Forum: Mikrocontroller und Digitale Elektronik zeichen empfangen


von Sahra N. (sahra_nana)


Lesenswert?

receive_loop:
   ldi    temp,  UCSR0A                     ; warten bis ein Byte 
angekommen ist
   sbrs      temp , RXC0
   rjmp     receive_loop
   lds       temp, UDR0                       ; empfangenes Byte nach 
temp kopieren
   out      PORTD, temp                     ; und an Port D ausgeben.
   rjmp     receive_loop

Hallo Leute,
ich möchte ein Zeichen per poling über Hyperterminal empfangen, zb wenn 
ich ein 1 schreibe geht ein LED an und bei 0 geht die aus.
ist es so richtig wie ich geschrieben habe. ich bin in µc eine 
Angängerin.
ich habe eine Atmega88P
danke

von Peter (Gast)


Lesenswert?

wir frage ist was übertragen wird? eine '0' order eine 0 (0x00) Wenn du 
in einem Terminialprogramm eine '0' eintippts wird eigentlich eine 48 
(0x48) übertragen und diese weist du jetzt dem Port zu.

von Sahra N. (sahra_nana)


Lesenswert?

ich will einfach das Beispiel im AVR-Tutorial Empfangen von Zeichen per 
Polling zum laufen bringen. nur als Übung

von Karl H. (kbuchegg)


Lesenswert?

Sahra Nana schrieb:
> ich will einfach das Beispiel im AVR-Tutorial Empfangen von Zeichen per
> Polling zum laufen bringen. nur als Übung

OK.
Was ist mit dem Beispiel. Klappt es bei dir nicht?
http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

von Sahra N. (sahra_nana)


Lesenswert?

ich habe nach meinem µC den Text angepasst, und so geschrieben:
 ; Port D = Ausgang
     ldi     temp, 0xFF
    out     DDRD, temp
     ; Baudrate einstellen
     ldi     temp, HIGH(UBRR_VAL)
    sts     UBRR0H, temp
    ldi     temp, LOW(UBRR_VAL)
    sts     UBRR0L, temp
     ; Frame-Format: 8 Bit
     ldi     temp, (1<<USBS0)|(3<<UCSZ00)
    sts     UCSR0C, temp
    ldi    temp,1<< RXEN0                     ; RX (Empfang) aktivieren
    sts    UCSR0B , temp
receive_loop:
   ldi    temp,  UCSR0A                     ; warten bis ein Byte 
angekommen ist
   sbrs      temp , RXC0
   rjmp     receive_loop
   lds       temp, UDR0                       ; empfangenes Byte nach 
temp kopieren
   out      PORTD, temp                     ; und an Port D ausgeben.
   rjmp     receive_loop
das Programm zeigt keine Fehler, also 0 Fehler 0 Warning, aber ich kann 
nicht in Hyperterminal was schreiben.

von Karl H. (kbuchegg)


Lesenswert?

Sahra Nana schrieb:

> das Programm zeigt keine Fehler, also 0 Fehler 0 Warning, aber ich kann
> nicht in Hyperterminal was schreiben.

Da heißt erst mal gar nichts.
0 Fehler, 0 Warnung heißt nur, dass dein Programm keine 
'Grammatik-Fehler' aufweist.
"Das Segelboot schimpft die Gabel" ist laut Duden auch korrekt und 
trotzdem ein sinnloser Satz.

Kannst du senden, sprich: Hast du schon getestet ob die UART 
funktioniert und ob PC und AVR miteinander prinzipiell können?

Immer mit dem Senden anfangen. Da kann man Hardwarefehler leichter 
diagnostizieren.

von Sahra N. (sahra_nana)


Lesenswert?

senden kann ich ja, aber empfangen leider nicht..........
MFG

von Karl H. (kbuchegg)


Lesenswert?

Sahra Nana schrieb:
> senden kann ich ja, aber empfangen leider nicht..........

OK. das ist gut.
Das heist, die Leitung steht prinzipiell

Dann mach mal folgendes.
1
   ...
2
receive_loop:
3
   ldi    temp,  UCSR0A                     ; warten bis ein Byte angekommen ist
4
   sbrs      temp , RXC0
5
   rjmp     receive_loop
6
7
   lds       temp, UDR0                       ; empfangenes Byte nach temp kopieren
8
9
   ldi      temp, 0xAA          ; <------------
10
   out      PORTD, temp                     ; und an Port D ausgeben.
11
   rjmp     receive_loop

hier wird nicht das empfangene Zeichen ausgegeben, sondern einfach das 
Bitmuster für 0xAA (das ist abwechselnd 0 und 1). Wenn du 8 LED am PORT 
D hast, musst du das auf jeden Fall sehen.

Das Ziel ist es, herauszufinden, ob überhaupt etwas empfangen wird. 
Irgendwas.

Sobald du am Hyperterminal eine Taste drückst, muss sich am PORT D etwas 
tun

