Está en la página 1de 2

/*

* problema3.c
*
* Created: 21/11/2016 05:06:58 p.m.
* Author: L. J.
*/

#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t flanco; //selecciona el flanco, 0 para bajada y 1 para subida
volatile uint8_t busy; // ya fue activado el bit de inicio
volatile uint8_t i;// contador de posicion del byte de salida
volatile uint8_t byte;//byte de salida
int main(void)
{
DDRB=0x00;//puerto B como entrada
DDRD=0xFF;//puerto D como salida
TCCR1A=0;//modo normal
TCCR1B=1;//sin cancelador de ruido, modo normal,flanco de bajada, sin pr
eescalador
TCCR1C=0;//Sin forzar eventos
TIMSK1=0x20;//interrupcion por captura de entrada
flanco=0;
busy=0;
i=0;
sei();
while(1)
{
asm("NOP");
}
}
ISR(TIMER1_CAPT_vect){
int time; //se crea una variable temporal
if (flanco)
{
time=ICR1;
if (busy)
{
if (time<999) //menor a 1 ms, 0 logico
{
i++;
}
if (time>999 && time<1999) //1 logico
{
byte=byte|(1<<i);
i++;
}
if (i==8)
{
i=0;
busy=0;
PORTD=byte;
}
}
else
{
if (time>1999) //es mayor a 2ms, se detecta bit
de inicio
{
busy=1;
}
}
flanco=0; //se espera flanco de bajada en el proximo evento
TCCR1B=TCCR1B&(~(1<<ICES1)); //se configura flanco de bajada;
}
else
{
TCNT1=0;//RESETEA EL TIMER TRAS UN FLANCO DE BAJADA, LO PREPARA
PARA CONTAR
flanco=1;//SE ESPERARA UN FLANCO DE SUBIDA EN EL PROXIMO EVENTO
TCCR1B=TCCR1B|(1<<ICES1); //SE CONFIGURA FLANCO DE SUBIDA
}
}

También podría gustarte