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???...
es muss aber mit "lds ..." gehen (lds kan ALLE register/IO-Adressen/Speicheradressen lesen)
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?
@ 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.
> '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?
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 |
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.
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
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.
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...
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.
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
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
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
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
mittagspause... ich kommuniziere mit einem programm namens rs232 terminal. das hab ich aus 'messen steuern und regeln mit c-control 2'
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
big_T, das klappt. scheinbar lags an dem programm, danke für den tip. AHOI und besten dank nochmal...
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.