Der AVR-/ARDUINO-Faden

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Das ist sehr unterschiedlich. Einmal ist das Teil nach einer halben Minute abgestürzt, dann läuft es mal eine Stunde klaglos. Komisch ist auch, dass der Servo dann nicht mehr angesteuert wird. Wird der über Software-PWM versorgt? (Hängt an Pin 9, einem PWM-Pin.)
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitrag von Sir_Death »

da bin ich leider ratlos
Benutzeravatar
Sven
Beiträge: 4421
Registriert: Fr 28. Jun 2013, 12:52
Wohnort: Sechsundzwanzigdreisechzehn

Re: Der AVR-/ARDUINO-Faden

Beitrag von Sven »

Gib Statusmeldungen auf der seriellen Verbindung aus, so dass du siehst, was das Teil gerade macht. Dann hast du einen Anhaltspunkt, wo es schief geht.

Generell gibt es gerne mal Probleme, wenn die Servo Lib zusammen mit irgendwelchen One-Wire oder ähnlichen Libs verwendet wird.
Bei Adafruit gibt es dazu einen Artikel inkl. Workaround. Dort ist die NeoPixel Ansteuerung problematisch aber das ist in diesem Fall eigentlich egal.
https://learn.adafruit.com/neopixels-an ... s/overview
Da kommen sich zwei Libs ins Gehege, die mit Interrupts arbeiten.

PS: Oder bau es einfach selber mit den Hardware Timern. Wenn ich mich recht erinnere wird Timer 0 von den internen Zeitgebern genutz (millis usw.)
Timer 1 ist frei verfügbar und hat 16 Bit Auflösung. Wenn du damit deinen Servo ansteuerst, läuft das komplett autark, ohne dass dir da ein Interrupt ein Bein stellt.
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Ordentlich aufgebaut (gelötet, nicht auf einem Steckbrett) und mit einer Servolibrary von Adafruit, die den Timer zur Hardware-PWM-Erzeugung verwendet, funktioniert das Ding jetzt zuverlässig...
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

Hallo,

Folgendes Problem:
Ich habe einen MCP2515 an einen Atmega328P über die SPI Schnittstelle angebunden.
Ich sitze jetzt seit etwa zwei Tagen daran, dass der Atmega mit dem MCP über SPI spricht. Aber da tut sich bisher nichts. Ich verwende Atmel Studio 7.
Versucht habe ich es bis jetzt unter anderem mit diesem Tutorial, sowie der Library von der Seite http://www.kreatives-chaos.com/artikel/can.


Bezüglich der Library, falls jemand Erfahrungen mit dar spezifischen Library aus dem Link von oben hat:
Ich habe die Library nach der Konfiguration für die aktuelle Hardware mit WinAvr zusammengebaut und mitsamt can.h und config.h in den Projektordner von Atmel Studio verfrachtet. Mit dem Beispiel aus der Library kompiliert das Programm ohne Fehler. Nach dem upload tut sich aber auf dem SPI Bus weiterhin nichts.
Das ist der Code:

Code: Alles auswählen

// coding: utf-8

#include <avr/io.h>
#include <avr/pgmspace.h>
typedef uint8_t prog_uint8_t;
#include "can.h"


// -----------------------------------------------------------------------------
/** Set filters and masks.
 *
 * The filters are divided in two groups:
 *
 * Group 0: Filter 0 and 1 with corresponding mask 0.
 * Group 1: Filter 2, 3, 4 and 5 with corresponding mask 1.
 *
 * If a group mask is set to 0, the group will receive all messages.
 *
 * If you want to receive ONLY 11 bit identifiers, set your filters
 * and masks as follows:
 *
 *	prog_uint8_t can_filter[] = {
 *		// Group 0
 *		MCP2515_FILTER(0),				// Filter 0
 *		MCP2515_FILTER(0),				// Filter 1
 *		
 *		// Group 1
 *		MCP2515_FILTER(0),				// Filter 2
 *		MCP2515_FILTER(0),				// Filter 3
 *		MCP2515_FILTER(0),				// Filter 4
 *		MCP2515_FILTER(0),				// Filter 5
 *		
 *		MCP2515_FILTER(0),				// Mask 0 (for group 0)
 *		MCP2515_FILTER(0),				// Mask 1 (for group 1)
 *	};
 *
 *
 * If you want to receive ONLY 29 bit identifiers, set your filters
 * and masks as follows:
 *
 * \code
 *	prog_uint8_t can_filter[] = {
 *		// Group 0
 *		MCP2515_FILTER_EXTENDED(0),		// Filter 0
 *		MCP2515_FILTER_EXTENDED(0),		// Filter 1
 *		
 *		// Group 1
 *		MCP2515_FILTER_EXTENDED(0),		// Filter 2
 *		MCP2515_FILTER_EXTENDED(0),		// Filter 3
 *		MCP2515_FILTER_EXTENDED(0),		// Filter 4
 *		MCP2515_FILTER_EXTENDED(0),		// Filter 5
 *		
 *		MCP2515_FILTER_EXTENDED(0),		// Mask 0 (for group 0)
 *		MCP2515_FILTER_EXTENDED(0),		// Mask 1 (for group 1)
 *	};
 * \endcode
 *
 * If you want to receive both 11 and 29 bit identifiers, set your filters
 * and masks as follows:
 */
uint8_t can_filter[] = 
{
	// Group 0
	MCP2515_FILTER(0),				// Filter 0
	MCP2515_FILTER(0),				// Filter 1
	
	// Group 1
	MCP2515_FILTER_EXTENDED(0),		// Filter 2
	MCP2515_FILTER_EXTENDED(0),		// Filter 3
	MCP2515_FILTER_EXTENDED(0),		// Filter 4
	MCP2515_FILTER_EXTENDED(0),		// Filter 5
	
	MCP2515_FILTER(0),				// Mask 0 (for group 0)
	MCP2515_FILTER_EXTENDED(0),		// Mask 1 (for group 1)
};
// You can receive 11 bit identifiers with either group 0 or 1.


// -----------------------------------------------------------------------------
// Main loop for receiving and sending messages.

