Witam,
próbuję od wczoraj przerobić wprost w Bascomie, dokładnie w przerwaniu pewne polecenie na asembler:
gdzie:
cyfry to --> Dim Cyfry(4) as Byte
nr_wysw --> Dim nr_wysw as Byte
Tabela - to tabela zdefiniowanych cyfr dla wyświetlacza LED
mam zrobione wyświetlanie multipleksowane i wszystko działa wyśmienicie. Teraz zacząłem całe przerwanie pisać w asm aby skorzystać z opcji NOSAVE i "ręcznie" odłożyć potrzebne rejestry na stos. Wszystko w przerwaniu jak inkrementacja nr_wysw, czy Select Case dla gaszenia i zapalania poszczególnych wyświetlaczy ładnie już mi śmiga w asemblerze dzięki czemu kodu zrobiło się duuużo mniej a i dzięki temu samo przerwanie szybciej się wykonuje
jednak dręczy mnie jeszcze ten Lookup, próbowałem tak:
ale chyba coś może źle mi się dodaje w tym poleceniu add zl, r16 ??? chyba powinienem użyć czegoś jak ADIW ale tym można dodać stałą tylko.
próbowałem więc jeszcze tak jeśli chodzi o ten mój fragment źle działającego kodu:
czyli po dodaniu do zl jeśli nie było przeniesienia to nic się nie dzieje a jesli było to zwiększana jest zawartość zh o 1 (dobrze kombinuję?)
a może w ogóle źle jest przekazywany adres w :
jeśli chodzi o tablicę ???
może ktoś naprowadzi mnie na jakiś trop???
pozdrawiam i z góry dziękuję
próbuję od wczoraj przerobić wprost w Bascomie, dokładnie w przerwaniu pewne polecenie na asembler:
PORTA = Lookup(cyfry(nr_wysw) , Tabela)gdzie:
cyfry to --> Dim Cyfry(4) as Byte
nr_wysw --> Dim nr_wysw as Byte
Tabela - to tabela zdefiniowanych cyfr dla wyświetlacza LED
mam zrobione wyświetlanie multipleksowane i wszystko działa wyśmienicie. Teraz zacząłem całe przerwanie pisać w asm aby skorzystać z opcji NOSAVE i "ręcznie" odłożyć potrzebne rejestry na stos. Wszystko w przerwaniu jak inkrementacja nr_wysw, czy Select Case dla gaszenia i zapalania poszczególnych wyświetlaczy ładnie już mi śmiga w asemblerze dzięki czemu kodu zrobiło się duuużo mniej a i dzięki temu samo przerwanie szybciej się wykonuje
jednak dręczy mnie jeszcze ten Lookup, próbowałem tak:
$asm
' ładuję do pary rejestrów Z adres pierwszej komórki pamięci w której jest umieszczona 1sza cyfra
Loadadr Cyfry(1) , Z
' ładuję do R16 wartość zmiennej nr_wysw czyli aktualnie świecący wyświetlacz
lds r16, {Nr_wysw}
' pomniejszam go o 1 bo tablice są indeksowane od 1 i nr_wysw przyjmuje wartości od 1 do 4
dec r16
' dodaję do zl wartość bieżącego znaku na wyświetlaczu
add zl, r16
lpm
mov r16, r0
'ldi r16, 3 - gdy ta linijka nie jest zaremowana to dalsza część kodu ładnie działa i wyświetla same 3-ki
ldi zl, LOW(Tabela * 2)
ldi zh, high(Tabela * 2)
add zl, r16
lpm
Out Porta , R0
$end Asmale chyba coś może źle mi się dodaje w tym poleceniu add zl, r16 ??? chyba powinienem użyć czegoś jak ADIW ale tym można dodać stałą tylko.
próbowałem więc jeszcze tak jeśli chodzi o ten mój fragment źle działającego kodu:
Loadadr Cyfry(1) , Z
lds r16, {Nr_wysw}
dec r16
add zl, r16
Brcc Pp2
inc zh
Pp2:
lpm
mov r16, r0czyli po dodaniu do zl jeśli nie było przeniesienia to nic się nie dzieje a jesli było to zwiększana jest zawartość zh o 1 (dobrze kombinuję?)
a może w ogóle źle jest przekazywany adres w :
Loadadr Cyfry(1) , Zjeśli chodzi o tablicę ???
może ktoś naprowadzi mnie na jakiś trop???
pozdrawiam i z góry dziękuję
