Sida 1 av 1

Ersättare för Adiw?? (Tiny15)

Postat: 28 april 2005, 20:47:00
av Hedis
Jag sitter och portar över kod ifrån en Mega32:a till en Tiny15.

Det mesta är löst förutom en sak.

Jag använder Adiw för att öka Z-pekaren. T15 har dock inte det kommandot i sin in instruktionslista. Vad kan jag använda istället för att öka ZH och ZL?


Såhär ser det ut i Mega32 koden.

Kod: Markera allt

adiw	ZH:ZL,1

Postat: 28 april 2005, 21:41:27
av cykze
Om du använder Z tillsammans med t ex 'ld' eller 'st' så kan du ju ange att Z-pekaren ska öka automatiskt med ett, så slipper du göra det manuellt. Om du inte använder Z till det eller av någon annan anledning vill öka Z med ett så är väl ett sätt att köra med,

ld dummy, Z+
(där dummy är något register som du inte använder)

Om du nu vill öka/minska med ett alltså. Annars får du väl kolla på subi och sbci.

Postat: 28 april 2005, 22:23:00
av Hedis
Jag pekar Z för att läsa id´t på en I-button som jag har i minnet.
Jag testar byte för byte och ökar då Z för att testa nästa byte.
Alltså: läser in 1:a byten ifrån nyckeln, gämnför den med 1:a byten i key:, sedan nästa osv.

Jag provade att köra inc r30, inc r31 men det funkade inte. (zl=r30, zh=r31)

Kod: Markera allt

	ldi		zl,low(key*2)		;Peka Z emot lookup tabellen
	ldi		zh,high(key*2)

key:
	.db $02,$02,$4F,$C1,$00,$01,$00,$E9

Postat: 28 april 2005, 23:02:57
av cykze
När du läser av det som ligger där Z pekar så använder du väl 'lpm'? Då borde du kunna göra så här för att spara ett värde i taget och samtidigt öka Z-pekaren med ett.

lpm r16, Z+ ;sparar första värdet i 'key' i r16
;gör något med r16
lpm r16, Z+ ;sparar andra värdet i 'key' i r16
osv.

Postat: 29 april 2005, 00:21:27
av Melker
Finns inte adiw som intruktion så skulle jag inte tro att instruktionerna som i vanliga fall går att skriva med +/- finns heller. Eftersom att skriva +/- framför/bakom registret inte är ett makro, utan tillhör instruktionen LD, LPM ST mfl och har svårt att se varför man skulle plocka bort adiw, men behålla dessa troligtvis-krångligare-att-implementera-i-hårvaran-instruktioner :)

Du får helt enkelt öka på r30 och sedan kolla om det är lika med noll, och isåfall öka på även r31.

Postat: 29 april 2005, 08:28:54
av Hedis
Ok, för det ungerade inge vidare med cykze´s alternativ. :( (tack ändå)
Varför kolla om r30 är = 0 innan man ökar r31?
Får prova detta när jag kommer hem sen.

Postat: 29 april 2005, 08:50:38
av cykze
Melker: Det har du säkert rätt i. :roll:

Hedis: För att det är så ett binärt tal är uppbyggt. ZH:ZL utgör ju ett 16 bitars-tal tillsammans. Så när ZL slår över från 11111111 till 00000000 så ska ZH öka med ett.

Postat: 29 april 2005, 09:01:43
av Hedis
Ahhh, justeja :)

Postat: 29 april 2005, 10:48:49
av erixon
Annars ett het tips är att kolla på apliktions bladen till avr närmare bestämt http://www.atmel.com/dyn/resources/prod ... avr202.zip

Kod: Markera allt

;***************************************************************************
;* 
;* "addi16" - Adding 16-bit register with immediate
;*
;* This example adds a register variable (addi1l,addi1h) with an 
;* immediate 16-bit number defined with .equ-statement.   The result is
;* placed in (addi1l, addi1h).
;*
;* Number of words	:2
;* Number of cycles	:2
;* Low registers used	:None
;* High registers used	:2
;*
;* Note: The sum and the addend share the same register.  This causes the
;* addend to be overwritten by the sum.
;*
;***************************************************************************

;***** Register Variables
.def addi1l = r16
.def addi1h = r17

;***** Immediate 16-bit number
.equ addi2 = 0x1234

;***** Code
addi16:	subi	add1l, low(-addi2)	;Add low byte ( x -(-y)) = x + y
	sbci	add1h, high(-addi2)	;Add high byte with carry
	;Expected result is 0xBE9C
:)