Programowanie mikrokontrolerów. 5 grudnia 2007

Podobne dokumenty
Programowanie mikrokontrolerów. 3 stycznia 2008

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

Mikroprocesory i Mikrosterowniki Liczniki Timer Counter T/C0, T/C1, T/C2

Uproszczony schemat blokowy zespołu 8-bitowego timera przedstawiono na rys.1

Wbudowane układy peryferyjne cz. 2 Wykład 8

Programowanie mikrokontrolerów. 8 listopada 2007

SYSTEM PRZERWAŃ ATmega 32

Przerwanie. Źródła przerwań

Metody obsługi zdarzeń

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Układy czasowe / liczniki (timers/counters)

Instytut Teleinformatyki

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania. Sterowniki Urządzeń Mechatronicznych laboratorium. Ćw. 3: Timer v1.0

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Podstawy Techniki Mikroprocesorowej Laboratorium

Omówimy przykłady 8-mio bitowego licznika z wyposażenia ADuC812 (CISC 51) oraz mikrokontrolera ATMega128 należącego do rodziny AVR.

Przerwania, polling, timery - wykład 9

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

AGH Akademia Górniczo- Hutnicza w Krakowie Katedra Elektroniki WIET

Hardware mikrokontrolera X51

Programowanie mikrokontrolerów. 15 stycznia 2008

Dokumentacja mikrokontrolera Atmega16 firmy Atmel

Wbudowane układy peryferyjne cz. 1 Wykład 7

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Wstęp Architektura... 13

2. PORTY WEJŚCIA/WYJŚCIA (I/O)

ad a) Konfiguracja licznika T1 Niech nasz program składa się z dwóch fragmentów kodu: inicjacja licznika T1 pętla główna

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Sterowanie multipleksowe 4-cyfrowego wyświetlacza siedmiosegmentowego w oparciu o system przerwao mikrokontrolera ATmega16 w języku Asembler

1. Struktura urządzeń z wykorzystaniem mikrokontrolerów...13

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Programowanie mikrokontrolerów 2.0

Komunikacja w mikrokontrolerach. Wydział Elektroniki Mikrosystemów i Fotoniki Piotr Markowski

Instytut Teleinformatyki

równoległe (w wersji 4-, 8- i 16-bitowej). Same wyświetlacze ze względu na budowę i możliwości możemy podzielić na dwie grupy:

Stanowisko laboratoryjne dla mikrokontrolera Atmega16 firmy Atmel

Układy czasowo-licznikowe w systemach mikroprocesorowych

MIKROPROCESORY architektura i programowanie

długo. W tym celu w czasie przeczesywania if (key) {

Przerwania w architekturze mikrokontrolera X51

Schemat blokowy architektury AVR

Wbudowane układy peryferyjne cz. 3 Wykład 9

Programowanie mikrokontrolerów 2.0

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32)

Mikrokontroler ATmega32. Tryby adresowania Rejestry funkcyjne

Przetworniki analogowo-cyfrowe (A/C)

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Technika mikroprocesorowa. Konsola do gier

PRZETWORNIK ADC w mikrokontrolerach Atmega16-32

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Przetwornik ADC procesora sygnałowego F/C240 i DAC C240 EVM

Programowanie mikrokontrolerów

LITEcomp aplikacje Zegar z układem PCF8583

Programowanie w językach asemblera i C

Akademia Górniczo- Hutmicza w Krakowie Katedra Elektroniki WIET

Techniki mikroprocesorowe i systemy wbudowane

2.1 Porównanie procesorów

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Mikrokontrolery AVR ATmega

INSTRUKCJA OBSŁUGI. Rys.1. Wyświetlacz. Rys.2. Klawiatura

Programator układów HCS

(Rysunek z książki T.Starecki. Mikokontrolery jednoukładowe rodziny 51. NOZOMI W-wa 1996)

Mikrokontroler AVR ATmega32 - wykład 9

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Programowanie mikrokontrolerów 2.0

Wbudowane układy komunikacyjne cz. 1 Wykład 10

Układ transmisji szeregowej AVR

Przerwania w systemie mikroprocesorowym. Obsługa urządzeo wejścia/wyjścia

1. Porty wejścia wyjścia (I/O)

INSTRUKCJA OBSŁUGI. Przekaźnik czasowy ETM ELEKTROTECH Dzierżoniów. 1. Zastosowanie

Opis Ogólny OPIS OGÓLNY LICZNIKA AL154LI01.

Instytut Teleinformatyki

Programowanie mikrokontrolerów 2.0

Instytut Teleinformatyki

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Wydział Elektroniki. Wykrywacz przewodów ściennych. Wizualizacja danych sensorycznych - projekt. Prowadzący: dr inż.

Politechnika Białostocka

Wyłącznik czasowy GAO EMT757

