






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Codigo ADC para atmega, la implementacion se debe hacer en el programa de ardunio debido a que se usa la libreria seria, de otra forma toca programar el UART que trae el atmega328p
Tipo: Apuntes
1 / 10
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







1 Código: // Iniciar variables boolean toggle = false; // Use la variable toggle como testigo de la acción de la interrupción. void cambiarEstadoLED(); int main(){ DDRB|=(1<<5); //DEFINICION DE PIN DE SALIDA // Programación de la interrupción por temporizador 0 a una tasa de 250 Hz. SREG = 0;// 1. Deshabilite todas las interrupciones. Ver registro de estado (Status Register, SREG). TCCR0A = 0;// 2. Inicie los registros de control del temporizador 0 (TCCR0A y B) en 0. TCCR0B = 0; TCCR0B|= ((1<<2)|(1<<0)|(0<<1));// Habilitar en 1 3. Programe los bits para pre-escalización del reloj (CS00,1 y 2) de este registro. TCCR0A|=(1<<1)|(0<<0);// preescalizacion de 1024 // 4. Programe los bits de modo generación de forma de onda del temporizador 0 (WGM00, 1 y 2) en el modo borrar temporizador al comparar (CTC), ver Table 19-9. TCNT0= 0;// 5. Inicie el registro de conteo del temporizador 0 (TCNT0) en 0.
OCR0A= 60;// 6. Inicie el registro de conteo de salida del temporizador 0 (OCR0A) en el valor apropiado para obtener la frecuencia de 250 Hz. TIMSK0= (1<<1);// 7. Habilite el bit apropiado de la máscara de interrupción del temporizador 0 (TIMSK0) al alcanzar el valor del registro de conteo de salida OCR0A. SREG = (1<<7);// 8. Habilite todas las interrupciones. while(1){ } } // Bucle principal void loop(){ // El procesador queda libre. } // Función testigo de la interrupción. void cambiarEstadoLED(void) void cambiarEstadoLED() { toggle = !toggle; // Cambia de estado la variable toggle cada vez que se produce una interrupción if(toggle){ PORTB |= (1 << 5);// PRENDER LED }else{ PORTB &= ~(1 << 5); // APAGAR LED } // Función de atención a la interrupción. ISR(TIMER0_COMPA_vect) } ISR(TIMER0_COMPA_vect){// interrupcion cambiarEstadoLED(); }
// Iniciar variables void cambiarEstadoLED(); boolean toggle = false; // Use la variable toggle como testigo de la acción de la interrupción. volatile boolean readFlag=false; // Almacenamiento de la conversión volatile int analogVal; // Iniciación int main(){ SREG = 0;// 1. Deshabilite todas las interrupciones. ADCSRA=0;// 2. Programe el reloj del conversor A/D (preescalización en el ADCPSR) a la máxima tasa posible, ADMUX=0; ADCSRA|= (1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); //Sección 28.4. ADMUX|= (0<<REFS1)|(1<<REFS0)|(0<<ADLAR); // 3. Programe la referencia del conversor A/D (ADMUX) hacia AVCC. // 4. Programe el multiplexor de entrada (registro ADMUX) hacia ADC0. // 5. Programe el registro de datos del conversor A/D de modo que los 8 dígitos binarios menos // significativos (LSB) queden en ADCL y los 2 más significativos (MSB) en ADCH. ADCSRB=0;// 6. Programe el modo de inicio de la conversión en modo libre (free running) (registro ADCSRB). ADCSRA|=(1<<ADEN)|(0<<ADSC)|(1<<ADATE)|(1<<ADIE);// 7. Habilite e inicie la conversión A/D en modo libre (bits ADEN, ADSC y ADATE en ADCSRA) // 8. Habilite la interrupción del conversor A/D (bit ADIE del registro ADCSRA)
SREG|= (1<<7);// 9. Habilite todas las interrupciones. ADCSRA|=(1<<ADSC);// 10. Inicie la conversión A/D en modo libre (bit ADSC en ADCSRA) //11. Iniciar la bandera de conversión lista. readFlag = false; // Iniciar salida digital. DDRB|=(1<<5); //DEFINICION DE PIN DE SALIDA while(1){ // Leer el dato. if (readFlag) { readFlag=false; cambiarEstadoLED(); /* Medir el tiempo entre cambios de estados "toggles" */ } } } void cambiarEstadoLED(){ toggle = !toggle; // Cambia de estado la variable toggle cada vez que se produce una interrupción if(toggle){ PORTB |= (1 << 5);// PRENDER LED }else{ PORTB &= ~(1 << 5); // APAGAR LED } // Función de atención a la interrupción. ISR(TIMER0_COMPA_vect) } ISR(ADC_vect){
// Programar el microcontrolador para que se haga conversión a una tasa fija de 250 Hz // Iniciar variables. volatile boolean readFlag=false; void configurAR_TIMER(); void configurar_adc(); void enviardato(); // Valor leído volatile int analogVal; void setup(){ SREG=0;// 1. Suspender interrupciones. configurAR_TIMER();// 2. Programar temporizador 0 para producir interrupciones a la tasa de muestreo de 250 Hz. configurar_adc();// 3. Programar conversor A/D para convertir a la máxima velocidad de reloj, pero empleando el //temporizador 0 como fuente de disparo (Timer/Counter0 Compare Match A). // 4. Configurar puerto serial para recibir datos a la tasa de muestreo. Serial.begin(9600); /velocidad maxima para que no interfiera con otros procesos/ while (!Serial) { ; // Esperar a que el puerto inicie } SREG=(1<<7); } void loop(){ // Se lee dato y envía hacia el puerto serial. if (readFlag) { readFlag=false;
enviardato(); } } void enviardato(){ Serial.println(analogVal); //Serial.print(" "); } void configurAR_TIMER(){ TCCR0A = 0;// 2. Inicie los registros de control del temporizador 0 (TCCR0A y B) en 0. TCCR0B = 0; TCCR0B|= ((1<<2)|(1<<0)|(0<<1));// Habilitar en 1 3. Programe los bits para pre-escalización del reloj (CS00,1 y 2) de este registro. TCCR0A|=(1<<1)|(0<<0);// preescalizacion de 1024 // 4. Programe los bits de modo generación de forma de onda del temporizador 0 (WGM00, 1 y 2) en el modo borrar temporizador al comparar (CTC), ver Table 19-9. TCNT0= 0;// 5. Inicie el registro de conteo del temporizador 0 (TCNT0) en 0. OCR0A= 60;// 6. Inicie el registro de conteo de salida del temporizador 0 (OCR0A) en el valor apropiado para obtener la frecuencia de 250 Hz. TIMSK0= (1<<1);// 7. Habilite el bit apropiado de la máscara de interrupción del temporizador 0 (TIMSK0) al alcanzar el valor del registro de conteo de salida OCR0A. } void configurar_adc(){ ADCSRA=0;// 2. Programe el reloj del conversor A/D (preescalización en el ADCPSR) a la máxima tasa posible, ADMUX=0; ADCSRB=0; ADCSRA|= (1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); //Sección 28.4.
Imagen 4. Código 3