Sida 1 av 1
AVR: in och out i extended I/O?
Postat: 28 september 2007, 20:27:51
av syltkaka
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"?
Postat: 28 september 2007, 21:45:12
av björn
Ser ut som att du har rätt(och atmel fel(tryck)), verkar fel med IN men jag har bara kollat som snabbast...
EDIT: Kollade lite till och har ändrat mig, det verkar vara rätt i databladet(som vanligt). Varför skulle inte IN kunna användas på TSWR ?
Postat: 28 september 2007, 22:26:08
av syltkaka
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?
Postat: 29 september 2007, 00:00:33
av Andax
De har liknande tryckfel i atmega128 databladet. Jag kör med metoden att skiva in och out på alla och ändra de som assemblatorn klagar över till lds sts. Ingen snygg lösning... ...men funkar hyffsat.
Postat: 29 september 2007, 00:14:49
av björn
Ok, jag kollade i något datablad till och där stod likadant. Så det är ett misstag av atmel, bör "anmälas" så att det ändras framöver.
konstigt att dom har gjort en sådan tabbe....
Postat: 29 september 2007, 10:03:24
av syltkaka
Okej. Då får jag lita på asseblatorn då och rätta det som den klagar på. Antagligen är det ett litet copy-paste fel då lite mindre µC kan klämma in alla I/O-register i de 64 lägsta adresserna och då kan man använda in/out till allt men på en större µC så går inte det.
Tack för hjälpen
Postat: 29 september 2007, 10:30:13
av thepirateboy
Det går inte att lita helt på Atmels datablad. De klipper och klistrar ofta mellan olika datablad och då uppstår fel. Kodexempel ska man tydligen vara extra kritisk mot. Det är inte alls säkert att det fungerar rakt av utan är mer tänkt att visa principen.
Källa: AVR-freaks
Postat: 30 september 2007, 11:36:42
av exile
Ett enkelt macro löser detta problem ganska enkelt
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
Exemplet är hämtat från
AVR001 Conditional Assembly and portability macros ,
Zip
hoppas det var till någon hjälp ^^
Postat: 1 oktober 2007, 12:46:56
av syltkaka
Tack ska du ha. Det löser ju faktiskt problemet på ett snyggt sätt

Postat: 2 oktober 2007, 21:15:56
av exile
Tack! roligt att kunna vara till hjälp ^^
Postat: 2 oktober 2007, 23:14:26
av Abra Hana
Postat: 2 oktober 2007, 23:51:54
av BEEP
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