int main(void)
{
	// Initialize MCP2515
	can_init(BITRATE_125_KBPS);
	
	// Load filters and masks
	can_static_filter(can_filter);
	
	// Create a test messsage
	can_t msg;
	
	msg.id = 0x123456;
	msg.flags.rtr = 0;
	msg.flags.extended = 1;
	
	msg.length = 4;
	msg.data[0] = 0xde;
	msg.data[1] = 0xad;
	msg.data[2] = 0xbe;
	msg.data[3] = 0xef;

	// Send the message

		can_send_message(&msg);


	
	can_send_message(&msg);	

	
	
	while (1)
	{
		// Check if a new messag was received
		if (can_check_message())
		{
			can_t msg;
			
			// Try to read the message
			if (can_get_message(&msg))
			{
				// If we received a message resend it with a different id
				msg.id += 10;
				
				// Send the new message
				can_send_message(&msg);
			}
		}
	}
	
	return 0;
}

Hat jemand von euch mit dem MCP schonmal so etwas gemacht und kann mir vielleicht eine Seite empfehlen, oder hat jemand sogar Code, der unter Atmel Studio läuft?

Ich wäre euch super dankbar, wenn ihr mir irgendwie weiterhelfen könnt. Ich komme nämlich nicht wirklich weiter.

Schönen Abend noch,
Lüsterklemme
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Wie sieht die config.h denn aus?
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

Die sieht folgendermaßen aus:

Code: Alles auswählen

#ifndef	CONFIG_H
#define	CONFIG_H

// -----------------------------------------------------------------------------
/* Global settings for building the can-lib and application program.
 *
 * The following two #defines must be set identically for the can-lib and
 * your application program. They control the underlying CAN struct. If the
 * settings disagree, the underlying CAN struct will be broken, with
 * unpredictable results.
 * If can.h detects that any of the #defines is not defined, it will set them
 * to the default values shown here, so it is in your own interest to have a
 * consistent setting. Ommiting the #defines in both can-lib and application
 * program will apply the defaults in a consistent way too.
 *
 * Select if you want to use 29 bit identifiers.
 */
#define	SUPPORT_EXTENDED_CANID	1

/* Select if you want to use timestamps.
 * Timestamps are sourced from a register internal to the AT90CAN.
 * Selecting them on any other controller will have no effect, they will
 * be 0 all the time.
 */
#define	SUPPORT_TIMESTAMPS		0


// -----------------------------------------------------------------------------
/* Global settings for building the can-lib.
 *
 * Select ONE CAN controller for which you are building the can-lib. 
 */
#define	SUPPORT_MCP2515			1
#define	SUPPORT_AT90CAN			0
#define	SUPPORT_SJA1000			0


// -----------------------------------------------------------------------------
/* Setting for MCP2515
 *
 * Declare which pins you are using for communication.
 * Remember NOT to use them in your application!
 * It is a good idea to use bits from the port that carries MOSI, MISO, SCK.
 */
#define	MCP2515_CS				B,2
#define	MCP2515_INT				B,0

// -----------------------------------------------------------------------------
// Setting for SJA1000

#define	SJA1000_INT				E,0
#define	SJA1000_MEMORY_MAPPED	1

// memory-mapped interface
#define	SJA1000_BASE_ADDR		0x8000		// for ATMega162

/*
// port-interface
#define	SJA1000_WR				D,6
#define	SJA1000_RD				D,7

#define	SJA1000_ALE				E,1
#define	SJA1000_CS				C,0
#define	SJA1000_DATA			A
*/

#endif	// CONFIG_H
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Der CS Pin stimmt nehm ich mal an?

In der Lib kann ich irgendwie die Funktion can_init nicht finden.
Für den MCP gibts nur eine mcp2515_init
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

Der CS Pin stimmt mit der Hardware überein.
Die Funktion can_init gibt es dort meine ich irgendwo, die ist mir heute schon begegnet. Ich suche aber sicherheitshalber nochmal.

Edit:

Code: Alles auswählen

#if ((BUILD_FOR_MCP2515 + BUILD_FOR_AT90CAN + BUILD_FOR_SJA1000) <= 1)
	#if (BUILD_FOR_MCP2515 == 1)

		#define mcp2515_init(...)					can_init(__VA_ARGS__)
		#define mcp2515_sleep(...)					can_sleep(__VA_ARGS__)
		#define mcp2515_wakeup(...)					can_wakeup(__VA_ARGS__)
		#define mcp2515_check_free_buffer(...)		can_check_free_buffer(__VA_ARGS__)
		#define mcp2515_check_message(...)			can_check_message(__VA_ARGS__)
		#define mcp2515_get_filter(...)				can_get_filter(__VA_ARGS__)
		#define mcp2515_static_filter(...)			can_static_filter(__VA_ARGS__)
		#define mcp2515_set_filter(...)				can_set_filter(__VA_ARGS__)
		#define mcp2515_get_message(...)			can_get_message(__VA_ARGS__)
		#define mcp2515_send_message(...)			can_send_message(__VA_ARGS__)
		#define	mcp2515_read_error_register(...)	can_read_error_register(__VA_ARGS__)
		#define	mcp2515_set_mode(...)				can_set_mode(__VA_ARGS__)
Das gibt es in can_private.h. Somit werden die Befehle den jeweils der Hardwarekonfiguration entsprechenden Funktionen zugeordnet. Also wird mit can_init() die Funktion mcp2515_init() aufgerufen.
IPv6
Beiträge: 2166
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Ich schätze ich bin hier nicht der erste, der ein Menü auf einem OLED Display anzeigen will, vielleicht kann mir jemand weiterhelfen.

Ich bastel schon den ganzen Tag mit dieser Bibliothek rum: https://github.com/neu-rah/ArduinoMenu

Fertige Bibliothek erscheint mir aus vielerlei Gründen sinnvoll, bis ich ein Menü selber geschrieben habe, was den sonst laufenden Code nicht blockiert und die Funktionen kann, die ich gerne hätte, vergehen wohl Wochen.

Ich bekomme mit dieser Bibliothek aber nichts ans laufen. Die Dokumentation erscheint mir mangelhaft (oder ich bin zu blöd?), klar, es gibt eine Menge Beispiele, die auch vollgepackt sind mit allerlei Code, aber wirklich verständlich geht nicht daraus hervor, was es alles an Funktionen gibt und wie diese zu nutzen sind.
Ich bekomme beispielsweise nichts auf meinem OLED Display angezeigt. Das Beispiel für das OLED Display zeigt zwar "hello world" auf dem Display an, wie es in der Setup Funktion steht. Aber kein Menü, ich bekomme das ums verrecken nicht hin.
Außerdem wird z.B. in der Setup Funktion eine Zeile Code auf dem seriellen Monitor ausgegeben, nur beim Ausführen von dem Programm erscheint die Zeile alle halbe Sekunde neu. Ruft sich da die Setup Funktion mehrfach auf? Wie soll das gehen? Ich verstehe einfach nicht, was da passiert.

