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; } } ---------------------------------------------
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)?
Achja: Wenn du die 255 als erstes Zeichen sendest, funktioniert es dann ?
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
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.
> 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.
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.
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.