Autor Tema: interrupciones externas PCINTXX  (Leído 2360 veces)

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

Desconectado criscumlig

  • PIC10
  • *
  • Mensajes: 3
interrupciones externas PCINTXX
« en: 28 de Octubre de 2010, 19:53:34 »
Que tal gente...
Espero que alguien pueda ayudarme..
estoy trabajando con el atmega48 y en el proyecto queestoy desarrollando necesito de mas de 2 interrupciones externas, y estoy empezando a estudiar las interrupciones de pc (pcint0..23), el problema es que con lo que he desarrollado no he podido nanejar y configurar estas interrucciones
de manera que funcionen bien,
sialguien sabe como configurar estas interrupciones agradeceria si me hechan una mano..
gracias de antemano//

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: interrupciones externas PCINTXX
« Respuesta #1 en: 29 de Octubre de 2010, 20:40:45 »
Esto tal vez te sirva, es un contador de RPM que hice yo para un Atmega48, mezcla de cosas que lei en internet mas otras que aprendí y agregué, no está optimizado pero usa la interrupción y funciona. Es básico, pero una vez que entiendas el concepto es lo mismo para cualquier interrupción. Una interrup es como llamar una subrutina, entras y tenes que salir lo antes posible para no tener problema de atomicidad.

Código: [Seleccionar]
#include <avr/io.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd_lib.h"

#define RPM 60000000u
#define ICP PINB0

//timer overflow counter
uint8_t ovs=0;
uint32_t T;
uint16_t PreviousTime, CurrentTime;
uint8_t buffer[15];
uint8_t calculate=0;

//timer1 input capture interrupt service routine
ISR(TIMER1_CAPT_vect)
{
if(calculate==0)
{
TCNT1=0;
calculate=1;
}
else if (calculate==1)
{
//Saving current timer value on falling edge
CurrentTime=ICR1;
calculate=2;
}
else if(calculate==2)
{
T=(uint32_t)CurrentTime;
//form string with RPM value
sprintf(buffer,"RPM: %06lu",RPM/T);
//output to LCD
LCDGotoXY(0,0);
LCDstring(buffer, 15);
calculate=0;
}
}


int main(void)
{
LCDinit();//init LCD 8 bit, dual line, cursor right
LCDclr();//clears LCD
LCDhome();//cursonr home
LCDstring("Count RPM", 9);

PORTB |= (1<<ICP);//pullup enable
DDRB &=~ (1<<ICP);//ICR1 as input

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x02; //prescaller en 8 + modo contador en "normal"
TCNT1H=0x00;
TCNT1L=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x20; //ICP Input Capture Interrupt enable

// Enable interrupts
sei();

while(1)//loop 
{
//_delay_ms(5);
}
return 0;
}
Julio - Argentina


 

anything