IMP (Mikroprocesorové a vestavěné systémy) Demonstrační cvičení č. 5: AD/DA převod, LCD displej
Josef Strnadel https://www.fit.vutbr.cz/study/courses/IMP/private/VYUKA/CVICENI_A_LABORATORE/
AD/DA převod
Úvod • Fyzikální veličiny v přírodním prostředí jsou analogové (A) • HC08 je číslicový (digitální, D) systém – musí tedy umět zajistit A/D převod D/A převod
Příklady aplikace: digitální voltmetr, digitální systém zpracování řeči nebo obrazu, snímání polohy plynového pedálu v autě, …
D/A převod • Výstup: analogový proud/napětí • Pomocí vhodně generovaného PWM signálu a lze za použití přídavného obvodu generovat
A/D převod
68HC908LJ12
8 A/D kanálů
6 A/D kanálů
A/D převod (68HC908LJ12) • 6 časově multiplexovaných A/D kanálů • Lineární postupná aproximace (Linear Successive Approximation, LSA) • 10 bitové rozlišení (vzorky) • Jednorázový/nepřetržitý A/D převod • Příznak „ A/D převod dokončen“, možnost přerušení při dokončení A/D převodu • Volitelný A/D kmitočet • Možnost zarovnání výsledku A/D převodu (8-bit oříznutí, zarovnání vpravo, vlevo bez a se znaménkem)
A/D převod: blokové schéma a algoritmus LSA
Stop
Registry pro A/D (ADC, Analog-to-Digital)
A/D převod: Registr ADSCR COCO (COnversion Complete Bit) •0 (A/D převod ještě není dokončen) •1 (A/D převod je dokončen)
A/D převod: Registr ADSCR COCO (COnversion Complete Bit) •0 (A/D převod ještě není dokončen) •1 (A/D převod je dokončen) AIEN (ADC Interrupt ENable) •0 (přerušení zakázáno) •1 (přerušení povoleno)
A/D převod: Registr ADSCR COCO (COnversion Complete Bit) •0 (A/D převod ještě není dokončen) •1 (A/D převod je dokončen) AIEN (ADC Interrupt ENable) •0 (přerušení zakázáno) •1 (přerušení povoleno) ADCO (ADC COntinuous Conversion Bit) •0 (jednorázový A/D převod) •1 (nepřetržitý A/D převod)
A/D převod: Registr ADSCR
A/D převod: Registr ADCLK
A/D převod: Registr ADCLK
A/D převod: Registr ADCLK
ADICLK (ADC Input CLK Select Bit) •0 (externí CLK, CGMXCLK) •1 (CLK interní sběrnice HC08)
A/D převod: Registr ADR
← v ADCLK registru
A/D převod: příklad aplikace (nepřetržitý A/D převod) unsigned char ad_res; CONFIG1 = 0x31; ADSCR = 0x20; ADCLK = 0x70; PTA = 0; DDRA = 0xFF; TBCR = 0x48; TBCR = 0x04; TBCR |= 0x02; EnableInterrupts;
/* /* /* /* /* /* /* /*
vypni LVI a COP */ init AD: bez int., ch. 0, cont. */ AD_clk = BUS_clk/8 */ vypni displej */ nastav port A na vystupni */ init TimeBase: TBON=0, TACK=1, 512Hz */ zapni TimeBase int. */ spust TimeBase: TBON = 1 */
unsigned char sevent_segment(unsigned char hexValue) { . . . } interrupt 17 void TBM_ISR(void) { TBCR |= TACK; if(PTA & 0x80) /* PTA7==1? Ano->disp2, { PTA |= seven_segment(ad_res & 0x0F); PTA &= 0x7F; } else { ad_res = ADRL; PTA |= seven_segment((ad_res>>4) & 0x0F); PTA |= 0x80; } }
ne->disp1 */ /* bity 3-0 */ /* dalsi: disp1 */
/* bity 7-4 */ /* dalsi: disp2 */
A/D převod: příklad aplikace (jednorázový převod) unsigned char sirka; sirka = 0; /* init. sirku */ CONFIG1 = 0x31; /* vypni LVI a COP */ ADSCR = 0; /* init AD: bez int., ch. 0, 1-conv. */ ADCLK = 0x70; /* AD_clk = BUS_clk/8 */ T1SC=0x73; /* int. enable, TIM1_clk = BUS_clk/8 */ T1SC0 = 0x5A; /* int. en., clr on comp., TOV=1 */ T1CH0H = T1MODH=0; T1MODL=255; PTA = 0; /* vypni displej */ DDRA = 0xFF; /* nastav port A na vystupni */ TBCR = 0x48; /* init TimeBase: TBON=0, TACK=1, 512Hz */ TBCR = 0x04; /* zapni TimeBase int. */ TBCR |= 0x02; /* spust TimeBase: TBON = 1 */ EnableInterrupts; for(;;);
interrupt 6 void TIM1OVERFLOW_ISR(void) { T1SC &= 7F; /* nuluj priznak preteceni (TOF) TIM1 */ sirka = ADRL; ADSCR &= 7F; /* nuluj COCO bit */ T1CH0L += sirka; }
LCD displej
Statické řízení LCD
Medoda (k)
Počet vývodů pro Př.: počet vývodů pro řízení n segmentů n=80 1+n 81 42 30 k+(n/k) 24
Statická (1) MUX2 (2) MUX3 (3) MUX4 (4) k Duty ratio Počet napěťových úrovní Bias
1 1
2 1/2
3 1/3
4 1/4
6 1/6
7 1/7
11 1/11
12 1/12
2
3
4
4
4
5
5
6
1
1/2
1/3
1/3
1/3
1/4
1/4
1/5
MUX2
MUX3
LCD řadič v MC68HC908LJ12 Pomocí vývodů BP0-BP2, FP0/BP3, FP1FP18, PTC0/FP19-PTC7/FP26 dokáže řídit až 104 LCD segmentů, umožňuje generovat až 27 FP-signálů a až 4 BP-signály a to v jednom z následujících režimů: – 26 FP-signálů, 4 BP-signály (104 segmentů), – 27 FP-signálů, 3 BP-signály (81 segmentů), – 27 FP-signálů, 1 BP-signály (27 segmentů).
BP0 BP1 BP2
BP0 BP1 BP2 BP3
BP0 BP1 BP2
BP0 BP1 BP2 BP3
Zobrazování číslic na LCD void turnOffLCDsegments() { LDAT1=LDAT2=LDAT3=LDAT4=LDAT5=LDAT6=LDAT7=LDAT8=LDAT9=LDAT10=LDAT11=LDAT12=LDAT13=LDAT14=0; } void inits() { /* vypni COP */ CONFIG1=0x01; /* init LCD */ turnOffLCDsegments(); LCDCR=0xA0; LCDCLK=0x53; } void main() { inits();
/* inicializuj HC08: AD, LCD */
for(;;) { displayOnLCD(dig_x, dig_y); /* zobraz honotu napeti na LCD displeji */ delay(500); } }
unsigned char dig_x, dig_y; const unsigned char LCDpart_2[20]= { 0x53, 0x03, /* display 0 */ 0x03, 0x00, /* display 1 */ 0x71, 0x02, /* display 2 */ 0x73, 0x00, /* display 3 */ 0x23, 0x01, /* display 4 */ 0x72, 0x01, /* display 5 */ 0x72, 0x03, /* display 6 */ 0x13, 0x00, /* display 7 */ 0x73, 0x03, /* display 8 */ 0x73, 0x01 /* display 9 */ }; /* doplnte kod k bodum 3 a 4 ve funkci */ void displayOnLCD(unsigned int dig2, unsigned int dig3) { /* 1) vypni vsechny LCD-segmenty */ turnOffLCDsegments(); /* 2) zobraz cislici dig2 na 7-segmentu 2 LCD displeje */ LDAT9|= LCDpart_2[2*dig2]; LDAT10|= LCDpart_2[2*dig2+1]; /* 3) zobraz cislici dig3 na 7-segmentu 3 LCD displeje */ /* 4) zobraz desetinou tecku (P2) lezici mezi 7-segmenty 2 a 3 LCD displeje */ }
Konec demonstračního cvičení