Forum: Mikrocontroller und Digitale Elektronik AVR 644p Invalid register


von Invalid register (Gast)


Lesenswert?

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ß
von Krapao (Gast)


Lesenswert?

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.
von g457 (Gast)


Lesenswert?

..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
von Invalid register (Gast)


Lesenswert?

@ 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
von spess53 (Gast)


Lesenswert?

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
von spess53 (Gast)


Lesenswert?

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
von Krapao (Gast)


Lesenswert?

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)
von g457 (Gast)


Lesenswert?

> [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
von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.