Dokumentacja Licznika PLI-2

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Struktura i działanie jednostki centralnej

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Aneks do Instrukcji obsługi wagi Basic Label 300 z dnia

2. Architektura mikrokontrolerów PIC16F8x... 13

Komunikacja w mikrokontrolerach Laboratorium

Start Bity Bit Stop 1 Bit Par Rys. 1

ĆWICZENIE. TEMAT: OBSŁUGA PRZETWORNIKA A/C W ukontrolerze 80C535 KEILuVISON

Instytut Teleinformatyki

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Instrukcja obsługi. Sterownik ścienny KJR-12B/DP

EV Termostat cyfrowy do urządzeń chłodniczych

MIKROPROCESORY architektura i programowanie

Architektura mikrokontrolera MCS51

Licznik rewersyjny MD100 rev. 2.48

Transkrypt:

Programowanie mikrokontrolerów Marcin Engel Marcin Peczarski 5 grudnia 2007

Przerwania Umożliwiają asynchroniczną obsługę różnych zdarzeń, np.: zmiana stanu wejścia, zakończenie przetwarzania analogowo-cyfrowego, przepełnienie licznika, osiągnięcie przez licznik zadanej wartości, zakończenie transmisji przez interfejs szeregowy, odebranie danych przez interfejs szeregowy. Umożliwiają efektywne wykorzystanie urządzeń peryferyjnych. Umożliwiają niejako obsługę w tle w stosunku do programu głównego. ATmega16 ma 21 źródeł przerwań.

Rozważmy następujący program Gdzieś w RAM definiujemy 1-bajtową zmienną..dseg.org 0x60 ; adres poczatku RAM value:.byte 1 Wektor przerwań o adresie 0 musi zawierać instrukcję skoku do właściwego początku programu..cseg.org 0 rjmp start

Rozważmy następujący program Program rozpoczynamy, jak zwykle, od zainicjalizowania wskaźnika stosu..org 0x2A ; pierwszy adres za tablica przerwan start: ldi r17, high(ramend) ldi r16, low(ramend) out sph, r17 out spl, r16 Następnie inicjalizujemy i konfigurujemy wyświetlacz LCD. rcall rcall LCD_init LCD_config Inicjalizujemy naszą zmienną. ldi r16, 0 sts value, r16 Instrukcja sts zapisuje wartość z rejestru pod wskazanym adresem w RAM.

Rozważmy następujący program W pętli głównej wyświetlamy wartość naszej zmiennej. forever: lds r16, value rcall LCD_number ldi r16, 0 rcall LCD_goto rjmp forever Instrukcja lds ładuje rejestr wartością spod podanego adresu w RAM. Ten program nie robi nic mądrego. Posłuży nam do obserwacji zmian value.

Przerwania wywołane zmianą stanu wejść Do obserwacji zmiany stanu wejść możemy użyć jednego z trzech przerwań: INT0, INT1, INT2 lub komparatora. Wejścia przerwań INT0 i INT1, odpowiednio PD2 i PD3, zajęte są przez wyświetlacz LCD. Obsługą komparatora zajmniemy się być może w przyszłości. Zatem wybieramy przerwanie INT2. Wejście przerwania znajduje się na nodze PB2. Podłączymy do niej klawisz. Naciśnięcie klawisza będzie wywoływało przerwanie, którego procedura obsługi będzie zwiększać wartość value.

Rejestr MCUCSR 7 6 5 4 3 2 1 0 ISC2 bit 6 sposób zgłaszania przerwania INT2 0 przy opadającym zboczu (zmiana z 1 na 0) 1 przy narastającym zboczu (zmiana z 0 na 1) Pozostałe bity nie dotyczą INT2 i nie będziemy ich omawiać, ale musimy zadbać, aby nie zmieniać ich wartości.

Rejestr GICR 7 6 5 4 3 2 1 0 INT2 bit 5 włączenie przerwania INT2 0 przerwanie wyłączone 1 przerwanie włączone Pozostałe bity nie dotyczą INT2 i nie będziemy ich omawiać, ale musimy zadbać, aby nie zmieniać ich wartości.

Rejestr GIFR 7 6 5 4 3 2 1 0 INTF2 bit 5 znacznik zgłoszenia przerwania INT2 0 przerwania nie było 1 wystąpiło przerwanie Znacznik ten jest automatycznie zerowany w procedurze obsługi przerwania. Czasem jednak będziemy chcieli wyzerować go ręcznie. Zerowanie odbywa się przez zapisanie jedynki do tego bitu! Pozostałe bity nie dotyczą INT2 i nie będziemy ich omawiać, ale musimy zadbać, aby nie zmieniać ich wartości.

