AVR: in och out i extended I/O?
AVR: in och out i extended I/O?
Hej.
Är det fel i databladet till atmega 644? Det gäller ett exempel där man skriver tex "in r16,TWSR". Kolla i tabellen på sid 210 i databladet. Enligt sid 355 så ligger TWSR på adress 0xB9 och borde då inte alls gå att nå med instruktionerna in och out?
Är det möjligen så att jag missat något eller har dem verkligen klantat sig?
Borde det inte stå "lds r16,TWSR"?
Är det fel i databladet till atmega 644? Det gäller ett exempel där man skriver tex "in r16,TWSR". Kolla i tabellen på sid 210 i databladet. Enligt sid 355 så ligger TWSR på adress 0xB9 och borde då inte alls gå att nå med instruktionerna in och out?
Är det möjligen så att jag missat något eller har dem verkligen klantat sig?
Borde det inte stå "lds r16,TWSR"?
Enligt note 4 på sid 357 så kan in och out endast nå I/O adresserna 0x00 - 0x3F.
Så vad jag kan läsa mig till så borde Atmel ha ett tryckfel. Men jag undrar om någon verkligen har använt dem registerna i asm.
Det blir ju lite extra svårt om man måste kolla mot databladet hela tiden i vilken area registret ligger (I/O eller exended I/O) för att välja aningen in/out eller lds/sts. Är det såhär man får göra?
Så vad jag kan läsa mig till så borde Atmel ha ett tryckfel. Men jag undrar om någon verkligen har använt dem registerna i asm.
Det blir ju lite extra svårt om man måste kolla mot databladet hela tiden i vilken area registret ligger (I/O eller exended I/O) för att välja aningen in/out eller lds/sts. Är det såhär man får göra?
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Ett enkelt macro löser detta problem ganska enkelt
Exemplet är hämtat från AVR001 Conditional Assembly and portability macros , Zip
hoppas det var till någon hjälp ^^
Kod: Markera allt
;*********************************************************
;* Byte access anywhere in IO or lower $FF of data space
;* STORE - Store register in IO or data space
;* LOAD - Load register from IO or data space
;*********************************************************
.MACRO STORE ;Arguments: Address, Register
.if @0>0x3F
sts @0, @1
.else
out @0, @1
.endif
.ENDMACRO
.MACRO LOAD ;Arguments: Register, Address
.if @1>0x3F
lds @0, @1
.else
in @0, @1
.endif
.ENDMACRO
hoppas det var till någon hjälp ^^
* Den eller dom som skrev "in r16,TWSR". , i databladet till atmega 644 har rakt av kopierat denna kod raden från andra MCU .
Om ni kollar på detta databladet till ATmega32(L) .
http://www.atmel.com/dyn/resources/prod ... oc2503.pdf
sidan 328 i register summary , det står där att TWSR finns på address &01 ( &21 ) .

Om ni kollar på detta databladet till ATmega32(L) .
http://www.atmel.com/dyn/resources/prod ... oc2503.pdf
sidan 328 i register summary , det står där att TWSR finns på address &01 ( &21 ) .













Det står väl skrivet något om detta på sidan 8 om kod exempel?
The code examples assume that the part specific header file is included before compilation. For
I/O registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI" instruc-
tions must be replaced with instructions that allow access to extended I/O. Typically "LDS" and
"STS" combined with "SBRS", "SBRC", "SBR", and "CBR".
och i m644def.inc filen så står det...
; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ TWSR = 0xb9 ; MEMORY MAPPED
The code examples assume that the part specific header file is included before compilation. For
I/O registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI" instruc-
tions must be replaced with instructions that allow access to extended I/O. Typically "LDS" and
"STS" combined with "SBRS", "SBRC", "SBR", and "CBR".
och i m644def.inc filen så står det...
; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ TWSR = 0xb9 ; MEMORY MAPPED