Table of Contents

Numberindikaator

Vajalikud teadmised: [HW] Kasutajaliidese moodul, [LIB] 7-segmendiline LED indikaator,
[LIB] Viide [PRT] Valgusdiood

Teooria

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.

Indikaatori segmentide asetus ja elektriskeem
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 <homelab/module/segment_display.h>
#include <homelab/delay.h>
 
// 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);
	}
}
et/examples/display/segment_display.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0