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; /* vypni LVI a COP */ ADSCR = 0x20; /* init AD: bez int., ch. 0, cont. */ ADCLK = 0x70; /* AD_clk = BUS_clk/8 */ 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; unsigned char sevent_segment(unsigned char hexvalue) {... } interrupt 17 void TBM_ISR(void) { TBCR = TACK; if(pta & 0x80) /* PTA7==1? Ano->disp2, ne->disp1 */ { PTA = seven_segment(ad_res & 0x0F); /* bity 3-0 */ PTA &= 0x7F; /* dalsi: disp1 */ } else { ad_res = ADRL; PTA = seven_segment((ad_res>>4) & 0x0F); /* bity 7-4 */ PTA = 0x80; /* 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 Statická (1) 1+n 81 MUX2 (2) 42 MUX3 (3) k+(n/k) 30 MUX4 (4) 24 k 1 2 3 4 6 7 11 12 Duty ratio 1 1/2 1/3 1/4 1/6 1/7 1/11 1/12 Počet napěťových 2 3 4 4 4 5 5 6 úrovní Bias 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, FP1- FP18, 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 BP3 BP0 BP1 BP2
BP0 BP1 BP2 BP3 BP0 BP1 BP2
void turnofflcdsegments() { LDAT1=LDAT2=LDAT3=LDAT4=LDAT5=LDAT6=LDAT7=LDAT8=LDAT9=LDAT10=LDAT11=LDAT12=LDAT13=LDAT14=0; } void inits() { /* vypni COP */ CONFIG1=0x01; Zobrazování číslic na LCD } /* 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í