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