Mein eigentliches Projekt ist Folgendes:
Unters Bett kommt ein Bewegungsmelder, eine Menge LEDs, ein LDR und in ein kleines Kästchen an die Wand das Gehirn, ein OLED Display, eine RTC und ein paar Knöpfe.
Ziel ist zum Einen ein Nachtlicht, was abhängig von der Uhrzeit die Helligkeit und Lichtfarbe verändert. Da kommt dann optimalerweise, wenn man die Füße aus dem Bett streckt, gerade so viel Licht unterm Bett hervor, wie man zum laufen braucht. E soll aber dunkel genug sein, dass der Andere problemlos weiterschlafen kann.
Zum Anderen soll da gleich ein Lichtwecker mit rein, dessen Weckzeit man auf einem Menü am Display einstellen kann.
Per Menü soll dann auch manuell das Licht mit auswählbaren Farben eingestellt werden können.

Hardware liegt schon eine Weile rum, Zeit ist in den nächsten Wochen auch gut vorhanden. Grundsätzliche Programmierung sollte auch möglich sein.
Es fehlt nur zunächst ein funktionierendes Menü.
Das Menü muss nicht viel können, hauptsächlich ein paar Variablen änderen (für Uhrzeit, Lichtfarben usw.).

Vielleicht ist die Bibliothek, die ich rausgesucht habe, auch viel zu kompliziert?
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

@Lüsterklemme
Auf dem SPI passiert wirklich NICHTS?
Haste das mit nem Oszi/Logicanalyzer überprüft?
Die mcp2515_init klimpert ja direkt auf dem SI rum, also irgendwas müsste man direkt am Anfang sehen.
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

Also der Logicanalyzer hängt dauerhaft am SPI. Da kommt absolut gar nichts an.
Aber folgendes ist mir eben aufgefallen:

Ich habe mal den Beispielcode in ein funktionierendes Programm integriert, welches über den SPI Daten rausschiebt. Solange man die Funktion can_init() nicht aufruft ist alles ganz normal.
Wenn man diese Funktion dann aber aufruft, scheint das Programm sich aufzuhängen und es passiert gar nichts mehr, auch auf normalen I/O Ports.
Jetzt stellt sich mir gerade die Frage, wo er sich aufhängt.

Der Ablauf ist ja wie folgt:

Code: Alles auswählen

bool mcp2515_init(uint8_t bitrate)
{
	if (bitrate >= 8)
		return false;
	
	SET(MCP2515_CS);
	SET_OUTPUT(MCP2515_CS);
	
	// Aktivieren der Pins fuer das SPI Interface
	RESET(P_SCK);
	RESET(P_MOSI);
	RESET(P_MISO);
	
	SET_OUTPUT(P_SCK);
	SET_OUTPUT(P_MOSI);
	SET_INPUT(P_MISO);
	
	// SPI Einstellung setzen
	mcp2515_spi_init();
mcp2515_spi_init() findet sich dann in spi.c

Code: Alles auswählen

void mcp2515_spi_init(void)
{
	#ifndef USE_SOFTWARE_SPI
		// Aktivieren des SPI Master Interfaces
		SPCR = (1<<SPE)|(1<<MSTR) | R_SPCR;
		SPSR = R_SPSR;
	#endif
}
und dann geht es mit dem Rest in mcp2515_init() weiter:

Code: Alles auswählen

// MCP2515 per Software Reset zuruecksetzten,
	// danach ist er automatisch im Konfigurations Modus
	RESET(MCP2515_CS);
	spi_putc(SPI_RESET);
	
	_delay_ms(1);
	
	SET(MCP2515_CS);
	
	// ein bisschen warten bis der MCP2515 sich neu gestartet hat
	_delay_ms(10);
	
	// CNF1..3 Register laden (Bittiming)
	RESET(MCP2515_CS);
	spi_putc(SPI_WRITE);
	spi_putc(CNF3);
	for (uint8_t i=0; i<3 ;i++ ) {
		spi_putc(pgm_read_byte(&_mcp2515_cnf[bitrate][i]));
	}
	// aktivieren/deaktivieren der Interrupts
	spi_putc(MCP2515_INTERRUPTS);
	SET(MCP2515_CS);
	
	// TXnRTS Bits als Inputs schalten
	mcp2515_write_register(TXRTSCTRL, 0);
	
	#if defined(MCP2515_INT)
		SET_INPUT(MCP2515_INT);
		SET(MCP2515_INT);
	#endif
	
	#ifdef RXnBF_FUNKTION
		SET_INPUT(MCP2515_RX0BF);
		SET_INPUT(MCP2515_RX1BF);
		
		SET(MCP2515_RX0BF);
		SET(MCP2515_RX1BF);
		
		// Aktivieren der Pin-Funktionen fuer RX0BF und RX1BF
		mcp2515_write_register(BFPCTRL, (1<<B0BFE)|(1<<B1BFE)|(1<<B0BFM)|(1<<B1BFM));
	#else
		#ifdef MCP2515_TRANSCEIVER_SLEEP
			// activate the pin RX1BF as GPIO which is connected 
			// to RS of MCP2551 and set it to 0
			mcp2515_write_register(BFPCTRL, (1<<B1BFE));
		#else
			// Deaktivieren der Pins RXnBF Pins (High Impedance State)
			mcp2515_write_register(BFPCTRL, 0);
		#endif
	#endif
	
	// Testen ob das auf die beschreibenen Register zugegriffen werden kann
	// (=> ist der Chip ueberhaupt ansprechbar?)
	bool error = false;
	if (mcp2515_read_register(CNF2) != pgm_read_byte(&_mcp2515_cnf[bitrate][1])) {
		error = true;
	}
	
	// Device zurueck in den normalen Modus versetzten
	// und aktivieren/deaktivieren des Clkout-Pins
	mcp2515_write_register(CANCTRL, CLKOUT_PRESCALER_);
	
	if (error) {
		return false;
	}
	else
	{
		while ((mcp2515_read_register(CANSTAT) & 0xe0) != 0) {
			// warten bis der neue Modus uebernommen wurde
		}
		
		return true;
	}
}
Und irgendwo dort muss er sich aufhängen. Wie geht man jetzt bei sowas zur Fehlersuche vor? Ich hätte jetzt angefangen einzelne Befehle und Funktionen aus mcp2515_spi_init() rauszunehmen, es dann immer wieder neu mit WinAvr zu bauen und das solange zu machen, bis es sich nicht mehr aufhängt. Dann schauen, was als letztes rausgenommen wurde.
Ist das eine sinnvolle Herangehensweise, oder ist das nur ein Symptom das dieser Abschnitt nicht funktioniert und das Problem liegt ganz woanders? (Es muss schließlich bei anderen Personen schon funktioniert haben)
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Statt andauernd neucompilen würde ich da den UART in Betrieb nehmen und über diesen ausgeben bis wohin das Program grade kam.
(gutes altes printf Debugging)
Nen Debugger zum durchsteppen wär natürlich besser, hat aber fürn AVR kaum jemand.
UART Lib: http://homepage.hispeed.ch/peterfleury/ ... tware.html

