Sunteți pe pagina 1din 4

Prctica.

Programar un microcontrolador ATmega48 para leer el ADC conectado en el canal cero, usando formato de 8 bits, y mostrar el resultado en una pantalla LCD. De acuerdo a los siguientes diagramas:

Paso 1. Seleccionar el valor de preescalamiento del ADC para elegir una frecuencia de operacin del ADC a 125kHz (aprox 14kSps) usando los bits (ADPS2:ADPS0) del registro ADCSRA. Considerando que la frecuencia del sistema es de 1MHz (El circuito no tiene oscilador externo o cristal, por lo que se referir al oscilador interno RC) F 1MHz PRE = CPU = =8 . F adc 125kHz ADPS2 0 0 0 0 1 1 1 1 ADPS1 0 0 1 1 0 0 1 1 ADPS0 0 1 0 1 0 1 0 1 Preescalamiento 2 2 4 8 16 32 64 128

Paso 2. Seleccionar los voltajes de referencia del ADC usando los bits (REFS1:REFS0) del registro ADMUX. Para el caso especificado, se requiere que la referencia sea igual al valor de alimentacin Vcc. REFS1 REFS0 Descripcin 0 0 1 1 0 1 0 1 Aref, Vref interna OFF Avcc, Vref externa Reservado Interna de 1.1V con capacitor en pin Aref

Paso 3. Establecer la justificacin de resultado con el bit ADLAR (ADMUX). Si ADLAR = 0 (por defecto) realiza la justificacin a la derecha.(conversin de 10bits) 15 14 13 12 11 10 9 8 MSB(9) X 7 X 6 X 5 X 4 X 3 X 2 X 1 X LSB(0) 0 ADCH ADCL

Si ADLAR= 1, se realiza la justificacin a la izquierda (Para conversin de 8 bits) 15 MSB(7) X 7 14 X lsb 6 5 4 3 2 1 0 13 X 12 X 11 X 10 X 9 X 8 LSB(0) ADCH ADCL

Paso 4. Seleccionar el canal o canales de entrada del ADC con los bits MUX3:MUX0. Para este caso el canal 0, es mediante el valor MUX3:MUX0 = 0000. MUX3:MUX0 Descripcin MUX3:MUX0 Descripcin 0000 0001 0010 0011 0100 0101 0110 0111 ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 reservado reservado 1000 1001 1010 1011 1100 1101 1110 1111 reservado reservado reservado reservado reservado reservado 1.1V (VBG) 0V GND

Paso 5. Encender el mdulo del ADC al setear el bit ADEN del registro ADCSRA Paso 6. Iniciar la conversin seteando el bit ADSC en el registro ADCSRA Paso 7. Esperar a que termine la conversin. Cuando esto sucede, el flag ADIF se pondr a uno y si la conversin es normal y el bit ADSC se limpiar automticamente. Paso 8. Leer el resultado de la conversin del par de registros ADCH:ADCL. Para el caso de la prctica, solo se leer el registro ADCH en una variable tipo char, si se requiere de una lectura de 10bits, habr que justificar a la derecha y la variable receptora es de tipo int. Paso 9. Escribir el cdigo que a continuacin se presenta:
#include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> #include "lcd.h" #define setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit))) #define clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit))) void adc_setup(void); unsigned char adc_read(char channel); int main(void) { unsigned char n; // variable que recibira la lectura de 8 bits char buff[4]; //Buffer para lectura de ADC lcd_init(); adc_setup();

lcd_gotorc(1,5); lcd_puts("ADC0"); while(1) { n = adc_read(0); sprintf(buff,"%3d",n); //campo de numeros lcd_gotorc(2,1); lcd_puts("val: "); lcd_gotorc(2,5); lcd_puts(buff); } } void adc_setup(void) { //vref+ y Vref-: Vcc y GND //Justificacin: Izquierda (Para lectura de 8 bits) clearbit(ADMUX,REFS1); //Referencia a AVcc setbit(ADMUX,REFS0); setbit(ADMUX,ADLAR); // Reloj del ADC0: F_CPU/8 = 125kHz // Estado del convertidor: ON // Modo: Manual setbit(ADCSRA,ADEN); clearbit(ADCSRA,ADATE); //ADC habilitado //Modo manual (Normal) Prescalador reloj

} unsigned char adc_read(char channel) { ADMUX&=0xFF; ADMUX|=channel; _delay_us(10); //delay para estabilizar el voltaje de entrada del ADC setbit(ADCSRA,ADSC); //se inicia la conversion while(bit_is_clear(ADCSRA,ADIF)); return ADCH; } //Espera a que termine la conversion

clearbit(ADCSRA,ADPS2); //Seleccion del setbit(ADCSRA,ADPS1); // n = 8 setbit(ADCSRA,ADPS0);

S-ar putea să vă placă și