Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET
Transkrypt
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET Laboratorium mikrokontrolerów Ćwiczenie 4B Wyświetlacz LED - projekt Autor: Paweł Russek http://www.fpga.agh.edu.pl/pm ver. 26.10.16 1/6 1. Cel ćwiczenia Celem ćwiczenia jest wykorzystanie przez student wiedzy w z zakresu programowania układów GPIO w celu stworzenia aplikacji wykorzystującej poczwórny wyświetlacz 7segmentowy. W ćwiczeniu zastosowano mikrokontroler z rodziny Kinetis L firmy NXP. Literatura: W opisach wykorzystanych w tym ćwiczeniu posłużono się opisami zaczerpniętymi z książki: Muhammad Ali; Chen, Shujen; Naimi, Sarmad; Naimi, Sepehr. Freescale ARM Cortex-M Embedded Programming: Using C Language (ARM books Book 3) 2. Budowa i zasada działania wyświetlacza 7-segmentwego 2.1. Podłączenie do mikrokontrolera i zasada działania Wyświetlacz 7-segmentowy, to popularny układ peryferyjny wykorzystywany w aplikacjach mikrokontrolerów. Można wytóżnić dwa typu tych wyświetlaczy: ze wspólną anodą, lub ze wspólną katodą. W wyświetlaczach ze wspólną anodą, wspólna anoda diód jest podłączona do napięcia odpowiadającego wysokiemu poziomowi logicznemu, a mikrokontroler steruje niskim poziomem logicznym indywidualne katody w celu ich zaświecenia. W takiej konfiguracji bardzo ważna jest odpowiednia wydajność prądowa źródła prądu dla anody. W wyświetlaczach ze wspólną katodą, wspólna katoda diód jest podłączona do napięcia odpowiadającego niskimu poziomowi logicznemu, a mikrokontroler steruje wysokim poziomem logicznym indywidualne anody w celu ich zaświecenia. W takiej konfiguracji bardzo ważna jest odpowiednia wydajność prądowa źródła prądu dla katody. W każdej z konfiguracji pin mikroknotrolera nie jest w stanie dostarczyć prądu koniecznego dla wspólnej anody/katody i dlatego konieczne jest buforowanie za pomocą układu scalonego lub tranzystora. Pojedyncze diody wyświetlacza są oznaczone kolejnymi literami alfabetu a, b, c, d, e, f, g, h, jak pokazano na rysunku poniżej. 2/6 Jeden bajt wystarcza do wysterowania odpowiedniej cyfry na wszystkich dostępnych segmentach. W przykładowym sposobie połączenia portów mikrokontrolera do wyświetlacza podanym poniżej segment a jest przypisany do bitu D0, segment b do bitu D1 i tak dalej, jak pokazano poniżej: Bit D7 steruje podświetleniem kropki dziesiętnej. W ten sposób można stworzyć wzorce dla cyfr od 0 do 9. Poniżej podano wartości dla wyświetlacza ze wspólną katodą. Rysunek poniżej przedstawia sposób podłączenia dwóch wyświetlaczy 7-segmentowych ze wspólną anodą do mikrokontrolera. 3/6 Należy zwrócić uwagę, że ponieważ segmenty (katody) cyfr wyświetlacza są podłączone do tych samych pinów portu mikrokontrolera, jedyną możliwością rozdzielenia sterowania cyfr jest rozdzielne sterowania katody pierwszej cyfry i drugiej cyfry. W tym sposobie sterowania, cyfry (anody) są załączane naprzemiennie, a wartość na katodach jest odpowiednio podmieniana. Dla przykładu, jeżeli chcemy wyświetlić liczbę 25, dla mikrokontrolera Kinetis L powinien być zastosowany następujący algorytm: 1) Włączyć zegar dla portów PORTD and PORTE, 2) Skonfigurować Port D jako wyjście, 3) Skonfigurować Port E jako wyjście,, 4) Wpisz wartość odpowiadającą cyfrze 2 (z tablicy powyżej) na Port D, 5) Ustaw pin PTE1 na LOW i PTE0 na HIGH , aby aktywować pozycję dziesiątek, 6) Wprowadź opóźnienie, 7) Wpisz wartość odpowiadającą cyfrze 5 na Port D, 8) Ustaw pin PTE0 na LOW i PTE1 na HIGH, aby aktywować pozycję jednostek, 9) Wprowadź opóźnienie, 10)Powtarzaj kroki 4 do 9. Jeżeli częstotliwość przełączania będzie zbyt niska cyfry będą w sposób widoczny mrugać. Aby wyeliminować ten efekt, każda cyfra powinna być włączona co najmniej 60 razy w ciągu każdej sekundy. Dla przykładu, w powyższym algorytmie opóźnienie powinno wynosić 8 ms 4/6 lub mniej 1 sek. / 60 / 2 = 8 ms. Zwróć uwagę, że aby sterować, na przykład czterema cyframi potrzebujemy 12 pinów mikrokontrolera, to jest 8 pinów na segmenty wyświetlacza i 4 piny, aby aktywować na jego cyfry. Przykładowy program. /** * * * * */ Display number 25 on a 4-digit 7-segment LED. Four common anode 7-segment LEDs are used. PTD0-6 are connected to segment A-G respectively. PTE0 is used to control right digit (low for digit on). PTE1 is used to control left digit (low for digit on). #include <MKL25Z4.H> void delayMs(int n); int main(void) { unsigned char digitPattern[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x18}; SIM->SCGC5 |= SIM_SCGC5_PORTD(1); SIM->SCGC5 |= SIM_SCGC5_PORTE(1); PORTD->PCR[0] = PORT_PCR_MUX(1); PORTD->PCR[1] = PORT_PCR_MUX(1); PORTD->PCR[2] = PORT_PCR_MUX(1); PORTD->PCR[3] = PORT_PCR_MUX(1); PORTD->PCR[4] = PORT_PCR_MUX(1); PORTD->PCR[5] = PORT_PCR_MUX(1); PORTD->PCR[6] = PORT_PCR_MUX(1); PTD->PDDR |= 0b01111111; PORTE->PCR[0] = PORT_PCR_MUX(1); PORTE->PCR[1] = PORT_PCR_MUX(1); PORTE->PCR[2] = PORT_PCR_MUX(1); PORTE->PCR[3] = PORT_PCR_MUX(1); PTE->PDDR |= 0b00001111; /* enable clock to Port D */ /* enable clock to Port E */ /* make PTD0 pin as GPIO */ /* make PTD1 pin as GPIO */ /* make PTD2 pin as GPIO */ /* make PTD3 pin as GPIO */ /* make PTD4 pin as GPIO */ /* make PTD5 pin as GPIO */ /* make PTD6 pin as GPIO */ /* make PTD6-0 as output pins */ /* make PTE0 pin as GPIO */ /* make PTE1 pin as GPIO */ /* make PTE0 pin as GPIO */ /* make PTE1 pin as GPIO */ /* make PTE3-0 as output pin */ while() { PTD->PDOR = digitPattern[2]; /* drive pattern of 2 on the segments */ PTE->PSOR = 0x01; /* turn off right digit */ PTE->PCOR = 0x02; /* turn on left digit */ delayMs(8); /* delay 8 ms will result in 16 ms per loop or 62.5 Hz */ PTD->PDOR = digitPattern[5]; PTE->PCOR = 0x01; /* drive pattern of 5 on the segments */ /* turn on right digit */ 5/6 } PTE->PSOR = 0x02; delayMs(8); /* turn off left digit */ } /* Delay n milliseconds * The CPU core clock is set to MCGFLLCLK at 41.94 MHz in SystemInit(). */ void delayMs(int n) { int i; int j; for(i = 0 ; i < n; i++) for (j = 0; j < 7000; j++) {} } Ćwiczenie 2.1 Napisz program, który będzie realizował prosty stoper z funkcją start i stop, który będzie wyświetlał sekundy na wyświetlaczu 7-segmentowym. 6/6