(Im Hyperterminal hast du das Handshake, die 'Flusskontrolle', 
ausgeschaltet?)

> MFG

von Sahra N. (sahra_nana)


Lesenswert?

also keine Reaktion der macht nicht mit,

von Karl H. (kbuchegg)


Lesenswert?

Die Checkliste von weiter oben bist du schon durchgegangen.
Da ist insbesondere ein Test drinnen, der darüber Aufschluss geben kann, 
ob vom PC überhaupt etwas weggesendet wird.
(Das du im hyperterminal deine tastendrücke nicht siehst, bedeutet erst 
mal gar nichts. Je nach Einstellung des lokalen Echos ist das normal)

von Sahra N. (sahra_nana)


Lesenswert?

schön guten Morgen,
welche checkliste meinste du, und wo finde ich die?
MFG
S.N

von Karl H. (kbuchegg)


Lesenswert?

Sahra Nana schrieb:
> schön guten Morgen,
> welche checkliste meinste du, und wo finde ich die?

Beitrag "Re: zeichen empfangen"

von Sahra N. (sahra_nana)


Lesenswert?

ich habe die Liste gechekt, anscheint habe alles richtig eingestellt, 
wenn ich das Programm laufen lasse, leucht die Diode, die am Port  PD7 
angeschlossen habe permanent. aber der Hyperterminal  reagiert nicht, 
soll man vielleich etwas in HyT umstellen.
danke

von Sahra N. (sahra_nana)


Lesenswert?

ich habe jetzt das auskommentiert:
  ;ldi      temp, 0xAA
und wenn nich irgendwas eintippe, wird die Diode leuchten, aber der 
HYTerminal, zeigt nicht was ich schreibe

von Uwe (Gast)


Lesenswert?

Hi!
>  ldi    temp,  UCSR0A               ; warten bis ein Byte angekommen ist
>  sbrs   temp , RXC0
sollte eher lauten:
   lds    temp,  UCSR0A              ; warten bis ein Byte angekommen 
ist
   sbrs   temp , RXC0

Viel Erfolg, Uwe

von geb (Gast)


Lesenswert?

vielleicht RX /TX vertauscht, probier mal Pin 2 und 3 des Sub-D Steckers 
zu vertauschen.

Grüße Gebhard

von Karl H. (kbuchegg)


Lesenswert?

Sahra Nana schrieb:
> ich habe jetzt das auskommentiert:
>   ;ldi      temp, 0xAA
> und wenn nich irgendwas eintippe, wird die Diode leuchten, aber der
> HYTerminal, zeigt nicht was ich schreibe

Das ist normal.
HyperTermianl wartet darauf, dass dein AVR die Zeichen zurückschickt, 
die er empfangen hat. AUf die Art kann man nämlich gut kontrollieren, ob 
die Übertragung klappt. Nur dann wenn Hyperterminal das getippte auch 
anzeigt kann man sicher sein, dass die Strecke PC->AVR und wieder zurück 
einwandfrei funktioniert und nicht zb irgendwo ein Kabel abgefallen ist.

von spess53 (Gast)


Lesenswert?

Hi

Seht euch mal den Tip von Uwe an.

MfG Spess

von Sahra N. (sahra_nana)


Angehängte Dateien:

Lesenswert?

es geht auch mit ldi, das Problem war: ich soll was in HyT einstellen, 
und zwar die Ascii setup, die 2 häckschen oben im Bild

von spess53 (Gast)


Lesenswert?

Hi

>es geht auch mit ldi

Das 'ldi' macht deine Routine wirkungslos!

  ldi    temp,  UCSR0A lädt die Adresse des Registers
  lds    temp,  UCSR0A lädt den Inhalt des Registers

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Sahra Nana schrieb:
> es geht auch mit ldi,

Äh. Nein
ldi macht etwas ganz anderes

> das Problem war: ich soll was in HyT einstellen,
> und zwar die Ascii setup, die 2 häckschen oben im Bild

Das erste Häkchen bestimmt nur was passiert, wenn du 'Return' drückst.
Das zweite Häkchen. Nun, das mag für dich jetzt so aussehen, als ob es 
dein Problem löst. Aber das tut es nicht. Es besagt nur, dass 
Hyperterminal die Zeichen die es rausschickt auch gleichzeitig anzeigt. 
Ob die Zeichen tatsächlich rausgehen bzw. ob sie auch korrekt empfangen 
werden kann man damit nicht feststellen.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

'Früher' <tm> hat man sowas mit einem Längschlitzschraubendreher durch 
Brücken von TxD und TxD direkt am 8051 'überprüft'. Dran gehalten und 
kurz ins Terminalwindow gehackt, ferrrtisch.

von Sahra N. (sahra_nana)


Lesenswert?

hallo abdul,
wo kommst du her, dein Name klingt marokkanisch, stimmt es?

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.