Atmega88 empfängt über UART keine Daten?

Gast #2542393
Lesenswert?

Hallo zusammen!

Mein Problem ist, dass mein Programm/Schaltung zwar die Daten ausgiebt, 
jedoch scheinbar keine Empfängt und gleichzeitig wieder ausgibt. (ECHO)

Ausgabe des µC teste ich mit: minicom -D /dev/ttyUSB0 -b 9600
Zeichen sende ich mit: echo "test" > /dev/ttyUSB0

Hast jemand eine Idee warum das nicht funktioniert?
Angehängte Dateien:
Gast #2542422
Lesenswert?

Das Programm wird meines Erachtens EINMAL durchlaufen,
also es wird was gesendet, dann ein Zeichen erwartet und DANN
in der Endlos-Schleife

"    schleife:
        rjmp schleife"

nicht mehr getan.

Gib wenigstens das Zeichen noch aus!
Gast #2542427
Lesenswert?

USART_RX:
    lds temp, UCSR0A                   ; Registerinhalt von UCSR0A nach 
temp kopieren
    sbrs temp, RXC0                    ; Warten bis Byte angekommen ist
    rjmp USART_RX
    lds zeichen, UDR0                  ; Empfangenes Zeichen nach 
zeichen kopieren
    rcall USART_TX                     ; Zeichen ausgeben
    rjmp USART_RX                      ; Endlosschleife Empfangen

Siehe Endlosschleife Empfang
Das Programm wurde so geschrieben, dass es zum Test die Grundfunktionen 
beherrscht
#2542434
Lesenswert?

Häng als erstes mal deine Empfangs-Echo Funktion in die Hauptschleife 
rein, damit der µC ständig lauscht und zurücksendet.

> Zeichen sende ich mit: echo "test" > /dev/ttyUSB0

und woran erkennst du dann, dass der µC etwas zurücksendet?`Wo wird das 
angezeigt?

Fahr ein Terminalprogramm (minicom) hoch und teste mit dem (auf der 
Tastatur klimpern). Das ist doch Unsinn von der Command Line aus etwas 
zu senden.
#2542444
Lesenswert?

horst schrieb:
> USART_RX:
>     lds temp, UCSR0A                   ; Registerinhalt von UCSR0A nach
> temp kopieren
>     sbrs temp, RXC0                    ; Warten bis Byte angekommen ist
>     rjmp USART_RX
>     lds zeichen, UDR0                  ; Empfangenes Zeichen nach
> zeichen kopieren
>     rcall USART_TX                     ; Zeichen ausgeben
>     rjmp USART_RX                      ; Endlosschleife Empfangen
>
> Siehe Endlosschleife Empfang

Tus NICHT!

Das sieht kein Mensch. Schreib dir eine Funktion die 1 Zeichen sendet 
(die hast du schon). Schreib dir eine Funktion, die auf 1 Zeichen wartet 
und das Zeichen holt. Die hast du noch nicht, bist aber nahe drann. Und 
dann kombiniere diese beiden Funktionen

schleife:
    rcall USART_RX
    rcall USART_TX
    rjmp schleife


Ein Unterprogramm (Funktione) hat 1 Aufgabe. Sie soll aber auch nur 
diese 1 Aufgabe machen. Alles andere ist (gerade in Assembler) ein 'Ask 
for trouble'. Du forderst mit solchen Hintertürchen es geradezu heraus, 
dass du selber Fehler machst bzw. dass wer anderer (mich inklusive) 
Dinge nicht sieht, die du programmiert hast. Bei einer Funktion USART_RX 
ist die Erwartungshaltung jedes normalen Menschen nicht die, dass die in 
einer Endlosschleife mündet. Die implizite Erwartungshaltung ist es, 
dass die Funktion zurückkommt und das empfangene Zeichen abliefert.
Gast #2542446
Lesenswert?

Karl Heinz Buchegger schrieb:
> und woran erkennst du dann, dass der µC etwas zurücksendet?`Wo wird das
> angezeigt?
>
> Fahr ein Terminalprogramm (minicom) hoch und teste mit dem (auf der
> Tastatur klimpern). Das ist doch Unsinn von der Command Line aus etwas
> zu senden.

