Mikroprocesorowa Ośla łączka
Mikroprocesorowa Ośla łączka
■CQ17a prosty zegar |
OSZCZĘDNY |
Rys. 76 |
‘TU WSZYSTKIE DEKLARACJE l POLECENIA KONfIGURACJI, w tym konfiguracji liczników: | ||
Config TimerO Tlmer |
, Prescale = 64 ’zwiększanie TimerO co 16ms (64*0,2Sus) | |
Config Tlmerl Tlmer |
Prescale = 64 'zwiększanie Timerl co 16ms (64*0,2Sus) | |
Enable Interrupts |
'odblokowanie globalne systemu przerwań | |
Enable TimerO |
'odblokowanie przerwania od TimeraO | |
Enable Tlmerl |
’odblokowanie przerwania od Timeral (przepełnienie licznika) | |
On TimerO Co4ms |
■po przepełnieniu licznika 0 skocz do etykiety o nazwie Co4ms | |
On Tlmerl Cols Hosave |
'po przepełnieniu licznika 1 skocz do etykiety o nazwie Cols | |
Do |
'główny program | |
If Pina.O « 1 Then |
‘jeżeli brak napięcia 3ieci | |
Disable TimerO |
'zablokuj pracę licznika T/CO | |
Idle |
‘i zaśnij, przechodząc do trybu IDLE | |
Elsę |
'jeśli jest napięcie sieci | |
Enable TimerO |
'uruchom T/CO potrzebny do wyświetlania cyfr | |
End If | ||
Loop |
'koniec pętli | |
End |
'koniec programu głównego | |
Cols : |
'co ł sekundę | |
... Tresc Procedury - |
Zwiększanie Licznika Sekund | |
Return |
'koniec obsługi przerwania od T/Cl | |
Co4ms: |
'przerwanie co 4,09óms (bez skracania cyklu licznika T/CO) | |
... Tu Podprogram Ustawiania Czasu Jeśli SI Naciśnięty | ||
’następnie standardowo | ||
... Co 4ms Sprawdzanie |
I Korygowanie Stanu Liczników | |
. Zamiana Liczb Zwojkowych Na Bcd | ||
... Wyświetlanie Kolej |
no Po Jednej Cyfrze | |
Return |
‘koniec obsługi przerwania od T/CO co 4,096ms | |
Tabela: |
'do wyświećłaenia cyfr 0...9 | |
Data 192 , 249 164 |
176 , 153 146 , 130 , 248 , 128 , 144 |
stan na końcówce PD.O
Rys. 77
:/
tu procesor nadal jest v trybie IDLE
dopiero po obsłużeniu kolejnego przerwania procesor powraca do
normalnej pracy
r znów przechodzi w tryb IDLE
Należy podkreślić, że wprowadzamy procesor w tryb oszczędnościowy zawsze w sposób programowy, natomiast „budzimy” go do normalnej pracy nie programowo, tylko w zupełnie inny sposób, bo przecież w obu tych trybach program nie jest realizowany. Ze stanu Idle procesor może zostać „obudzony” za pomocą jakiegokolwiek przerwania. Oznacza to, że praktycznie natychmiast następuje typowa procedura obsługi przerwania, a zaraz potem odbywa się kontynuacja bieżącego programu od rozkazu następnego po baskomowym poleceniu IDLE. Ilustruje to poniższy rysunek.
przebieg programu
II |
ii fi |
dowolni® długi czas "drzemki" |
procedura obsługi przerwania "budzącego" |
II |
/ koniec powrót do programu
zgłoszenie procedury głównego począwszy
przerwania obsługi od rozkazu następnego
budzącego przerwania po poleceniu wprowa-
ze stanu IDLE dzającym w stan IDLE
Wprawdzie nie rezygnujemy z tej pętli, ale teraz w trybie oszczędnościowym po każdym zgłoszeniu przerwania od licznika T/Cl będzie ona wykonywana tylko raz. Przycisk S1, a tym samym stan nóżki PD.O zadecyduje, czy zegar ma pracować normalnie, czy też przejść w tryb oszczędnościowy. Dlatego w pętli głównej dodajemy prościutką procedurę badania stanu końcówki PD.O. Jeśli program stwierdzi, że jest tam stan wysoki, po prostu zamiast „kręcić” pustą pętlę DO...LO-OP, wprowadzi procesor w tryb IDLE. Zwróć uwagę na to, że po wykryciu zaniku napięcia sieciowego nie tylko procesor wprowadzany jest w stan Idle, ale też wcześniej poleceniem Disable TimerO
wyłączany jest TimerO, który służy przede wszystkim do obsługi wyświetlacza. Ściślej biorąc, licznik ten pracuje nadal, tylko zablokowane zostają przerwania od niego, pojawiające się co 4,096ms. Czynne (i obsługiwane) pozostają natomiast przerwania od T/Cl, pojawiające się co sekundę i przerwania te powodują odmierzanie czasu - zwiększanie licznika sekund.
Jeśli po jakimś czasie na końcówce PD.O znów pojawi się stan niski (powrót napięcia sieci), najpóźniej po sekundzie (po najbliższej obsłudze przerwania od T/Cl) zostaną odblokowane przerwania od licznika T/CO
normalny prze-bieg programu ,
wyłączenie Yny? \ / przerwań \/
od T/CO co sekundę
obsługiwane są tylko przerwania od TC/1 a potem pro-
i zegar zacznie znów normalnie wyświetlać czas. Rysunek 77 pokazuje w pewnym uproszczeniu przebieg programu w okresie (symulowanego) zaniku napięcia zasilania.
Zwróć uwagę, że przeróbka ma polegać na drobnej modyfikacji wcześniejszego programu COlób.bas, konkretnie na dodaniu w pętli głównej procedury badania stanu PD.O. Zastanów się, czy taki program zrealizuje postawione zadanie? Czy widzisz tu jakieś pułapki?
... dobrze się zastanów ...
Jeśli starannie analizowałeś poprzednie ćwiczenia, zapewne przypomniałeś sobie, że już w ćwiczeniu 13, w programie C013b.bas pokazanym na rysunku 63 przerwanie przychodzące co sekundę tylko skraca cykl licznika i zwiększa stan licznika sekund. Natomiast sprawdzanie i korygowanie liczników dokonywane jest co 4,096ms. Takie rozwiązanie jest konieczne, by prawidłowo zmieniać stany
W przypadku polecenia POWERDOWN zazwyczaj jest inaczej - procesor zostaje „obudzony do życia” przez reset od watchdoga, co oczywiście powoduje rozpoczęcie działania programu od samego początku z wszelkimi konsekwencjami tego faktu (m.in. opóźnienie o kilkanaście milisekund i ustawienie w tym czasie końcówek portów w stan trzeci, co zostanie szczegółowo omówione w części poświeconej obwodom rese-tu w jednym z następnych numerów). Warto pamiętać, że istnieje możliwość wyjścia z trybu Power Down za pomocą zewnętrznego przerwania (INTO lub INT1), obowiązkowo przy wyzwalaniu poziomem, a nie zboczem. 1 ten poziom niski na końcówce wejściowej musi utrzymywać się przez co najmniej kilkanaście milisekund - bezpiecznie jest przyjąć minimalny czas równy 25ms. KjJ W Technikaliach znajdziesz wyjaśnienie, dlacze-1 go tylko przerwanie zewnętrzne wyzwalane poziomem może wyprowadzić procesor ze stanu Power Down i dlaczego impuls budzący musi trwać odpowiednio długo.
CONFIG INTx = reakcja
MCU Control Register - |
The MCU Control Register contains control bits for generał MCU functions. J | |||||
MCUCR |
Bit |
7 6 |
5 |
4 |
3 |
2 1 0 |
S35(555) |
- i - |
1 SE |
SM |
ISC11 |
ISC10 | ISC01 | ISC00 | MCUCR | |
Read/Write |
R R |
R/W |
R/W |
R/W |
R/W R/W R/W | |
Initial value |
0 0 |
0 |
0 |
0 |
0 0 0 |
aby zagwarantować niezawodne zgłoszenie przerwania, impuls wejściowy musi więc trwać dłu
żej niż jeden takt zegara kwarcowego (w naszym przypadku powyżej 0,25ps). Ilustruje to rysunek I. Przy wyzwalaniu poziomem sytuacja jest inna, ale generalnie też należy zadbać o to. by czas zgłaszania przerwania nie był zbyt krótki.
Przy okazji chcę Ci zwrócić uwagę na kolejny dość istotny szczegół. Na rysunku J znajdziesz
skan fragmentu oryginalnej karty katalogowej. Jak z niego wynika, gwarantowanym stanem początkowym po zresetowaniu procesora (initial value) wszystkich bitów rejestru MCUCR jest stan niski. Oczywiście polecenia konfiguracji przerwań ze- ^ wnętrznych
Elektronika dla Wszystkich Czerwiec 2003 45