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...
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
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
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ß
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.
>>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 ;))
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.