Forum: Compiler & IDEs Mega64 mit gcc --> dmx lesen/schreiben


von Nicky C. (nicky)


Angehängte Dateien:

Lesenswert?

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!

von Nicky C. (nicky)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

volatile

von Nicky C. (nicky)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Die Variable wird vermutlich einfach wegoptimiert, da sie sich im 
Hauptprogramm nicht ändert.

von Nicky C. (nicky)


Lesenswert?

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
Noch kein Account? Hier anmelden.