Mikroprocesorowa Ośla łączka M1
Mikroprocesorowa Ośla łączka M1
riii«uixe limen |
uuŁiiUKU»aiiiE pi łcl wau±ta uu i miel ai ipuepeiuieiuE ixc-iinvai | ||
On TijnerO Co4ms |
'po przepełnieniu licznika 0 skocz do etykiety o nazwie Co4ms | ||
On TJjnerl Cols Hosave |
'po przepełnieniu licznika 1 skocz do etykiety o nazwie Cols | ||
Uniwers = 4 : Maxi = 100 |
'wartości początkowe zmiennych pomocniczych | ||
Do |
'główny program | ||
1 w każdym obiegu pętli |
sprawdzamy i korygujemy stany liczników | ||
If Sekundy = 60 Then |
'skróć cykl licznika Sekund 0...59 | ||
Sekundy = 0 : Incr |
Minuty 'co 60s zwiększ stan licznika minut | ||
End If | |||
If Hinuty = 60 Then |
'liczy 0...59 | ||
Minuty = 0 : Incr |
Godziny 'co 60mm zwiększ stan licznika godzin | ||
End If | |||
If Godziny = 24 Then |
Godziny = 0 'liczy 0...23 | ||
If Pind.O = l Then |
'Jeżeli brak napięcid sieci | ||
Portd = 127 |
'wygaś wyświetlacze | ||
Disahle TijnerO |
'zablokuj TimerO | ||
Idle |
1PP2EJDZ DO TRYBU IDLE | ||
Elee |
'jeśli jest napięcie sieci | ||
Enable TijnerO |
‘uruchamiamy znów T/CO potrzebny do wyświetlania | ||
End If | |||
Loop | |||
End |
'koniec programu głównego | ||
Cols: |
'co 1 sekundę | ||
Load Timerl 62500 |
'“ Timerl=3036 '- żeby przerwanie było dokładnie co ls | ||
Incr Sekundy : Toggle Migaj |
: Return 'koniec obsługi przerwania od T/Cl | ||
Co4ms: |
'przerwanie co 4,096m3 (bez skracania cyklu licznika T/CO)) | ||
Decr Uniwers |
'obsługa wyświetlaczy i przycisków | ||
If Pmd.l = 0 Then |
'USTAWIANIE CZASU - tylko gdy przycisk S2 naciśnięty | ||
If Uniwers = 0 Then |
'licznik pomocniczy Uniwers | ||
Uniwers = Maxi |
'liczy w dół, od Maxi do zera | ||
Incr Minuty |
'i przyciśnięty zwiększa stan licznika minut | ||
Sekjed = 0 : Sekdz |
ies |
= 0 'zawsze tez zeruje sekundy | |
Maxi = Maxi - 4 |
'samoczynnie - coraz szybciej | ||
If Maxi < 4 Then Maxi |
4 'maksymalna szybkość | ||
End If | |||
Elae |
'NORMALNA PRACA - gdy S2 zwolniony | ||
If Uniwers = 0 Then |
1 licznik Uniwers wykorzystywany do multipleksu | ||
Uniwers = 4 |
'liczy od 4 do zera | ||
Maxi = 100 |
'początkowa wartość Maxi (nie wykorzystana) | ||
End If | |||
End If | |||
■potem zamieniamy liczby |
dwójkowe na BCD | ||
Hindzips = Hakphnl mi nur |
VI |
Minńpri = MinriziPS And 15 : Shift, Mindzips R1«ht 4 | |
c.uciiixe ujuerj. |
' ulujiuk.uwonie przerwania uu umerai (przepełnienie nuzmiraj |
Rys 79 | |
On TijnerO Co4ms |
'po przepełnieniu licznika 0 skocz do etykiety o nazwie Co4ms | ||
'po przepełnieniu licznika 1 skocz do etykiety o nazwie Cols | |||
Uniwers = 4 : Maxi - 100 |
'wartości początkowe zmiennych pomocniczych | ||
'wyłącz zasilanie komparatora analogowego | |||
Do |
'główny program | ||
1 w każdym obiegu pętli |
sprawdzalny i korygujemy stany liczników | ||
If Sekundy = 60 Then |
'skróć cykl licznika Sekund 0...59 | ||
Sekundy = 0 : Incr |
Minuty 'co 60s zwiększ stan licznika minut | ||
End If | |||
If Minuty = 60 Then |
'liczy 0...59 | ||
Minuty = 0 : Incr |
Godziny 'co 60mln zwiększ stan licznika godzin | ||
End If | |||
If Godziny = 24 Then |
Godziny = 0 'liczy 0...23 | ||
If Pind.O = l Then |
'jeżeli brak napięcia sieci | ||
Portd = 127 |
'wygaś wyświetlacze | ||
'likwiduje prąd płynący przez R15...R18 i kabel programujący | |||
Diaahle TijnerO |
'zablokuj TimerO | ||
Idle |
'PRZEJDZ DO TRYBU IDLE | ||
Elae |
'jeśli jest napięcie sieci | ||
Enahle TijnerO |
'w każdym obiegu pętli uruchamiamy T/CO, co nie przeszkadza | ||
End If | |||
Loop | |||
End |
'koniec programu głównego | ||
Cols: |
'co 1 sekundę | ||
Inart T1mer1 62.400 |
1 “ Timer1 =303 6 żehv nr zerwani p hwłn dokładnie co 1 «> |
liczników podczas ustawiania za pomocą „inteligentnych” przycisków SI i S2. Właśnie ze względu na ustawianie musieliśmy korygować liczniki podczas obsługi przerwania od licznika T/CO. a nie od T/Cl. Czy już widzisz problem?
No właśnie, jeśli zanik napięcia sieci wyłączy obsługę przerwań T/CO, podczas obsługi przerwań od T/Cl zwiększany będzie tyl-
zmieniają stan bitów odpowiednio ISCłl, ISC10 oraz ISCOl, ISCOO. Wynika z tego oczywisty wniosek - jeśli w programie zabraknie takiego po-lecenia konfiguracji, a wykorzystywane będą przerwania zewnętrzne, będą one reagować na ni-ski poziom logiczny, bo wszystkie te bity konfigu-M racyjne będą wyzerowane. Jeśli więc przerwania zewnętrzne mają czy mogą pracować w tym try-bie, można spokojnie pominąć polecenie t- CONFIG INTx = LOW LEVEL M I tym samym zmniejszyć objętość programu ^ o kilka czy nawet kilkanaście bajtów. Jak już pisałem, czasem nawet te kilka bajtów pozwoli zmie-ko stan licznika sekund, a liczniki minut i godzin nie będą pracować prawidłowo.
Czy masz jakiś pomysł na rozwiązanie problemu?
Oczywiście rozwiązania mogą być rozmaite. Można na przykład procedurę korygowania liczników umieścić w pętli głównej. Kluczowy fragment tak zmodyfikowanego programu pokazany jest na rysunku 78 ścić się w limicie 2kB programu wynikowego, dlatego warto wiedzieć o takiej możliwości. Oczywiście dotyczy to też innych poleceń konfiguracji -w każdym przypadku trzeba sprawdzić w karcie katalogowej, jaki jest stan początkowy danych rejestrów po resecie i sprawdzić, czy za pomocą takiej sztuczki uda się nieco zmniejszyć objętość programu, na przykład wpisując do rejestru MCUCR stan wszystkich bitów konfiguracyjnych jednym poleceniem. Takie sztuczki zawsze należy sprawdzić na etapie tworzenia i testowania programu.
Oczywiście, podobnie jak w przypadku innych przerwań, możesz wykorzystać opcję NOSAVE
(C017b.bas). Oprócz blokowania przerwań od licznika T/CO i przechodzenia do stanu Idle, dodaliśmy też linie wygaszającą wskaźniki: PortD = 127
Zwróć uwagę, że zmieniliśmy też procedurę ustawiania czasu, która teraz wykorzystuje tylko przycisk S2. Załaduj program C017b.bas do procesora i sprawdź, czy zegar działa.
Prawdopodobnie przekonasz się, że działa. Jeśli jednak dłużej pobawisz się z ustawianiem oraz włączaniem i wygaszaniem, najprawdopodobniej zegar się po pewnym czasie zawiesi i nie da się włączyć naciśnięciem przycisku SI. Do ewentualnych takich prób warto „zaremować” w programie linię: 'PortD = 127
co pozwoli najdociekliwszym Czytelnikom poszukać dziwnych prawidłowości w zawieszaniu programu. Nie namawiam jednak do dociekliwego szukania przyczyn, tylko od razu zasygnalizuję, iż określając procedurę obsługi przerwania od licznika T/Cl, pozostawiliśmy tam pożyteczną skądinąd opcję No-save. Jak zapewne pamiętasz, pozwala ona skrócić zarówno program, jak i czas wykonywania programu (skróciła nasz program z 966 na 846 bajtów), jednak musi być stosowana świadomie. W przypadku, gdy główny program byl pustą pętlą DO...LOOP, wszystko było w porządku. Potem do pętli dorzuciliśmy sporo poleceń i tym samym zaryzykowaliśmy, że przerwania z opcją Nosave mogą zakłócić pracę programu.
Usuń lub „zaremuj” klauzulę Nosave, jak pokazuje rysunek 79 (C017c.bas), a potem sprawdź, że program nie będzie się już zawieszał.
Jeżeli sądzisz, iż nasza płytka testowa pobiera teraz w spoczynku około 2mA prądu, to się grubo mylisz. Owszem, w trybie Idle sam procesor pobiera mniej więcej taki prąd. Budzony co sekundę z drzemki procesor w krótkich chwilach pracy potrzebuje znacznie więcej prądu, jednak praca trwa krótko i ten składnik można pominąć. Możesz wykorzystywać bardzo pożyteczny tryb Idle i procesor będzie pobierał prąd rzędu 1...2mA, zależnie od napięcia zasilania. Trzy, a od biedy nawet dwie baterie alkaliczne LR03 (tzw. małe paluszki) powinny wystarczyć na kilkaset godzin, czyli
(patrz EdW 5/2003), co przy sensownie napisanym programie pozwoli zarówno skrócić, jak i przyspieszyć pracę programu.
Powinieneś też wiedzieć, że jeśli przerwania są odblokowane (ustawione bity GIMSK.6, GIMSK.7, SREG.7), będą one zgłaszane i obsługiwane także wtedy, jeśli końcówki PD.2, PD.3 (nóżki 6, 7) będą pracować jako wyjścia, co zależy od stanu bitów 3 i 2 w rejestrach DDRD i PORTD. Inaczej mówiąc, obwód przerwań zewnętrznych jest zupełnie niezależny od stanu portu D. Może to być wykorzystane w zupełnie nietypowy sposób -do obsługi tak zwanych przerwań programowych.
46 Czerwiec 2003 Elektronika dla Wszystkich