Autor Tema: Ayuda Interrupción AVR  (Leído 3287 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alex_bm

  • PIC10
  • *
  • Mensajes: 3
Ayuda Interrupción AVR
« en: 15 de Febrero de 2012, 16:48:02 »
Wenas estoy empezando a programar un atmega8 y estoy con el ADC, e exo un programa para que se encienda un led u otro dependiendo de la tension que cae a la salida de un potenciometro.
El codigo es este:

#include <avr/io.h>
#include <avr/iom8.h>
#include <util/delay.h>
# define F_CPU 1000000UL

int main(void)
{

int adc;
DDRB=0xFF;//Activo toda la parte B como salida
ADMUX=(0<<ADLAR) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0) | (0<<REFS1) | (1<<REFS0);
ADCSRA=(1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
while(1)
{
ADCSRA=(1<<ADSC) | (1<<ADEN);

ADC=(ADCH<<8) | ADCL; //Primero desplazo la parte alta 8 bits para ponerlo en la parte alta de ADC

if((ADCSRA & (0<<ADSC))== 0)
{

if(ADC < 614) //Vin 3V
{
PORTB=(1<<PB0);
}

else if(ADC > 614)
{
PORTB=(1<<PB1);
}
}
_delay_ms(20);
}
}


Ahora estoy intentando hacer lo mismo pero con interrupciones pero no me funciona no entra dentro de la interrupcion, el codigo es este:

#include <avr/io.h>
#include <avr/iom8.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL

int main(void)
{

DDRB=0xFF;//Activo toda la parte B como salida
ADMUX=(0<<ADLAR) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0) | (0<<REFS1) | (1<<REFS0);
ADCSRA=(1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADIE);

sei();

while(1)
{
ADCSRA|=(1<<ADSC);
sei();
}
}

ISR(ADC_vect)
{
cli();
int adc;
adc=(ADCH<<8) | ADCL;

if(adc < 614) //Vin 3V
{
PORTB=(1<<PB0);
}

else if(adc > 614)
{
PORTB=(1<<PB1);
}
_delay_ms(20);

ADCSRA|=(1<<ADIE) | (1<<ADIF);
}

Haber si alguien sabe porque no solo me ejecuta una vez la interrupcion.
Muchas gracias por adelantado

Desconectado Lucho08

  • PIC10
  • *
  • Mensajes: 24
Re: Ayuda Interrupción AVR
« Respuesta #1 en: 16 de Febrero de 2012, 23:36:38 »
Hola alex_bm; la verdad que no entiendo bien cual es el problema que tienes
Citar
Haber si alguien sabe porque no solo me ejecuta una vez la interrupcion.
Bueno, viendo el programa donde intentas usar la interrupcion podemos hacerlo asi:

#include <avr/io.h>
#include <avr/iom8.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL

int main(void)
{

DDRB=0xFF;//Activo toda la parte B como salida
ADMUX=(0<<ADLAR) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0) | (0<<REFS1) | (1<<REFS0);
ADCSRA=(1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADIE);

sei();

while(1)
{
ADCSRA|=(1<<ADSC);
_delay_ms(20);


}
}

ISR(ADC_vect)//En la subrutina que atiende el vector de interrupcion debe ser lo mas corta posible.No se debe añadir temporizados.
{                   //Tampoco es necesario deshabilitar las interrupciones, aqui ya no se permite interrupcion, funciona si mal no recuerdo el Stack
int adc;
adc=ADC;

if(adc < 614)PORTB=(1<<PB0); //Vin Aproximadamente 2.5V---Esta parte es un resumen de lo que intentas hacer tu, pero te diré que si corres el
else  PORTB=(1<<PB1);//programa e incrementas el potenciometro, se prenderá un led primero y luego el led PB1, pero al bajar el potenciometro

}


Desconectado Lucho08

  • PIC10
  • *
  • Mensajes: 24
Re: Ayuda Interrupción AVR
« Respuesta #2 en: 16 de Febrero de 2012, 23:54:23 »
  //ya no se apagaran los led, para ello tendrias que darle otra instruccion para que se apaguen
}

Otra cosa:

Citar
ADC=(ADCH<< | ADCL; //Primero desplazo la parte alta 8 bits para ponerlo en la parte alta de ADC


Desconectado Lucho08

  • PIC10
  • *
  • Mensajes: 24
Re: Ayuda Interrupción AVR
« Respuesta #3 en: 17 de Febrero de 2012, 00:00:33 »
Ya no es necesario hacer esto, ya que has justificado a la derecha el resultado  con ADMUX = (0 << ADLAR), por lo tanto puedes usar directamente el registro
ADC cuya maxima resolucion sera  1024.
Disculpa el haberte escrito por partes, tuve problemas con la edicion

Saludos

Desconectado alex_bm

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda Interrupción AVR
« Respuesta #4 en: 17 de Febrero de 2012, 05:15:25 »
Funciona a las mil maravillas,  muchiimas gracias.
Supongo que no funcionaria xk hacia la inter. demasiado larga y lo del ADC no sabia que utilizaba directamente los 10bits.
Muchisimas graciass de nuevo, gracias