Sunteți pe pagina 1din 7

Arhitecturi cu microprocesor

Curs 8
8.1. Afioare LED pe apte segmente (anod comun, catod comun)

Afioarele conectate la un microcontroler ocup un numr ridicat de pini intrare/ieire, care creeaz probleme, mai ales dac este nevoie de mei multe cifre zecimale. De exemplu, dac vreem s afim numere pe 6 cifre, avem nevoie de 6x16=96 pini. Soluia este MULTIPLEXAREA (folosind MUX). Dac sunt mai multe afioare conectate la microcontroler, se recomand utilizarea a aa numit Low current LED care este de 2 mA. Principiul este similar filmelor n care cadre sunt vizualizate succesiv, la o anumit vitez creend impresia de micare.

Un octet reprezentnd o unitate este aplicat portului PORT2 al microcontrolerului i este activat n acelai timp tranzistorul T1. Dup un timp se nchide tranzistorul T1, un octet reprezentnd un numr de la 0-9 este aplicat la PORT2, i tranzistorul T2 este deschis. Procesul contunu apoi ciclic. Problema este ca microcontrolerul este ca un calculator n miniatur, i nelege numai un limbaj format din 0 i 1, ca atare, mai muli digii trebuie mparii n uniti, zeci, sute, etc. prin rutine speciale. Dac portul microcontrolerului este conectat la afior astfel nct bitul 0 activeaz segmentul a, bitul 1 activeaz segmentul b, bitul 2 activeaz segmentul c, etc., atunci tabelul de mai jos arat masca se aplicare pentru fiecare cifra.

8.2. Numrator pe 2 digii multiplexat Variabila I este incrementat lent, suficient pentru a fi vizibil. Partea mai complicat este mprirea numrului binar pentru a fi convertit i mprit n 2 digii (uniti i zeci). TMR0 este responsabil de multiplexare n diviziunea de timp alocat n timp ce funcia mask convertete numrul binar n format zecimal.

/*Header******************************************************/ unsigned short mask(unsigned short num); unsigned short digit_no, digit10, digit1, digit, i; void interrupt() { if (digit_no==0) { PORTA = 0; PORTD = digit1; PORTA = 1; digit_no = 1; } else { PORTA = 0; PORTD = digit10; PORTA = 2; digit_no = 0; } TMR0 = 0; INTCON = 0x20; } void main() { OPTION_REG = 0x80; TMR0 = 0; INTCON = 0xA0; PORTA = 0; TRISA = 0; PORTD = 0; TRISD = 0;

// Turn off both displays // Set mask for displaying ones on PORTD // Turn on display for ones (LSD)

// Turn off both displays // Set mask for displaying tens on PORTD // Turn on display for tens (MSD)

// Reset counter TMRO // Bit T0IF=0, T0IE=1

// Set timer TMR0 // // // // // Disable interrupt PEIE,INTE,RBIE,T0IE Turn off both displays All port A pins are configured as outputs Turn off all display segments All port D pins are configured as outputs

do { for (i = 0; i<=99; i++) { // digit = i % 10u; digit1 = mask(digit); // digit = (char)(i / 10u) % digit10 = mask(digit); // Delay_ms(1000); } } while (1); //

Count from 0 to 99 Prepare mask for displaying ones 10u; Prepare mask for displaying tens

Endless loop

} Fiierul mask.c
/*Header******************************************************/ unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0x3F; case 1 : return 0x06; case 2 : return 0x5B; case 3 : return 0x4F; case 4 : return 0x66; case 5 : return 0x6D; case 6 : return 0x7D; case 7 : return 0x07; case 8 : return 0x7F; case 9 : return 0x6F; } }

8.3. Msurarea unei tensiuni variabile n gama 0-5 V LCD este unul din afioarele cele mai utilizate n aplicaii cu microcontrolere. Dac folosim MikroC, pentru utilizarea afirii pe LCD sunt necesare bibliotecile ADC, LCD.

Tensiunea variabil este culeas de pe potenomentrul care este conectat la intrarea RA2 a microcontrolerului.

/*Header******************************************************/ // LCD module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit;

sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections unsigned char ch; unsigned int adc_rd; char *text; long tlong; void main() { INTCON = 0; ANSEL = 0x04; input TRISA = 0x04; ANSELH = 0; Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); // // Declare variables // //

// All interrupts disabled // Pin RA2 is configured as an analog

// Rest of pins are configured as digital // LCD display initialization // LCD command (cursor off) // LCD command (clear LCD)

text = "mikroElektronika"; // Define the first message Lcd_Out(1,1,text); // Write the first message in the first line text = "LCD example"; // Define the second message Lcd_Out(2,1,text); // Define the first message ADCON1 = 0x82; TRISA = 0xFF; Delay_ms(2000); text = "voltage:"; // A/D voltage reference is VCC // All port A pins are configured as inputs

// Define the third message

while (1) { adc_rd = ADC_Read(2); // A/D conversion. Pin RA2 is an input. Lcd_Out(2,1,text); // Write result in the second line tlong = (long)adc_rd * 5000; // Convert the result in millivolts tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // Extract volts (thousands of millivolts) // from result Lcd_Chr(2,9,48+ch); // Write result in ASCII format Lcd_Chr_CP('.'); ch = (tlong / 100) % 10; // Extract hundreds of millivolts Lcd_Chr_CP(48+ch); // Write result in ASCII format ch = (tlong / 10) % 10; // Extract tens of millivolts Lcd_Chr_CP(48+ch); // Write result in ASCII format ch = tlong % 10; // Extract digits for millivolts Lcd_Chr_CP(48+ch); // Write result in ASCII format Lcd_Chr_CP('V'); Delay_ms(1); }

8.3. Comunicaie serial RS232 (utiliznd modulul EUSART)

/*Header******************************************************/ unsigned short i; void main() { UART1_Init(19200);

// Initialize USART module // (8 bit, 19200 baud rate, no parity bit...)

while (1) { if (UART1_Data_Ready()) { // If data has been received i = UART1_Read(); // read it UART1_Write(i); // and send it back } }