Hallo,
ich möche wie im Datenblatt des avr 644p beschrieben, folgenden Code
verwenden:
out:
; Wait for empty transmit buffer
sbrs UCSR0A,UDRE0 ->hier Fehler
rjmp out
; Copy 9th bit from r17 to TXB8
cbr UCSR0B,TXB81 ->hier Fehler
sbrc r17,0
sbr UCSR0B,TXB81 ->hier Fehler
; Put LSB data (r16) into buffer, sends the data
sts UDR0,r16
ret
Es kommt 3 Mal der Fehler "Invalid register". Woran kann das liegen?
Besten Gruß
UCSR0A, UCSR0B sind (beim Atmega644P memory mapped) Spezialadressen und
die können bei den Befehlen cbr sbr und sbrs nicht als Operand verwendet
werden, wo ein Register erwartet wird.
..in 'meinem' Datenplatt vom m644p steht hier..
> sbrs UCSR0A,UDRE0 ->hier Fehler
^^^^
sbis
> cbr UCSR0B,TXB81 ->hier Fehler
^^^
cbi
> sbr UCSR0B,TXB81 ->hier Fehler
^^^
sbi
> sts UDR0,r16
^^^
out
Bin aber kein Assembler, ich trau mich an C ran, da erledigt der
Compiler das mit den IO-Räumen für mich :-)
HTH
@ g457
Zitat:
Re: Fehler: "Operand out of range" bei out-Befehl
Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum: 24.01.2007 10:50
Bei neueren AVR-Controllern sind etliche Register in den erweiterten
I/O-Bereich gewandert, der sich nur mit "lds" für Lesen und "sts" für
Schreiben ansprechen läßt. Direkte Bitmanipulationen sind dort auch
nicht mehr mit "cbi", "sbi", "sbis" und "sbic" zu machen, sondern
indirekt über ein temporäres Register mit "cbr", "sbr", "sbrs" und
"sbrc".
@ Krapao
der Code ist direkt aus dem Atmega 644p Datenblatt und dort werden diese
Register verwendet. Hast du eine andere Lösung?
Vielen Dank für die Antworten
Hi
>der Code ist direkt aus dem Atmega 644p Datenblatt und dort werden diese>Register verwendet. Hast du eine andere Lösung?
sbrs UCSR0A,UDRE0 ->hier Fehler
Hi
Zu früh gedrückt. Noch mal:
>der Code ist direkt aus dem Atmega 644p Datenblatt und dort werden diese>Register verwendet.
Nein. Dein Code:
sbrs UCSR0A,UDRE0 ->hier Fehler
Datenblatt:
sbis UCSRnA, UDREn
MfG Spess
Ich suche das jetzt nicht im Datenblatt.
Die Sequenz könnte man so implementieren:
1. Aktuellen Wert aus der Spezialadresse in ein Register laden (LDS da
Memory Mapped, sonst IN)
2. Das Register bitweise manipulieren ("cbr", "sbr", "sbrs")
3. Das Register in die Spezialadresse zurück speichern (STS da Memory
Mapped, sonst OUT)
> [unterschiedliche IO-Räume]
[Loriot]Ach.[/]
> der Code ist direkt aus dem Atmega 644p Datenblatt und dort werden diese> Register verwendet.
In ∗meinem∗ Datenplatt vom m644p (revision O 07/10) stehen obige
sbis/cbi/sbi/out drin, und zwar genau auf Seite 179.
Aber probiers lieber nicht aus, Dein Assembler meckert sicher wegen was
gaaanz anderem.
HTH, nix für ungut und EOD
Hi
>Aber probiers lieber nicht aus, Dein Assembler meckert sicher wegen was>gaaanz anderem.
Die Beispiele aus dem Datenblatt stimmen nicht. Die stammen von älteren
AVRs, bei denen die UART-REgister im IO-Bereich liegen. Allerding hat
Invalid register (Gast) versucht Befehle für r0...r31 (sbr,...) auf
IO-Register anzuwenden.
sbi/cbi sind zu ersetzen durch:
lds rxy,UCSR0B
cbr/sbr 1<<TXB8
sts UCSR0B,rxy
sbis/sbic durch
lds rxy,UCSR0A
sbrs/sbrc rxy,UDRE0
MfG Spess