1. Wstęp
Wykonany przez nas projekt to mikroprocesorowy sterownik oświetlenia.
Ideą naszej pracy był zbudowanie uniwersalnego sterownika oświetlenia, którego zadaniem byłoby załączanie oświetlenia w odpowiednich godzinach wieczornych i wyłączanie go w odpowiednich godzinach porannych. Pod uwagę wzięliśmy to, aby układ był odporny na zakłócenia, jego praca była stabilna i statyczna.
Zaletą projektu, jest to, że łączy w sobie funkcję sterownika i zegara. W odróżnieniu od sterowników oświetlenia z czujnikami optycznymi jest odporny na zakłócenia wywołane różnymi źródłami światła (np.: przejeżdżający w nocy samochód).
Układ działa na zasadzie porównywania aktualnego czasu z zapisanymi w programie mikroprocesora godzinami włączeń i wyłączeń oświetlenia, które są indywidualnie dobrane do poszczególnych miesięcy według rocznego rozkładu godzin wschodów i zachodów słońca, który dla każdego roku jest niemal identyczny. Czasy te zostały zaokrąglone dla kolejnych piętnastu dni każdego miesiąca (tabela strona 42).
Obsługa sterownika
Aby rozpocząć pracę mikroprocesorowego sterownika oświetlenia, należy najpierw do wyjścia przekaźnika dołączyć odbiornik (żarówka max.60W, przekaźnik), podłączyć kabel zasilający do sieci oraz znajdujący się na tylnym panelu przełącznik suwakowy ustawić w pozycję „ON”.
Przełącznik ten służy on do odłączania baterii podtrzymującej pracę zegara. W pozycji „ON” bateria jest dołączona do układu, a w pozycji „OFF” odłączona.
Gdy sterownik jest nie używany i odłączony od sieci, przełącznik odłączający baterię należy ustawić w pozycji OFF.
Do obsługi sterownika służy czteroprzyciskowa klawiatura, która umożliwia wprowadzenie aktualnej daty i czasu.
Aby zmienić ustawienia zegara należy:
1. Nacisnąć przycisk „SET” (1), który powoduje wejście w tryb ustawień.
Na wyświetlaczu pojawi się napis:
„MIESIĄC: (dotychczasowe ustawienie)”
2.Klawiszami „strzałka w górę”(2) i „strzałka w dół”(4) ustawiamy żądaną wartość.
3. Klawiszem „OK” (3) zatwierdzamy wprowadzoną nastawę.
Na wyświetlaczu pojawi się napis:
„DZIEŃ: (dotychczasowe ustawienie)”
Według identycznej procedury ustawiamy dzień miesiąca, a następnie: godzinę i minutę. Po wpisaniu ostatniej nastawy i wciśnięciu „OK”, układ automatycznie zmienia nastawy zegara oraz wprowadza do pamięci zegara odpowiednie dla danego miesiąca i dnia dane określające godziny załączenia i wyłączenia przekaźnika sterującego oświetleniem.
3. Opis działania sterownika
Mikroprocesorowy sterownik oświetlenia zbudowany jest w oparciu o uniwersalny mikroprocesor firmy ATMEL 89C4051. Pełni on pięć zasadniczych funkcji:
komunikuje się z zegarem czasu rzeczywistego PCF 8583 za pomocą szyny I2C
steruje przekaźnikiem
wysyła dane na wyświetlacz LCD
odczytuje stany z klawiatury
resetuje watchdog.
Mikroprocesor jest taktowany generatorem z rezonatorem kwarcowym 11,0592MHz. Linie szyny I2C: SDA i SCL, są wyprowadzone na porty odpowiednio:P3.2 i P3.1. Linie te wymagają podciągnięcia do +5V, co jest realizowane przez rezystory R3 i R4. Zegar czasu rzeczywistego PCF8583 wymaga stosowanie rezonatora Q1: 32,768kHz i dwóch kondensatorów C10 i C11 służących do stabilizacji pracy generatora zegara.
Program mikroprocesora odczytuje z układu PCF8583 aktualną: sekundę, minutę, godzinę, dzień i miesiąc a także minutę i godzinę alarmu.
Wyświetlacz LCD jest połączony z mikroprocesorem czterema liniami danych: D4, D5, D6, D7 (odpowiednio porty: P1.2, P1.5, P1.3, P1.4) oraz liniami RS (P1.7) i E (P1.6).
Przekaźnik wyjściowy posiada pojedynczy styk przystosowany do załączania napięcia sieciowego. Cewka przekaźnika jest sterowana poprzez tranzystory T2 i T3 pracujące w układzie Darlingtona. Kondensator C6 ma za zadanie eliminować krótkotrwałe zmiany stanów na porcie P1.1, które powodowały by niepożądane „klapania” styków.
Klawiaturę stanowią cztery przyciski typu switch dołączone do portów: P1.0, P3.4, P3.5, P3.7.
Po włączeniu zasilania program dokonuje konfiguracji zegara (np.: wybór 12 -godzinnego formatu wyświetlania, uaktywnienie systemu alarmów).
Dalej program mikroprocesora stanowi pętla, w której wykonywane są kolejne czynności:
odczyt z PCF8583 aktualnej godziny i daty oraz minuty i godziny alarmu
zamiana formatu zapisu danych z BCD na dziesiętny
wyświetlenie danych
sprawdzenie czy naciśnięty klawisz SET - wejście w tryb ustawień zegara
sprawdzenie czy aktualna godzina i minuta są równe godzinie i minucie alarmu - jeżeli tak:
sprawdzenie czy alarm dotyczy włączenia czy wyłączenia oświetlenia i odpowiednie wysterowanie przekaźnika.
wpisanie do zegara do rejestrów minuty i godziny alarmu danych odpowiednich dla następnego przełączenia.
- powrót na początek pętli i wykonywanie jej od początku.
2. Schemat ideowy sterownika
4. Mikrokontroler AT89C4051
4.1 Opis ogólny
Układ AT89C4051 jest niskonapięciowym, 8-bitowym mikrokomputerem CMOS z programowalną i kasowalną pamięcią Flash (EEPROM) 4KB.układ jest produkowany z wykorzystaniem technologii pamięci nielotnych dużej gęstości firmy Atmel i jest zgodny z przemysłowym standardem MCS-51 pod względem zestawu instrukcji i rozmieszczenia wyprowadzeń. W wyniku połączenia w jednej strukturze elastycznej 8-bitowej jednostki centralnej (CPU) i pamięci Flash, układ AT89C4051 jest wydajnym mikrokomputerem, będącym wysoce elastycznym i tanim rozwiązaniem wielu wbudowanych zastosowań sterowania.
Układ AT89C2051 oferuje następujące standardowe właściwości: 4KB pamięci Flash, 128 bajtów pamięci RAM, 15 linii wejścia/wyjścia, dwa 16-bitowe timery/liczniki, architekturę przerwań o sześciu wektorach i dwu poziomach, w pełni dupleksowy port szeregowy, precyzyjny komparator analogowy, wewnętrzny oscylator i układ zegara.
Ponadto układ AT89C4051 jest wykonany w logice statycznej dla pracy przy częstotliwościach zegara poczynając od zera, dodatkowo wspomagany przez dwa wybierane programowo tryby oszczędnego poboru mocy. Tryb bezczynności wstrzymuje pracę jednostki centralnej, podczas gdy pamięć RAM, timery/liczniki, port szeregowy i system przerwań funkcjonują nadal. Tryb obniżonej mocy podtrzymuje zawartość pamięci RAM, ale zamraża pracę oscylatora, blokując wszystkie inne funkcje układu aż do zerowania sprzętowego.
4.2 Działanie mikrokontrolera
Mikroprocesory są układami sekwencyjnymi, synchronicznymi, tzn. wszystkie operacje wykonywane przez układy procesora odbywają się w określonej kolejności i w ściśle określonych momentach czasowych. Dlatego muszą współpracować z generatorami impulsów zegarowych. Mikrokontrolery mają wewnętrzny generator, do którego dołącza się z zewnątrz rezonator kwarcowy lub ceramiczny oraz dodatkowo dwa kondensatory, ułatwiające wzbudzenie się generatora na pożądanej częstotliwości.
W mikrokontrolerach rodziny '51, jeżeli jest stosowany rezonator kwarcowy, to pojemności mają wartości 22 - 39 pF, a przy rezonatorze ceramicznym 30 - 51 pF.
W pracy został zastosowany rezonator kwarcowy 11,0592 MHz i dwa kondensatory o pojemności 33 pF.
Dobierając częstotliwość generatora należy pamiętać, że musi się ona mieścić w zakresie określonym przez producenta. Przy częstotliwości za dużej lub za małej mikrokontroler przestanie poprawnie pracować.
Układ każdego generatora wymaga odpowiedniego czasu od momentu włączenia zasilania do momentu osiągnięcia założonej częstotliwości. Czas ten wynosi na ogół około 10 ms.
Ponieważ po włączeniu zasilania układy wewnętrzne mikrokontrolera przyjmują stan dowolny, dlatego musi istnieć możliwość wymuszenia na mikroprocesorze powtarzalnych stanów początkowych wszystkich jego rejestrów. Mikroprocesory posiadają wejście (RST), na które jeżeli poda się odpowiedni sygnał, to nastąpi wymuszenie stanów początkowych rejestrów wewnętrznych. Ponieważ stan początkowy procesora musi być ustalony po włączeniu zasilania, to do tego wejścia dołącza się układ czasowy RC, który wymusza na wymagany odcinek czasu sygnał zerujący.
Podstawową jednostką określającą czas wykonywania instrukcji jest cykl maszynowy. Składa się on z sześciu stanów oznaczonych od S1 do S6. Każdy ze stanów trwa dwa okresy sygnału taktującego (cykle zegarowe) nazywane fazami i oznaczane P1 i P2. pojedynczy cykl maszynowy składa się z 12 taktów sygnału zegarowego, a czas wykonywania instrukcji wynosi 1, 2 lub 4 cykle maszynowe.
4.3 Opis wyprowadzeń układu AT89C4051
RST - reset
VCC - zasilanie +5V
GND - masa
P1.0-P1.7 - wejścia/wyjścia portu P1
P3.0-P3.5 i P3.7 - wejścia/wyjścia portu P3
5. Zasilanie układu
5.1 Schemat
Zasilacza zbudowany jest na transformatorze sieciowym TS4/13. |Wyprostowane i odfiltrowane napięcie podawane jest na stabilizator monolityczny 7805, którego napięcie wyjściowe wynosi 5V.
5.2 Stabilizator 7805
Stabilizator 7805 zbudowany jest z następujących bloków:
Wzmacniacza błędu
Źródła napięcia odniesienia
Ogranicznika prądowego
Ogranicznika termicznego
Tranzystora mocy
Wyprowadzenia:
5.3 Układ podtrzymania zegara PCF8583
Do zasilania wykorzystywana jest również bateria o napięciu 3,6V. Ogniwo to jest stosowane, gdy odłączone zostanie zasilanie główne i służy do podtrzymania działania zegara PCF 8583. W czasie, gdy zasilanie główne jest włączone ogniwo jest doładowywane.
W czasie normalnej pracy zegar czasu rzeczywistego PCF 8583 jest zasilany z zasilania głównego. Jednak każda przerwa w zasilaniu powoduje reset pamięci RAM zegara. Dlatego konieczne jest zastosowanie dodatkowego zasilania bateryjnego. W czasie pracy zasilacza zegar czasu rzeczywistego jest zasilany przez diodę D1. W tym samym czasie bateria (3,6V) jest doładowywana napięciem +5V przez elementy R2 i D2, które ograniczają prąd płynący do baterii. Dioda D3 blokuje pełne napięcie +5V. W czasie przerwy w zasilaniu bateria zasila PCF poprzez diodę D3. Natomiast diody D1 i D2 separują baterię, aby nie była zasilana pozostała część sterownika.
6. Układ WATCHDOGA zewnętrznego
WATCHDOG jest układem nadzorującym, który umożliwia wykrywanie błędów w działaniu programu. W przypadku zawieszenia się programu mikrokontrolera, WATCHDOG powoduje automatyczny reset systemu mikroprocesorowego, a więc w czasie normalnej pracy WATCHDOG musi, co pewien czas być resetowany sygnałem z mikroprocesora, aby nie zakłócał pracy programu.
6.1 Licznik 4060
W mikroprocesorowym sterowniku oświetlenia WATCHDOG zbudowany jest w oparciu o scalony 14-bitowy licznik CMOS 4060.
Układ ten posiada w swej strukturze wewnętrzny generator, którego częstotliwość działania zależy od elementów zewnętrznych: R8, C7 dołączonych do wejść RTC i CTC.
Na wyjściach Q3 - Q13 otrzymujemy odpowiednie podziały częstotliwości generatora wewnętrznego.
Dla użytych elementów w układzie sterownika oświetlenia częstotliwość wynosi 925kHz.
Rt<< R1 R1C1<<RtCt
Wartości zalecane:
Ct >100pF
10 k Rt < 1 M
6.2 Opis działania układu
Impulsy zerujące licznik podawane są z portu P3.3 mikroprocesora na wejście M RST licznika. Każdy impuls powoduje, że licznik zaczyna zliczać od zera.
Sygnał resetujący mikroprocesor jest pobierany z wyjścia Q9 licznika i podawany przez układ całkujący R1, C11 na bazę tranzystora T1. Zawieszenie się programu spowoduje, że mikroprocesor przestanie generować impulsy zerujące watchdog. W pewnym momencie zliczania na Q9 pojawi się stan wysoki „1”, którym wysterowany zostanie T1. Prowadzi to dalej do podania stanu wysokiego na wejście RST, co powoduje natychmiastowy reset mikroprocesora i rozpoczęcie wykonywania programu od początku.
Impulsy zerujące licznik muszą być generowane przez mikroprocesor w takich odstępach czasowych, aby nie nastąpiło pojawienie się stanu wysokiego na wyjściu Q9 licznika, czyli częstotliwość impulsów zerujących licznik powinna być większa od częstotliwości impulsów resetujących mikroprocesor.
7. Zegar czasu rzeczywistego PCF8583
7.1 Opis ogólny
Układ PCF8583 jest układem zegara i kalendarza zawierającym 256 bajtów pamięci RAM. Posiada wbudowany oscylator o częstotliwości 32,768 kHz.
Adresowanie i przesyłanie danych do tego układu przez mikrokontroler odbywa się za pomocą transmisji szeregowej dwoma liniami szyny I2C. Po każdym odczycie lub zapisie danej z tego układu następuje automatyczna inkrementacja słowa adresowego.
7.2 Konfiguracja wyprowadzeń
Nóżka |
Oznaczenie |
Funkcja |
1 |
OSCI |
Wejście oscylatora lub 50 Hz |
2 |
OSCO |
Wyjście oscylatora |
3 |
A0 |
Wejście adresowe |
4 |
GND |
Masa układu |
5 |
SDA |
Szeregowa linia danych szyny I2C |
6 |
SCL |
Szeregowa linia zegarowa szyny I2C |
7 |
INT |
Wyjście przerwania |
8 |
Vcc |
Zasilanie układu +5V |
7.3 Właściwości:
Ośmiołóżkowa obudowa DIP8 lub SO8
Zasilanie napięciem stałym +5V
Zliczanie czasu odbywa się w oparciu o zewnętrzny wzorzec czasu (np. kwarc 32,768 kHz lub 50kHz)
Po włączeniu zasilania wszystkie liczniki są repetowane, automatycznie ustawiane jest odmierzanie czasu oscylatorem kwarcowym, format czasu na 24h, data na „1 styczeń”, styczeń godzina na 0:00:00
Możliwość podtrzymania pracy zegara przy użyciu niskiego napięcia z zakresu 1V-6V (np. bateria lub akumulator)
Sterowanie zapisem i odczytem informacji do/z układu odbywa się za pośrednictwem szyny I2C pracującej przy napięciu 2,5V-6V
Automatyczna inkrementacja słowa adresowego
Dwa formaty wyświetlania godziny - 12 lub 24 godzinny
Zapis i odczyt informacji do/z zegara następuje w kodzie BCD
Możliwość modyfikacji przedostatniego bitu adresu zegara (A0)
Możliwość pracy jako zegar, kalendarz, licznik, tirem, sygnalizator programowanych alarmów
Układ zawiera 256 jednakowych rejestrów, z których pierwszych 8 (lub 16, jeśli korzystamy z funkcji alarmu) służy do sterowania zegarem, a pozostałe 248 (albo 240) stanowi zwykłą pamięć RAM ogólnego przeznaczenia
Generacja przerwania na nóżce numer 7 (INT) po spełnieniu zaprogramowanych warunków alarmu
Zatrzaskiwanie odczytywanych danych na początku cyklu odczytu, co zapobiega błędom odczytu z licznika
7.4 Adres układu
Komunikacja z układem PCF8583 odbywa się za pośrednictwem szyny I2C. Aby móc komunikować się z układem o takim interfejsie należy w pierwszej kolejności wysłać jego adres. Ma on postać 8 bitów, a przedostatni bit może być modyfikowany poprzez dołączenie nóżki A0 pod odpowiedni poziom napięcia. Dzięki temu do wspólnej magistrali można podłączyć dwa układy PCF8583. Poprzez nadanie każdemu z nich innego adresu staną się one rozróżnialne dla mikroprocesora.
Modyfikacji, lecz tylko w sposób programowy, ulega także ostatni bit adresu. Związany jest on z kierunkiem transmisji („0” - zapis do rejestrów, „1” - odczyt rejestrów)
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
1 |
0 |
1 |
0 |
0 |
0 |
A0 |
R/W |
Adres I2C układu PCF8583 |
|||
Sposób podłączenia nóżki A0 |
Adres |
||
|
Dec |
Bin |
Hex |
Nóżka A0 zwarta do masy, zapis rejestrów |
160 |
10100000 |
A0 |
Nóżka A0 zwarta do masy, odczyt rejestrów |
161 |
10100001 |
A1 |
Nóżka A0 zwarta do +5V, zapis rejestrów |
162 |
10100010 |
A2 |
Nóżka A0 zwarta do +5V, odczyt rejestrów |
163 |
10100011 |
A3 |
7.5 Zapis i odczyt rejestrów
Zegar PCF8583 zawiera 16 ośmiobitowych rejestrów. Aby wywołać dowolny rejestr należy za pomocą szyny I2C wysłać jego numer.
Aby zapisać informację do rejestrów należy wysłać:
Sygnał START
Adres układu z ostatnim bitem równym 0
Numer rejestru, od którego ma się rozpocząć zapis informacji
Określoną w programie ilość bajtów danych; po każdorazowym wysłaniu kolejnego bajtu numer rejestru jest automatycznie zwiększany o jeden
Po zakończonym zapisie informacji - sygnał STOP.
Aby odczytać informację z rejestrów należy wysłać:
Sygnał START
Adres układu z ostatnim bitem równym 0
Numer rejestru, od którego ma się rozpocząć odczyt informacji
Ponownie sygnał START
Adres układu z ostatnim bitem równym 1
Teraz można odczytywać informację spod wskazanego rejestru; po każdorazowym odczycie zawartości danego rejestru, jego numer jest zwiększany o jeden
Po zakończonym odczycie informacji - sygnał STOP
7.6 Wykaz rejestrów zegara
Rejestr |
Adres RAM |
|
|
Hex |
Dec |
Sterujący |
00H |
0 |
Setne sekundy |
01H |
1 |
Sekundy |
02H |
2 |
Minuty |
03H |
3 |
Godziny |
04H |
4 |
Lata / Dni miesiąca |
05H |
5 |
Dni tygodnia / miesiące |
06H |
6 |
Tirem |
07H |
7 |
Kontrola alarmu |
08H |
8 |
|
09H |
9 |
|
0AH |
10 |
|
0BH |
11 |
|
0CH |
12 |
|
0DH |
13 |
|
0EH |
14 |
|
0FH |
15 |
Dostępna dla użytkownika pamięć RAM |
10H |
16 |
|
….. |
….. |
|
0FFH |
255 |
Rejestr sterujący (adres 00H):
MSB LSB
B7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
b0 - flaga sekund alarmu („0” - alarm sekund aktywny)
b1 - flaga minut alarmu („0” - alarm minut aktywny)
b2 - flaga uaktywnienia alarmu
„0” - alarm nieaktywny (pamięć o adresach 08H do 0FH jest dostępna)
„1” - alarm aktywny (pamięć o adresach 08H do 0FH jest wykorzystana do kontroli alarmu)
Jeżeli bit jest wyzerowany, b0 zmienia cyklicznie swój stan logiczny co 0,5sek, a b1 - co 0,5min
b3 - maskowanie przy odczycie bitów roku i tygodnia
„0” - odczyt rejestrów 05H i 06H bezpośrednio
„1” - zerowanie w komórkach 05H i 06H bitów oznaczających rok i dzień tygodnia
b4, b5 - wybór trybu sterowania oscylatorem i jego rodzaju
„00” - dołączony kwarc 32,768 kHz
„01” - do wejścia OSCI doprowadzony sygnał 50 Hz
„10” - wejście OSCI zlicza impulsy
„11” - tryb test
b6 - zatrzymanie ostatniej wartości
„0” - brak zatrzymania
„1” - zatrzymanie
b7 - znacznik zatrzymania zliczania
„0” - zliczaj impulsy
„1” - zatrzymaj zliczanie, resetuj dzielnik
Rejestr setnych części sekundy (adres 01H):
MSB LSB
b7 |
b6 |
b5 |
b4 |
B3 |
b2 |
b1 |
b0 |
b0, b1, b2, b3 - setne części sekund
b4, b5, b6, b7 - dziesiąte części sekund
Rejestr sekund (adres 02H):
MSB LSB
b7 |
b6 |
b5 |
b4 |
B3 |
b2 |
b1 |
b0 |
b0, b1, b2, b3 - sekundy
b4, b5, b6, b7 - dziesiątki sekund
Rejestr minut (adres 03H):
MSB LSB
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
b0, b1, b2, b3 - minuty
b4, b5, b6, b7 - dziesiątki minut
Rejestr godzin (adres 04H):
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
MSB LSB
b0, b1, b2, b3 - godziny (w kodzie BCD)
b4, b5 - dziesiątki godzin (wartość od 0 do 2 w kodzie binarnym)
b6 - znacznik AM/PM („0” - AM, „1” - PM)
b7 - tryb 12h/24h („0” - tryb 12h, „1” - tryb 24h)
Rejestr lat / dni miesiąca (adres 05H):
MSB LSB
b7 |
b6 |
b5 |
b4 |
B3 |
b2 |
b1 |
b0 |
b0, b1, b2, b3 - dni miesiąca (w kodzie BCD)
b4, b5 - dziesiątki dni miesiąca (wartość od 0 do 3 w kodzie binarnym)
b6, b7 - informacja o roku (w kodzie binarnym)
Bity informacji o roku są zapisaną binarnie różnicą aktualnego roku i ostatniego roku przestępnego. Układ 8583 nie przewiduje zapisu całej informacji o roku w komórkach liczników. Aby można było stwierdzić aktualny rok należy zapamiętać gdzieś informację o ostatnim roku przestępnym.
Rejestr dni tygodnia /miesięcy (adres 06H):
MSB LSB
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
b0, b1, b2, b3 - miesiące (w kodzie BCD)
b4 - dziesiątki miesięcy
b5, b6, b7 - dni tygodnia (wartość od 0 do 6 w kodzie binarnym)
Rejestr timera (adres 07H).
Rejestr alarmu (adres 08H):
b0, b1, b2 - bity sterujące funkcją timera
000 - timer wyłączony
001 - timer zlicza ułamki sekundy od 0 do 99
010 - timer zlicza sekundy od 0 do 60, itd…
b3 -
„1” - w przypadku przepełnienia timera zostanie ustawiona flaga alarmu w rejestrze kontrolnym oraz na wyjściu INT pojawi się stan niski
„0” - zostanie ustawiona tylko flaga alarmu.
b4, b5 - funkcje alarmu zegara
00 - zegar pracuje bez alarmu
01 - alarm codzienny, układ nie uwzględnia rejestrów alarmowych daty i dnia tygodnia
10 - alarm w określonym dniu tygodnia, układ nie uwzględnia rejestru alarmowego daty, natomiast uwzględnia rejestr dnia tygodnia
11 - alarm zgodnie z wszystkimi ustawionymi rejestrami alarmowymi (oprócz rejestru dnia tygodnia)
b6 - włączenie alarmu timera.
b7 -
„1” - w przypadku alarmu zegara ustawiony zostanie bit w rejestrze kontrolnym i podany stan niski na wyjście INT
„0” - ustawiony zostanie tylko bit w rejestrze kontrolnym
Rejestr alarmowy ułamków sekund (adres 09H).
Rejestr alarmowy sekund (adres 0AH).
Rejestr alarmowy minut (adres 0BH).
Rejestr alarmowy godzin (adres 0CH).
Rejestr alarmowy dni, bez numeru roku (adres 0DH).
Rejestr alarmowy miesiąca / dnia tygodnia (adres 0EH):
W zależności od ustawionej opcji alarmu zawiera numer miesiąca, albo numer dnia tygodnia. W drugim przypadku funkcje bitów rejestru są następujące:
b0 - alarm, jeśli dzień tygodnia 0,
b1 - alarm jeśli dzień tygodnia 1, itd…
b7 - nie używany
Rejestr alarmowy timera (adres 0FH).
Struktura rejestrów jest identyczna z rejestrami zegara. Służą do porównania z rejestrami zegara w przypadku włączonej funkcji alarmu.
Zliczanie czasu nie powoduje zmiany ich zawartości.
W związku z opisanymi bitami jest niezbędna mała uwaga. Układ alarmu zegara może pracować w czterech trybach:
1. Alarm wyłączony - zegar tylko odmierza czas,
2. Alarm jednorazowy - układ komparatora porównuje rejestry zegara począwszy od rejestru ułamków sekund, aż po rejestr miesiąca wraz z odpowiadającymi im rejestrami alarmu, które zostaną opisane poniżej. W przypadku stwierdzenia równości wszystkich rejestrów zostaje ustawiona flaga alarmu i ewentualnie podany stan niski na wyjście INT.
3. Alarm codzienny - z porównania wykluczone zostaną rejestry daty, a alarm zostanie włączony, jeśli będą zgodne ustawienia rejestrów godzin, minut, itd.
4. Alarm cotygodniowy - układ pomija rejestry daty, natomiast uwzględnia przy porównaniu rejestr zawierający numer dnia tygodnia, co jest bardzo wygodnym rozwiązaniem, jeśli układ ma działać cyklicznie; staje się zbędne wyliczanie kolejnej daty alarmu.
Pozostałe 240 bajtów pamięci RAM, począwszy od adresu 10H, może być dowolnie wykorzystane. Sekwencja programowania alarmu powinna przebiegać w ten sposób, że najpierw zapisuje się wybrane parametry czasu i daty alarmu. Jeżeli będzie to alarm cykliczny, cotygodniowy, pod adresem 0EH trzeba ustawić jeden bit odpowiadający wybranemu dniu tygodnia. W rejestrze 08H bity dotyczące timera powinny być wyzerowane, natomiast ustawienie pozostałych określi rodzaj alarmu oraz zezwolenie na pojawienie się stanu niskiego na wyjściu INT.Na koniec w rejestrze 00H trzeba wyzerować bity 0 i 1.
W przypadku alarmu są one ustawiane i można wyzerować je powtórnie tylko programowo.
8. Wyświetlacz LCD 24x2
8.1 Opis ogólny
Wyświetlacz ciekłokrystaliczny oparty jest na sterowniku HD44780. Umożliwia on wyświetlanie znaków alfanumerycznych (cyfry i litery) w dwóch liniach po 24 znaki. Kody generowanych znaków są zgodne z kodami ASCII. Znaki wyświetlane są punktowo w polu 5 x 7 pikseli.
Układ posiada dwie pamięci:
DDRAM -pamięć danych wyświetlanych (pamięć ekranu) o pojemności 128 bajtów.
CGRAM - pamięć konfigurowalna (generator znaków definiowalnych) o pojemności 64 bajtów, w której użytkownik może zapisać 8 własnych znaków.
W pamięci CGRAM zarezerwowanych jest po 8 bajtów dla każdego definiowanego znaku. Znakom tym przypisuje się domyślne numery od 0 do 7 jako kody tych znaków, które wykorzystuje się tak samo jak kody ASCII znaków standardowych. Znak o kodzie n zapisuje się w pamięci CGRAM pod adresami 8n(8n+7), gdzie n = 0…7.
W celu zdefiniowania własnego znaku, np. litery Ł jako znaku numer 7 należy do pamięci CGRAM pod adresami 56 - 63 (38h - 3Fh) zapisać 8 bajtów o wartościach odpowiadających kombinacjom bitów reprezentujących punkty (piksele) wierszy matrycy (6 x 8 punktów), w której odwzorowany jest znak o wymiarach 5 x7 punktów
|
Matryca znaku |
CGRAM |
||||||
|
5 |
4 |
3 |
2 |
1 |
0 |
Adres (hex) |
Dane (hex) |
0 |
|
|
|
|
|
|
38 |
10 |
1 |
|
|
|
|
|
|
39 |
10 |
2 |
|
|
|
|
|
|
3A |
14 |
3 |
|
|
|
|
|
|
3B |
18 |
4 |
|
|
|
|
|
|
3C |
10 |
5 |
|
|
|
|
|
|
3D |
10 |
6 |
|
|
|
|
|
|
3E |
1F |
7 |
|
|
|
|
|
|
3F |
00 |
8.2 Opis wyprowadzeń (widok wyświetlacza z góry)
1 - GND 8 - D1
2 - Vcc (+5V) 9 - D2
3 - V0 10 - D3
4 - RS 11 - D4
5 - R / W 12 - D5
6 - E 13 - D6
7 - D0 14 - D7
D0…D7 - 8 linii danych do dwukierunkowej komunikacji z systemem (w trybie 4-bitowej pracy używane są linie D4…D7)
RS - sygnalizuje, czy dana na wejściu jest kodem znaku do wpisania, czy też instrukcją do wykonania
„0” - wybieramy rejestr instrukcji
„1” - wybieramy rejestr danych
R / W - sygnalizuje, czy dana ma być czytana, czy też wpisywana do wyświetlacza
„0” - zapis
„1” - odczyt
E - linia uaktywnienia (sterująca) - aktywna w stanie H
V0 - regulacja kontrastu od 0V do 5V
0V - maksymalny kontrast
5V - wygaszony wyświetlacz
Cztery kombinacje sygnałów RS i R/W pozwalają na wykonanie następujących instrukcji:
RS |
R/W |
Instrukcje |
0 |
0 |
Zapis rozkazów do sterownika. Są one przesyłane po linii danych |
0 |
1 |
Odczyt flagi Busy (siódmy bit) oraz aktualnej zawartości licznika adresów AC (bity od 0 do 7) Busy = 1 - sterownik zajęty wykonywaniem wewnętrznej operacji Busy = 0 - sterownik może przyjąć kolejną instrukcję |
1 |
0 |
Zapis danych do RAM-u (danych wyświetlacza DDRAM lub generatora znaków CG-RAM) |
1 |
1 |
Odczyt danej z RAM-u (danych wyświetlacza DDRAM lub generatora znaków CG-RAM) |
8.3 Lista instrukcji
Lp. |
Instrukcja |
Kod instrukcji |
Opis |
|||||||||
|
RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
|
1 |
Ustawienie parametrów wyświetlacza |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
- |
- |
DL=0 4-bitowa szyna danych DL=1 8-bitowa szyna danych N=0 1 linia wyświetlacza N=1 2 linie wyświetlacza F=0 matryca 5*7 punktów F=1 matryca 5*10 punktów |
2 |
Ustawienie trybu wprowadzania znaków |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
I/D=0 - zmniejszaj adres kursora po każdym wpisie lub odczycie danych I/D=1 - zwiększaj adres kursora po każdym wpisie lub odczycie danych S=1 - jednoczesny obrót danych wyświetlacza |
3 |
Załączanie/ wyłączanie wyświetlacza |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
1-włącz 2-wyłącz D - cały wyświetlacz C - kursor B - mruganie znaku w pozycji kursora |
4 |
Czyszczenie ekranu |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Kasuje dane wyświetlacza i ustawia kursor pod adres 0 |
5 |
Ustawienie kursora na pozycji 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
Ustawia kursor w położeniu zerowym |
6 |
Przesuwanie kursora i ekranu |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
- |
- |
S/C=1 - obrót danych wyświetlacza S/C=0 - przesunięcie kursora R/L=1 - obrót/przesunięcie w prawo R/L=0 - obrót/przesunięcie w lewo |
7 |
Ustawianie adresu CGRAM |
0 |
0 |
0 |
1 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
A0-A5 Adres pamięci RAM generatora znaków |
8 |
Ustawianie adresu DDRAM |
0 |
0 |
1 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
A0-A6 Adres pamięci danych |
9 |
Odczyt flagi zajętości Busy i adresu pamięci danych |
0 |
1 |
BF |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
BF - wskaźnik zajętości A0-A6 Stan licznika adresu |
10 |
Zapis danej do CGRAM lub DDRAM |
1 |
0 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
A0-A7 Dane do zapisania do pamięci RAM generatora lub pamięci danych |
11 |
Odczyt danej z CGRAM lub DDRAM |
1 |
1 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
A0-A7 Dane do odczytania z pamięci RAM generatora znaków lub pamięci danych |
9. Interfejs I2C
9.1 Właściwości
Transmisja odbywa się za pomocą dwóch linii:
SDA - dane
SCL - sygnał taktujący (zegarowy)
Możliwe jest przesyłanie informacji między wieloma urządzeniami wykorzystującymi wspólną szynę.
Transmisja danych jest dwukierunkowa - nadawanie i odbiór
Każdy z układów dołączonych do szyny I2C posiada niepowtarzalny adres, umożliwiający jednoznaczne zaadresowanie danego urządzenia do nadawania lub odbioru.
Przesyłaniem danych steruje układ nadrzędny, przy czym w systemie może być więcej niż jeden układ nadrzędny.
W przypadku jednoczesnego rozpoczęcia nadawania przez kilka urządzeń nadrzędnych, mechanizm arbitrażu nie dopuszcza do utraty ani przekłamania przesyłanych danych.
Synchronizacja transmisji za pomocą sygnału taktującego umożliwia komunikację między urządzeniami o różnych prędkościach przesyłania danych.
Maksymalna prędkość transmisji danych wynosi 100 kBodów w standardowym trybie pracy szyny i 400 kBodów w trybie szybkim.
Wszystkie układy posiadające Interfejs I2C są wyposażone w układy filtracji zakłóceń
Liczba układów podłączonych do szyny ograniczona jest wyłącznie maksymalna pojemnością szyny równą 400pF.
Urządzenie nadrzędne jest układem inicjalizującym transmisję po szynie, generującym sygnał taktujący SCL, adresującym urządzenie podrzędne i określającym rodzaj transmisji (nadawanie lub odbiór danych). Rolę tę pełni zazwyczaj mikrokontroler.
Urządzenie podrzędne musi jedynie stwierdzić, czy zostało ono zaadresowane (porównać adres przesłany po szynie z własnym adresem), oraz w takt sygnału taktującego, generowanego przez urządzenie nadrzędne - wysłać lub odebrać dane
Interfejs I2C jest stosowany do urządzeń peryferyjnych, które nie wymagają często komunikacji z jednostką centralną np. zegar czasu rzeczywistego, sterowniki wyświetlacza LED lub LCD, pamięć EEPROM zawierająca nastawy początkowe urządzenia
9.2 Przesyłanie informacji po szynie I2C
Liniami sygnałowymi są linie SDA i SCL
Są to linie dwukierunkowe, podłączone do dodatniego napięcia zasilania pośrednictwem rezystorów podciągających
Przy braku transmisji obie linie znajdują się w stanie wysokim (wynika to z obecności rezystorów podciągających)
Podczas transmisji danych impulsy taktujące na szynie SCL wysyłane są w ilości: 1 impuls na każdy bit przesyłanych danych
Podczas stanu wysokiego na linii SCL stan linii SDA musi być stabilny - stan tej linii może ulegać zmianie tylko podczas niskiego stanu linii SCL
SCL
SDA
Stan stabilny
Wyjątkiem od wyżej wymienionej reguły są sygnały:
START - wymuszenie opadającego zbocza na SDA przy wysokim stanie SCL. Po pojawieniu się tego sygnału szyna jest uważana za zajętą, aż do wystąpienia sygnału STOP.
SDA
SCL
STOP - wymuszenie narastającego zbocza na SDA przy wysokim stanie SCL
SDA
SCL
Każdy bajt danych przesyłanych po szynie I2C musi składać się z 8 bitów, przy czym dane nadawane są od najbardziej znaczącego bitu
Liczba bitów danych przesyłanych w ramach danej transmisji nie jest ograniczona.
Każda operacja przesłania bajtu danych powinna zakończyć się bitem potwierdzenia.
Impuls taktujący związany z bitem potwierdzenia jest generowany przez urządzenie nadrzędne.
Urządzenie nadające dane musi na czas bitu potwierdzenia zwolnić linię SDA, zaś urządzenie odbierające w czasie trwania stanu wysokiego na SCL powinno wymusić stan niski na SDA.
1
Brak potwierdzenia
2
Potwierdzenie
3 S 1 2 8 9
Impuls taktujący do bitu potwierdzenia
START
1. Stan linii SDA wymuszony przez urządzenie nadające.
2. Stan linii SDA wymuszony przez urządzenie odbierające.
3. Stan linii SCL wymuszony przez urządzenie nadrzędne.
Jeśli zaadresowane urządzenie podrzędne nie jest w stanie potwierdzić swojego adresu, musi pozostawić ono linię SDA w stanie wysokim. Wówczas urządzenie nadrzędne może wysłać sygnał STOP i tym samym przerwać transmisję.
Analogiczna sytuacja ma miejsce, gdy urządzenie podrzędne potwierdzi swój adres, ale nie jest w stanie odebrać jednego z następnych bajtów danych i chce wymusić przerwanie transmisji przez urządzenie nadrzędne. Urządzenie podrzędne wysyła sygnał braku potwierdzenia, w wyniku czego urządzenie nadrzędne sygnałem STOP kończy transmisję danych.
Jeśli dane są odbierane przez urządzenie nadrzędne to wysłanie przez to urządzenie bitu braku potwierdzenia jest informacją dla urządzenia podrzędnego, że zakończono właśnie transmisję ostatniego bitu danych. Urządzenie podrzędne musi zwolnić linię danych, aby umożliwić urządzeniu nadrzędnemu wysłanie sygnału STOP.
Jeżeli urządzenie odbierające dane nie może z pewnych względów rozpocząć odbioru następnego bajtu, to może ono przeciągnąć stan niski na linii SCL i wymusić w ten sposób na urządzeniu nadającym przejście w stan oczekiwania.
Transmisja danych będzie w takim przypadku kontynuowana po zwolnieniu linii SCL przez urządzenie odbierające dane.
10. Program
$crystal = 11059200 'KWARC Q=11.0592Mhz
'Ustawienia wyświetlacza, konfiguracja pinów wyświetlacza LCD,
'wyłączenie kursora, konfiguracja pinów szyny I2C
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = P1.2 , Db5 = P1.5 , Db6 = P1.3 , Db7 = P1.4 ,
Config Lcdpin = Pin , E = P1.6 , Rs = P1.7
Deflcdchar 0 , 12 , 4 , 6 , 12 , 4 , 4 , 14 , 32
Deflcdchar 1 , 21 , 17 , 25 , 21 , 19 , 17 , 17 , 32
Deflcdchar 2 , 14 , 17 , 17 , 31 , 17 , 17 , 19 , 32
Cursor Off
Cls
Config Sda = P3.2
Config Scl = P3.1
'Deklaracja zmiennych
Dim Przerwa As Bit 'sygnalizuje przerwę w zasilaniu
Dim Sekunda As Byte 'sekundy
Dim Minuta As Byte 'minuta
Dim Godzina As Byte 'godzina
Dim Dzien As Byte 'dzien
Dim Miesiac As Byte 'miesiac
Dim Godz_al As Byte 'godzina alarmu
Dim Min_al As Byte 'minuta alarmu
Dim Godz_off As Byte 'godzina wyłączenia
Dim Min_off As Byte 'minuta wyłączenia
Dim Godz_on As Byte 'godzina włączenia
Dim Min_on As Byte 'minuta włączenia
Dim Mmax As Byte 'określa liczbę dni w danym miesiącu
Dim Rejestr_kontrol As Byte 'Bajt Konfiguracji
'Nadanie nazw (aliasów) numerom portów w celu ulatwienia pisania programu
Up Alias P3.4
Down Alias P3.5
Prog Alias P1.0
Ok Alias P3.7
Przekaznik Alias P1.1
Watczdog Alias P3.3
'**************************** PROGRAM GŁÓWNY *********************************
Reset Watczdog
'Zapis do rejestru (0) kontrolnego zegara
Rejestr_kontrol = &B00001100 'bajt konfigurujący pracę zegara
I2cstart
I2cwbyte 160
I2cwbyte 0
I2cwbyte Rejestr_kontrol
I2cstop
Przerwa = 1
Do
Set Watczdog
Reset Watczdog
I2cstart
I2cwbyte 160 'adres zapisu
I2cwbyte 2 'numer pierwszej komórki od której
'rozpoczynamy odczyt pam.RAM PCF
I2cstart 'ponowny start
I2cwbyte 161 'adres odczytu
I2crbyte Sekunda , Ack 'odczyt 2 rejestru - sekundy
I2crbyte Minuta , Ack 'odczyt 3 rejestru - minuta
I2crbyte Godzina , Ack 'odczyt 4 rejestru - godzina
I2crbyte Dzien , Ack 'odczyt 5 rejestru - dzien miesiąca
I2crbyte Miesiac , Nack 'odczyt 6 rejestru - miesiac
I2cstop
I2cstart
I2cwbyte 160
I2cwbyte 11
I2cstart
I2cwbyte 161
I2crbyte Min_al , Ack
I2crbyte Godz_al , Nack
I2cstop
Sekunda = Makedec(sekunda)
Minuta = Makedec(minuta)
Godzina = Makedec(godzina)
Dzien = Makedec(dzien)
Miesiac = Makedec(miesiac)
Godz_al = Makedec(godz_al)
Min_al = Makedec(min_al)
Locate 1 , 2
If Godzina < 10 Then
Locate 1 , 3
End If
Lcd Godzina ; ":"
If Minuta < 10 Then
Lcd "0"
End If
Lcd Minuta ; ":"
If Sekunda < 10 Then
Lcd "0"
End If
Lcd Sekunda
Locate 1 , 14
If Dzien < 10 Then
Lcd " "
End If
Lcd Dzien ; "."
If Miesiac < 10 Then
Lcd "0"
End If
Lcd Miesiac
Locate 2 , 2
Lcd "Wy" ; Chr(0) ; ".: " ; Godz_off ; ":"
If Min_off < 10 Then
Lcd "0"
End If
Lcd Min_off
Locate 2 , 14
Lcd "W" ; Chr(0) ; ".: " ; Godz_on ; ":"
If Min_on < 10 Then
Lcd "0"
End If
Lcd Min_on
If Prog = 0 Then
Set Watczdog
Gosub Nastaw_zegar
Reset Watczdog
End If
If Przerwa = 1 Then
Set Watczdog
Gosub Alarm
Reset Przerwa
Reset Watczdog
End If
If Godzina = Godz_al And Minuta = Min_al And Sekunda = 0 Then
Set Watczdog
Gosub Alarm
Reset Watczdog
End If
If Godzina = 0 And Minuta = 0 And Sekunda = 0 Then
Set Watczdog
Cls
Reset Watczdog
End If
Loop
'******WPROWADZANIE NASTAW ZEGARA I GODZIN ZAŁĄCZEŃ PRZEKAŹNIKA*******
Nastaw_zegar:
Do
If Up = 0 Then
If Miesiac = 12 Then
Miesiac = 1
Else
Incr Miesiac
End If
End If
If Down = 0 Then
If Miesiac = 1 Then
Miesiac = 12
Else
Decr Miesiac
End If
End If
Cls
Lcd "MIESI" ; Chr(2) ; "C: " ; Miesiac
Waitms 200
Loop Until Ok = 0
While Ok = 0
Wend
Do
If Up = 0 Then
Select Case Dzien
Case Is < 28 : Incr Dzien
Goto Kkk
Case 31 : Dzien = 1
Goto Kkk
Case 30 :
If Miesiac = 4 Or Miesiac = 6 Or Miesiac = 9 Or Miesiac = 11 Then
Dzien = 1
Else
Incr Dzien
End If
Goto Kkk
Case 29 : Incr Dzien
Goto Kkk
Case 28 :
If Miesiac = 2 Then
Dzien = 1
Else
Incr Dzien
End If
End Select
End If
If Down = 0 Then
Select Case Dzien
Case Is > 1 : Decr Dzien
Goto Kkk
Case 1 :
If Miesiac = 4 Or Miesiac = 6 Or Miesiac = 9 Or Miesiac = 11 Then
Dzien = 30
Else
Dzien = 31
End If
If Miesiac = 2 Then
Dzien = 28
End If
Goto Kkk
End Select
End If
Kkk:
Cls
Lcd "DZIE" ; Chr(1) ; ": " ; Dzien
Waitms 200
Loop Until Ok = 0
While Ok = 0
Wend
Do
If Up = 0 Then
If Godzina = 23 Then
Godzina = 0
Else
Incr Godzina
End If
End If
If Down = 0 Then
If Godzina = 0 Then
Godzina = 23
Else
Decr Godzina
End If
End If
Cls
Lcd "GODZINA: " ; Godzina
Waitms 200
Loop Until Ok = 0
While Ok = 0
Wend
Do
If Up = 0 Then
If Minuta = 59 Then
Minuta = 0
Else
Incr Minuta
End If
End If
If Down = 0 Then
If Minuta = 0 Then
Minuta = 59
Else
Decr Minuta
End If
End If
Cls
Lcd "MINUTA: " ; Minuta
Waitms 200
Loop Until Ok = 0
Sekunda = 0
Minuta = Makebcd(minuta)
Godzina = Makebcd(godzina)
Dzien = Makebcd(dzien)
Miesiac = Makebcd(miesiac)
I2cstart 'zapisanie nowych ustawień do zegara
I2cwbyte 160
I2cwbyte 2
I2cwbyte Sekunda
I2cwbyte Minuta
I2cwbyte Godzina
I2cwbyte Dzien
I2cwbyte Miesiac
I2cstop
Cls
Minuta = Makedec(minuta)
Godzina = Makedec(godzina)
Dzien = Makedec(dzien)
Miesiac = Makedec(miesiac)
Gosub Alarm
Return
'*****************************ZMIANA ALARMU ***********************************
Alarm:
Gosub Sprawdz_dzien
If Godzina > Godz_off Then
Gosub Wylacz
End If
If Godzina = Godz_off And Minuta > Min_off Then
Gosub Wylacz
End If
If Godzina = Godz_off And Minuta = Min_off Then
Gosub Wylacz
End If
If Godzina < Godz_off Then
Gosub Ddd
End If
If Godzina = Godz_off And Minuta < Min_off Then
Gosub Ddd
End If
If Godzina > Godz_on Then
Gosub Wlacz
End If
If Godzina = Godz_on And Minuta = Min_on Then
Gosub Wlacz
End If
If Godzina = Godz_on And Minuta > Min_on Then
Gosub Wlacz
End If
Min_al = Makebcd(min_al)
Godz_al = Makebcd(godz_al)
I2cstart
I2cwbyte 160
I2cwbyte 11
I2cwbyte Min_al
I2cwbyte Godz_al
I2cstop
Cls
Return
Ddd:
Godz_al = Godz_off
Min_al = Min_off
Set Przekaznik
Return
Wylacz:
Godz_al = Godz_on
Min_al = Min_on
Reset Przekaznik
Return
Wlacz:
If Dzien = Mmax Then
If Miesiac = 12 Then
Miesiac = 1
Gosub Jj
End If
Incr Miesiac
End If
Jj:
Dzien = 1
Gosub Sprawdz_dzien
Godz_al = Godz_off
Min_al = Min_off
Set Przekaznik
Return
*GODZINY WYŁĄCZENIA i WŁĄCZENIA PRZEKAŹNIKA DLA POSZCZEGÓLNYCH MIESIĘCY**
Sprawdz_dzien:
If Dzien < 15 Or Dzien = 15 Then
Select Case Miesiac
Case 1 : Godz_off = 7
Min_off = 43
Godz_on = 15
Min_on = 45
Mmax = 31
Return
Case 2 : Godz_off = 7
Min_off = 08
Godz_on = 16
Min_on = 30
Mmax = 28
Return
Case 3 : Godz_off = 6
Min_off = 10
Godz_on = 17
Min_on = 25
Mmax = 31
Return
Case 4 : Godz_off = 5
Min_off = 00
Godz_on = 18
Min_on = 15
Mmax = 30
Return
Case 5 : Godz_off = 4
Min_off = 05
Godz_on = 19
Min_on = 00
Mmax = 31
Return
Case 6 : Godz_off = 3
Min_off = 23
Godz_on = 19
Min_on = 45
Mmax = 30
Return
Case 7 : Godz_off = 3
Min_off = 20
Godz_on = 20
Min_on = 00
Mmax = 31
Return
Case 8 : Godz_off = 3
Min_off = 45
Godz_on = 19
Min_on = 45
Mmax = 31
Return
Case 9 : Godz_off = 4
Min_off = 30
Godz_on = 18
Min_on = 45
Mmax = 30
Return
Case 10 : Godz_off = 5
Min_off = 18
Godz_on = 17
Min_on = 36
Mmax = 31
Return
Case 11 : Godz_off = 6
Min_off = 4
Godz_on = 16
Min_on = 40
Mmax = 30
Return
Case 12 : Godz_off = 7
Min_off = 15
Godz_on = 15
Min_on = 40
Mmax = 31
Return
End Select
End If
If Dzien > 15 Then
Select Case Miesiac
Case 1 : Godz_off = 7
Min_off = 30
Godz_on = 16
Min_on = 8
Mmax = 31
Return
Case 2 : Godz_off = 6
Min_off = 40
Godz_on = 17
Min_on = 0
Mmax = 28
Return
Case 3 : Godz_off = 5
Min_off = 34
Godz_on = 17
Min_on = 50
Mmax = 31
Return
Case 4 : Godz_off = 4
Min_off = 32
Godz_on = 18
Min_on = 38
Mmax = 30
Return
Case 5 : Godz_off = 3
Min_off = 40
Godz_on = 19
Min_on = 25
Mmax = 31
Return
Case 6 : Godz_off = 3
Min_off = 15
Godz_on = 19
Min_on = 48
Mmax = 30
Return
Case 7 : Godz_off = 3
Min_off = 30
Godz_on = 19
Min_on = 55
Mmax = 31
Return
Case 8 : Godz_off = 4
Min_off = 5
Godz_on = 19
Min_on = 15
Mmax = 31
Return
Case 9 : Godz_off = 4
Min_off = 45
Godz_on = 18
Min_on = 15
Mmax = 30
Return
Case 10 : Godz_off = 5
Min_off = 40
Godz_on = 17
Min_on = 05
Mmax = 31
Return
Case 11 : Godz_off = 6
Min_off = 36
Godz_on = 16
Min_on = 10
Mmax = 30
Return
Case 12 : Godz_off = 7
Min_off = 40
Godz_on = 15
Min_on = 25
Mmax = 31
Return
End Select
End If
Return
'******************************************************************************
'Program został napisany w programie BASCOM 8051 ver.2.0.8.0
11. Tabela przełączeń przekaźnika dla odpowiednich dni i miesięcy.
Miesiąc |
Dni (Od 1 do 15) |
Dni (>15) |
||
|
Wyłączenie |
Włączenie |
Wyłączenie |
Włączenie |
Styczeń |
7:43 |
15:45 |
7:30 |
16:08 |
Luty |
7:08 |
16:30 |
6:40 |
17:00 |
Marzec |
6:10 |
17:25 |
5:34 |
17:50 |
Kwiecień |
5:00 |
18:15 |
4:32 |
18:38 |
Maj |
4:05 |
19:00 |
3:40 |
19:25 |
Czerwiec |
3:23 |
19:45 |
3:15 |
19:48 |
Lipiec |
3:20 |
20:00 |
3:30 |
19:55 |
Sierpień |
3:45 |
19:45 |
4:05 |
19:15 |
Wrzesień |
4:30 |
18:45 |
4:45 |
18:15 |
Październik |
5:18 |
17:36 |
5:40 |
17:05 |
Listopad |
6:04 |
16:40 |
6:36 |
16:10 |
Grudzień |
7:15 |
15:40 |
7:40 |
15:25 |
MIKROPROCESOROWY STEROWNIK OŚWIETLENIA
________________________________________________________________
13
14 * *13
12 * *11
10 * *9
8 * *7
6 * *5
4 * *3
2 * *1