Forum: Compiler & IDEs UART PC -> AVR Problem


von Rölf (Gast)


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;
 }
}
---------------------------------------------

von Thomas L. (tom)


Lesenswert?

Sowas würde ich in einem Interrupt lösen. Deine Schleife würde ja nie
terminieren.
Die IOs an PORTB hast du alle als Ausgang geschaltet (DDRB)?

von Thomas L. (tom)


Lesenswert?

Achja:
Wenn du die 255 als erstes Zeichen sendest, funktioniert es dann ?

von Roland P. (pram)


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

von Rölf (Gast)


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.

von Rölf (Gast)


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.

von Rölf (Gast)


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.

von Rölf (Gast)


Lesenswert?

das mit dem Case funktioniert.
Besten Dank!

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.