Opis procedur asemblera AVR

Transkrypt

Opis procedur asemblera AVR
Piotr Kalus
PWSZ Racibórz
10.05.2008 r.
Opis procedur asemblera AVR
init_lcd
Plik: lcd4pro.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura inicjuje pracę alfanumerycznego wyświetlacza LCD za sterownikiem HD44780.
Wyświetlacz działa w trybie 4-bitowym bez odczytu (r/w=0).
Połączenia: D4–>PC2, D5–>PC3, D6–>PC4, D7–>PC5, rs–>PC6, e–>PC7.
Przykład:
rcall
init_lcd
;wywołaj procedurę inicjującą LCD
Wykorzystane rejestry: r16, r17, r24, r30, r31
wr_instr
Plik: lcd4pro.hvr
Dane wejściowe: r24
Dane wyjściowe: ---Działanie:
Wpisuje do sterownika wyświetlacza LCD komendę. Procedura najczęściej używana do ustawienia
pozycji kursowa na LCD.
Przykład:
ldi
rcall
r24,line1
wr_instr
;ustawia kursor w pierwszej linii LCD
;
ldi
rcall
r24,line2+4
wr_instr
;ustawia kursor w linii drugiej, w 4-tej kolumnie
;
Wykorzystane rejestry: r24
Opracował: Piotr Kalus, PWSZ Racibórz
-1-
Opis procedur asemblera AVR
wr_data
Plik: lcd4pro.hvr
Dane wejściowe: r24
Dane wyjściowe: ----
– znak do wyświetlenia
Działanie:
Wypisuje na wyświetlaczu LCD znak ASCII. Znak wypisuje w miejscu kursora.
Przykład:
ldi
rcall
ldi
rcall
r24,65
wr_data
r24,'B'
wr_data
;wypisz dużą literę A (kod ascii A=65)
;
;wypisz dużą literę B
;
Wykorzystane rejestry: r24
wyp_text
Plik: lcd4pro.hvr
Dane wejściowe: Z
Dane wyjściowe: ----Działanie:
Wypisuje na wyświetlaczu LCD łańcuch znaków umieszczonych w pamięci programu FLASH
zakończonych liczbą 0. W rejestrze Z (r31,r30) powinien znajdować się adres łańcucha. Tekst będzie
wypisywany w miejscu kursora na wyświetlaczu LCD.
Przykład:
ldz
rcall
tekst1:
tekst1*2
wyp_text
;zapisz do rej. Z adres łańcucha
;wypisz tekst
.db ”Witaj student !”,0
Wykorzystane rejestry: r24, r30, r31
Opracował: Piotr Kalus, PWSZ Racibórz
-2-
Opis procedur asemblera AVR
wyp_hex
Plik: lcd4pro.hvr
Dane wejściowe: r24
Dane wyjściowe: ----
– liczba do wyświetlenia
Działanie:
Wypisuje na wyświetlaczu LCD zawartość rejestru r24 w postaci szesnastkowej. Rejestr wypisuje w
miejscu kursora.
Przykład:
ldi
rcall
r24,165
wyp_hex
;liczba 165
;wyświetli A5 (=165)
Wykorzystane rejestry: r24
ld_znaki
Plik: lcdznaki.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Ładuje do pamięci wyświetlacza LCD czcionki 8-miu programowalnych znaków. Znaki dostępne są
jako kody ASCII od 8 do 15.
Przykład:
rcall
ld_znaki
;załaduj 8 znaków do LCD
Wykorzystane rejestry: r24, r17
Opracował: Piotr Kalus, PWSZ Racibórz
-3-
Opis procedur asemblera AVR
bin8bcd
Plik: bin8bcd.hvr
Dane wejściowe: r16
Dane wyjściowe: r15, r14, r13
liczba do zamiany na kod BCD
setki, dziesiątki, jednostki
Działanie:
Zamienia liczbę 8-bitową zawartą w rejestrze r16 na kod BCD. Wynik działania zapisywany jest w
rejestrach: r5 – setki, r6 – dziesiątki, r7 – jednostki.
Przykład:
ldi
rcall
r16,239
bin8bcd
;wpisz liczbę do zamiany na BCD
;wywołaj procedurę zamiany na BCD
; r15=2 , r14=3 , r13=9
Wykorzystane rejestry: r16, r15, r14, r13
wyp_8b
Plik: bin8bcd.hvr
Dane wejściowe: r16
Dane wyjściowe: ----Działanie:
Wypisuje na wyświetlaczu LCD w postaci dziesiętnej liczbę 8-bitową zawartą w rejestrze r16.
Wcześniej powinien być ustawiony kursor LCD w miejscu, gdzie ma być wyświetlona liczba.
Procedura wykorzystuje bin8bcd, lecz nie niszczy zawartości rejestrów r15, r14, r13.
Przykład:
ldi
rcall
ldi
rcall
r24,line1
wr_instr
r16,178
wyp_8b
;ustawia kursor w pierwszej linii LCD
;zapisz jako instrukcję dla LCD
;wpisz liczbę do wyświetlenia na LCD
;wyświetl tę liczbę
Wykorzystane rejestry: r16, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-4-
Opis procedur asemblera AVR
bin16bcd
Plik: bin16bcd.hvr
Dane wejściowe: r17,r16
Dane wyjściowe: r15, r14, r13
–
–
liczba 16-bitowa (r17 bity starsze, r16 bity młodsze)
liczba BCD spakowana
Działanie:
Zamienia liczbę 16-bitową zawartą w rejestrze r17 i r16 na spakowany kod BCD. Wynik działania
zapisywany jest w rejestrach: r15 – dziesiątki tysięcy, r14 – tysiące i setki, r13 – dziesiątki i
jednostki.
Przykład:
ldi
rcall
r16,41239
bin8bcd
;wpisz liczbę do zamiany na BCD
;wywołaj procedurę zamiany na BCD
; r15=00000100 , r14=00010010 , r13=00111001
Wykorzystane rejestry: r16, r15, r14, r13
wyp_16b
Plik: bin16bcd.hvr
Dane wejściowe: r17,r16
Dane wyjściowe: -----
liczba 16-bitowa (r17 bity starsze, r16 bity młodsze)
Działanie:
Wypisuje na wyświetlaczu LCD w postaci dziesiętnej liczbę 16-bitową. Wcześniej powinien być
ustawiony kursor LCD w miejscu, gdzie ma być wyświetlona liczba. Procedura wykorzystuje
bin16bcd, lecz nie niszczy zawartości rejestrów r15, r14, r13.
Przykład:
ldi
rcall
ldi
ldi
rcall
r24,line1
wr_instr
r16,low(35178)
r17,high(35178)
wyp_16b
;ustawia kursor w pierwszej linii LCD
;zapisz jako instrukcję dla LCD
;wpisz liczbę do wyświetlenia na LCD
;wyświetli „35178”
Wykorzystane rejestry: r16, r17, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-5-
Opis procedur asemblera AVR
bin24bcd
Plik: bin24bcd.hvr
Dane wejściowe: r18, r17, r16
Dane wyjściowe: r15, r14, r13, r12
liczba 24-bitowa do zamiany na BCD
liczba spakowana BCD
Działanie:
Zamienia liczbę 8-bitową zawartą w rejestrze r16 na kod BCD. Wynik działania zapisywany jest w
rejestrach: r15 – dziesiątki milionów i miliony, r14 – setki tysięcy i dziesiątki tysięcy, r13 – tysiące i
setki , r12 – dziesiątki i jednostki.
Przykład:
ldi
ldi
ldi
rcall
r16,$AF
r17,$29
r18,$E0
bin24bcd
;wpisz liczbę do zamiany na BCD
;E029AF = 14690735
;wywołaj procedurę zamiany na BCD; r15=00010100 ,
; r14=01101001 , r13=00000111 , r12=00110101
Wykorzystane rejestry: r16, r17, r18, r15, r14, r13, r12
wyp_24b
Plik: bin24bcd.hvr
Dane wejściowe: r18, r17, r16
Dane wyjściowe: -----
liczba 24-bitowa do wypisania na LCD
Działanie:
Wypisuje na wyświetlaczu LCD liczbę 24-bitową w postaci dziesiętnej. Wcześniej powinien być
ustawiony kursor LCD w miejscu, gdzie ma być wyświetlona liczba. Procedura wykorzystuje
bin24bcd, lecz nie niszczy zawartości rejestrów r15, r14, r13, r12.
Przykład:
ldi
ldi
ldi
rcall
r16,$AF
r17,$29
r18,$E0
wyp_24b
;wpisz liczbę do zamiany na BCD
;E029AF = 14690735
;wyświetli liczbę „14690735”
Wykorzystane rejestry: r16, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-6-
Opis procedur asemblera AVR
init_i2c
Plik: i2c_pc01.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Inicjuje programowy interfejs i2c.
Przykład:
rcall
init_i2c
;zainicjuj interfejs i2c
Wykorzystane rejestry:
rd_i2c
Plik: i2c_pc01.hvr
Dane wejściowe: i2csub (r17)
Dane wyjściowe: i2cdata (r16)
subadres komórki układu i2c
zawartość tej komórki
Działanie:
Procedura odczytuje zawartość komórki o adresie wpisanym do rejestru subadres układu i2c , którego
adres zawarty jest w pamięci SRAM AVR pod nazwą adr_i2c. I2csub i i2cdata są predefiniowanymi
nazwami rejestrów r17 i r16 i można je używać zamiennie.
Uwaga! Jeżeli w systemie występuje tylko jeden układ i2c (np. DS1307), jego adres ($D0) należy
tylko raz wpisać do komórki adr_i2c i nie ma potrzeby wpisywania go przed każdym wywołaniem
procedury.
Przykład:
ldi
sts
ldi
rcall
r16,$d0
adr_i2c,r16
r17,5
rd_i2c
;wpisz adres układu ($d0 – adres DS1307)
;zapamiętaj w SRAM
;subadres =5 komórki układu i2c
;odczytaj i zapisz zawartość w r16 (i2cdata)
Wykorzystane rejestry: r16, r17, r18
Opracował: Piotr Kalus, PWSZ Racibórz
-7-
Opis procedur asemblera AVR
wr_i2c
Plik: i2c_pc01.hvr
Dane wejściowe: i2csub (r17), i2cdata (r16)
Dane wyjściowe: -----
subadres komórki układu i2c i dana do zapisania
Działanie:
Procedura zapisuje zawartość rejestru r16 do komórki o adresie wpisanym do rejestru subadres
układu i2c. Adres układu powinien być wpisany w pamięci SRAM AVR pod nazwą adr_i2c.
I2csub i i2cdata są predefiniowanymi nazwami rejestrów r17 i r16 i można je używać zamiennie.
Uwaga! Jeżeli w systemie występuje tylko jeden układ i2c (np. DS1307), jego adres ($D0) należy
tylko raz wpisać do komórki adr_i2c i nie ma potrzeby wpisywania go przed każdym wywołaniem
procedury.
Przykład:
ldi
ldi
rcall
i2cdata,100
i2csub,5
wr_i2c
;dana do zapisania (w rej. r16)
;subadres =5 pod który będzie wpisana (w rej. r17)
;wpisz do układu i2c
Wykorzystane rejestry: r16, r17, r18
rd_czas
Plik: ds1307.hvr
Dane wejściowe: ----Dane wyjściowe: sek, min, godz, dz_tyg, dzien, mies, rok.
Działanie:
Procedura odczytuje zegar i kalendarz układu DS1307 i zapisuje w pamięci SRAM AVR w
komórkach o nazwach: sek, min, godz, dz_tyg, dzien, mies, rok. Nazwy komórek powinny być
zarezerwowane w segmencie dseg programu głównego. Procedura zapisuje czas zamieniony na
postać binarną.
Uwaga! Jeżeli w systemie występuje tylko jeden układ i2c (np. DS1307), jego adres ($D0) należy
tylko raz wpisać do komórki adr_i2c i nie ma potrzeby wpisywania go przed każdym wywołaniem
procedury.
Przykład:
ldi
sts
rcall
r16,$d0
adr_i2c,r16
rd_i2c
;wpisz adres układu ($d0 – adres DS1307)
;zapamiętaj w SRAM
;odczytaj czas i datę i zapisz w komórkach SRAM
Wykorzystane rejestry: r16, r17, r18
Opracował: Piotr Kalus, PWSZ Racibórz
-8-
Opis procedur asemblera AVR
wyp_rtc
Plik: ds1307.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura wypisuje na wyświetlaczu LCD czas w postaci: „ godziny:minuty:sekundy”. Procedura
pobiera dane z komórek pamięci: godz, min, sek.
Pozycja kursora powinna być ustawiona przed wywołaniem procedury.
Przykład:
ldi
rcall
rcall
r24,line1
wr_instr
wyp_rtc
;ustaw kursor na wyświetlaczu LCD
;
;wypisuje czas np.: 18:25:58
Wykorzystane rejestry: r16, r24
wyp_rtc2
Plik: ds1307.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura wypisuje na wyświetlaczu LCD czas w postaci: „dzień tygodnia godziny:minuty:sekundy”.
Procedura pobiera dane z komórek pamięci: dz_tyg, godz, min, sek.
Pozycja kursora powinna być ustawiona przed wywołaniem procedury.
Przykład:
ldi
rcall
rcall
r24,line1
wr_instr
wyp_rtc2
;ustaw kursor na wyświetlaczu LCD
;
;wypisuje czas np.: Pn 18:25:58
Wykorzystane rejestry: r16, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-9-
Opis procedur asemblera AVR
wyp_date
Plik: ds1307.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura wypisuje na wyświetlaczu LCD datę w postaci: „ dzień/miesiąc/rok”. Procedura pobiera
dane z komórek pamięci: dzien, mies, rok.
Pozycja kursora powinna być ustawiona przed wywołaniem procedury.
Przykład:
ldi
rcall
rcall
r24,line1
wr_instr
wyp_date
;ustaw kursor na wyświetlaczu LCD
;
;wypisuje datę np.: 21/04/2008
Wykorzystane rejestry: r16, r24
wyp_date2
Plik: ds1307.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura wypisuje na wyświetlaczu LCD datę w postaci: „dzień tygodnia dzień/miesiąc/rok”.
Procedura pobiera dane z komórek pamięci: dz_tyg, dzien, mies, rok.
Pozycja kursora powinna być ustawiona przed wywołaniem procedury.
Przykład:
ldi
rcall
rcall
r24,line1
wr_instr
wyp_date2
;ustaw kursor na wyświetlaczu LCD
;
;wypisuje datę np.: Pn 21/04/2008
Wykorzystane rejestry: r16, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-10-
Opis procedur asemblera AVR
rtc
Plik: ds1307.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura zegara czasu rzeczywistego. Powinna być wywoływana raz na sekundę – zwiększa
sekundy, sprawdza czy nie są równe 60. Jeżeli tak, to zeruje sekundy i zwiększa minuty itd. Procedura
wykonuje te operacje na komórkach pamięci: dz_tyg, godz, min, sek.
Przykład:
rcall
rtc
;wywołaj procedurę , zwiększ sekundy itd.
Wykorzystane rejestry: r16
bin7seg
Plik: wysw7seg.hvr
Dane wejściowe: r16
Dane wyjściowe: r16
cyfra do zamiany
kod wskaźnika 7-segmentowego
Działanie:
Procedura zamienia wartość binarną na kod wskaźnika 7-segmentowego wspólna anoda.
Segmenty wskaźnika: najmłodszy bit – segment a, najstarszy - h (dp).
Procedura wyświetla również cyfry kodu szesnastkowego A-F (10-15).
Przykład:
ldi
rcall
r16,1
bin7seg
;cyfra „1”
;rejestr r16=11111001 (hgfedcba) świeci „b” i „c”
Wykorzystane rejestry: r16
Opracował: Piotr Kalus, PWSZ Racibórz
-11-
Opis procedur asemblera AVR
rd_temp
Plik: przetw_ac.hvr
Dane wejściowe: r16
Dane wyjściowe: r17, r16
numer kanału 0-7 (PA0-PA7)
temperatura (wart. całkowita, 2 bity po przecinku)
Działanie:
Procedura odczytuje wartość temperatury na czujniku LM35. Wynik całkowitych stopni Celsjusza
zawarty jest w r17, natomiast w r16 jest wartość dwóch bitów po przecinku.
Uwaga! Przed pomiarem odpowiednia końcówka PA powinna być ustawiona jako wejście w stanie
wysokiej impedancji.
Przykład:
ldi
rcall
r16,0
rd_temp
;czujnik LM35 podłączony do PA0
;odczytaj temperaturę
Wykorzystane rejestry: r16, r17
wyp_temp
Plik: przetw_ac.hvr
Dane wejściowe: r17, r16
Dane wyjściowe: -----
wynik pomiaru temperatury (rd_temp)
Działanie:
Procedura wyświetla na wyświetlaczu LCD temperaturę czujnika LM35 z dokładnością do 0,5°C.
Pozycja kursora powinna być ustawiona przed wywołaniem procedury. Procedura wykorzystuje
procedury z pliku bin8bcd.hvr
Przykład:
ldi
rcall
rcall
r16,0
rd_temp
wyp_temp
;czujnik LM35 podłączony do PA0
;odczytaj temperaturę
;wyświetli temperaturę np.: 26,5°C
Wykorzystane rejestry: r16, r17, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-12-
Opis procedur asemblera AVR
init_rs
Plik: usart.hvr
Dane wejściowe: ----Dane wyjściowe: ----Działanie:
Procedura inicjalizuje układ transmisji szeregowej USART. Parametry: tryb asynchroniczny,
prędkość 19200 [bit/sek] (dla Focs=16MHz), 8 bitów danych, bez bitu parzystości 1 bit stopu,
nadajnik działa bez przerwań a odbiornik generuje przerwania po odebraniu bajtu.
Procedura wyłącza przerwania i należy je włączyć po inicjalizacji.
Przykład:
rcall
init_rs
;USART gotowy do pracy
Wykorzystane rejestry: r16
send_char
Plik: usart.hvr
Dane wejściowe: r16
Dane wyjściowe:
bajt do wysłania przez port szeregowy
Działanie:
Procedura wysyła jeden bajt zawarty w rejestrze r16 przez port szeregowy USART.
Przykład:
ldi
rcall
r16,'A'
send_char
;wyślij kod ascii litery 'A' przez USART
;
Wykorzystane rejestry: r16
Opracował: Piotr Kalus, PWSZ Racibórz
-13-
Opis procedur asemblera AVR
send_str
Plik: usart.hvr
Dane wejściowe:
Dane wyjściowe:
Z
Z wskazuje łańcuch do wysłania
Działanie:
Procedura wysyła łańcuch zakończony znakiem 0 (null) przez USART.
Przed wywołaniem adres łańcucha musi być załadowany do rejestru Z.
Przykład:
ldz
rcall
tekst1:
tekst1*2
send_str
;załaduj adres łańcucha do rejestru Z
;wyślij przez port szeregowy
.db ”Witaj student !”,0
Wykorzystane rejestry: r16, Z
send_char
Plik: usart.hvr
Dane wejściowe: r16
Dane wyjściowe: -----
bajt do wysłania przez port szeregowy
Działanie:
Procedura wysyła jeden bajt zawarty w rejestrze r16 przez port szeregowy USART.
Przykład:
ldi
rcall
r16,'A'
send_char
;wyślij kod ascii litery 'A' przez USART
;
Wykorzystane rejestry: r16, r17, r24
Opracował: Piotr Kalus, PWSZ Racibórz
-14-
Opis procedur asemblera AVR