Siehe meinen ersten Beitrag.
Ich verwende minicom, allerdings zeigt es mir dort keine 
tastertureingaben an, ob das normal ist? Jedenfalls funktioniert die 
Ausgabe. Deshalb hab ich das zusätzlich durch die Konsole probiert.

Aber dennoch danke für den Hinweis!
Gast #2542449
Lesenswert?

Dietrich L. schrieb:
> Hast Du die HW kontrolliert, ob die RX-Daten auch wirklich am µC
> ankommen? Also mit Oszi direkt am Pin (nicht am Sockel) gemessen?
> Wenn kein Oszi vorhanden: Baudrate sehr niedrig einstellen und mit LED
> beobachten (es reicht ja, testweise nur am Terminalprogramm zu ändern).
>
> Gruß Dietrich

Super Tipp, werd ich probieren!
#2542453
Lesenswert?

horst schrieb:

> Siehe meinen ersten Beitrag.

In deinem ersten Beitrag steht, dass du an den µC sendest, indem du mit 
einem echo ausgibst und die Ausgabe auf die serielle redirectest.

> Ich verwende minicom, allerdings zeigt es mir dort keine
> tastertureingaben an, ob das normal ist?

Ja, ist normal.
Damit hat man eine einfache Kontrolle, ob die Gegenstelle auch etwas 
empfangen hat. Die Gegenstelle, also dein µC hat die Aufgabe, alles was 
es empfängt auch zurückzusenden. Das nennt man das 'Echo'. Bleibt das 
Echo aus, dann weiß man, dass irgendwas passiert ist, zb Kabel hat sich 
gelöst oder wurde abgezogen.

> Jedenfalls funktioniert die
> Ausgabe. Deshalb hab ich das zusätzlich durch die Konsole probiert.

Dann hättest du uns die Sache mit der Ausgabe mittels echo gar nicht 
erzählen brauchen. Du testest deine serielle aussschliesslich mit dem 
Terminalprogramm. Alles andere ist Unsinn.


Hast du den Test von Dietrich schon gemacht und dir eine LED an den Rx 
Pin vom Mega gehängt? Wenn du dort nichts siehst, könnte am PC das 
Hardware Handshake aktiviert sein, welches verhindert, dass der PC 
überhaupt sendet.
#2542458
Lesenswert?

horst schrieb:
> Ich verwende minicom, allerdings zeigt es mir dort keine
> tastertureingaben an,

Der erste Test sollte immer sein, Pin 2 und 3 (RX und TX) am 
Sub-D-Stecker zu verbinden (nur am PC angeschlossen, sonst nirgendwo) 
und sehen, ob Du das (HW-) Echo siehst!
Dann weißt Du, dass Terminalprogramm und Kabel tut.
Als nächstes kommt das RS232-Interface am µC: µC entfernen und RX / TX 
verbinden.
Und dann - wie oben gesagt - messen, ob RX am richtigen Pin ankommt.

Gruß Dietrich
Gast #2543827
Lesenswert?

Vielen Dank!

Eure Ratschläge haben mir wirklich geholfen!

Allerdings habe ich es mit minicom nicht hinbekommen, da scheinbar meine 
Tastertureingaben nicht übermittelt werden. Eventuell muss man etwas 
anderes einstellen.

Auf jedenfall hat mein Programm anstandslos funktioniert, nachdem ich 
den Ledtest vorerst mit der Software hterm versuchte.

Falls jemand mal mein Programm braucht und vor einem ähnlichen Problem 
steht (Datei im Anhang)
Angehängte Dateien:
Gast #2544372
Lesenswert?

Bevor ich jetzt ein neues Thema eröffne:

Ich habe nun versucht das ganze mit Interrupts zu lösen. Als ich 
versuchte im Handler den LED abzuschalten reagierte das nicht beim 
Senden über den PC.

So schließe ich daraus das die der Interrupt Handler gar nie aufgerufen 
wird.

Hat jemand eine Idee warum?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren