A continuación se hará mención del uso de una parte importante de los micro controladores, y es el uso de los timers, en este caso del timer0 en modo CTC.
La razón de presentar este ejemplo es por su gran utilidad al realizar operaciones debido a que hace uso de la interrupción de comparación con el registro OCR0A con lo cual el código dentro de la interrupción se ejecuta independientemente del resto.
EXPLICACIÓN:
El código realiza una interrupción cada 1 mili segundo y realiza la operación de cambiar el estado lógico de la salida PB0, que en este caso es un led que conmuta su estado cada vez que se genera la interrupción.
Al finalizar agregare el link para que puedan descargar la simulación y el programa
/*
* TIMER_0.c
*
* Created: 22/09/2013 11:57:06
* Author: NEBURESS.KYLL
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define clearbit(sfr,bit)(_SFR_BYTE(sfr)&=~(_BV(bit)))
#define setbit(sfr, bit)(_SFR_BYTE(sfr) |= (_BV(bit)))
#define togglebit(sfr,bit)(_SFR_BYTE(sfr)^=(_BV(bit)))
ISR(TIMER0_COMPA_vect){
//Se ejecuta cada 1ms
togglebit(PORTB,PB0);
}
void TEMPORIZADOR(){
//PREESCALER DEL TIMER0 A 64
clearbit(TCCR0B,CS02);
setbit(TCCR0B,CS01);
setbit(TCCR0B,CS00);
//DESCONECTAR OC0A
clearbit(TCCR0A,COM0A1);
clearbit(TCCR0A,COM0A0);
//MODO CTC
clearbit(TCCR0B,WGM02);
setbit(TCCR0A,WGM01);
clearbit(TCCR0A,WGM00);
OCR0A=124;
}
//habilitación de la interrupción por coincidencia
void INTERRUPCION(){
setbit(TIMSK0,OCIE0A);
sei();
}
int main(void)
{
TEMPORIZADOR();
INTERRUPCION();
setbit(DDRB,DDB0);
setbit(PORTB,PB0);
while(1)
{
//TODO:: Please write your application code
}
}
LINK
https://mega.co.nz/#!818nmTRC!dfNNvToziWGWHdZaeFjG4AhruecWmCZxs2PDdyVcDDQ
Programas realizados en microcontroladores AVR, donde se muestran aplicaciones sencillas de microcontroladores y softwares como MATLAB, LABVIEW entre otros.
miércoles, 30 de octubre de 2013
TIMER0
Etiquetas:
funciones,
interrupciones,
timer
Ubicación:
México
ADC E INTERRUPCIONES
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;
}
}

Etiquetas:
ADC,
funciones,
interrupciones
Ubicación:
México
Suscribirse a:
Entradas (Atom)
