Elektroniczny zegar sterujący z mikrokontrolerem ST6225
http://www.easy-soft.tsnet.pl Elektroniczny zegar sterujący z mikrokontrolerem ST6215/25 Zapewne wśród Was znajdują się również i tacy, którzy pamiętają czasy budowy zegarów elektronicznych ze specjalizowanych, dedykowanych tylko tej funkcji, układów scalonych takich jak seria MC120x produkcji NPCP CEMI. Taki zegar miał tylko funkcje przewidziane przez producenta i nie było specjalnie możliwości aby Funkcje zegara: zmienić je i dostosować do własnych potrzeb. Nie dosyć - wskazywanie bieżącego czasu w więc, że bardzo trudno było taki chip zegarowy zdobyć, systemie 24 godzinnym, - wskazywanie sekund, to jeszcze najczęściej efekt tylko w 90% spełniał - włączanie przekaznika w dwóch oczekiwania. Dziś mikrokomputery jednoukładowe ustawianych godzinach na czas 0,5 stwarzają bardzo szerokie pole do popisu dla ludzi z lub 1 godziny. pomysłami i wyobraznią. W zasadzie tylko ilość dostępnej pamięci programu i danych są jedynymi ograniczeniami dla konstruowanych układów. Każdy mający nieco pojęcia o programowaniu i elektronice może stworzyć sobie układ taki, aby jak najlepiej pasował do jego potrzeb. Opis układu Jednym z kryteriów przy budowie zegara było użycie jak Stany diod LED: najmniejszej ilości elementów i jak najniższy ich koszt - D1 Progr.1 świeci światłem przy jednocześnie wysokich walorach użytkowych (np. ciągłym ustawione jest wyłączanie bardzo dobra widoczność cyfr, także przy oświetleniu prog.1 po upływie 1 godziny; D1 światłem słonecznym). Stąd też może niektórych zdziwić pulsuje ustawione jest wyłączanie zasilanie segmentów z wyjść ST62 (zazwyczaj wyjścia prog.1 po upływie 0,5 godziny. załączają segmenty do masy poprzez otwarty dren - D2 Progr.2 świeci światłem tranzystora wyjściowego), lecz przy sprawdzeniu kilku ciągłym ustawione jest wyłączanie modeli wyświetlacza okazało się, że najlepiej wymagania prog.2 po upływie 1 godziny; D2 pulsuje ustawione jest wyłączanie co do jasności świecenia spełnia wyświetlacz o wspólnej prog.2 po upływie 0,5 godziny, katodzie SC03-12 firmy Kingbright. W praktyce prąd - D3 Gotowy świeci ustawiony i pobierany z wyjść ST62 zapewnia dosyć dobre warunki aktywny jest czas załączenia prog.1 wyświetlania i nie powoduje przeciążenia układu. Należy lub prog.2 zwrócić jednak uwagę na to, że nie jest to obciążenie - D4 Włączony świecenie stałe, ponieważ wyświetlacze są multipleksowane i w informuje o załączeniu przekaznika rezultacie na wyjściach ST62 napięcie ma kształt fali RL1. prostokątnej. Zasadniczą funkcją, dla której projektowany był zegar sterujący, było włączenie w którymś z dwóch zaprogramowanych czasów oraz wyłączenie po upływie 0,5 lub 1 godziny odbiornika prądu elektrycznego. yródłem zasilania była instalacja prądu stałego o napięciu 22 do 32V. Rolę układu pomiaru czasu oraz obsługi funkcji zegara, spełnia mikrokontroler ST6215 lub ST6225 produkcji firmy STM. Jako wzorca czasu użyłem rezonatora kwarcowego 7,2MHz. Jego częstotliwość jest wewnętrznie dzielona przez 96000 (dając w rezultacie 75Hz) i steruje przerwaniem zegarowym służącym do pomiaru czasu. Klawisze połączone są w układ prostej matrycy 2 wiersze x 3 kolumny. Dodatkowo wiersze i kolumny podłączone są do +5V poprzez rezystory R13..R17. Rezystorów tych można nie stosować, jeżeli zegar pracuje z dala od zródeł zakłóceń elektrycznych. ST62 ma bowiem wewnętrzne rezystory pull-up załączane programowo. Katody wyświetlaczy załączane są przez bramki ULN2003A. Ten sam układ steruje przekaznikiem. Anody wyświetlaczy zasilane są bezpośrednio z wyjść mikrokontrolera poprzez rezystory. Rolę zasilacza i stabilizatora napięcia spełnia typowy układ 7805. Napięcie do stabilizacji jest wstępnie obniżane przez rezystor R12 tak, aby zmniejszyć straty mocy na stabilizatorze. Stan pracy zegara sygnalizowany jest poprzez diody LED. W prezentowanym układzie modelowym wyświetlacz wyłączany jest po upływie zaprogramowanego czasu i włączany po przyciśnięciu któregoś z klawiszy. Tę właściwość zegara można jednak łatwo zablokować w programie, jeżeli nie jest potrzebna. J.Bogusz Elektroniczny zegar sterujący z ST6225 , Strona 1 z 5 http://www.easy-soft.tsnet.pl Opis programu Opis programu Listing 1. ;Tablica przerwań zawiera wskazania do procedur obsługi Program napisany jest w całości w Program napisany jest w całości w .ORG 0FF0H języku asemblera mikrokontro- języku asemblera mikrokontro- IT_ADC NOP ;Przerwanie z przetwornika A/D lerów z rodziny ST62. Jest dosyć lerów z rodziny ST62. Jest dosyć RETI ; IT_TMR JP TMR_IRQ ;Przerwanie układu zegarowego garowego obszerny, toteż poniższy opis nie obszerny, toteż poniższy opis nie IT_PBC NOP ;Przerwanie z portu B lub C IT_PBC NOP ;Przerwanie z portu B lub C wyczerpie wszystkich jego wyczerpie wszystkich jego RETI RETI aspektów. Pozwoli jednak aspektów. Pozwoli jednak IT_PA NOP ;Przerwanie z portu A IT_PA NOP ;Przerwanie z portu A zrozumieć zasadę i ułatwi zrozumieć zasadę i ułatwi RETI ; RETI ; NOP ;Zarezerwowane przez NOP ;Zarezerwowane przez samodzielną analizę. samodzielną analizę. producenta producenta Najważniejszą częścią programu Najważniejszą częścią programu NOP ; NOP ; jest procedura obsługi przerwania jest procedura obsługi przerwania NOP ; NOP ; zegarowego służąca do zegarowego służąca do NOP ; NOP ; NMI NOP ;Przerwanie niemaskowalne NMI NOP ;Przerwanie niemaskowalne odmierzania czasu. Adres odmierzania czasu. Adres RETI ; RETI ; procedury przerwania zegarowego procedury przerwania zegarowego RES JP INIT ;Wektor obsługi programu RES JP INIT ;Wektor obsługi programu podaje się w tabeli przerwań podaje się w tabeli przerwań ;po RESET ;po RESET umieszczonej pod adresem umieszczonej pod adresem 0FF0H. Częstotliwość z jaką jest ona wywoływana można zmieniać programując wartości rejestrów 0FF0H. Częstotliwość z jaką jest ona wywoływana można zmieniać programując wartości rejestrów TCR (D3H) i TSCR (D4H) mikrokontrolera. W programie preskaler ustawiany przez stany bitów b0 TCR (D3H) i TSCR (D4H) mikrokontrolera. W programie preskaler ustawiany przez stany bitów b0 do b2 rejestru TSCR ma zadaną wartość podziału 64. Podział ten zwielokrotniany jest przez do b2 rejestru TSCR ma zadaną wartość podziału 64. Podział ten zwielokrotniany jest przez wewnętrzny TIMER (125) oraz wstępny podział (12) wynikający z konstrukcji mikrokontrolera wewnętrzny TIMER (125) oraz wstępny podział (12) wynikający z konstrukcji mikrokontrolera (7,2MHz / (64 x 125 x 12) = 75Hz). Czas aktualny pamiętany jest w komórkach SECAKT, MINAKT (7,2MHz / (64 x 125 x 12) = 75Hz). Czas aktualny pamiętany jest w komórkach SECAKT, MINAKT i HOURAKT a procedura obsługi przerwania zegarowego w odpowiedni sposób modyfikuje ich i HOURAKT a procedura obsługi przerwania zegarowego w odpowiedni sposób modyfikuje ich zawartość. Modyfikowana jest również komórka SECSCNT wykorzystywana przez program do zawartość. Modyfikowana jest również komórka SECSCNT wykorzystywana przez program do odmierzania czasu wygaszenia wyświetlacza lub automatycznego przełączenia z ustawiania odmierzania czasu wygaszenia wyświetlacza lub automatycznego przełączenia z ustawiania godziny programu do wskazań zegara. Przerwanie zegarowe blokowane jest w momencie godziny programu do wskazań zegara. Przerwanie zegarowe blokowane jest w momencie ustawiania czasu aktualnego tak, aby nie był on zliczany w podczas aktualizacji. Każda zmiana ustawiania czasu aktualnego tak, aby nie był on zliczany w podczas aktualizacji. Każda zmiana licznika minut (w efekcie rezultat naciśnięcia klawisza Plus lub Minus ) powoduje, że czas licznika minut (w efekcie rezultat naciśnięcia klawisza Plus lub Minus ) powoduje, że czas zliczany jest od 0 sekund. Zostało tak zrobione po to, aby zegar mógł wystartować odliczanie zliczany jest od 0 sekund. Zostało tak zrobione po to, aby zegar mógł wystartować odliczanie równocześnie z jakimś (np. nadawanym przez radio) wzorcem czasu. równocześnie z jakimś (np. nadawanym przez radio) wzorcem czasu. Listing 2. ;Fragment procedury inicjującej INIT dotycząca programowania częstotliwości wywoływania ;przerwania zegarowego INIT .............. LDI TCR,07DH ;licznik TIMERA = 125 LDI TSCR,06EH ;zezwolenie na generowanie przerwań przez ;TIMER (ETI=1), preskaler=64 CLR ADCR ;wyłączenie przetwornika A/D dla oszczędzania ;energii LDI IOR,070H ;globalne zezwolenie na przyjmowanie przerwań ................ ;Obsługa przerwania zegarowego, zliczanie czasu TMR_IRQ LDI TCR,07DH ;rozpoczęcie nowego odliczania, uzupełnienie zawartości ;rejestru TCR RES 7,TSCR ;wyzerowanie bitu uruchamiającego nowe odliczanie LD COPY_A,A ;zapamiętanie zawartości akumulatora w ram INC IRQCNT ;zwiększamy licznik przerwań o 1 LD A,IRQCNT ;czy to już 75 powtórzeń? CPI A,ONESEC JRZ TMR_1 ;jeśli tak, zwiększ licznik sekund JP TIRQEND ;jeśli nie, koniec obsługi przerwania TMR_1 CLR IRQCNT ;kasowanie licznika wejść do obsługi INC SECSCNT ;zwiększenie licznika pauzy licznik ten liczy do ;przepełnienia, zerowany i sprawdzany w odpowiednich ;procedurach INC SECAKT ;zwiększenie licznika sekund LD A,SECAKT ;czy to już 60 sekund(minuta)? CPI A,60 JRZ TMR_2 ;jeśli tak, to zwiększ licznik minut JP TIRQEND ;jeśli nie, to koniec obsługi przerwania TMR_2 CLR SECAKT ;kasowanie licznika sekund INC MINAKT ;zwiększenie licznika minut LD A,MINAKT ;czy to już 60 minut(godzina)? CPI A,60 JRZ TMR_3 ;jeśli tak, to zwiększ licznik godzin JP TIRQEND ;jeśli nie, to koniec obsługi przerwania J.Bogusz Elektroniczny zegar sterujący z ST6225 , Strona 2 z 5 http://www.easy-soft.tsnet.pl TMR_3 CLR MINAKT ;skasuj licznik minut INC HOURAKT ;zwiększ licznik godzin LD A,HOURAKT ;czy minęły już 24 godziny(doba)? CPI A,24 JRZ TMR_4 ;jeśli tak, zacznij zliczanie od nowa (od 0.00) JP TIRQEND ;jeśli nie, to koniec obsługi przerwania TMR_4 CLR HOURAKT TIRQEND LD A,COPY_A RETI Program po wykonaniu funkcji inicjowania rejestrów i zmiennych wykonuje pętlę o nazwie MAIN przerywaną cyklicznie przez przerwanie zegarowe. W pętli tej znajdują się procedury: 1) WYSW wyświetlenie czasu bieżącego lub któregoś z czasów załączeń oraz stanu diod LED, 2) KLAW odczyt stanu klawiatury, 3) AKCJA podjęcie akcji w zależności od stanu klawiatury, 4) ALARM porównanie czasów załączeń z czasem bieżącym i załączenie / wyłączenie przekaznika. Procedura WYSW Opisując tę procedurę należy wspomnieć o co najmniej dwóch jej fragmentach. Pierwszy to sposób pobierania wzorca cyfry z pamięci ROM, który dla układów ST62 jest dosyć specyficzny, natomiast drugi to metoda zamiany liczb w kodzie szesnastkowym (HEX) na kod dziesiętny (BCD). Wzorzec cyfry odczytywany jest poprzez okno dostępu do danych w ROM o rozmiarze 64 bajtów. Adresem początkowym tego okna steruje rejestr o nazwie DWR (C9H). Zawartość tego rejestru wylicza się jako: ADRES_UMIESZCZENIA_TABLICY_W_ROM / 3FH. I tak jeśli dane pobierane będą spod adresu 880H, to zawartość DWR = 880H / 3FH = 22H. Zawartość DWR wpływa na to z jakiego obszaru ROM pobierać będziemy dane, nie ma natomiast żadnego wpływu na sposób dostępu do tych danych. Będą one bowiem zawsze dostępne dla aplikacji w obszarze od 40H do 7FH. Możemy więc przesuwać dowolnie adres początkowy okna (wybierając np. różne wzorce cyfr) i nie musimy nic zmieniać w formatach rozkazów pobierających te wzorce do wyświetlenia z ROM. Procedura WYSW zawsze wyświetla stan diod LED sygnalizujących pracę programu. Cyfry wyświetlane są natomiast wówczas, gdy bit 6 zmiennej STAPRG ma wartość 1 i gaszone, gdy ma on wartość 0 . Nie chcąc używać funkcji wyłączania cyfr należy tak zmodyfikować program, aby ten bit był zawsze ustawiony lub usunąć rozkaz, który sprawdza jego stan. Liczby do wyświetlenia znajdują się w 2-bajtowej zmiennej o nazwie STADISP. Program w zależności od tego, co ma być wyświetlane, wpisuje do komórek MIN i HOUR albo czas aktualny (MINAKT,HOURAKT), albo czas któregoś z alarmów (MINAL1, MINAL2, HOURAL1, HOURAL2). Następnie przez procedurę H2D dokonywana jest konwersja liczb HEX na BCD a wynik tej konwersji zapamiętywany jest w STADISP. Zamiana liczb HEX na BCD odbywa się poprzez bardzo prostą metodę odejmowania od wartości w rejestrze dziesiątek dotąd, dopóki nie wystąpi pożyczka i liczenie tych operacji (ich liczba to wprost liczba dziesiątek). Następnie rejestr, od którego odejmowano uzupełniany jest o 10 (odpowiada to operacji dodania do liczby ujemnej) i w ten sposób uzyskuje się liczbę jedności. Listing 3. ;Konwersja liczb HEX z komórek MIN i HOUR na liczby dziesiętne BCD ;wynik umieszczany jest w STADISP H2D LDI WDR,0FEH ;uzupełnienie rejestru WATCHDOG LD A,MIN ;Konwersja minut na BCD LDI X,STADISP ;do: A <- MIN, X <- adres, gdzie będzie wynik konwersji CALL H2D_1 ;wywołanie procedury zamiany LD A,HOUR ;Konwersja godzin na BCD INC X ;następny bajt przechowuje godziny CALL H2D_1 ;wywołanie procedury zamiany RET ;Liczba do konwersji w A, wynik zapamiętany pod adresem wskazywanym przez rejestr X H2D_1 CLR CNT1 ;zerowanie licznika 10 w liczbie H2D_2 SUBI A,10 ;liczymy 10 w liczbie JRC H2D_3 ;i dokąd dają się odejmować, dotąd INC CNT1 ;liczymy ich ilość JP H2D_2 H2D_3 ADDI A,10 ;wyliczenie jednostek poprzez uzupełnienie ;akumulatora o 10 J.Bogusz Elektroniczny zegar sterujący z ST6225 , Strona 3 z 5 http://www.easy-soft.tsnet.pl LD V,A ;przechowanie młodszej części liczby w rejestrze V LD A,CNT1 ;do akumulatora starsza część liczby (dziesiątki) SLA A ;zajmuje ona bity od b4 do b7, toteż należy akumulator SLA A ;przesunąć w lewo o 4 pozycje SLA A SLA A ADD A,V ;suma młodszej przechowanej w V i starszej części liczby LD (X),A ;zapamiętanie ich pod adresem X RET W przypadku wyświetlania czasu jako odrębne minuty i sekundy mamy do czynienia wyłączenie z liczbami z zakresu od 0 do 59, wiec procedura konwersji może być maksymalnie uproszczona. W przypadku większych liczb należy liczyć wystąpienia 10000, 1000 itd. i wykonywać operacje na większej ilości rejestrów. Procedura KLAW Opis funkcji klawiszy: - SW5 Zegar : naciśnięcie powoduje Klawiatura sterująca zbudowana jest w typowy wyświetlenie czasu aktualnego, dłuższe sposób. Bity 6 i 7 portu PB to wiersze matrycy przytrzymanie włącza wyświetlanie klawiatury. Bity 3,4 i 5 tego samego portu, to sekund; ustawianie zegara klawiszami kolumny. Procedura wysyłając 0 na linię wiersza Plus / Minus po naciśnięciu Zegar , skonfigurowaną jako wyjście bada, czy przeniosło - SW2 Z/W : załączanie i wyłączanie się ono na którąś z linii kolumn skonfigurowanych przekaznika; załączenie powoduje, że jako wejściowe. Normalnie na tych liniach jest 1 żaden z ustawionych czasów nie będzie zmieniał stanu przekaznika, zapewniana przez rezystory załączone do plus - SW1 Prog.1 i SW3 Prog.2 : pierwsze zasilania, jednak jeżeli na linii wiersza jest 0 i naciśnięcie powoduje wyświetlenie godziny wciśniemy klawisz, to nastąpi zwarcie stanu jednego z dwóch alarmów i umożliwia jej wysokiego kolumny poprzez wiersz i tak można zmianę, drugie uaktywnienie danego czasu zidentyfikować naciśnięcie klawisza. Stan włączenia - odpowiednia dioda LED świeci klawiatury umieszczany jest w zmiennej STAKBD światłem ciągłym wyłączenie przekaznika ustawienie bitu oznacza, że naciśnięto klawisz. po upływie 1 godziny, trzecie zmienia czas Znaczenie bitów opisane jest w programie włączenia przekaznika na 0,5 godz., zródłowym. Procedura nie eliminuje tzw. drgań czwarte dezaktywuje program (odpowiednia dioda LED nie świeci), styków. Drganie, czy też przypadkowe naciśnięcia - SW4 Minus i SW6 Plus : ustawianie klawisza, eliminowane są poprzez liczenie ile razy czasu; przy jednokrotnym naciśnięciu na skutek wciśnięcia klawisza program odwoływał aktualnie wyświetlana godzina (czas się do danej funkcji. Licznik ten (LOOPCNT) bieżący, alarm 1 lub 2) zwiększana / porównywany jest ze stałą DELAY1 i po osiągnięciu zmniejszana jest o 1 minutę, przy równości funkcja jest wykonywana. dłuższym przytrzymaniu klawisza włączane Autopowtarzanie włączane jest tam, gdzie jest jest autopowtarzanie ze zwiększoną potrzebne, po przytrzymaniu klawisza przez czas szybkością. określony w stałej DELAY2. Procedura AKCJA Nazwa procedury wskazuje na jej funkcję. Steruje ona podejmowaniem akcji przez program w zależności od stanu zmiennej STAKBD. Zakres realizowanych funkcji jest dosyć szeroki - od zwiększania czasu alarmu, czy też aktualnego, do prozaicznego ustawiania stanów pojedynczych bitów zmiennej STAPRG. Procedura ALARM Jej zadaniem jest : załączenie przekaznika o określonej godzinie, wyliczenie czasu wyłączenia poprzez dodanie do czasu załączenia odpowiedniej wartości, wyłączenie przekaznika. Procedura ta to tylko proste porównanie ustawionych i wyliczonych wartości. Czas porównywany jest z dokładnością do 1 sekundy. Dlaczego? Otóż jeżeli czas porównywany byłby z dokładnością do 1 minuty, to nie byłoby możliwe wyłączenie urządzenia przez okres tejże minuty. Mikrokontroler włączał by urządzenie na skutek porównania czasu, my wyłączalibyśmy je ręcznie, po czym znowuż następowałoby załączenie i taka zabawa trwałaby okrągłą minutę z tym, że ST62 byłby od nas szybszy. Do konstrukcji modelu zegara użyłem ST6225 ze sprzętowym układem watchdog (ST6225 HWD). Ogólnie rzecz biorąc rola tego układu polega na wymuszeniu sygnału RESET, jeżeli program nie J.Bogusz Elektroniczny zegar sterujący z ST6225 , Strona 4 z 5 http://www.easy-soft.tsnet.pl aktualizuje rejestru licznika WDR (D8H). Każda procedura przy wejściu aktualizuje więc WDR wpisując do niego maksymalną Rezystory: wartość. W nowych układach ST serii C o tym czy Watchdog jest R1..R8 150R programowy, czy sprzętowy decyduje się podczas programowania R9 10k R10,R11 1k mikrokontrolera w starszych trzeba zwrócić uwagę na określenie R12 180R/2W jego rodzaju w nazwie. R13..R17 82k Kondensatory: Zegar sterujący powstał w całości w warunkach amatorskich przy C1,C2 22pF wykorzystaniu jedynie narzędzi z firmowego ST6 Starter Kit (AST6 C3,C4 47n Assembler, SIMST6 symulator i LST6 linker). Wszystkie te C5 10u/10V narzędzia (i nieco więcej) dostępne są również na płycie CD-EP2 C6 10u/50V oferowanej przez Elektronikę Praktyczną. Także programator do Półprzewodniki: U1 ST6225 mikrokontrolerów ST6 był opisywany w EP 11/97 i można go kupić U2 ULN2003A jako kit AVT-363. U3 7805U D1..D4 LED 2,5mm W1..W4 SC03-12 Jacek Bogusz Różne: jacek.bogusz@easy-soft.tsnet.pl SW1 PROG.2 SW2 Z/W SW3 PROG.1 SW4 MINUS SW5 ZEGAR SW6 PLUS RL1 RL96R PL1 +24V PL2 MASA PL3 P1.1 PL4 P1.2 Q1 7,2MHz J.Bogusz Elektroniczny zegar sterujący z ST6225 , Strona 5 z 5 U2E ULN2003A PC4 5 12 DG1 9 U2D PC5 4 13 DG2 Q1 7,2MHz DA 14 DA 14 DA 14 DA 14 a a a a C1 9 DB 13 DB 13 DB 13 DB 13 U2C b b b b 22pF U2 DC 8 DC 8 DC 8 DC 8 c c c c 3 27 PA0 PC6 3 14 DG3 DD 7 DD 7 DD 7 DD 7 OSCIN PA0 d d d d 26 PA1 DE 6 DE 6 DE 6 DE 6 PA1 e e e e 25 PA2 DF 1 DF 1 DF 1 DF 1 PA2 f f f f 24 PA3 9 DG 2 DG 2 DG 2 DG 2 PA3 U2B g g g g 4 23 PA4 9 9 9 9 OSCOUT PA4/AIN h h h h 22 PA5 PC7 2 15 DG4 PA5/AIN C2 21 PA6 PA6/AIN 22pF 20 PA7 W1 W2 W3 W4 PA7/AIN 9 SC03-12 SC03-12 SC03-12 SC03-12 TIMER 2 19 PB0 R1 TIMER PB0/AIN 10 18 PB1 TIMER TEST PB1/AIN 17 PB2 R2 R14 PB2/AIN 150 150 16 PB3 PA0 DA PB3/AIN 15 PB4 R3 R13 PB4/AIN 150 82k 14 PB5 PA1 DB PB5/AIN VCC 13 PB6 R4 R15 PB6/AIN 150 82k 12 PB7 PA2 DC PB7/AIN R5 150 82k 9 PC4 PA3 DD PC4/AIN 8 PC5 R6 PC5/AIN 150 5 7 PC6 PA4 DE NMI PC6/AIN 11 6 PC7 R7 RESET PC7/AIN 150 PA5 DF R8 150 SW1 SW2 SW3 SW4 SW5 SW6 ST6225 PA6 DG PROG.2 Z/W PROG.1 MINUS ZEGAR PLUS PB3 PB4 R16 PB5 PB6 R17 VCC 82k "PROGR.1" PB7 D1 82k PB0 RL1 RL96R R10 U2A CQYP74 "PROGR.2" PA7 1 16 1k D2 PB1 U3 VDD 9 7805U R12 VCC PL1 ULN2003A CQYP74 3 1 VCC VO VI "GOTOWY" "WACZONY" +28V 180R/2W D3 R11 R9 PB2 10k 1k C6 CQYP74 C4 D4 10u C3 47n 47n CQYP74 PL2 MASA C5 10u VSS PL3 P-1.1 PL4 P-1.2 DG1 DG2 DG3 DG4 4 12 4 12 4 12 4 12 + + + + C 2