Forum: Mikrocontroller und Digitale Elektronik Atmega88 empfängt über UART keine Daten?


von horst (Gast)


Angehängte Dateien:

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?

von XXX (Gast)


Lesenswert?

Hallo

Bar jeglicher Assembler-Ahnung:

USART_TX wird per rjmp angesprungen, aber per ret verlassen!?

Gruß
Joachim

von horst (Gast)


Lesenswert?

Danke!

Wenn man stundenlang vor dem Rechner sitzt sieht man oft die einfachsten 
Fehler nicht.

Hab ich gerade durch rcall ersetzt!

Funktioniert allerdings immer noch nicht

von ASM-Fan (Gast)


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!

von horst (Gast)


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

von Karl H. (kbuchegg)


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.

von Dietrich L. (dietrichl)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von horst (Gast)


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!

von horst (Gast)


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!

von Karl H. (kbuchegg)


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.

von Dietrich L. (dietrichl)


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

von horst (Gast)


Angehängte Dateien:

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)

von horst (Gast)


Angehängte Dateien:

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?

von Dietrich L. (dietrichl)


Lesenswert?

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

Du musst den RX-Interrupt auch einschalten! Oder habe ich das übersehen?
Ich habe jetzt nicht beim ATmega88 geschaut, aber beim ATmega8 heißt das 
Bit RXCIE im UCSRB-Register.

Gruß Dietrich

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.