AVR: in och out i extended I/O?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
syltkaka
Inlägg: 188
Blev medlem: 9 december 2006, 18:55:09
Ort: Göteborg

AVR: in och out i extended I/O?

Inlägg 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"?
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg 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 ?
syltkaka
Inlägg: 188
Blev medlem: 9 december 2006, 18:55:09
Ort: Göteborg

Inlägg 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?
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg 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....
syltkaka
Inlägg: 188
Blev medlem: 9 december 2006, 18:55:09
Ort: Göteborg

Inlägg 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
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg 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
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg 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 ^^
syltkaka
Inlägg: 188
Blev medlem: 9 december 2006, 18:55:09
Ort: Göteborg

Inlägg av syltkaka »

Tack ska du ha. Det löser ju faktiskt problemet på ett snyggt sätt :)
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Tack! roligt att kunna vara till hjälp ^^
Användarvisningsbild
Abra Hana
Inlägg: 94
Blev medlem: 12 maj 2005, 13:20:58

Inlägg av Abra Hana »

* 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 ) .

:? :shock: :? :shock: :? :shock: :? :shock: :? :o :o :o :o
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg 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
Skriv svar