Zegar elektroniczny z mikrokontrolerem ST6215

Zapewne wśród Was znajdują się również i tacy, którzy pamiętają czasy budowania zegarów elektronicznych ze specjalizowanych układów scalonych, takich jak z serii MC120x produkcji NPCP CEMI. Taki zegar miał tylko funkcje przewidziane przez producenta i nie było specjalnie możliwości aby zmienić je i dostosować do własnych potrzeb. Nie dosyć więc, że bardzo trudno było taki chip zegarowy zdobyć, to jeszcze najczęściej efekt tylko w 90% spełniał oczekiwania. Dziś mikrokomputery jednoukładowe stwarzają bardzo szerokie pole do popisu dla ludzi z pomysłami i wyobraźnią. 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 zbudować 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 najmniejszej liczby elementów i jak najniższy ich koszt przy jednocześnie wysokich walorach użytkowych (np. bardzo dobra widoczność cyfr, także przy oświetleniu światłem słonecznym). Stąd też może niektórych zdziwić zasilanie segmentów z wyjść ST62 (zazwyczaj wyjścia załączają segmenty do masy poprzez otwarty dren tranzystora wyjściowego), lecz po sprawdzeniu kilku modeli wyświetlacza okazało się, że najlepiej wymagania co do jasności świecenia spełnia SC03-12 o wspólnej katodzie firmy Kingbright. W praktyce prąd pobierany z wyjść ST62 zapewnia dosyć mocne świecenie i nie powoduje przeciążenia układu. Należy zwrócić jednak uwagę na to, że nie jest to obciążenie stałe, ponieważ wyświetlacze są multipleksowane i w rezultacie na wyjściach ST62 napięcie ma kształt fali 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. Źródłem zasilania była instalacja prądu stałego o napięciu 22...32 VDC.
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,2 MHz. Jego częstotliwość jest wewnętrznie dzielona przez 96000 (dając w rezultacie 75 Hz) i steruje przerwaniem zegarowym służącym do pomiaru czasu. Klawisze są połączone prostą matrycę 2 wiersze x 3 kolumny. Dodatkowo, wiersze i kolumny są dołączone do +5 V poprzez rezystory R13...R17. Rezystorów tych można nie stosować, jeżeli zegar pracuje z dala od źródeł zakłóceń elektrycznych. ST62 ma bowiem wewnętrzne rezystory pull-up załączane programowo.
Katody wyświetlaczy są załączane przez bramki ULN2003A. Ten sam układ steruje przekaźnikiem. Anody wyświetlaczy są zasilane bezpośrednio z wyjść mikrokontrolera poprzez rezystory. Rolę zasilacza i stabilizatora napięcia spełnia 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 jest sygnalizowany za pomocą diod 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.

Opis programu
Program jest napisany w całości w języku asemblera mikrokontrolerów z rodziny ST62. Jest dosyć obszerny, toteż poniższy opis nie wyczerpie wszystkich jego aspektów. Pozwoli jednak zrozumieć zasadę i ułatwi samodzielną analizę.
Najważniejszą częścią programu jest procedura obsługi przerwania zegarowego służąca do odmierzania czasu. Adres procedury przerwania zegarowego podaje się w tabeli przerwań umieszczonej pod adresem 0FF0H (listing 1).

Listing. 1. Tablica wektorów przerwań
;Tablica przerwań zawiera wskazania do procedur obsługi
.ORG     0FF0H
IT_ADC
    NOP             ;Przerwanie z przetwornika A/D
    RETI            ;
IT_TMR
    JP   TMR_IRQ    ;Przerwanie układu zegarowego
IT_PBC
    NOP             ;Przerwanie z portu B lub C
    RETI
IT_PA
    NOP             ;Przerwanie z portu A
    RETI            ;

    NOP             ;Zarezerwowane przez producenta
    NOP             ;
    NOP             ;
    NOP             ;
NMI NOP             ;Przerwanie niemaskowalne
    RETI            ;
RES
    JP   INIT       ;Wektor obsługi programu po RESET

Częstotliwość, z którą jest ona wywoływana można zmieniać programując wartości rejestrów TCR (D3H) i TSCR (D4H) mikrokontrolera. W programie preskaler programowany poziomami bitów b0...b2 rejestru TSCR ma zadaną wartość podziału 64. Podział ten jest zwielokrotniany przez wewnętrzny TIMER (125) oraz wstępny podział (12) wynikający z konstrukcji mikrokontrolera (7,2 MHz/(64x125x12) = 75Hz). Czas aktualny jest pamiętany w komórkach SECAKT, MINAKT 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 odmierzania  czasu wygaszenia wyświetlacza lub automatycznego przełączenia z ustawiania 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 licznika minut (w rezultacie naciśnięcia klawisza "Plus" lub "Minus") powoduje, że czas jest zliczany 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.

Listing 2. Fragment procedury inicjującej INIT z nastawą 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
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 przekaźnika.

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 jest odczytywany poprzez okno dostępu do danych w ROM o wielkości 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 parametrach rozkazów pobierających te wzorce do wyświetlenia z ROM.
Procedura WYSW zawsze wyświetla stan diod LED sygnalizujących pracę programu.


Stany diod LED:
- D1 “Progr.1” świeci światłem ciągłym – ustawione jest wyłączanie prog.1 po upływie 1 godziny; D1 pulsuje – ustawione jest wyłączanie prog.1 po upływie 0,5 godziny.
- D2 “Progr.2” świeci światłem ciągłym – ustawione jest wyłączanie prog.2 po upływie 1 godziny; D2 pulsuje – ustawione jest wyłączanie prog.2 po upływie 0,5 godziny,
- D3 “Gotowy” świeci – ustawiony i aktywny jest czas załączenia prog.1 lub prog.2
- D4 “Włączony” – świecenie informuje o załączeniu przekaźnika RL1.



Natomiast cyfry są wyświetlane wówczas, gdy bit 6 zmiennej STAPRG ma wartość logiczną "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 jest zapamiętywany 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 jest 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        ;je liczymy

    JP   H2D_2
H2D_3
    ADDI A,10        ;wyliczenie jednostek poprzez uzupełnienie
                     ;akumulatora o “10”
    LD   V,A         ;przechowanie młodszej części w rejestrze V
    LD   A,CNT1      ;do akumulatora starsza część liczby (dziesiątki)
    SLA  A           ;zajmuje ona bity od 4..7, więc należy akumulator
    SLA  A           ;przesunąć w lewo o 4 pozycje
    SLA  A
    SLA  A
    ADD  A,V         ;suma młodszej i starszej części liczby
    LD   (X),A       ;zapamiętanie wyniku 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ć uproszczona. W przypadku większych liczb należy liczyć wystąpienia 10000, 1000 itd. i wykonywać operacje na większej liczbie rejestrów.

Procedura KLAW
Klawiatura sterująca zbudowana jest w typowy sposób. Bity 6 i 7 portu PB to wiersze matrycy klawiatury. Bity 3, 4 i 5 tego samego portu, to kolumny. Procedura wysyłając "0" na linię wiersza skonfigurowaną jako wyjście bada, czy przeniosło się ono na którąś z linii kolumn skonfigurowanych jako wejściowe. Normalnie na tych liniach jest "1" zapewniana przez rezystory załączone do plus zasilania, jednak jeżeli na linii wiersza jest "0" i wciśniemy klawisz, to nastąpi zwarcie stanu wysokiego kolumny do masy poprzez wiersz i tak można zidentyfikować naciśnięcie klawisza. Stan klawiatury umieszczany jest w zmiennej STAKBD – ustawienie bitu oznacza, że naciśnięto klawisz. Znaczenie bitów jest opisane w programie źródłowym. Procedura nie eliminuje tzw. drgań styków. Drganie, czy też przypadkowe naciśnięcia klawisza, eliminowane są poprzez liczenie ile razy na skutek wciśnięcia klawisza program odwoływał się do danej funkcji. Licznik ten (LOOPCNT) porównywany jest ze stałą DELAY1 i po osiągnięciu równości funkcja jest wykonywana. Autopowtarzanie włączane jest tam, gdzie jest potrzebne, po przytrzymaniu klawisza przez czas
określony w stałej DELAY2.


Opis funkcji klawiszy:
-  SW5 "Zegar": naciśnięcie powoduje wyświetlenie czasu aktualnego, dłuższe przytrzymanie włącza wyświetlanie sekund; ustawianie zegara klawiszami "Plus"/ "Minus" po naciśnięciu "Zegar".
-  SW2 "Z/W": załączanie i wyłączanie przekaźnika; załączenie powoduje, że żaden z ustawionych czasów nie będzie zmieniał stanu przekaźnika,
odpowiednia dioda LED świeci światłem ciągłym – wyłączenie przekaźnika po upływie 1 godziny, trzecie zmienia czas włączenia przekaźnika na 0,5 godz., czwarte – dezaktywuje program (odpowiednia dioda LED nie świeci),SW1 "Prog.1"  i SW3 "Prog.2": pierwsze naciśnięcie powoduje wyświetlenie godziny jednego z dwóch alarmów i umożliwia jej zmianę, drugie uaktywnienie danego czasu włączenia –
- SW4 "Minus" i SW6 "Plus": ustawianie czasu; po jednokrotnym naciśnięciu aktualnie wyświetlana godzina (czas bieżący, alarm 1 lub 2) zwiększana/zmniejszana jest o 1 minutę, przy dłuższym przytrzymaniu klawisza włączane jest autopowtarzanie ze zwiększoną szybkością.




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 zadaniami są: załączenie przekaźnika o określonej godzinie, wyliczenie czasu wyłączenia poprzez dodanie do czasu załączenia odpowiedniej wartości, wyłączenie przekaźnika. 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 (ST6225HWD). Ogólnie rzecz biorąc rola tego układu polega na wymuszeniu sygnału RESET, jeżeli program nie aktualizuje rejestru licznika WDR (D8H). Każda procedura przy wejściu aktualizuje więc WDR wpisując do niego maksymalną wartość. W nowych układach ST serii C o tym czy Watchdog jest programowy, czy sprzętowy decyduje się podczas programowania mikrokontrolera – w starszych trzeba zwrócić uwagę na określenie jego rodzaju w nazwie.
Zegar sterujący powstał w całości w warunkach amatorskich przy wykorzystaniu jedynie narzędzi z firmowego ST6 Starter Kit (AST6 Assembler, SIMST6 – symulator i LST6 – linker). Wszystkie te narzędzia (i nieco więcej) dostępne są również na płycie CD-EP2 oferowanej przez Elektronikę Praktyczną. Także programator do mikrokontrolerów ST6 był opisywany w EP 11/97 i można go kupić jako kit AVT-363.

Jacek Bogusz
j.bogusz@easy-soft.net.pl

http://www.tomaszbogusz.blox.pl/

ZałącznikWielkość
Plik do zaprogramowania mikrokontrolera (zegar6225-hex.zip)1.3 KB
Program źródłowy zegara (zegar6225-src.zip)7.96 KB
Schemat i wzory płytek (zegar6225-pcb.pdf)122.59 KB

Dodaj nowy komentarz

Zawartość pola nie będzie udostępniana publicznie.