ELEKTRONIKA PRAKTYCZNA 8/2019 - AVT · 2019-08-14 · 58 ELEKTR 8/2019 MINIPROJEKTY Listing 5....

3
56 ELEKTRONIKA PRAKTYCZNA 8/2019 MINIPROJEKTY Clock Zostałem poproszony o zaprojek- towanie układu prostego i taniego zegara czasu rzeczywistego o pod- stawowej funkcjonalności i niewiel- kich wymiarach zewnętrznych – tak oto powstał projekt Clock. Budowa i działanie Schemat urządzenia pokazano na rysunku 1. Zaprojektowano dość prosty system mi- kroprocesorowy zbudowany z wykorzysta- niem popularnego mikrokontrolera firmy Atmel typu ATmega48 taktowanego we- wnętrznym, wysokostabilnym oscylatorem o częstotliwości 1 MHz, którego zadaniem jest realizacja wszystkich założonych funk- cjonalności. Mikrokontroler ten realizuje tutaj dwa podstawowe zadania: obsługę pro- gramowego zegara czasu rzeczywistego RTC oraz obsługę wyświetlacza LED. W celu realizacji zegara czasu rzeczywi- stego, w jego najprostszej formie, wykorzy- stano układ czasowo-licznikowy Timer2, wbudowany w mikrokontroler, pracujący w trybie asynchronicznym i taktowany przy VDD T1 BC807 T2 BC807 T3 BC807 T4 BC807 R10 2k2 R11 2k2 R12 2k2 R13 2k2 LED AF-5643 R2 R3 R4 R5 R6 R7 R8 R9 270 270 270 270 270 270 270 270 GND GND SCK MISO MOSI OK SET 1 2 3 4 1 2 3 4 a b c d e f g dp dig1 dig2 dig3 dig4 cola colc RES U1 R1 47k 5V Q1 32768Hz V+ 5V 29 7 8 4 6 18 20 C1 100nF GND GND V– 21 3 5 ATmega48 AVCC AREF AGND GND GND VCC VCC PC6(/RESET/PCINT14) PB6(XTAL1/TOSC1/PCINT6) PB7(XTAL2/TOSC2/PCINT7) 23 24 25 26 27 28 19 22 30 31 32 1 2 9 10 11 12 13 14 15 16 17 PC0(ADC0/PCINT8) PC1(ADC1/PCINT9) PC2(ADC2/PCINT10) PC3(ADC3/PCINT11) PC4(ADC4/SDA/PCINT12) PC5(ADC5/SCL/PCINT13) ADC6 ADC7 PD0(RXD/PCINT16) PD1(TXD/PCINT17) PD2(INT0/PCINT18) PD3(INT1/OC2B/PCINT19) PD4(T0/XCK/PCINT20) PD5(T1/OC0B/PCINT21) PD6(AIN0/OC0A/PCINT22) PD7(AIN1/PCINT23) PB0(ICP1/CLK0/PCINT0) PB1(OC1A/PCINT1) PB2(SS/OC1B/PCINT2) PB3(MOSI/OC2/PCINT3) PB4(MISO/PCINT4) PB5(SCK/PCINT5) Dodatkowe materiały do pobrania ze strony www.media.avt.pl W ofercie AVT* AVT-5699 Podstawowe parametry: napięcie zasilania 3…5 V średni prąd obciążenia 70 mA Wykaz elementów: Rezystory: (obudowa SMD 0805) R1: 47 kV R2…R5, R7…R9: 270 V R6: 130 V R10…R13: 2,2 kV Kondensatory: (obudowa SMD 0805) C1: 100 nF Półprzewodniki: U1: ATmega48 (TQFP32) T1…T4: BC807 (SOT23) LED: wyświetlacz typu LED-AF5643FS Inne: SET, OK: mikroswitch TACT 6 mm Q1: rezonator kwarcowy SMD 32768 Hz * Uwaga! Elektroniczne zestawy do samodzielnego montażu. Wymagana umiejętność lutowania! Podstawową wersją zestawu jest wersja [B] nazywana potocznie KIT-em (z ang. zestaw). Zestaw w wersji [B] zawiera elementy elektroniczne (w tym [UK] – jeśli występuje w projekcie), które należy samodzielnie wlutować w dołączoną płytkę drukowaną (PCB). Wykaz elementów znajduje się w dokumentacji, która jest podlinkowana w opisie kitu. Mając na uwadze różne potrzeby naszych klientów, oferujemy dodatkowe wersje: wersja [C] – zmontowany, uruchomiony i przetestowany zestaw [B] (elementy wlutowane w płytkę PCB) wersja [A] – płytka drukowana bez elementów i dokumentacji Kity w których występuje układ scalony wymagający zaprogramowania, mają następujące dodatkowe wersje: wersja [A+] – płytka drukowana [A] + zaprogramowany układ [UK] i dokumentacja wersja [UK] – zaprogramowany układ Nie każdy zestaw AVT występuje we wszystkich wersjach! Każda wersja ma załączony ten sam plik pdf! Podczas składania zamówienia upewnij się, którą wersję zamawiasz! http://sklep.avt.pl. W przypadku braku dostępności na http://sklep.avt.pl, osoby zainteresowane zakupem płytek drukowanych (PCB) prosimy o kontakt via e-mail: [email protected]. Rysunek 1. Schemat ideowy urządzenia Clock udziale zewnętrznego rezonatora kwarco- wego o częstotliwości 32768 Hz. Odpo- wiednio skonfigurowany Timer2 generuje co 1 sekundę przerwanie od przepełnienia licznika, co wykorzystano do programo- wej realizacji prostego zegara czasu rze- czywistego. Sposób konfiguracji układu czasowo-licznikowego Timer2 w celu reali- zacji zegara czasu rzeczywistego pokazano na listingu 1. Co ważne, dla przejrzystości realizacji założonej funkcjonalności (zegara czasu Ustawienia Fuse-bitów (ważniejszych): CKSEL3...0: 0010 SUT1...0: 10 CKDIV8: 0 CKOUT: 1 DWEN: 1

