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
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.