33
Programowanie mikrokontrolerów Marcin Engel Marcin Peczarski 3 stycznia 2008

Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

  • Upload
    dangthu

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Programowanie mikrokontrolerów

Marcin Engel Marcin Peczarski

3 stycznia 2008

Page 2: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Liczniki, cd.

I Przypomnienie wiadomości o liczniku 0I Przykładowy program korzystający z licznikaI Ćwiczenia praktyczne

Page 3: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 4: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 5: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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!

Page 6: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 7: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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ć

Page 8: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 9: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 10: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 11: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 12: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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)

Page 13: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 14: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 15: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Tabela wartości OCR0

dźwięk OCR0C2 118D2 105E2 94F2 88G2 79A2 70H2 62C3 59

Page 16: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 17: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 18: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 19: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 20: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 21: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 22: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 23: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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)

Page 24: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Schemat połączeń, płytka

głośnik (wypożyczany od prowadzących) do GND i PB3SW0 do PC0SW1 do PC1. . .SW7 do PC7

Page 25: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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)

Page 26: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Program, standardowy początek

.cseg

.org 0reset:

jmp start

.cseg

.org 42 ; pierwszy adres za wektorem przerwa«start:

Page 27: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Program, konfiguracja

; konfiguracja licznika 0:ldi temp, C_STOPout TCCR0, temp

; konfiguracja portu PB3 jako wyjsciasbi ddrb, PB3

Page 28: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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)

Page 29: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 30: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 31: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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

Page 32: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

Ćwiczenia jeszcze świąteczne i nie tylko

I Zagraj na wykonanym przez siebie instrumencie: :-)

Page 33: Programowanie mikrokontrolerów - mimuw.edu.plmengel/mikrokontrolery/zajecia7.pdf · Licznik 0, tryb normalny I normalny tryb pracy: I licznik zlicza od 0 do 255 i potem znów od

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!