UART PC -> AVR Problem

Gast #365001
Lesenswert?
• ▲
▼
Hallo!

Mein m8515 will meine 255 nicht erkennen. In Visual Basic sende ich
wahlweise 128 oder 255 als Code. Die 128 werden erkannt und die
LED-Leiste schaltet 0xF0. Aber wenn ich 255 sende, bleibt die 0xF0
stehen. Nix ändert sich.

Der Code dürfte doch richtig sein!?
Mit der while-Abfrage kann ich es nicht machen da es an der Stelle
stehen bleiben würde bis etwas empfangen würde, zwischendurch muss aber
auch der AVR mal zum PC senden.

---------------------------------------------
for (;;)
{
if (bit_is_set(UCSRA, RXC) && (UDR == 128))
 {
 PORTB = 0xF0;
 }


if (bit_is_set(UCSRA, RXC) && (UDR == 255))
 {
 PORTB = 0xAA;
 }
}
---------------------------------------------
#365004
Lesenswert?
• ▲
▼
Der Code ist falsch, du kannst das UDR-Register so nicht mehrmals
hintereinander auslesen. Ein Auslesen setzt nämlich RXC zurück, somit
kann die zweite IF bedingung nicht ausgeführt werden. Mach eine
verschachtelte IF-Abfrage und evtl besser eine Switch abfrage:

if (bit_is_set(UCSRA,RXC) {
  switch(UDR) {
     case 128:
       PORTB=0xF0;
       break;
     case 255:
       PORTB=0xAA;
       break;
  }
}

Gruß
Roland
Gast #365005
Lesenswert?
• ▲
▼
bei 255 zuerst senden, passiert nichts. Die erste Abfrage wird immer nur
ausgeführt. In diesem Fall 128.

Irgendwas im UART scheint danach zu blockieren. Der weitere
Programmablauf wird jedoch problemlos fortgesetzt. es hängt sich also
nicht auf.
Gast #365006
Lesenswert?
• ▲
▼
> Ein Auslesen setzt nämlich RXC zurück, somit
> kann die zweite IF bedingung nicht ausgeführt werden.

Ich denke wenn ein Byte angekommen ist, wird RXC gesezt und kann mit
der if Anweisung abgefragt werden.
Es kommt ein Byte rein, das Flag wird gesetzt und damit sind alle
if-Bedingungen hier zu 50% erfüllt. Fehlt noch die richtige
Byte-Übereinstimmung mit dem UDR. Genau das tun die if-Abfragen doch
hier.
Verstehe nicht warum der Code falsch ist.

Werde deinen jetzt mal probieren.
Gast #365007
Lesenswert?
• ▲
▼
ach ja, verstehe, die if-Anwesung selbst führt ja ein Lese-Versuch durch
und damit wird die Bedingung für
bit_is_set(UCSRA, RXC) in der zweiten Schleife auf jeden Fall
negativ...

ok hast du wohl recht.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.