95
wu na działanie poprzedniej wersji centralki?
Po przeprowadzeniu takich eksperymentów powróć do naszej oszczędnościowej centralki i przeanalizuj kompletny program, pokazany na rysunku 118 (C022d.bas). Czerwoną strzałką zaznaczyłem usuniętą przyczynę problemu - miejsce, gdzie znacznik końca globalnego komentarza trzeba było przenieść do następnej linii. Jak widzisz, program bardzo przypomina poprzedni, działanie centralki też jest takie, jak wcześniej, tylko wykorzystana koncepcja radykalnie zmniejsza czas rzeczywistej pracy procesora, a tym samym pobór prądu.
Przy testach centralki pamiętaj, iż stan linii i klucza S2 jest sprawdzany co pół sekundy, więc pobudzenie musi trwać ponad te pół sekundy.
Program oszczędnościowej centralki z rysunku 118 działa jak poprzednio, ale u mnie, a zapewne także u Ciebie, co około pół sekundy występuje wyraźnie widoczne krótkie mignięcie segmentu f wyświetlacza W2.
1 oto znów mam dla Ciebie zadanie do samodzielnego wykonania: spróbuj dojść, dlaczego występuje to miganie. Najpierw zastanów się, wykonaj próby, a potem przeczytaj podane dalej wyjaśnienie.
Oto ono:
Migotanie segmentu f występuje wtedy, gdy masz kabel programujący cały czas dołączony do komputera. Jeśli odłączysz kabel programujący i zasilisz płytkę testową inaczej, przekonasz się, że to denerwujące miganie zniknie i nowa oszczędnościowa centralka będzie zachowywać się dokładnie tak, jak jej wcześniejsza wersja wykorzystująca Timerl. Jeśli w programie wygasiłbyś punkty
Uwaga! Bit FSTR nie jest bitem rejestru l/O w pamięci RAM (zastanów się, dlaczego nie spełniłby wtedy swej roli). Jest to jeden z dwóch bitów dodatkowych (SPIEŃ, FSTRT) w pamięci FLASH, i to nie w normalnej przestrzeni adresowej programu. Co ważne, te dodatkowe bity w pamięci FLASH można modyfikować tylko w trybie programowania równoległego. Oznacza to, że popu-H larny programator szeregowy, wykorzystujący łą-M cze SPI, taki jak np. nasz kabelek programujący, n nie może zmienić stanu bitu FSTRT. Tym samym JĘ wspomniana możliwość jest praktycznie niedoli stępna dla użytkowników posługujących się popu-m larnym, prostym programatorem szeregowym, pę w tym dla użytkowników płytki testowej AVT-> 3500.
[-i Czas opóźnienia. Podane wiadomości nn o opóźnieniu Td są istotne tylko w tych rzadkich >• przypadkach, gdy wymagane jest precyzyjne odmierzanie czasu tuż po włączeniu zasilania. Należy wtedy uwzględnić to opóźnienie i oszacować lub lepiej zmierzyć jego wielkość w rzeczywistych warunkach pracy. Warto wtedy dodatkowo wziąć pod uwagę, iż w praktyce napięcie zasilające narasta po włączeniu z jakąś skończoną szybkością związaną z wartością pojemności filtrujących i wy
'C022d Oszczędna centralko alarmowo- watchdog “budzi" ją co O.Ss Snoraiclear 'nie zeruj pamięci RAM (zmiennych) po resecie
Const Czasal ■ 10 '240 'Czas alarmu liczba<2S5 . 240»0,Ss - 120s - 2 minuty
Const Czaswy “8 '50 'Czas na wyjście liczba<255 . 50»CI.5s ■ 25 sekund
Const Czaswe *6 '30 'Czas na wyłączenie alarmu liczba<255 30«0.Ss = lSs
Din Sygnalarmu As Bit Stan As By te '( Stan - bajt stanu centralki:
Stan.7 - Bit Niewykorzystany Stan 6 - Flago Czasu Alarmu
Stan 5 - Bit Pomocniczy Potrzebny Przy Włączaniu Czuwania
Stan 4 - Stan Klucza S2(zał / Wyłącz Alarm) 1 —spoczynek 0 —praca
Stan,3 - L2 - Linia Natychmiastowa
Stan.2 - Flaga Czasu Na Wyjście
Stan.1 - Flaga Czasu Na Wejście
Stan 0 - Ll_- linia Z Opóźnieniem(zwłoczna)
Dim Czasalarmu As Byte Czaswyjscia As Byte Czaswejscia As Byte Enable Interrupts Enable Timerl Config Timerl = Timer Prescale - 64 Config Watchdog 3 512 Start Watchdog 'reset co ok O.Ss
Config Portb ■ Output Portb * 127 ' portB - wyjście, PB 6 = 0
Config Portd * &B0000100 Portd ■ 127 'podciągnij wejścia, wyłącz syrenę
If Pind 0=0 Then 'ręczna inicjałizacja przyciskiem SI
Stan ■ 16 'po ręcznej micjalizacji stan (I) czuwania Czasalarmu ■ Czasal 'inicjalizacja czasów
Czaswyjscia * Czaswy Czaswejscia = Czaswe End If 'a teraz sprawdzamy stan linii LI. L2 oraz wejść SI. S2
Stan 4 = Pind 1 Stan 3 * Pind 6 Stan 0 * Pmd 5 'przepisz stany wejść
If Stan 6 * 1 Then 'gdy bit alarmu ustawiony licz czas
Sygnalarmu • 1 nowa flaga pamięci alarmu - włączy segmenty g
Decr Czasalarmu 'zmniejsz zawartość licznika
If Czasalarmu * 255 Then Stan 6 * 0 'zakończ odliczanie czasu
Elsę 'co 0.5s, gdy nie ma alarmu
Czasalarmu - Czasal 'przygotuj do następnego cyklu
'koniec procedury licznika czasu alarmu 'gdy bit czasu na wyjście ustawiony licz czas włącz segmenty b wyświetlaczy 'zmniejsz zawartość licznika
255 Then Stan 2 = 0 ‘zakończ odliczanie czasu
'gdy nie odlicza czasu na wyjście Czaswy 'przygotuj do następnego cyklu
'wygaś segmenty b
'koniec procedury licznika czasu na wyjście Stan.l = 1 Then 'gdy bit czasu na wejście ustawiony
Portb.5 = 0 'włącz segmenty f wyświetlaczy
Decr Czaswejscia 'zmniejsz zawartość licznika
If Czaswejscia * 255 Then
Stan 1=0 'zakończ odliczanie czasu na wejście
Stan 6=1 'włącz alarm
End If
Elsę 'gdy nie odlicza czasu na wejście
Czaswejscia = Czaswe 'przygotuj do następnego cyklu
Portb 5 = 1 'wygaś segmenty f
End If 'koniec procedury licznika czasu na wejście
'a teraz sprawdzamy stan centralki:
If Stan 4=1 Then 'gdy centralka wyłączona, czyli klucz S2 - rozwarty Stan = &B00110000 'oprócz wcześniej ustawionego bitu Stan 5 (S2)
dodatkowo ustawiamy bit pomocniczy Stan 5. a resztę zerujemy
End If
If Stan 2=1 Then Portb 1=0 Decr Czaswyjscia If Czaswyjscia Elsę
Czaswyjscia Portb 1=1 End If If
If Pind Elsę
If Stan Stan Stan End If If Stan Stan Elsę
If Stan =
End If End If
Portb 0 = Stan 4 'segmenty a świadczą o włączeniu czuwania centralki Portd 2 * Not Stan 6 'ewentualnie włącz syrenę dołączoną do Q2
Portb 6 = Not Sygnalarmu 'pamięć alarmu - zaświeca segmenty g
Powerdown End
Then Sygnalarmu = 0 'gasi segment g
'praca centralki: klucz S2 - zwarty Then ' jednorazowo po włączeniu czuwania
'zablokujemy linię zwłoczną i odmierzymy czas na wyjście
'jednorazowo, więc wyzeruj bit pomocniczy
kasuje pamięć alarmu
Then gdy pobudzona linia natychmiastowa L2 - zawsze włącz alarm 1 'zacznij odmierzać czas alarmu
'gdy L2 me pobudzona, wtedy Stan*Q .7 i można 1 Then Stan 1=1 odmierz czas na wejście
dajnością zasilacza. Czym wolniej narasta napięcie, tym z większymi różnicami trzeba się liczyć. Ponadto, jak wskazuje tabela 2, dla różnych egzemplarzy napięcie progowe przy włączaniu może wynosić 1,0...1,8V. Ilustruje to rysunek E, pokazujący zakres czasu, w którym dla różnych egzemplarzy procesorów rozpocznie się procedura POR. Kolejnym źródłem niepewności jest słaba stabilność wewnętrznego oscylatora RC, pracującego podczas procedury POR. Czas zliczania jest silnie zależny od napięcia zasilania i temperatury struktury - patrz wcześniejszy rysunek C. Rysunek ten, wzorowany na charakterystyce z karty katalogowej
procesora, pokazuje przeciętną zależność częstotliwości tego oscylatora od napięcia zasilania. W dopuszczalnym zakresie napięć zasilania częstotliwość może zmieniać się w zakresie 3(X)kHz... 1600kHz. Oznacza to, że zliczenie wspomnianych 16384 taktów tego oscylatora może w skrajnych przypadkach trwać od około lOms do około 55ms. Według katalogu nawet przy napięciu zasilania wynoszącym 5V należy liczyć się z dużym rozrzutem czasu zliczania 16ms±5ms (11...21ms). Ilustruje to rysunek F. Jak z tego widać, nie sposób ani zagwarantować, ani nawet precyzyjnie określić czasu opóźnienia, po którym program zacznie realizować swe zadanie. Można go co najwyżej zmierzyć dla konkretnego egzemplarza, określonego napięcia zasilającego i temperatury.
i |
k napięcie zasilania f początek / pracy programu / |
Vrot |
J zliczanie 16384 A taktów oscylatora RC [ |
n...2ims J czas F |
38 Grudzień 2003 Elektronika dla Wszystkich