mikrocontroller.net

Forum: Compiler & IDEs UART PC -> AVR Problem


Autor: Rölf (Gast)
Datum:

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

Autor: Thomas L. (tom)
Datum:

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

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja:
Wenn du die 255 als erstes Zeichen sendest, funktioniert es dann ?

Autor: Roland Praml (pram)
Datum:

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

Autor: Rölf (Gast)
Datum:

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

Autor: Rölf (Gast)
Datum:

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

Autor: Rölf (Gast)
Datum:

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

Autor: Rölf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mit dem Case funktioniert.
Besten Dank!

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.