programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · licznik 0,...
TRANSCRIPT
Programowanie mikrokontrolerów
Marcin Engel Marcin Peczarski
3 stycznia 2008
Liczniki, cd.
I Przypomnienie wiadomości o liczniku 0I Przykładowy program korzystający z licznikaI Ćwiczenia praktyczne
Licznik 0, tryb normalny
I normalny tryb pracy:I licznik zlicza od 0 do 255 i potem znów od zeraI w chwili przepełnienia jest ustawiany znacznik TOV0I gdy licznik osiąga wartość rejestru OCR0, jest ustawiany
znacznik OCF0I zmiany wartości OCR0 są natychmiastowe
Licznik 0, tryb CTC
I tryb CTC (Clear Timer on Compare):I licznik zlicza od 0 do OCR0 i potem znów od zeraI w chwili przepełnienia jest ustawiany znacznik TOV0I gdy licznik osiąga wartość rejestru OCR0, jest ustawiany
znacznik OCF0I zmiany wartości OCR0 są natychmiastowe
Licznik 0, przerwania
I mogą (nie muszą) być wyzwalaneI przerwanie przepełnienia wyzwalane ustawieniem flagi TOV0
(adres OVF0addr)I przerwanie zgodności wyzwalane ustawieniem flagi OCR0
(adres OC0addr)I powrót z przerwania automatycznie zeruje flagiI można je wyzerować ręcznie ustawiając je na 1!
Licznik 0, preskaler
Licznik może być:I zatrzymanyI taktowany częstotliowością zegaraI taktowany częstotliwością 8, 64, 256 lub 1024 razy mniejszą
niż zegar procesoraI taktowany sygnałem na nodze T0
Licznik 0, noga OC0 (PB3)
I Licznik można skonfigurować tak, że każde wykrycie zgodnościpowoduje zmianę poziomu na wyjściu OC0
I Obsługa OC0 jest sprzętowa, tzn. wystarczy skonfigurowaćodpowiednio licznik, potem program nie musi się już niczymzajmować
Uwagi
I Rozdzielczość licznika można zwiększyć programowo poprzezumiejętną obsługę przerwania przepełnienia
I W trybie CTC przepełnienie może nigdy nie wystąpićI W trybie CTC trzeba uważać zmieniając wartość OCR0 —
zmiana może „zgubić się” w jednym cyklu licznika
Przykład
Zrobimy prosty jednogłosowy, jednooktawowy instrument„muzyczny”Założenia:
I przyciski mają działać jak jednooktawowa klawiaturafortepianowa (bez czarnych klawiszy!)
I przycisk SW7 ma powodować wygenerowanie tonu C2, SW6— tonu D2 itd.
I dźwięk ma trwać tak długo, jak długo wciśnięty jest przyciskI nie precyzujemy, co się stanie przy wciśnięciu dwóch
przycisków jednocześnie
Głośnik
I płytka zawiera tzw. przetwornik piezo z generatorem, czyligłośniczek z generatorem tonu o określonej częstotliwości
I nie nadaje się on do naszych celów ze względu na wbudowanygenerator
I podłączymy zewnętrzny przetwornik bez generatora
Zakres częstotliwości
I kamertonowe A1 to dźwięk o częstotliwości 440 HzI dźwięki odległe o oktawę mają stosunek częstotliwość równy 2I oktawa składa się z 12 półtonówI stosunek częstotliwości kolejnych półtonów jest taki sam . . .I . . . i wynosi 12
√2
StądI C2 to 440 · 4
√2 ≈ 523.3 Hz.
I C3 to 523.3 · 2 = 1046, 6 Hz
Jaki tryb pracy?
I Oczywiście CTC!I Wtedy rejestr OCR0 posłuży do uzyskania odpowiedniej
częstotliwościI Głośnik podłączymy do PB3 (OC0) i ustawimy licznik tak,
żeby poziom na tej nodze był zmieniany sprzętowo przyuzyskaniu zgodności (gdy licznik osiągnie wartość maksymalną,czyli OCR0)
Jak ustalić wartość OCR0 dla dźwięku C2?
I C2 to 523.3 HzI Przypomnijmy, że zgodność w trybie CTC występuje z
częstotliwościąclk
(OCR0 + 1) · NI Częstotliwość dźwięku będzie równa połowie tej częstotliwości,
bo pełny okres wymaga dwóch zmian poziomówI Stąd:
OCR0 =clk
2 · f · N− 1
Jak dobrać wartość preskalera N?
I Z jednej strony, powinna być jak najmniejsza, żeby uzyskaćdobrą dokładność
I Z drugiej strony, dla najniższej częstotliwości f dźwięku,powinniśmy uzyskać wartość 8-bitową
I Policzmy dla N = 1, f = 523.3 i clk = 1MHz:
OCR0 =1000000
2 · 523.3 · 1− 1 ≈ 954
I Za dużo, ale dla następnej możliwej wartości N = 8 będziedobrze:
OCR0 =1000000
2 · 523.3 · 8− 1 ≈ 118
Tabela wartości OCR0
dźwięk OCR0C2 118D2 105E2 94F2 88G2 79A2 70H2 62C3 59
Algorytm
1. Konfigurujemy licznik 0 do pracy w trybie CTC, preskalerem1/8, ale go nie włączamy
2. Konfigurujemy nogę PB3 jako wyjście3. W pętli nieskończonej:
I skanujemy przyciskiI gdy wykryjemy wciśnięty klawisz, odszukujemy odpowiednią
wartość w tabeli, ładujemy ją do OCR0 i uruchamiamy licznikI gdy żaden klawisz nie jest wciśnięty stopujemy licznik
Uwagi
I Zatrzymanie licznika nie zeruje goI Możemy przełączać PB3 w stan wysokiej rezystancji zamiast
stopować licznikI Nie przejmujemy się drganiem styków, nie mają one dużego
znaczenia w tej aplikacjiI Nie przejmujemy się też ewentualnymi zaburzeniami (w obrębie
jednego okresu) częstotliwości
Gdzie umieścić tabelę
I W pamięci programu!I Pamiętamy o przeliczaniu adresu (mnożnik 2)I Specjalny rozkaz lpm r, Z powoduje załadowanie do rejestru
r wartości spod adresu wskazywanego przez rejestr Z wpamięci programu
Typowy kod
ldi zh, high (tabela*2)ldi zl, low (tabela*2)
szukaj:...lpm temp, Z...adiw zh:zl, 1rjmp szukaj
lub
szukaj:...lpm temp, Z+...rjmp szukaj
Przesunięcia logiczne i arytmetyczne
I lsl r17: C ← b7 ← . . . b0 ← 0I lsr r17: 0→ b7 → . . . b0 → CI asr r17: jak wyżej ale bit b7 jest powielany, nie zerowanyI rol r17: C ← b7 ← . . . b0 ← CI ror r17: C → b7 → . . . b0 → C
I przydatne w tym kontekście rozkazy
I brcs adres: skocz pod adres jeśli C ustawionyI brcc adres: skocz pod adres jeśli C wyzerowanyI sec: ustaw CI clc: wyzeruj C
Porty wejścia/wyjścia, przypomnienie
I Rejestr DDRC ustala kierunek pracy: 0 — wejście, 1 — wyjście,np.: sbi ddrc, 5
I Odczyt stanu nogi odbywa się z PINCI Ustawienie stanu nogi odbywa się przez PORTC
Schemat podłączeń, VMLab
K0 pc0 gndK1 pc1 gndK2 pc2 gndK3 pc3 gndK4 pc4 gndK5 pc5 gndK6 pc6 gndK7 pc7 gndR0 pc0 vdd 1kR1 pc1 vdd 1kR2 pc2 vdd 1kR3 pc3 vdd 1kR4 pc4 vdd 1kR5 pc5 vdd 1kR6 pc6 vdd 1kR7 pc7 vdd 1k.plot V(pb3)
Schemat połączeń, płytka
głośnik (wypożyczany od prowadzących) do GND i PB3SW0 do PC0SW1 do PC1. . .SW7 do PC7
Program, definicje
.def temp = r17
; Licznik zatrzymany, zmiana poziomu na OC0, tryb CTC:.equ C_STOP = (1 << wgm01) | ( 1 << com00)
; Licznik zatrzymany, zmiana poziomu na OC0, tryb CTC:.equ C_START = C_STOP | ( 1 << cs01)
Program, standardowy początek
.cseg
.org 0reset:
jmp start
.cseg
.org 42 ; pierwszy adres za wektorem przerwa«start:
Program, konfiguracja
; konfiguracja licznika 0:ldi temp, C_STOPout TCCR0, temp
; konfiguracja portu PB3 jako wyjsciasbi ddrb, PB3
Program, główna pętla
forever:; skanowanie klawiatury
; Wczytujemy stan klawiszy i negujemy wszystkie bityin temp, pinccom temp
; Operacja com ustawi flage Z, jesli byly same jedynki; Skaczemy do wylacz, jesli zaden klawisz nie wcisnietybreq wylacz
; do Z zmniejszony o 1 adres poczatku tabelildi zl, low (2*tabela-1)ldi zh, high (2*tabela-1)
Program, szukanie ustawionego bitu
szukaj:; przewijamy rejestr temp ladujac do C kolejne bity; w kazdym obrocie zwiekszamy Z o 1 tak, aby zawieral; adres pozycji tabeli odpowiadajacy kolejnemu; klawiszowiadiw zh:zl, 1lsl temp
; jesli nie wcisniety, szukaj dalejbrcc szukaj
Program, graj dźwięk
; znalezlismy wcisniety klawisz; odczytujemy z tabeli odpowiadajaca mu wartosc OCR0lpm temp, Zout ocr0, temp
; wlaczamy licznikldi temp, C_STARTout tccr0, temp
rjmp forever
Program, wyłącz dźwięk
wylacz:; wylaczamy dzwiekildi temp, C_STOPout tccr0, temprjmp forever
tabela:.DB 118, 105, 94, 88, 79, 70, 62, 59
Ćwiczenia jeszcze świąteczne i nie tylko
I Zagraj na wykonanym przez siebie instrumencie: :-)
I (zaległe) Wygeneruj na PB3 sygnał o częstotliwości 1 HzI (zaległe) Napisz elektroniczną ruletkęI (zaległe) Wykonaj „lampki choinkowe”: zapalaj po kolei po
jednej diodzie z częstotliwością zmienianą przyciskami SW0 iSW7. Do odmierzania czasu użyj licznika!