Komplett aufhängen kann er sich eigentlich nur in der spi_putc, denn dort wartet er in einer while Schleife auf ein Flag.
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

@IPv6:
Wenn das mit der Library nicht funktionieren sollte für die Menüführung, dann kann man das auch gut selber machen.
Ich habe das bei meinem Wecker mit einem Drehencoder und zwei Schaltern gelöst. Da man bei solchen Projekten ja nichts steuern oder rechnen muss, während man im Menü rumwerkelt, ist die Programmierung der Menüführung relativ simpel. Wenn man sich einmal eine Menüstruktur überlegt hat (z.B. für die Lichtfarbenwahl), kann man die ja auch auf andere Sachen wie die Weckzeiteinstellung adaptieren. Wenn du möchtest, kann ich dir auch die Menüführung von meinem Wecker mal zukommen lassen (wenn ich die Software wiederfinde), dann kannst du dich ja inspirieren lassen :)

@Fritzler:
Dann baue ich mal einige Debuggmeldungen in die fraglichen Routinen und probiere es nochmal, danke.
MfG
Lüsterklemme
IPv6
Beiträge: 2166
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Ich bin gerade auch am überlegen, ob eine solche doch recht komplexe Menü-Lib wirklich notwendig ist.
Allerdings wäre es für zukünftige Projekte auch gar nicht schlecht, sich mal an einfachen Beispielen mit Menüs auseinandergesetzt zu haben.

Mal sehen...
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitrag von Sir_Death »

angehängte txt Datei in .ino umbenennen.

Ist ein Wecker mit 2 Stück 4-fach 7-Segmentanzeige + Doppelpunkt, Alarm ein über Schalter, Taster für Snooze, gesamte Bedienung über Dreh und Drück (Drehencoder mit Taste)
aktuelle Zeit auf grüner Anzeige, Weckzeit auf roter.
Während der Nacht werden die 7-Segment-Anzeigen abgeschaltet und durch drücken der Snooze Taste kurz aktiviert.
Ist der Alarmschalter ein, zeigt er auch die Weckzeit an, wenn nicht, dann nur die aktuelle Zeit

1 x Drücken am Encoder: gehe in den Weckzeit-Einstell-Modus.
Am Ende des Weckzeit-Einstell-Modus lange drücken (bis die Doppelpunkte leuchten) geht in den Einstellmodus für aktuelle Zeit + Nachtlicht Farbe + Nachtlicht Helligkeit
Weckmelodie liegt auf einer MicroSD-Karte in einem mp3-Modul, welches bei Spannung ein direkt losdudelt. Fertig
7-Segment-Stellen sind gemuxt - Helligeit selbst mit 1:3 MUX-Zeit und 1kOhm noch völlig ausreichend, aber auch so, dass es einem die Augen nicht raus haut.
RTC mit Knopfzelle ist drinnen für Stromausfall, Weckzeit wird im EEPROM gespeichert.

WAFF & DAFF (Wife & Doughter) ist mit dem Ding Grasgrün - wir haben schon 3 davon :D
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

@fritzler:
Das Problem scheint nicht die Library an sich zu sein, sondern die Library in Verbindung mit Atmel Studio.
Ich habe eben das Projekt mal mit WinAVR kompiliert und mit AVRDUDESS auf den Chip gebrannt. Sowohl mit einem Atmega8, wie auch mit einem offiziell nicht unterstützten Atmega328P funktioniert die Software und der SPI Bus einwandfrei :D
Sogar der MCP2515 schaufelt am anderen Ende fröhlich Daten raus, die sich auch mit dem Oszi wieder dekodieren lassen.
Vielen herzlichen Dank für die Tips und Ratschläge, wieder was gelernt. Wieso das mit Atmel Studio nicht funzt versuche ich dann morgen mal zu klären.

Schönen Abend noch,
Lüsterklemme
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Mit AVR-Studio hab ich auch schon so komische Erfahrungen gemacht, das irgenwelche Abhägigkeiten in dem Wust der Software nicht erfüllt werden.
Irgenwann hab ich ich dann auch vom AVR-Studio verabschiedet, die Suche nach irgend einem kruden Fehler hat mir zu lange gedauert.
Besonders Schlimmm ist es wenn man Teile von anderen Projekten übernimmt.

Ob das heute noch ein Problem ist, kann weiss ich nicht.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Ich weis ja, dass man das Atmelstudio meiden sollte wie der Teufel das Weihwasser.
Dies aber eher weil die Software total überladen ist.
Dass die sich noch sowas leisten is schon krass :shock:

Ich mein unter der Haube nutzen dir auch den GCC und wenn eine Datei fehlt, dann müsste spätestens der LInker meckern, dass da ein Symbol fehlt.
lüsterklemme2000
Beiträge: 249
Registriert: So 28. Aug 2016, 20:31
Wohnort: Südliches Niedersachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von lüsterklemme2000 »

Welche Software wäre denn eine empfehlenswerte Alternative zu Atmel Studio?
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Na so wie dus jetzt machst.
Editor deiner Wahl + Makefile + GCC + Utils
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Fritzler hat geschrieben:Editor deiner Wahl + Makefile + GCC + Utils
Örks, genau gegen so was wurden IDEs erfunden...
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitrag von Sir_Death »

Oder halt die Arduino IDE... :lol:
IPv6
Beiträge: 2166
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

