edw6 str46

edw6 str46



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


Wyszukiwarka

Podobne podstrony:
edw6 str39 Mikroprocesorowa Ośla łączka Mikroprocesorowa Ośla łączkaĆwiczenie 17 Oszczędny zegar -
edw6 str40 Mikroprocesorowa Ośla łączka Ml zostanie wykonana tylko raz). Natomiast przy reakcji na
edw6 str45 Mikroprocesorowa Ośla łączka Mikroprocesorowa Ośla łączka ■CQ17a prosty
edw6 str47 Mikroprocesorowa Ośla łączka Mikroprocesorowa Ośla łączka On TimerO Co4ms On Timerl Cols
89 (141) Mikroprocesorowa Ośla łączka M1 Mikroprocesorowa Ośla łączka M1 programowe zerowanie liczni
97 (117) Mikroprocesorowa Ośla łączka M1 Mikroprocesorowa Ośla łączka M1 Ćwiczenie 23Wyświetlacz
99 (115) Mikroprocesorowa Ośla łączka M1 Mikroprocesorowa Ośla łączka M1 ’C023e Wszystkie typy zmi
43680 Image37 (6) Mikroprocesorowa Ośla łączka Ml 191 ZmiennaTypuInteger = Funkcyjka (JakasZaiByte,
90 (145) Mikroprocesorowa Ośla łączka R14 R13
91 (142) Mikroprocesorowa Ośla łączka Ml Reset Watchdog I to sq wszystkie kluczowe informacje, umożl
92 (141) Mikroprocesorowa Ośla łączka Mikroprocesorowa Ośla łączka If Flaga * 1 Then gdy llaga usta
93 (135) Mikroprocesorowa Ośla łączka segmentów a tych dwóch wyświetlaczy. Podczas odmierzania czasu
95 (133) Mikroprocesorowa Ośla łączka 95 wu na działanie poprzedniej wersji centralki? Po przeprowad
96 (126) Mikroprocesorowa Ośla łączka Config Portb = Output : Portb = 127 portB - wyjcecie; PB.7 =
98 (115) Mikroprocesorowa Ośla łączka Mikroprocesorowa Ośla łączka •C023a Wyświetlacz LCD Cla Do Cl
Image33 (6) Mikroprocesorowa Ośla łączka Ml 187 SHIFTOUT Pdane , Pzegar Zmienna ,

więcej podobnych podstron