asembler avr
-
greg
asembler avr
szukam programu w którym zastosowano instrukcje "lpm" mam problem z jej zastosowaniem
Może coś znajdziesz tu:
http://www.avr-asm-tutorial.net/avr_en/AVR_SOFT.html
http://www.avr-asm-tutorial.net/avr_en/AVR_SOFT.html
Re: asembler avr
Podam przykład za autorem książki "Mikrokontrolery AVR w praktyce":greg pisze:szukam programu w którym zastosowano instrukcje "lpm" mam problem z jej zastosowaniem
ldi zh,high(tabl<<1) ; inicjuj rejestr indeksowy Z
ldi zh,low(tabl<<1)
lpm r16,z ; ładuj stałą z pamięci programu wskazaną przez rejestr Z do rejestru r16
..
..
tabl: .dw $5876 ; bajt $76 jest wskazywany gdy ZLSB=0, bajt $58 jest wskazywany gdy ZLSB=1
Chyba wiem na czym polega twój problem. Wojtek napisał to poprawnie, ja mogę jedynie dodać, że do rejestru Z należy załadować adres abszaru zwiększony dwukrotnie (takim operatorem jest <<1, oznacza przesunięty w lewo o jedną pozycję bitową). Wynika to z tego, że instrukcja lpm wymaga podania w rejestrze Z adresu pobieranego z pamięci bajtu, natomiast jednostką do adresowania przez kompilator jest adres słowa dwubajtowego.
Dorzucę jeszcze, bo Greg nie napisał jaki to AVR...
Niektóre AVRy obsługują tylko podstawowy rozkaz LPM. Nie ma on parametrów, a jego wynikiem jest przepisanie obszaru pamięci programu (Flash) spod adresu wskazanego zawsze w rejestrze Z, zawsze do rejestru R0.
Jakie warianty rozkazu LPM obsługuje nasz AVR najlepiej od razu sprawdzić w "Instruction Set Summary" w nocie katalogowej.
Niektóre AVRy obsługują tylko podstawowy rozkaz LPM. Nie ma on parametrów, a jego wynikiem jest przepisanie obszaru pamięci programu (Flash) spod adresu wskazanego zawsze w rejestrze Z, zawsze do rejestru R0.
Jakie warianty rozkazu LPM obsługuje nasz AVR najlepiej od razu sprawdzić w "Instruction Set Summary" w nocie katalogowej.