En el uso de microcontroladores es común realizar para diversas practicas en ingeniería el poder tomar datos del exterior y con ellos realizar operaciones para controlar diversos sistemas principalmente discretos debido a la tendencia actual hacia el uso de la tecnología.
Para este caso se hizo el uso del microcontrolador ATMEGA48
El siguiente programa realiza un muestreo del canal ADC0 y muestra el resultado en el puerto B el resultado de la conversión se ha justificado a la izquierda para una resolución de 8 bits los cuales son mas que suficientes para este ejemplo, ademas de usar las interrupciones INT0 e INT1 para cambiar el estado de dos leds que cambiaran de estado según la configuración que se le de a los bits de EICRA de nuestro microcontrolador, en este caso INT1 hará cambiar a PD5 de estado con cualquier cambio de estado e INT0 cambiara de estado a PD4 con un flanco de bajada.
El programa se subdividió en funciones para que hacerlo mas legible, ademas de que se añadieron las siguientes macros para una mejor comprensión del funcionamiento del código:
#define bitclear(sfr,bit)(_SFR_BYTE(sfr)&=~(_BV(bit)))
#define bitset(sfr, bit)(_SFR_BYTE(sfr) |= (_BV(bit)))
#define togglebit(sfr,bit)(_SFR_BYTE(sfr)^=(_BV(bit)))
A continuación se muestra el código y la simulacion en PROTEUS 7.7
Si tienen alguna duda con mucho les gusto responderé.
/*
* ADCandINTERRUPT.c
*
* Created: 28/09/2013 14:06:51
* Author: NEBURESS.KYLL
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define bitclear(sfr,bit)(_SFR_BYTE(sfr)&=~(_BV(bit)))
#define bitset(sfr, bit)(_SFR_BYTE(sfr) |= (_BV(bit)))
#define togglebit(sfr,bit)(_SFR_BYTE(sfr)^=(_BV(bit)))
ISR(INT0_vect){
togglebit(PORTD,PD4);
_delay_ms(300);
}
ISR(INT1_vect){
togglebit(PORTD,PD5);
_delay_ms(300);
}
//configuración de las interrupciones
void INTERRUPCIONES(){
//HABILITAR INTERRUPCIONES
bitset(EIMSK,INT0);
bitset(EIMSK,INT1);
//INT1 CUALQUIER CAMBIO LOGICO
bitclear(EICRA,ISC11);
bitset(EICRA,ISC10);
//INT0 FLANCO DE BAJADA
bitset(EICRA,ISC01);
bitclear(EICRA,ISC00);
//habilitación de interrupción general
sei();
}
//configuración del ADC
void iniADC(){
//VOLTAJE DE REFERENCIA AVCC
bitclear(ADMUX,REFS1);
bitset(ADMUX,REFS0);
//JUSTIFICACION A LA DERECHA
bitset(ADMUX,ADLAR);
//SELECCION DE CANAL
bitclear(ADMUX,MUX3);
bitclear(ADMUX,MUX2);
bitclear(ADMUX,MUX1);
bitclear(ADMUX,MUX0);
//PREESCALAMIENTO 128 F_CPU/128=f_cpuADC
bitset(ADCSRA,ADPS2);
bitset(ADCSRA,ADPS1);
bitset(ADCSRA,ADPS0);
//HABILITAR ADC
bitset(ADCSRA,ADEN);
}
//declaración de salidas
void salidas()
{
//SALIDA DEL ADC
bitset(DDRB,DDB0);
bitset(DDRB,DDB1);
bitset(DDRB,DDB2);
bitset(DDRB,DDB3);
bitset(DDRB,DDB4);
bitset(DDRB,DDB5);
bitset(DDRB,DDB6);
bitset(DDRB,DDB7);
//SALIDAS DE LAS INTERRUPCIONES
bitset(DDRD,DDD4);
bitset(DDRD,DDD5);
}
int main(void)
{
INTERRUPCIONES();
iniADC();
salidas();
while(1)
{
//TODO:: Please write your application code
bitset(ADCSRA,ADSC);
while((ADCSRA&&(1<<ADIF))==0){}
PORTB=ADCH;
}
}

No hay comentarios:
Publicar un comentario