:roll:
nicht schon wieder...
Benutzeravatar
Raja_Kentut
Beiträge: 1528
Registriert: Mi 14. Aug 2013, 13:11
Wohnort: Veitsbronn-Bernbach

Re: Der AVR-/ARDUINO-Faden

Beitrag von Raja_Kentut »

Moin,

für meine Kellerentmuffung 2.0 brauche ich neben einem Sensor für Temperatur & Luftfeuchte (SHT31 im Einsatz) einen zweiten Temperatursensor für die Kellerbodentemperatur. Dieser residiert leider ca. 10m vom Arduinokaschtl entfernt. Daher brauch ich einen I2C Bus Buffer, da mehr als ca.3m Kabel nicht vom Arduino/STH31 getrieben werden können.
Ich hab bereits gesuuuuucht, konnte aber nichts fertiges finden. Bevor ich nun selbst was stricke (z.B. auf Basis P82B715) meine frage :

Gibt's da einen fertigen Shield für ? (hab einen für unverschämte 17USD/Stk von Sandbox gefunden...ist mir aber viel zu teuer)

sparsame Grüße,
RK
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Vielleicht könnte man das auch mit einem SPI-Temperatursensor machen. SPI an sich geht auch gggaaaaannnnzzzzz lllllaaaannnngggsssaaammmm und damit über längere Leitungen, vorausgesetzt, der ADC braucht den SPI-Takt nicht zur Wandlung.
Benutzeravatar
Sunset
Beiträge: 1498
Registriert: Fr 6. Dez 2013, 15:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Sunset »

Ginge vielleicht ein WLAN-Kabel mit ESP8266 oder ESP32?
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Takt =/= Flankensteilheit
-> RS422
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Einige ICs sind da echt hart im nehmen...
Benutzeravatar
Raja_Kentut
Beiträge: 1528
Registriert: Mi 14. Aug 2013, 13:11
Wohnort: Veitsbronn-Bernbach

Re: Der AVR-/ARDUINO-Faden

Beitrag von Raja_Kentut »

geht alles, aber ich will möglichst wenig rumlöten/programmieren... SPI ist an sich keine schlechte Idee, aber da sind fertige Shields wohl auch selten/teuer. Hab jedenfalls nix gefunden...
Da meine Programmierkenntnisse nahe Fußpilzniveau angesiedelt sind :
Ließe sich beim Adruino der I2C langsamer einstellen ? (Wenn ja, wie?)
Das SHT31 Datenblatt hat da nix gegen : " The clock frequency can be freely chosen between 0 to 1000 kHz"
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Raja_Kentut hat geschrieben:geht alles, aber ich will möglichst wenig rumlöten/programmieren... SPI ist an sich keine schlechte Idee, aber da sind fertige Shields wohl auch selten/teuer. Hab jedenfalls nix gefunden...
Da meine Programmierkenntnisse nahe Fußpilzniveau angesiedelt sind :
Ließe sich beim Adruino der I2C langsamer einstellen ? (Wenn ja, wie?)
Das SHT31 Datenblatt hat da nix gegen : " The clock frequency can be freely chosen between 0 to 1000 kHz"
Da steht was dazu: https://forum.arduino.cc/index.php?topic=159855.0
Benutzeravatar
Raja_Kentut
Beiträge: 1528
Registriert: Mi 14. Aug 2013, 13:11
Wohnort: Veitsbronn-Bernbach

Re: Der AVR-/ARDUINO-Faden

Beitrag von Raja_Kentut »

danke für den Link ins Arduino Forum!
im post #12 steht das "in the Wire library" einen entsprechenden Wert gibt:
"The speed of 100kHz is fixed in the Wire library, and it is used in the Wire.begin() function. It is passed to the twi.c file which sets the TWBR register.
The TWBR register can be set faster and slower.
It is a 8-bits register and it is default 72.
The value of 72 makes it easy to change the speed without the need to change the prescaler.
A value of 255 makes it three and a half times slower.
A value of 18 makes it four times faster.
"
heißt das, das ich in meinem Programm an richtiger Stelle " TWBR = 255;" einfügen kann und gut ist ? (255 entspräche ca. 28kHz)
Wo wäre dann diese Stelle, etwa hier ? :
Mein Programm :
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

float ttp = 0; // RK : Definition Variable für Taupunkt
int LED_Fan = 4; // RK : Pin4 heisst LED_Fan und schaltet LED Lüfterbetrieb an/aus
TWBR = 255; // RK : WÄRE HIER der richtige Platz um das I2C Speed Register zu verändern ?
Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
Serial.begin(9600);

// while (!Serial)
// delay(10); // will pause Zero, Leonardo, etc until serial console opens

Serial.println("SHT31 test");
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate i2c addr
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
pinMode(LED_Fan, OUTPUT); //RK : PIN4 als Output = Schaltausgang LED Lüfterbetrieb
digitalWrite (LED_Fan, LOW); // RK : Bei Programmstart LED Lüfterbetrieb aus
}


void loop() {
float t = sht31.readTemperature();
float h = sht31.readHumidity();

ttp = t - (100-h)/5; // RK: Berechnung Taupunkt

if (! isnan(t)) { // check if 'is not a number'
Serial.print("Temp *C = "); Serial.println(t);
} else {
Serial.println("Failed to read temperature");
}

if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
Serial.print("Taupkt *C = "); Serial.println(ttp); // RK:Ausgabe Taupunkttemperatur
} else {
Serial.println("Failed to read humidity");
}
Serial.println();

if (ttp < 15) { // RK :Wenn Taupunkttemperatur <15 Grad C LED Lüfterbetrieb an
digitalWrite (LED_Fan, HIGH);}
else if (h < 35) {digitalWrite (LED_Fan, HIGH);} // Bei h<50% wird Formel zu ungenau -> ttp wird zu hoch berechnet
else {digitalWrite (LED_Fan, LOW);} //Wenn h<35 steigt ttp nie über 12,9°C bei t<30°C

delay(10000);
}
float ttp = 0; // RK : Definition Variable für Taupunkt
int LED_Fan = 4; // RK : Pin4 heisst LED_Fan und schaltet LED Lüfterbetrieb an/aus

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
Serial.begin(9600);

Serial.println("SHT31 test");
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate i2c addr
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
pinMode(LED_Fan, OUTPUT); //RK : PIN4 als Output = Schaltausgang LED Lüfterbetrieb
digitalWrite (LED_Fan, LOW); // RK : Bei Programmstart LED Lüfterbetrieb aus
}