Przykładowa konfiguracja przerwania INT2 Wciśnięcie klawisza wywołuje zbocze opadające. in cbr out r16, MCUCSR r16, 1 << ISC2 MCUCSR, r16 Uaktywniamy przerwanie. in sbr out r16, GICR r16, 1 << INT2 GICR, r16 Uwaga, drugim argumentem instrukcji cbr i sbr jest maska bitowa, a nie numer bitu, jak w instrukcjach cbi i sbi.

Przykładowa konfiguracja przerwania INT2 Zerujemy znacznik przerwania, wysyłając 1. Jest to zalecane przy zewnętrznych źródłach przerwań. ldi out r16, 1 << INTF2 GIFR, r16 Uwaga, wpisanie do rejestru GIFR wartości 1 << INTF2 nie zmienia pozostałych bitów tego rejestru. Uaktywniamy system przerwań. sei

Obsługa przerwania INT2 W wektorze przerwań umieszczamy skok do procedury obsługi..org INT2addr rjmp interrupt2 Procedura obsługi musi zachować na stosie rejestr znaczników i wszystkie używane rejestry robocze. interrupt2: push in push r16 r16, SREG r16

Obsługa przerwania INT2 Właściwa obsługa polega na zwiększeniu value o 1. lds inc sts r16, value r16 value, r16 Odtwarzamy rejestr znaczników i rejestry robocze. pop out pop r16 SREG, r16 r16 Kończymy obsługę przerwania, odblokowujemy obsługę przerwań. reti

Obsługa przerwania INT2 Niestety pojedyncze naciśnięcie, a nawet puszczenie, klawisza może spowodować wielokrotne zgłoszenie przerwania. Niezbyt eleganckim, ale skutecznym rozwiązaniem jest odczekanie chwilę. ldi ldi rcall r25, high(1000) r24, low(1000) wait Pamiętajmy o odłożeniu na stos, a potem zdjęciu ze stosu rejestrów r24 i r25.

Obsługa przerwania INT2 Przed wykonaniem obsługi klawisza sprawdzamy, czy jest on nadal wciśniety. sbic rjmp lds inc sts PINB, PB2 interrupt2_no_pressed r16, value r16 value, r16 interrupt2_no_pressed: Na koniec kasujemy zgłoszone przerwania, wysyłając 1. ldi out r16, 1 << INTF2 GIFR, r16

Konfiguracja klawisza VMLAB Rezystor podciągający może być wewnętrzny lub zewnętrzny. W naszych zestawach są zewnętrzne rezystory podciągające. K1 GND PB2 MONOSTABLE(5m) R1 VDD PB2 10k Zestaw uruchomieniowy Łączymy pin PB2 procesora z pinem SW0.

Pierwsze ćwiczenie Przećwiczyć obsługę przerwania: wersja bez oczekiwania na ustabilizowanie styków, wersja z oczekiwaniem na ustabilizowanie styków.

Liczniki Do cyklicznego zgłaszania przerwania, możemy wykorzystać licznik. ATmega16 ma trzy liczniki: dwa 8-bitowe Timer0 i Timer2, jeden 16-bitowy Timer1. Każdy z liczników ma kilka do kilkunastu trybów pracy. Poszczególne liczniki mają różne zestawy trybów pracy. Zajmiemy się dwoma najprostszymi trybami pracy licznika 0.

Rejestr TCNT0 Timer/Counter Register 0 Zawiera aktualną wartość licznika. Zapis zmienia wartość licznika.

Rejestr OCR0 Output Compare Register 0 Zawiera wartość, która jest ciągle porównywana z wartością licznika. Wykrycie zgodności może być użyte do: ustawienia znacznika OCF0, wyzwolenia przerwania o symbolicznym adresie OC0addr, zmiany poziomu na wyjściu OC0 pin PB3.

Rejestr TCCR0 7 6 5 4 3 2 1 0 FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 (PWM0) (CTC0) bit 7 gdy WGM00 = 0, ustawienie na 1, wymusza taką zmianę wyjścia OC0, jakby porównanie rejestrów TCNT0 i OCR0 dało wynik pozytywny bity 6, 3 tryb pracy bity 5, 4 sposób sterowania wyjściem OC0 bity 2, 1, 0 konfiguracja preskalera

Tryby pracy licznika 0 7 6 5 4 3 2 1 0 FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 (PWM0) (CTC0) WGM01 = 0, WGM00 = 0 tryb normalny Licznik zlicza od 0 do 255 i potem znów od zera. Rejestr OCR0 jest modyfikowany natychmiast. Jeśli licznik osiągnie wartość równą wartości z rejestru OCR0, ustawiany jest znacznik OCF0. W przypadku przepełnienia ustawiany jest znacznik TOV0. Znaczniki te mogą służyć do wyzwalania przerwań.

