Forum: Mikrocontroller und Digitale Elektronik UDR0 auslesen


von joerg_seemann (Gast)


Lesenswert?

frage vom anfänger:

ATmega 168 UART, Empfangen

wie lese ich UDR0

im datenblatt steht 'in r16,UDR0', aber register out of range.
habs erfolglos mit lds probiert, wobei das beschreiben mit 'sts' 
funktioniert.

ratlosigkeit???...

von Jörg X. (Gast)


Lesenswert?

es muss aber mit "lds ..." gehen (lds kan ALLE 
register/IO-Adressen/Speicheradressen lesen)

von Bend G. (frankyfarell0)


Lesenswert?

Hallo bin anfänger  in dem bereich, ich habe ein asm progr geschriben
und weiss nicht wieich mit mein PC communizieren kann, ich lade den prog
im mikro_c und kommt nichst in den Hyper-terminal.
ist es moeglich auf den selbe pc alles zu tun?

von Stefan (Gast)


Lesenswert?

@ Cyrille Guetsop

Mach' eine eigene Diskussion auf. Gib' den Quelltext vom vorhandenen 
Programm an sowie einen Schaltplan, aus dem man erkennen kann, wie deine 
µC (welcher?) Hardware aufgebaut und an den PC angeschlossen ist.

von Stefan (Gast)


Lesenswert?

> 'in r16,UDR0', aber register out of range.

Du hast die richtige Include-Datei für den Prozessor eingebunden? Wie 
sieht der restliche Quelltext aus? Kommt die Fehlermeldung exakt bei 
dieser Quellcodezeile?

von Jörg X. (Gast)


Lesenswert?

UDR0 liegt auf (RAM- nicht I/O-) Adresse "0xC6" laut Registersummary, es 
kann also nur
1
lds r16, UDR0
2
    ;(oder auch ld rn, -<X,Y,Z>+, ldd rn, <Y,Z> 
3
    ;wenn du den Pointer entspr. vorlädst, lds benötigt 2 Worte im Flash

von joerg_seemann (Gast)


Angehängte Dateien:

Lesenswert?

guten morgen

ich hab hier mal meinen quelltext, mit dem ich ein gelesenes byte wieder 
ausgeben möchte. im terminal kommt zwar was zurück, aber immer nur ne 
null.

von Tassilo B. (big_t)


Lesenswert?

Ersetze 'brne' durch 'rjmp' und schon sollte es gehen. Für 'brxx' fehlt 
der vorher nötige Vergleich (cp, cpi, dec etc.) um das SREG mit 
'gültigen' Werten zu füllen.

Tassilo

von joerg_seemann (Gast)


Lesenswert?

der vorher nötige vergleich ist doch von der sache das sbrs?
habs geändert und leider keinen anderen effekt als vorher.

Empfangen:
;
;
lds temp, UCSR0A
sbrs temp, 7
rjmp Empfangen
lds data, UDR0

ret

etwas an diesem Ausdruck klappt nicht.
auch ohne etwas empfangen zu haben wird der Programmteil bis ret 
ausgeführt.

von joerg_seemann (Gast)


Lesenswert?

die merkwürdigkeit geht noch weiter, meine sendeanweisung funktioniert 
und ist getestet. So, jetzt hab ich das programm so geändert, dass die 
variable data mit 0x08 gefüllt und gesendet wird, nachher empfang und 
senden des neuen datawertes:

ldi data, 0x08


Hauptprogramm:

call SendenRS

call Empfangen

call SendenRS

rjmp Hauptprogramm



SendenRS:; Sendefunktion

lds temp, UCSR0A
sbrs temp, UDRE0
rjmp SendenRS
sts  UDR0,data

ret


Empfangen:

lds temp, UCSR0A
sbrs temp, 7
rjmp Empfangen
lds data, UDR0

ret


um mich so richtig zu ärgern passiert jetzt, wider meiner erwartung, das 
senden von zwei nullen. das heisst, die 0x08 wird irgendwie unter den 
tisch gekehrt.

da läuft was grundlegend schief...

von joerg_seemann (Gast)


Lesenswert?

ok, das letzte problem ist gelöst, kriege ne 0x08 gesendet.

aber kann das sein, das ich das falsche RX-register auslese?
es wird wohl was empfangen, aber nicht an data übergeben.

von Tassilo B. (big_t)


Lesenswert?

Laut AVRStudio-Hilfe ändert sbrs nix am SREG und nur das SREG bestimmt, 
ob brxx abzweigt oder nicht! In dem ganzen Programm ist auf den ersten 
Blick kein Befehl, der die brxx-relevanten Bits im SREG verändert -> 
brne ist fehl am Platz.
Woher weißt du überhaupt, daß die Empfangen-Routine bis zum ret 
durchläuft?

Tassilo

von joerg_seemann (Gast)


Lesenswert?

weil die nachstehende senden-funktion ausgeführt wird.

von Tassilo B. (big_t)


Lesenswert?

Da war ich wohl zu langsam...

Ich werde das Gefühl nicht los, daß hier was Grundlegendes nicht stimmt:
Reduziere die Hauptschleife mal zu:
[avrasm]
Hauptprogramm:

call SendenRS

inc data

rjmp Hauptprogramm
[/avrasam]

Wenn die ausgegebenen Werte eine durchgehende Reihe ergeben, dann sehen 
wir weiter...

Tassilo

von joerg_seemann (Gast)


Lesenswert?

ja, das geht.

von Tassilo B. (big_t)


Lesenswert?

Ok, dann kann man halbwegs sicher sein, daß die ganzen Takteinstellungen 
auch wirklich richtig sind.
Mit was sendest du denn die einzelnen Zeichen an den AVR? Ich habe die 
Befürchtung, daß da noch was nicht stimmt...

Tassilo

von ecslowhand (Gast)


Lesenswert?

Du initialisierst das Baudraten-Register falsch, es besteht aus ZWEI 
Registern !!!


ldi  r16, LOW((clock/(16*baudrate))-1)       ; Baudrate berechnen..
ldi  r17, HIGH((clock/(16*baudrate))-1)
sts  UBRR0L, r16        ; ...und setzen
sts  UBRR0H, r17


Lg EC

von Tassilo B. (big_t)


Lesenswert?

???
Macht er doch richtig (siehe UART_2.asm)!

Tassilo

von ecslowhand (Gast)


Lesenswert?

@Tassilo:

Ja, macht er richtig. Sorry, habs zu schnell überlesen....

Sorry !



von joerg_seemann (Gast)


Lesenswert?

mittagspause...

ich kommuniziere mit einem programm namens rs232 terminal.

das hab ich aus 'messen steuern und regeln mit c-control 2'

von Tassilo B. (big_t)


Lesenswert?

Hm, ist mir jetzt kein Begriff, aber um auf Nummer sicher zu gehen, 
nimm' mal sowas wie HTerm (http://www.der-hammer.info/terminal/), da 
kann man am besten sehen was gesendet wird.
Notfalls geht auch das windowseigene Hyperterminal...

Tassilo

von joerg_seemann (Gast)


Lesenswert?

big_T, das klappt.


scheinbar lags an dem programm, danke für den tip.

AHOI und besten dank nochmal...

von Tassilo B. (big_t)


Lesenswert?

Na also, geht doch :-)

Tassilo

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.