void loop() {
float t = sht31.readTemperature();
float h = sht31.readHumidity();

ttp = t - (100-h)/5; // RK: Berechnung Taupunkt

if (! isnan(t)) { // check if 'is not a number'
Serial.print("Temp *C = "); Serial.println(t);
} else {
Serial.println("Failed to read temperature");
}

if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
Serial.print("Taupkt *C = "); Serial.println(ttp); // RK:Ausgabe Taupunkttemperatur
} else {
Serial.println("Failed to read humidity");
}
Serial.println();

if (ttp < 15) { // RK :Wenn Taupunkttemperatur <15 Grad C LED Lüfterbetrieb an
digitalWrite (LED_Fan, HIGH);}
else if (h < 35) {digitalWrite (LED_Fan, HIGH);} // Bei h<50% wird Formel zu ungenau -> ttp wird zu hoch berechnet
else {digitalWrite (LED_Fan, LOW);} //Wenn h<35 steigt ttp nie über 12,9°C bei t<30°C

delay(10000);
}
(Bitte nicht antworten "probiers doch aus" - kann ich gerade nicht, warte noch auf DHL fürn neuen Leonardo...)
Benutzeravatar
Raja_Kentut
Beiträge: 1528
Registriert: Mi 14. Aug 2013, 13:11
Wohnort: Veitsbronn-Bernbach

Re: Der AVR-/ARDUINO-Faden

Beitrag von Raja_Kentut »

jetzt wird's mathematisch...