Tryby pracy licznika 0 7 6 5 4 3 2 1 0 FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 (PWM0) (CTC0) WGM01 = 1, WGM00 = 0 tryb CTC (Clear Timer on Compare) Licznik zlicza od 0 do OCR0 i potem znów od zera. Rejestr OCR0 jest modyfikowany natychmiast. Jeśli licznik osiągnie wartość równą wartości zrejestru OCR0, ustawiany jest znacznik OCF0. W przypadku przepełnienia ustawiany jest znacznik TOV0. W tym trybie licznik może się nigdy nie przepełnić. Znaczniki OCF0 i TOV0 mogą służyć do wyzwalania przerwań.

Preskaler licznika 0 CS02 CS01 CS01 źródło zegara 0 0 0 licznik zatrzymany 0 0 1 clk 0 1 0 clk/8 0 1 1 clk/64 1 0 0 clk/256 1 0 1 clk/1024 1 1 0 zewnętrzny z nogi T0, zbocze opadające 1 1 1 zewnętrzny z nogi T0, zbocze narastające

Rejestr TIMSK 7 6 5 4 3 2 1 0 OCIE0 TOIE0 bit 1 konfiguracja przerwania, gdy porównanie rejestrów TCNT0 i OCR0 wypadło pozytywnie, tzn. gdy ustawiony znacznik OCF0: 1 przerwanie włączone, 0 przerwanie wyłączone. bit 0 konfiguracja przerwania, gdy wystąpiło przepełnienie licznika, tzn. gdy ustawiony znacznik TOV0: 1 przerwanie włączone, 0 przerwanie wyłączone. Pozostałe bity dotyczą liczników 1 i 2. Nie będziemy ich omawiać, ale powinniśmy dbać, aby nie zmieniać ich wartości.

Rejestr TIFR 7 6 5 4 3 2 1 0 OCF0 TOV0 bit 1 znacznik ustawiany, gdy porównanie rejestrów TCNT0 i OCR0 wypadło pozytywnie. bit 0 znacznik ustawiany, gdy wystąpiło przepełnienie licznika. Jeśli znacznik jest używany do wyzwalania przerwania, to jest automatycznie zerowany przy wywołaniu odpowiedniego przerwania. Znaczniki mogą być zerowane programowo, przez zapisanie do nich wartości 1. Pozostałe bity dotyczą liczników 1 i 2. Nie będziemy ich omawiać, ale powinniśmy dbać, aby nie zmieniać ich wartości.

Przykładowa konfiguracja licznika 0, tryb normalny Definiujemy tryby pracy licznika..equ TIMER0_RUNNING_NORMAL = 1 << CS02 Konfigurujemy tryb pracy. ldi out r17, TIMER0_RUNNING_NORMAL TCCR0, r17 Włączamy obsługę przerwania przy przepełnieniu. in sbr out sei r16, TIMSK r16, 1 << TOIE0 TIMSK, r16

Przykładowa konfiguracja licznika 0, tryb CTC Definiujemy tryby pracy licznika..equ TIMER0_TOP_VALUE = 155.equ TIMER0_RUNNING_CTC = 1 << CTC0 1 << CS02 Konfigurujemy tryb pracy. ldi ldi out out r16, TIMER0_TOP_VALUE r17, TIMER0_RUNNING_CTC OCR0, r16 TCCR0, r17 Włączamy obsługę przerwania przy osiągnięciu wartości z rejestru OCR0. in sbr out sei r16, TIMSK r16, 1 << OCIE0 TIMSK, r16

Obsługa przerwań licznika 0 W wektorze przerwań skok do odpowiedniej procedury obsługi.org OVF0addr rjmp.org OC0addr rjmp timer0_overflow timer0_compare_match

Obsługa przerwań licznika 0 Procedura obsługi podobna do obsługi przerwania INT2, ale nie ma problemu drgających styków. timer0_compare_match: timer0_overflow: push r16 in r16, SREG push r16 lds inc sts pop out pop reti r16, value r16 value, r16 r16 SREG, r16 r16

Drugie ćwiczenie Zaprogramować zwiększanie value z częstotliwością ok.: 25 Hz, 10 Hz, 4 Hz, 1 Hz. W trybie normalnym przepełnienie występuje z częstotliwością clk 256 N, w trybie CTC zgodne porównanie zachodzi z częstotliwością clk (OCR0 + 1) N, gdzie clk częstotliwość zegara, N współczynnik podziału preskalera.

Trzecie ćwiczenie Napisać program elektronicznej ruletki. Nieparzyste wciśnięcie klawisza powoduje wystartowanie licznika na wyświetlaczu bardzo szybko pojawiają się kolejne wartości od 0 do 37. Parzyste wciśnięcie klawisza powoduje zatrzymanie licznika ostatnia wartość pozostaje na wyświetlaczu.