====== Numberindikaator ====== //Vajalikud teadmised: [HW] [[et:hardware:homelab:digi]], [LIB] [[et:software:homelab:library:module:segment_display]], \\ [LIB] [[et:software:homelab:library:delay]] [PRT] [[et:examples:digi:led]]// ===== Teooria ===== [{{ :examples:display:segment_display:7-seg.jpg?100|7-segment}}] 7-segmendiline LED numberindikaator on seitsmest number 8-kujuliselt paigutatud valgusdioodist koosnev näidik. Vastavaid LED-e (segmente) süüdates või kustutades saab nendega kuvada numbreid nullist üheksani ning mõningaid tähti. Elektriliselt on kõigi LED-ide anoodid ühendatud ühise anoodi viiguga (inglise keeles //common anode//) - //ca//. LED-e süüdatakse nende katoode (//a, b, c...//) lülitades. Olemas on ka vastupidi ühendusi, kus indikaatoritel on ühine katood (inglise keeles //common cathode//) - //cc//. Tavaliselt kasutatakse mitut numberindikaatorit, et kuvada mitmekohalisi arve - selleks puhuks on indikaatorid varustatud ka koma(punkti) segmendiga //dp//. Kokkuvõttes on ühel indikaatoril siiski 8 segmenti, kuid nimetatakse neid ikkagi numbrisegmentide arvu järgi 7-segmendilisteks. [{{ :examples:display:segment_display:segment_display_leds.png?300|Indikaatori segmentide asetus ja elektriskeem}}] [{{ :examples:display:segment_display:segment_display_driver_logic.png?300|LED ajuri nihkeregistri ülesehitus koos vastavate indikaatori segmentidega}}] LED numberindikaatoreid on lihtne kasutada, sest neid võib juhtida kas või otse mikrokontrolleri viikudelt, kuid on ka spetsiaalseid ajureid (inglisekeeles //draiver//), mis võimaldavad numberindikaatorit juhtida vähemate mikrokontrollerite viikude arvuga. LED numberindikaatoreid on erinevat värvi, nad võivad olla väga eredad ja väga suured. Kogu ladina tähestiku kuvamiseks on olemas ka lisasegmentidega indikaatoreid. Ajureid on erinevaid, kuid levinud ajurid kasutavad järjestikliidest, mis on on sarnane SPI-ga, kus kasutatakse ka taktsignaali ja andmesignaali. Erinevalt SPI-st pole kasutusel kiibi valikut (inglise keeles //chip-select//), kuid selle asemel on andmete lukustussignaal (inglise keeles //latch//). Nimetatud kolm liini on ühendatud kontrolleri viikudega. * Lukustussignaal (//latch//) * Taktsignaal (//clock//) * Andmesignaal (//data//) Andmed edastatakse bitthaaval andmeviigu kaudu. Iga kord, kui taktsignaal kõrgeks läheb, nihutatakse nihkeregistri sisu paremale ja kõige vasakpoolsemasse pesasse loetakse andmeviigult tulev bitt. Niiviisi laaditakse nihkeregistrisse 8 bitti. Kui lukustussignaal kõrgeks seada, laetakse nihkeregistri väärtus lukustusregistrisse, kus see jääb püsima kuni uue laadimiseni. Iga lukustusregistri pesa (bitt) on läbi voolulülituse seotud ühe numberindikaatori segmendiga. Segment põleb kõrge bitiväärtuse korral. ===== Praktika ===== Kasutajaliidese moodulil on üks 7-segmendiline LED numberindikaator, mida juhitakse läbi järjestikliidesega ajuri. Numbrite kuvamiseks Kodulabori Kasutajaliidese mooduli indikaatoril on Kodulabori teeki kirjutatud järgnev funktsionaalsus: // Märgikaart // Bitid tähistavad segmente, madalaim järk A ja kõrgeim DP const unsigned char __attribute__ ((weak)) segment_char_map[11] = { 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111100, 0b00000111, 0b01111111, 0b01100111, 0b01111001 // E nagu Error }; // 7-segmendilise indikaatori käivitamine void segment_display_init(void) { // Juhtviikude väljundiks seadmine pin_setup_output(segment_display_latch); pin_setup_output(segment_display_data_out); pin_setup_output(segment_display_clock); } // 7-segmendilisel indikaatoril numbri kuvamine void segment_display_write(unsigned char digit) { unsigned char map; signed char i; // Numbri kontroll if (digit > 9) { digit = 10; } // Numbri segmentide kaardiks teisendamine map = segment_char_map[digit]; // Lukustussignaali madalaks muutmine pin_clear(segment_display_latch); // Bittide saatmine, kõrgeim järk esimesena for (i = 7; i >= 0; i--) { // Viigu seadmine vastavalt kaardi biti väärtusele pin_set_to(segment_display_data_out, bit_is_set(map, i)); // Taktsignaali hetkeks kõrgeks muutmine pin_set(segment_display_clock); _delay_us(1); // Taktsignaali madalaks muutmine pin_clear(segment_display_clock); _delay_us(1); } // Lukustussignaali kõrgeks muutmine pin_set(segment_display_latch); } Numbrite ja "E" tähe kuvamiseks segmentidena on loodud "nõrk" konstantne massiiv //segment_char_map//, kus iga segmendi põlemine on tähistatud bitiga 1 ja kustumine bitiga 0. Bitid madalamast kõrgemaks (binaarkujul paremalt vasakule) tähistavad segmente A, B, C, D, E, F, G ja DP. Ajuri juhtliides on teostatud tarkvaralise SPI-ga ehk andmesideviike programmis tarkvaraliselt juhtides. Funktsiooniga //segment_display_init// seatakse kõik kolm viiku väljundiks. Märgi kuvamiseks on //segment_display_write// funktsioon, mis leiab massiivist märgi segmendikaardi ja edastab kõigi segmentide väärtused bitthaaval ajurile. Taktsignaali sageduseks on tarkvaraliste pausidega saadud ligikaudu 500 kHz. Kui kasutaja defineerib muutuja segment_char_map oma koodis ise, on võimalik luua ekraanile ka muid sümboleid (Nt teksti vmt). Järgnevalt on toodud konkreetsem numberindikaatori kasutamise näiteprogramm. Programmis kasutatakse teegi eelnevalt kirjeldatud funktsioone. Programm loeb ligikaudu sekundilise intervalliga numbreid nullist üheksani ja seejärel kuvab tähe E, kuna kahekohalisi numbreid ei ole ühekohalisel indikaatoril võimalik näidata. // Kodulabori Kasutajaliidese mooduli 7-segmendilise LED indikaatori näidisprogramm #include #include // Põhiprogramm int main(void) { int counter = 0; // 7-segmendilise indikaatori seadistamine segment_display_init(); // Lõputu tsükkel while (1) { // Numbri kuvamine ekraanile segment_display_write(counter % 10); // Loenduri suurendamine kuni kümneni counter++; if (counter>19) counter=0; // Paus 1 sekund sw_delay_ms(1000); } }