Die Sensorik läuft jetzt soweit, hab nen DS1820 Temperatursensor genommen, der zickt auch mim langen Kabel nicht rum.
Ich möchte jetzt den Taupunkt genauer und über einen weiten Temperaturbereich bestimmen und hab ne Formel gefunden,
die recht gute Ergebisse von -20 … +40°C und 20...100%RH liefert (http://www.loxwiki.eu)

Im EXEL funzt das perfekt, der Arduino rechnet aber was völlig falsches aus. Unten der Ausschnitt aus meinem Programm.
Ich vermute, das es mit der laaangen Formel zu tun hat. (bin froh das ich soweit gekommen bin, hab leider keine Ahnung vom "richtigen" Programmieren)
Frage : Wie muß ich die Formel programmieren, damit das Ergebnis stimmt ?
/SCHNIPP/
ttp = 243,12*((17,62*t)/(243,12+t)+log(h/100))/((17,62*243,12)/(243,12+t)-log(h/100)); // Näherungsformel für Gesamtbereich
// ttp = 243,12*((17,62*T)/(243,12+T)+LN(RH/100))/((17,62*243,12)/(243,12+T)-LN(RH/100)) - so funktionierts in EXEL
/SCHNAPP/
IPv6
Beiträge: 2166
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Ist log auf dem Arduino das gleiche wie LN in Excel?

Passen die Datentypen, sprich sind das alle floats?

Mal die Formel in kleinere Stücke zerlegen, das Ergebnis auf dem seriellen Monitor ausgeben und mit Excel vergleichen? So würdest du rausbekommen, welche Teile funktionieren und bei welchen es hakt.

Theoretisch lässt sich eigentlich so auch auf einem Arduino rechnen, einen formellen Fehler kann ich auch nicht finden.
Benutzeravatar
Raja_Kentut
Beiträge: 1528
Registriert: Mi 14. Aug 2013, 13:11
Wohnort: Veitsbronn-Bernbach

Re: Der AVR-/ARDUINO-Faden

Beitrag von Raja_Kentut »

ja, ln(x) heisst bei Arduino log(x) , jedenfalls wenn man dem Arduinoforim trauen darf...

die Variablen sind alle float...
IPv6
Beiträge: 2166
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Wundert mich ein wenig, zumindest auf Taschenrechnern ist "ln" in der Regel der Logarithmus zur Basis e (eulersche Zahl) und "log" der Logarithmus zur Basis 10.
Vielleicht stimmt das aber auch.

Die Formel in Teilstücke zerlegen und schauen, bis wohin es klappt?

EDIT:
Das ist aber nicht direkt aus dem Programm rauskopiert, oder?
Kommas sind in der Arduino IDE nämlich Punkte...
Aber das müsste doch dann eigentlich zu einer Fehlermeldung geführt haben.
Benutzeravatar
Raja_Kentut
Beiträge: 1528
Registriert: Mi 14. Aug 2013, 13:11
Wohnort: Veitsbronn-Bernbach

Re: Der AVR-/ARDUINO-Faden

Beitrag von Raja_Kentut »

PUNKT STATT KOMMA !!!! Das wars !!!! Daaaaaanke !!!!
gab übrigens keine Fehlermeldung beim Compilieren
Benutzeravatar
Weisskeinen
Beiträge: 3942
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Was, echt? Das gibt keine Fehlermeldung? War mir nämlich gleich zu Anfang aufgefallen und ich dachte, du hast das nur schnell abgeschrieben und deshalb Dezimalkommata rein gemacht.
Benutzeravatar
Bauteiltöter
Beiträge: 254
Registriert: So 11. Aug 2013, 17:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bauteiltöter »

Code: Alles auswählen

torben@igor:~/test$ gcc test.c -Wall -lm
test.c: In function ‘main’:
test.c:6:18: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 ttp = 243,12*((17,62*t)/(243,12+t)+log(h/100))/((17,62*243,12)/(243,12+t)-log(h/100)); // Näherungsformel für Gesamtbereich
                  ^
test.c:6:29: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 ttp = 243,12*((17,62*t)/(243,12+t)+log(h/100))/((17,62*243,12)/(243,12+t)-log(h/100)); // Näherungsformel für Gesamtbereich
                             ^
test.c:6:52: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 ttp = 243,12*((17,62*t)/(243,12+t)+log(h/100))/((17,62*243,12)/(243,12+t)-log(h/100)); // Näherungsformel für Gesamtbereich
                                                    ^
test.c:6:59: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 ttp = 243,12*((17,62*t)/(243,12+t)+log(h/100))/((17,62*243,12)/(243,12+t)-log(h/100)); // Näherungsformel für Gesamtbereich
                                                           ^
test.c:6:68: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 ttp = 243,12*((17,62*t)/(243,12+t)+log(h/100))/((17,62*243,12)/(243,12+t)-log(h/100)); // Näherungsformel für Gesamtbereich
                                                                    ^
test.c:4:16: warning: variable ‘ttp’ set but not used [-Wunused-but-set-variable]
 double t=1,h=1,ttp;
:roll:

kein -Wall = selber Schuld. Zum duzenden mal in diesem Thread.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Gammelduino bietet das nichtmal an:
https://github.com/arduino/Arduino/issues/4184

Das ist ein Bugreport auf GitHub, dass doch bitte -Wall aktiviert sein soll in der IDE.
Was ist die Antwort?
Warnings are unnecessary to the formers and, classes prove, scare them away.
Oder auf Stackoverflow wo das jemand einschalten will:
Arduino 1.0.6: How to change compiler flag?
Using the IDE is very difficult to do that.
Bild
Fischjoghurt
Beiträge: 271
Registriert: Di 13. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fischjoghurt »

Hallo Leute

Ich habe einen Arduino Uno mit Datalogger-Shield mit RTC und ein LCD-Shield (1602) mit Keypad.
Alles sehr schön und gut, aber die Bibliotheken für die Ansteuerung dieser Funktionen die ich alle brauchen, führen dazu, dass ich noch 245 Byte von 2k RAM habe. Für die SD-Card brauch man aber angeblich über 512 Byte.

Ich finde diese Bibliotheken sind sehr Ressourcen fressend. Gibt es besser Bibliotheken oder eine andere Lösung? Selber alles zu schreiben, da fehlt mir im Moment das Wissen und die Zeit.

Ziel ist es ein Datalogger, welcher die Daten auf SD-Karte speichert und die Bedienung erfolgt über LCD und Keypad oder USB.



Gruss
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Es gibt ja auch nur _EINE_ RTC auf der Welt!

LCD Lib: http://homepage.hispeed.ch/peterfleury/ ... tware.html
Fischjoghurt
Beiträge: 271
Registriert: Di 13. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fischjoghurt »

Fritzler hat geschrieben:Es gibt ja auch nur _EINE_ RTC auf der Welt!

LCD Lib: http://homepage.hispeed.ch/peterfleury/ ... tware.html
Hallo Fritzer

Meine RTC ist eine DS1307. Aber ich glaube kaum dass ich bei der RTC viel RAM einsparen kann.
Eigentlich braucht alleine die Lib <SD.h> schon die Hälfte des RAMs.

Gruss
Matt
Beiträge: 6084
Registriert: So 24. Aug 2014, 21:22

Re: Der AVR-/ARDUINO-Faden

Beitrag von Matt »

Doch klar, damit kann man viel sparen. Wenn du i2c ausles-Funktion selber schreibt, der nur nötige Funktion hat.
Ich habe damals Library für DS1307/2321 selber geschrieben, da mir von überladene Biblothek Schnauze habe.

Reine Uhrfunktion mit DS1307 braucht etwa 10byte. (ohne zu prüfen) (I2C Library nicht mitgerechnet)


Diese Code läuft mit P.Fleury I2C Library. Vergiss nicht, Variabel zu definieren. (ist nicht dabei)

Code: Alles auswählen

void getTIME_BCD () 
{
		i2c_start(0xD0);		// DS2321 Adr =0xD0 auswählen
		i2c_write (0x00);		// Sekunden-Register auswählen
		i2c_rep_start (0xD1);	// Lesen-Modus
		i2c_readNak();			// auslesen
		S1 	=(TWDR & 0x0F);		// Daten (untere Nibble direkt übertragen)
		S10 =((TWDR >>4)&0x07);		// Daten ( oberne Nibble übertragen durch 4x nach rechts schieben) 				
		i2c_rep_start (0xD0);	// Schreibmodus
		i2c_write (0x01);		// Minuten-Register auswählen
		i2c_rep_start (0xD1);	// Lesenmodus
		i2c_readNak();			// auslesen
		M1 	=(TWDR & 0x0F);		// Daten (untere Nibble direkt übertragen)
		M10 =(TWDR >>4);		// Daten ( oberne Nibble übertragen durch 4x nach rechts schieben) 				
		i2c_rep_start (0xD0);	// Schreibmodus
		i2c_write (0x02);		// Stunden-Register auswählen
		i2c_rep_start (0xD1);	// Lesenmodus
		i2c_readNak();			// auslesen
		H1 	=(TWDR & 0x0F);		// Daten (untere Nibble direkt übertragen)
		H10 =(TWDR >>4) &0x03;		// Daten ( oberne Nibble übertragen durch 4x nach rechts schieben) 				
		i2c_stop();
}		
PS: zugebenmass schreibe ich meiste Library selber, wenn ich genauer und längere überlegen, ist P.Fleury-Library (UART, LCD, I2C) einzige "fremde" Library.
Für SD1306 habe ich von u8g Library abgeguckt und selber geschrieben. Da ich nie geschafft habe, u8g zum laufen zu bringen.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Komisches Fänomen:

Ich hab hier einen AtMega88, dort ist ein Display am SPI PB2,3,4,5 angeschlossen und funktioniert.
Zum Haareraufen: Am PortB Pin1 kommen auch SPI Daten raus.
Ich hab das soweit durchgecheckt, der PB1 wird nirgends weiter getriggert, auch wenn ich den mit PORTB~=(1<<PB1) abschalte kommen die Daten.
ich will aber den OC1A nutzen.

Wie kann da was rauskommen vom SPI ?

Anderer Baustein tut das gleiche und auch wenn der Pin in der Luft hängt kommen da SPI Daten raus.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Also der PB1 steckte zuletzt nicht mehr im Sockel?
Häng PB1 inner Luft hängend doch nochmal auf GND mit 330R.
AVCC hat Spannung?

Ansonsten hast du schon recht und PB1 ist zudem auch nicht direkt neben MOSI, sondern nSS.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Am PB1 hängt normalerweise eine Schaltung dran die leicht gegen GND zieht.
AVCC hat 5V.

Da kann man doch nix falsch machen?

lcd.c Ausschnitt

Code: Alles auswählen

/ SPI - Initialisierung
// ***********************************************************************
void spi_master_init(void) {
	DDRB |= (1 << PB3) | (1 << PB5) | (1 << PB2); // MOSI(PB3), SCK(PB5), SS(PB2) (Ausg�nge)
	DDRB &= ~(1 << PB4); // MISO(PB4) (Eingang)
	PORTB |= (1 << PB4); // MISO(PB4) Pull-Up-R zuschalten
	//DDRB |= (1 << PX5); // EN Ausgang

	CS_LCD_H; // LCD Disable

	// Grundinitialisierung (SPI-Freigabe, Master, LSB-First, Mode 3, Fosz/64)
	SPCR = ((1 << SPE) | (1 << MSTR) | (1 << DORD) |(1 << SPR0)| (1 << CPOL)
			| (1 << CPHA));

}

Hier noch Baustelle:
evtl in der init_devices Scheiße?
main.c

Code: Alles auswählen

//************************************************************************/
// Projekt Includes
//************************************************************************/
#include "defines.h"                        // Projektdefinitionen
#include "lcd_dip204ks0073_spi_avr.c"       // LCD-Funktionen
#include "ADC_Messung.h"
//************************************************************************/
// AVR/GCC Includes
//************************************************************************/
#include <avr/eeprom.h>
#include <stdbool.h> 
#include "main.h"
#include <avr/interrupt.h>
#include <avr/io.h>                         // IO-Grundfunktionen
#include <util/delay.h>                     // Pausenfunktionen
#include <string.h>                         // Stringfunktion
#include <stdio.h>                          // Standardfunktion
#include <stdlib.h>                         // Standardbibliothek
//************************************************************************/
//Defines 
//************************************************************************/
#define FOSC 8000000 // Clock Speed
#define BAUD 19600
#define MYUBRR FOSC/16/BAUD-1

#define rel1_an PORTD|=(1<<PD5)
#define rel1_aus PORTD &= ~(1<<PD5)

#define rel2_an PORTD|=(1<<PD6)
#define rel2_aus PORTD &= ~(1<<PD6)

#define rel3_an PORTD|=(1<<PD3)
#define rel3_aus PORTD &= ~(1<<PD3)

#define rel4_an PORTD|=(1<<PD4)
#define rel4_aus PORTD &= ~(1<<PD4)

#define out1_an PORTD|=(1<<PD7)
#define out2_aus PORTD &= ~(1<<PD7)

#define out1_an PORTB|=(1<<PD0)
#define out2_aus PORTB &= ~(1<<PD0)



//************************************************************************/
// Variablenbereich
//************************************************************************/


struct lcd_struc lcd;       // LCD Datensatz


uint16_t poti1;
uint16_t poti2;
uint16_t poti3;
uint16_t ana1;
uint16_t ana2;
bool sw1;
bool sw2;
bool sw3;
bool motor;

char buffer[6];


void input_d(void)
{
if  (PINC&(1<<PC5)){sw1=1;}
	else {sw1=0;}

if  (PINB&(1<<PB0)){sw2=1;}
	else {sw2=0;}

if  (PIND&(1<<PD7)){sw3=1;}
	else {sw3=0;}
}

//void USART_Init(unsigned int ubrr)
//{
/*Set baud rate */
//UBRR0H = (unsigned char)(ubrr>>8);
//UBRR0L = (unsigned char)ubrr;
//Enable receiver and transmitter */
//UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
//UCSR0C |= (3<<UCSZ00);
//}

//void USART_Transmit( unsigned char data )
//{
/* Wait for empty transmit buffer*/
//while( !( UCSR0A & (1<<UDRE0)) )
//;
/* Put data into buffer, sends the data*/
//UDR0 = data;
//}

//void uart_puts (char *s)//char s[];
//{
//    while (*s)
//    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
//        //uart_putc(*s);
//		USART_Transmit(*s);
//        *s++;
//    }
//	s[0]='\0';
//}

//************************************************************************/
// Devices init
//************************************************************************/
int init_devices(void)
{
cli();
  EIMSK|=1<<INT1;
  EICRA|=(1<<ISC11)|(1<<ISC10);//INTO einstellen auf steigende Flanke

  //TCNT1=0; //Timer auf ca. 2 Sekunden
  //TCCR1B|=((1<<CS11)|(1<<CS10)); //Timer anschalten prescaler 20Mhz/64 = 3,2us

  spi_master_init();        // Hardware-SPI Initialisierung als Master
  init_lcd();               // LCD Initialisierung im SPI-Mode
  DDRB |=(1<<PB6)|(1<<PB7)|(1<<PB1);
  DDRD |=(1<<PD5)|(1<<PD6)|(1<<PD3)|(1<<PD4)|(1<<PD7);

  //DIDR0=0xFF;
  //USART_Init(MYUBRR);

  DDRC|=(1<<PC3)|(1<<PC4);

DDRC&=~(1<<PC5);
DDRB&=~(1<<PB0);
DDRD&=~(1<<PD7);
PORTC|=(1<<PC5);
PORTB|=(1<<PC0);
PORTD|=(1<<PD7);
sei();

}
// ********************************************************************/
// Hauptprogramm
// ********************************************************************/
int main (void) {

init_devices();

  while(1) {


input_d();
poti1=messung(0);
poti2=messung(1);
poti3=messung(2);
ana1=messung(3);
ana2=messung(4);
	PORTC&=~(1<<PC4);
     	PORTB&=~(1<<PB1);

     //printf_lcd(0,0,"  L1    L2    L3",10);
     //printf_lcd(0,1,"V:",10);
     //printf_lcd(0,2,"A:",10);
     //printf_lcd(0,3,"W:",10);

	itoa(poti1,buffer,10);
	//printf_lcd(2,1,buffer,10);
	itoa(poti2,buffer,10);
	//printf_lcd(2,2,buffer,10);
	itoa(poti3,buffer,10);
	printf_lcd(2,3,buffer,10);
PORTC|=(1<<PC4);

    }
}

Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

Ich seh da ersmal nix schlimmes.
Wo hast du die m88 gekauft?

Aber noch was zu deinen defines:
KLAMMERN SETZEN!!!
#define MYUBRR FOSC/16/BAUD-1 -> #define MYUBRR (FOSC/16/BAUD-1)
irgendwann setzt du das vllt inne Formel ein (das weist du jetzt noch nicht) und dann rechnet dir der Compiler vllt was anderes aus.
Das ist ja nur ne Stringersetzung.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

Meinst du die p88 habe alle ne Macke? Ich hab 3 getestet.
Das mit den Klammern werd ich mir hoffentlich merken.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

AtM88 als Ersatz für den Zero-Pi:

Warum sollte da was nicht funktionieren:
Bild
Bild

Irgendwann will man nur noch das es Läuft, egal wie es aussieht.
Antworten