Forum: Mikrocontroller und Digitale Elektronik ATMEGA644 SPI ..out of range...


von Rookie644 (Gast)


Lesenswert?

Hilfe,

ich versuche mit AVR-Studio 4 SP4 die einfache Routine "schreiben" auf 
den SPI BUS.

Leider kommt beim erstellen immer ein Fehler!!!



.include "m644def.inc"     Version           : 2.24

sbis SPSR0,SPIF0


: error: Operand 1 out of range: 0x2d

SPSR0 hat wohl einen falschen Verweis?

Wer hat ähnliche Erfahrungen?

Gruß rookie...

von Michael U. (Gast)


Lesenswert?

Hallo,

sbis erwartet Register und Bitnummer...
Bitnummer ist 0...7

Laut Studio ist Operand 1, also SPIF0 = 0x2d, also außerhalb 0..7

Wer oder was ist SPIF0?

Gruß aus Berlin
Michael

von Peter D. (peda)


Lesenswert?

Schau Dir einfach mal die Adresse im Include oder Datenblatt an.

Die neueren AVRs haben viele IO-Register ins SRAM verlegt, d.h. sie sind 
dann nur noch per LDS/STS erreichbar.


Peter

von Rookie644 (Gast)


Lesenswert?

Vielen Dank für die schnellen Antworten.

In der include "m644def.inc" Datei stehen die Register jeweils immer nur 
mit der 0 deshalb SPIF0 usw.

Es kamen Fehlermeldungen weil die Registernamen nicht bekannt waren.

Hab ich vielleicht eine falsche ...inc?

.equ  SPDR0  = 0x2e
.equ  SPSR0  = 0x2d
.equ  SPCR0  = 0x2c

; SPSR0 - SPI Status Register
.equ  SPI2X0  = 0  ; Double SPI Speed Bit
.equ  WCOL0  = 6  ; Write Collision Flag
.equ  SPIF0  = 7  ; SPI Interrupt Flag

; SPCR0 - SPI Control Register
.equ  SPR00  = 0  ; SPI Clock Rate Select 0
.equ  SPR10  = 1  ; SPI Clock Rate Select 1
.equ  CPHA0  = 2  ; Clock Phase
.equ  CPOL0  = 3  ; Clock polarity
.equ  MSTR0  = 4  ; Master/Slave Select
.equ  DORD0  = 5  ; Data Order
.equ  SPE0  = 6  ; SPI Enable
.equ  SPIE0  = 7  ; SPI Interrupt Enable

Ich sehe den Wald vor lauter Bäumen nicht mehr.

Melde mich noch mal.
Vielen Danke erst einmal.


Gruß






von johnny.m (Gast)


Lesenswert?

Der Befehl sbis funktioniert nur mit den unteren 32 I/O-Registern (bis 
Adresse 0x1F). Deshalb auch die Fehlermeldung. Da steht eindeutig 
"Operand 1 out of range: 0x2d", und Operand 1 des Befehls ist die 
Registeradresse, die anscheinend sehr wohl bekannt ist, da der Assembler 
den Bezeichner korrekt mit 0x2d ersetzt hat.

von Simon K. (simon) Benutzerseite


Lesenswert?

>>Hab ich vielleicht eine falsche ...inc?

Nein.

Peter Dannegger wrote:
> Die neueren AVRs haben viele IO-Register ins SRAM verlegt, d.h. sie sind
> dann nur noch per LDS/STS erreichbar.


Man ersetze
1
sbis SPSR0,SPIF0

durch
1
lds r16, SPSR0
2
sbrs r16, (1<<SPIF0)

(Alle Angaben ohne Gewähr ;))

von johnny.m (Gast)


Lesenswert?

Erstaunlich, dass ATMEL in der m644def.inc andere Registernamen benutzt 
als im Datenblatt (da heißen die Register SPSR, SPCR und SPDR, alles 
ohne die 0...). Die liegen aber alle noch im "normalen" I/O-Bereich, 
deshalb ist ein "lds" da nicht nötig. Da funktioniert auch noch "in" und 
"out".

von Rookie644 (Gast)


Lesenswert?

Vielen Dank für die Denkanstöße!!

Es klappt jetzt alles wunderbar.
Der ATMEGA644 scheint wohl nicht der richtige AVR für ein Anfänger wie 
mich zu sein.

Aber learning bei doing war auch nicht schlecht.

Danke an das Forum!!!!

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.