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?
Hallo Bar jeglicher Assembler-Ahnung: USART_TX wird per rjmp angesprungen, aber per ret verlassen!? Gruß Joachim
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
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!
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
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.
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
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.
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!
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!
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.
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
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)
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.