www.mikrocontroller.net

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


Autor: Nicky C. (nicky)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Nicky C. (nicky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo noch einmal,

ich hab die rx routine zum laufen bekommen, aber verstehe nicht wieso 
der erste weg nicht ging.
 

uint8_t rx_data; 

rx_data = UDR0;

.....


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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile

Autor: Nicky C. (nicky)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
rx_data = UDR0;

... ein paar anweisungen/tests ...

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

Autor: Gast (Gast)
Datum:

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

Autor: Nicky C. (nicky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, vielen dank für die information - und so bleibt C do ein mysterium. 
;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.