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