Hallo Zusammen, ich versuche mich gerade mal wieder im verstehen von c. ich hab mir ein wenig hardware aufgebaut und diese mit einem assembler programm getestet. funktioniert wunderbar! nun wollte ich die gleiche funktion in c schreiben und stecke fest. wenn der conroller die uart-daten überhaupt einliest, dann nur sporadisch. gegenwärtig macht er mal wieder nichts. die empfangenen daten sollen in einem array zwischengespeichert und einfach wieder gesendet werden (dmx512). die sende routine funktionier sogar, nur sendet sie nichts anderes als "0". in der main macht der controller nichts ausser "nops". ich verwende einen atmega64 und gcc mit avr-studio. mit 16MHz und Baudrate 250kHz (dmx) es scheint so, dass es probleme gibt, beim auslesen des "udr0" in der rx routine, denn wenn ich dort einen fixen wert einsetze, ist alles schön, nur dass ich eben keinen fixen wert haben möchte. wenn jemand die zeit hat mal über den code zu schauen und sagt wo der fehler liegen kann und was ich besser machen kann, würde ich mich echt freuen. auch thema header datei - was gehört rein, was nicht - ist interessant, nicht dass ich mir unsinnige eigenarten angewöhne. vorab schon einmal vielen dank an alle c gurus!
hallo noch einmal, ich hab die rx routine zum laufen bekommen, aber verstehe nicht wieso der erste weg nicht ging.
1 | |
2 | |
3 | uint8_t rx_data; |
4 | |
5 | rx_data = UDR0; |
6 | |
7 | .....
|
8 | |
9 | |
10 | rx0_buffer[....] = rx_data; |
ergab nur mist. ich habe nun in der letzten zeile rx_data mit "UDR0" ersetzt und es funktioniert. wieso kann ich aber die daten nicht aus "rx_data" nehmen?
hallo, komischer weise funktioniert dies sogar, aber warum ... im tutorial steht: "Variablen die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)), als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem volatile deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen" aber oben genannter fall findet komplet nur in einer interrupt routine statt. es braucht nicht von anderen stellen im programm auf die variable zugegriffen werden. eigentlichist es in der ISR nichts anderes als:
1 | ...
|
2 | rx_data = UDR0; |
3 | |
4 | ... ein paar anweisungen/tests ... |
5 | |
6 | rx_buffer[i] = rx_data; |
selbst während der paar anweisungen wird nicht auf "rx_data" zugegriffen und wie gesagt, alles in einer ISR. Wo liegt mein denkfehler? VG
Die Variable wird vermutlich einfach wegoptimiert, da sie sich im Hauptprogramm nicht ändert.
ok, vielen dank für die information - und so bleibt C do ein mysterium. ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.