Transcript of ELEKTRONIKA PRAKTYCZNA 8/2019 - AVT · 2019-08-14 · 58 ELEKTR 8/2019 MINIPROJEKTY Listing 5....

Page 1: ELEKTRONIKA PRAKTYCZNA 8/2019 - AVT · 2019-08-14 · 58 ELEKTR 8/2019 MINIPROJEKTY Listing 5. Funkcja obsługi przerwania układu czasowo-licznikowego Timer0, realizująca mechanizm

56 ELEKTRONIKA PRAKTYCZNA 8/2019

MINIPROJEKTY

ClockZostałem poproszony o zaprojek-towanie układu prostego i taniego zegara czasu rzeczywistego o pod-stawowej funkcjonalności i niewiel-kich wymiarach zewnętrznych – tak oto powstał projekt Clock.

Budowa i działanieSchemat urządzenia pokazano na rysunku 1. Zaprojektowano dość prosty system mi-kroprocesorowy zbudowany z wykorzysta-niem popularnego mikrokontrolera firmy Atmel typu ATmega48 taktowanego we-wnętrznym, wysokostabilnym oscylatorem o częstotliwości 1 MHz, którego zadaniem jest realizacja wszystkich założonych funk-cjonalności. Mikrokontroler ten realizuje tutaj dwa podstawowe zadania: obsługę pro-gramowego zegara czasu rzeczywistego RTC oraz obsługę wyświetlacza LED.

W celu realizacji zegara czasu rzeczywi-stego, w jego najprostszej formie, wykorzy-stano układ czasowo-licznikowy Timer2, wbudowany w  mikrokontroler, pracujący w trybie asynchronicznym i taktowany przy

VDD

T1BC807

T2BC807

T3BC807

T4BC807

R102k2

R112k2

R122k2

R132k2

LEDAF-5643

R2

R3

R4

R5

R6

R7

R8

R9

270

270

270

270

270

270

270

270

GND GNDSCK MISO MOSI

OK SET

12

34

12

34

a b c d e f g

dp

dig1

dig2

dig3

dig4

cola

colc

RES

U1R1

47k5V

Q132768Hz

V+

5V

29

7

8

4

6

18

20

C1100nF

GND

GND

V–21

3

5

ATmega48

AVCCAREF

AGND

GNDGND

VCCVCC

PC6(/RESET/PCINT14)

PB6(XTAL1/TOSC1/PCINT6)

PB7(XTAL2/TOSC2/PCINT7)

23

24

25

26

27

28

19

22

30

31

32

1

2

9

10

11

12

13

14

15

16

17

PC0(ADC0/PCINT8)

PC1(ADC1/PCINT9)

PC2(ADC2/PCINT10)

PC3(ADC3/PCINT11)

PC4(ADC4/SDA/PCINT12)

PC5(ADC5/SCL/PCINT13)

ADC6

ADC7

PD0(RXD/PCINT16)

PD1(TXD/PCINT17)

PD2(INT0/PCINT18)

PD3(INT1/OC2B/PCINT19)

PD4(T0/XCK/PCINT20)

PD5(T1/OC0B/PCINT21)

PD6(AIN0/OC0A/PCINT22)

PD7(AIN1/PCINT23)

PB0(ICP1/CLK0/PCINT0)

PB1(OC1A/PCINT1)

PB2(SS/OC1B/PCINT2)

PB3(MOSI/OC2/PCINT3)

PB4(MISO/PCINT4)

PB5(SCK/PCINT5)

Dodatkowe materiały do pobrania ze strony www.media.avt.pl

W ofercie AVT* AVT-5699Podstawowe parametry:• napięcie zasilania 3…5 V• średni prąd obciążenia 70 mA

Wykaz elementów:Rezystory: (obudowa SMD 0805)R1: 47 kVR2…R5, R7…R9: 270 VR6: 130 VR10…R13: 2,2 kV

Kondensatory: (obudowa SMD 0805)C1: 100 nF

Półprzewodniki:U1: ATmega48 (TQFP32)T1…T4: BC807 (SOT23)LED: wyświetlacz typu LED-AF5643FS

Inne:SET, OK: mikroswitch TACT 6 mmQ1: rezonator kwarcowy SMD 32768 Hz

* Uwaga! Elektroniczne zestawy do samodzielnego montażu. Wymagana umiejętność lutowania!Podstawową wersją zestawu jest wersja [B] nazywana potocznie KIT-em (z ang. zestaw). Zestaw w wersji [B] zawiera elementy elektroniczne (w tym [UK] – jeśli występuje w projekcie), które należy samodzielnie wlutować w dołączoną płytkę drukowaną (PCB). Wykaz elementów znajduje się w dokumentacji, która jest podlinkowana w opisie kitu.Mając na uwadze różne potrzeby naszych klientów, oferujemy dodatkowe wersje: wersja [C] – zmontowany, uruchomiony i przetestowany zestaw [B] (elementy wlutowane w płytkę PCB)

wersja [A] – płytka drukowana bez elementów i dokumentacjiKity w których występuje układ scalony wymagający zaprogramowania, mają następujące dodatkowe wersje: wersja [A+] – płytka drukowana [A] + zaprogramowany układ [UK] i dokumentacja

wersja [UK] – zaprogramowany układNie każdy zestaw AVT występuje we wszystkich wersjach! Każda wersja ma załączony ten sam plik pdf! Podczas składania zamówienia upewnij się, którą wersję zamawiasz!http://sklep.avt.pl. W przypadku braku dostępności na http://sklep.avt.pl, osoby zainteresowane zakupem płytek drukowanych (PCB) prosimy o kontakt via e-mail: [email protected].

Rysunek 1. Schemat ideowy urządzenia Clock

udziale zewnętrznego rezonatora kwarco-wego o  częstotliwości 32768  Hz. Odpo-wiednio skonfigurowany Timer2 generuje co 1 sekundę przerwanie od przepełnienia licznika, co  wykorzystano do  programo-wej realizacji prostego zegara czasu rze-czywistego. Sposób konfiguracji układu czasowo-licznikowego Timer2 w celu reali-zacji zegara czasu rzeczywistego pokazano na listingu 1.

Co ważne, dla przejrzystości realizacji założonej funkcjonalności (zegara czasu

Ustawienia Fuse-bitów (ważniejszych):CKSEL3...0: 0010SUT1...0: 10CKDIV8: 0CKOUT: 1DWEN: 1

Page 2: ELEKTRONIKA PRAKTYCZNA 8/2019 - AVT · 2019-08-14 · 58 ELEKTR 8/2019 MINIPROJEKTY Listing 5. Funkcja obsługi przerwania układu czasowo-licznikowego Timer0, realizująca mechanizm

57ELEKTRONIKA PRAKTYCZNA 8/2019

R E K L A M A

MINIPROJEKTY

Do kompletu potrzebne są nam jeszcze definicje dwóch tablic upraszczających mechanizm multipleksowania. Pierwsza z nich, DIGITS[], zawiera definicje poszcze-gólnych cyfr wyświetlacza 7-segmentowego (czyli stanów logicznych na porcie katod wyświetlacza), zaś druga, COMS[], zawiera definicje dla portu sterującego wspólnymi anodami wyświetlaczy LED (czyli stanów logicznych na porcie wspólnych anod wy-świetlacza). Na koniec, na listingu 5, przed-stawię ciało funkcji obsługi przerwania układu czasowo-licznikowego Timer0, re-alizującą mechanizm multipleksowania wyświetlaczy LED.

Jak widać, zaimplementowano dodat-kową funkcjonalność w postaci obsługi mi-gania dowolnej cyfry wyświetlacza LED (gdy ustawiony jest najstarszy bit tejże cy-fry), co wykorzystywane jest w trybie edy-cji nastaw zegara czasu rzeczywistego.

Na  koniec, już zupełnie dla porządku, należy dodać, że mikrokontroler sterujący odpowiada również za obsługę prostego interfejsu użytkownika w  postaci dwóch przycisków umownie oznaczonych jako OK i SET, przy czym, co istotne, obsługiwane

Listing 1. Konfiguracja układu czasowo-licznikowego Timer2 w celu realizacji zegara czasu rzeczywistego

void megaRTCinit(void){ //Timer2 taktowany za pomocą kwarcu 32768Hz podłączonego do wypr. TOSC1/TOSC2 ASSR |= (1<<AS2); //Preskaler = 128, przerwanie przepełnienia co 1s (32768/128/256) TCCR2B = (1<<CS22)|(1<<CS20); while(ASSR & ((1<<TCN2UB)|(1<<OCR2AUB)|(1<<OCR2BUB)|(1<<TCR2AUB)| (1<<TCR2BUB))); //Oczekiwanie na aktualizację rejestrów //Skasowanie ewentualnych flag przerwań (przez wpisanie jedynek do bitów flag) TIFR2 = ((1<<OCF2B)|(1<<OCF2A)|(1<<TOV2)); //Uruchomienie przerwania od przepełnienia licznika TCNT2 TIMSK2 = (1<<TOIE2); }

Listing 2. Deklaracje zmiennych w realizacji zegara czasu rzeczywistego

//Definicja typu odpowiedzialnego za obsługę zegaratypedef struct{ volatile uint8_t Flag, Hour, Minute, Second;} clockType;

//Definicja typu odpowiedzialnego za obsługę stoperatypedef struct{ volatile uint8_t Activity, Flag, Minute, Second;} timerType;

//Zmienne globalne modułuextern clockType Clock; //Struktura przechowująca dane zegaraextern timerType Timer; //Struktura przechowująca dane timera

Listing 3. Ciało funkcji obsługi przerwania realizujące funkcjonalność zegara czasu rzeczywistego

//Przerwanie od przepełnienia licznika Timer2 wywoływane 1 raz na sekundę (Timer2//taktowany kwarcem zegarkowym 32768Hz)

ISR(TIMER2_OVF_vect){ //Obsługa programowego zegara Clock.Flag = 1;

if(++Clock.Second == 60){ Clock.Second = 0;

if(++Clock.Minute == 60){ Clock.Minute = 0; if(++Clock.Hour == 24) Clock.Hour = 0; } } //Obsługa programowego timera if(Timer.Activity){ Timer.Flag = 1;

if(++Timer.Second == 60){ Timer.Second = 0; if(++Timer.Minute == 100) Timer.Minute = 0; } }}

Listing 4. Konfiguracja układu czasowo-licznikowego Timer0 w celu realizacji multipleksowania

void initMultiplex(void){ //Porty wspólnych anod i katod, jako wyjściowe ze stanami nieaktywnymi //na wyjściach SEG_BLANK; SEG_AS_OUTPUT; COM_BLANK; COM_AS_OUTPUT;

//Konfiguracja układu Timer0 w celu generowania przerwania do obsługi //multipleksowania wyświetlacza LED (240 Hz) TCCR0A = (1<<WGM01); //Tryb CTC TCCR0B = (1<<CS01)|(1<<CS00); //Preskaler = 64 OCR0A = 64; //240 Hz (przerwanie co 4.167ms) //Uruchomienie przerwania Output Compare Match A (od porównania) TIMSK0 = (1<<OCIE0A); }

PORTC tegoż układu. Następnie skonfigu-rowano układ czasowo-licznikowy Timer0 wbudowany w strukturę mikrokontrolera w  taki sposób, by generował stosowne przerwanie 240  razy na  sekundę (czyli 60 razy na każdą cyfrę wyświetlacza LED), w ramach którego wyświetlane są kolejne cyfry zegara. Aby uruchomić mechanizm multipleksowania, niezbędne jest odpo-wiednie skonfigurowanie układu czaso-wo-licznikowego Timer0, które pokazano na listingu 4.

rzeczywistego i  stopera) wprowadzono 2 zmienne strukturalne, których zastosowa-nie upraszcza kod wynikowy i jednocześnie czyni go bardziej przejrzystym. Deklaracje wspomnianych zmiennych pokazano na li-stingu 2. Dalej, na listingu 3, pokazano ciało funkcji obsługi przerwania od przepełnienia zawartości licznika Timer2 (wywoływane co 1 s), której zadaniem jest realizacja ze-gara czasu rzeczywistego i prostego stopera.

Pora na przedstawienie drugiego, klu-czowego mechanizmu naszego urządze-nia. Mowa o  obsłudze 7-segmentowego wyświetlacza LED, która realizowana jest w ramach typowego multipleksowa-nia kolejnych cyfr tegoż wyświetlacza. Jest to zwyczajowe rozwiązanie problemu tego typu pozbawione jakiejkolwiek i nie-potrzebnej tutaj finezji. Katody poszcze-gólnych wyświetlaczy LED podłączono bezpośrednio do  portu PORTD mikro-kontrolera, zaś wspólne anody, poprzez tranzystory sterujące (T1…T4), do portu

Page 3: ELEKTRONIKA PRAKTYCZNA 8/2019 - AVT · 2019-08-14 · 58 ELEKTR 8/2019 MINIPROJEKTY Listing 5. Funkcja obsługi przerwania układu czasowo-licznikowego Timer0, realizująca mechanizm

58 ELEKTRONIKA PRAKTYCZNA 8/2019

MINIPROJEKTY

Listing 5. Funkcja obsługi przerwania układu czasowo-licznikowego Timer0, realizująca mechanizm multipleksowania wyświetlaczy LED

//Przerwanie obsługi wyświetlacza LED wywoływane co 4,167 ms (60 razy na sekundę dla każdej z cyfr)

ISR(TIMER0_COMPA_vect){ static uint8_t Nr; //Numer kolejnej cyfry przeznaczonej do wyświetlenia //Timer programowy 4ms służący do obsługi migania cyfr wyświetlacza LED static uint8_t timer4ms; uint8_t currentDigit = Digit[Nr]; //Optymalizacja zmiennej volatile

COM_BLANK; //Wyłączenie wspólnych anod wyświetlaczy LED

//Sprawdzamy, czy dla danej cyfry uruchomiono funkcję migania (ustawiony najstarszy bit zmiennej) if(currentDigit & BLINKING_BIT) { if(++timer4ms & 0x40) SEG_PORT = pgm_read_byte(&DIGITS[currentDigit & (~BLINKING_BIT)]); else SEG_BLANK; //Migamy co 266ms } //Pobranie kolejnej cyfry na port katod else SEG_PORT = pgm_read_byte(&DIGITS[currentDigit & (~BLINKING_BIT)]);

//Obsługa migania dwukropkiem if((++timer4ms & 0x80)) SEG_PORT &= ~(1<<SEG_CL);

//Włączenie odpowiedniej wspólnej anody (aktywny stan „0”) COM_PORT &= pgm_read_byte(&COMS[Nr]);

Nr = (Nr+1) & 0x03;}

Fotografia 4. Zmontowana płytka od strony BOTTOM

ZEGAR STOPER

Ustawienie godzin Zerowanie stopera Start/Stop

Regulacja godzin

Ustawienie minut

SET

– krótkie naciśnięcie przycisku

– długie naciśnięcie przycisku

SET

SETSET

SET SETOK OK OK

Regulacja minut

OK

OK

Rysunek 5. Diagram obrazujący sposób obsługi urządzenia Clock

Rysunek 3. Schemat montażowy płytki PCB, strona BOTTOMRysunek 2. Schemat montażowy płytki PCB, strona TOP

jest zarówno krótkie, jak i długie wciśnięcie każdego z przycisków.

MontażSchemat płytki PCB oraz schemat monta-żowy urządzenia Clock pokazano na rysun-kach 2 i 3. Zaprojektowano bardzo zwarty obwód drukowany, o  wielkości zbliżonej do wielkości zastosowanego wyświetlacza LED, zbudowany ze zdecydowaną przewagą elementów SMD umieszczonych po  obu stronach laminatu. Montaż urządzenia roz-poczynamy od  warstwy BOTTOM, gdzie w pierwszej kolejności przylutowujemy mi-krokontroler sterujący. Następnie lutujemy rezonator kwarcowy SMD, tranzystory steru-jące a na koniec elementy bierne. Dalej prze-chodzimy na warstwę TOP, gdzie montujemy elementy C1, T4 i R13, po czym przyluto-wujemy wyświetlacz LED. Na koniec przy-lutowujemy mikroprzełączniki OK i SET. Poprawnie zmontowany układ powinien działać tuż po włączeniu zasilania. Zmon-towaną płytkę od strony BOTTOM pokazuje fotografia 4.

ObsługaZgodnie z tym, co napisano wcześniej, in-terfejs użytkownika naszego urządzenia składa się z  dwóch mikroprzełączników umownie nazwanych OK i SET, przy czym obsługiwane jest zarówno krótkie, jak i dłu-gie (powyżej 0,5 s) naciśnięcie każdego z ele-mentów sterujących. Diagram obrazujący sposób obsługi urządzenia przedstawiono na rysunku 5.

Robert Wołgajew, EP