Saludos , Recientemente estoy realizando un proyecto que implica interrupciones de teclas digitales , y ademas de eso leer varios potenciometros usando interrupciones, El micro con el que estoy realizando esto es el pic18f4550 y me gustaria saber si alguien tiene un ejemplo.
Dejo mi configuracion que actualmente no funciona.
#include <p18f4550.h>
#include <delays.h>
#include <adc.h>
#include <usart.h>
#include <stdlib.h>
#include <stdio.h>
//Librerias Propias ver includes.txt
#include "alcd.h" //LIBRERIA LCD MODIFICADA
#include "fuses.h" //FUSES DEFINITIONS
#include "config.h" //PORTS, TRIS AND OTHER FLAVORS.
#include "interrupts.h" //INTERRUPCIONES
char k ;
void main(void)
{
InitPorts(); //Configura Dispositivos Micro {USART,TRIS,ADC,PWM}
ADCON0bits.ADON=1; //HABILITO EL CONVERTIDOR
while(1){
blinker(); // STATUS DEL MICRO
}
}
//******************************************
//HIGH INTERRUPTS
#pragma code high_vector=0x008 //HIGH PRIORITY
void high_interrupt (void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr (void)
{
int x=0;
x=PORTB&0b00001110; //Filtra Cambio en teclas, Maskara
//INTERRUPCION INT0 DE TECLAS DIGITALES
if (INTCONbits.INT0IF==1)
{
switch (x)
{
case 2:
Activate();
break;
case 4:
Desactivate();
break; }
INTCONbits.INT0IF=0;}
/**ESTA PARTE NO FUNCIONA ,ADIF SE PONE EN UNO CUANDO UN POTENCIOMETRO PRESENTA UN CAMBIO**/
if (PIR1bits.ADIF==1)
{ PIR1bits.ADIF=0; //LIMPIA LA BANDERA DE INTERRUPCION POR ADC
ADCON0=0x01; //SELECIONA CANAL AN0
ADCON0bits.GO=1; //INICIA CONVERSION
if(ADCON0bits.NOT_DONE); //ESPERA A TERMINAR
WriteCmdXLCD(0x01);
}
}
#pragma code
Lo que deseo realizar es simple tener dos botones uno para activar y otro para desactivar como interrupciones que ya funciona, lo otro es que cuando la bandera por interrupcion del adc se ponga en uno lea el dato analogo , lo guarde en una variable y lo envie por la usart, pero haciendo debuging cuando activo el potenciometro nunca se pone en 1 el ADIF.
Esta es la configuracion que estoy usando para configurar las interrupciones .
TRISA=0XFF;
INTCON =0b11010000; //INTERRUPCION GLOBAL =1, INTERRUPCION PERIFERICOS=1,INTERRUPCION TIMER=0, INTERRUPCION EXTERNA =1,INT PUERTOB =0,TIMER=0,INTERRUPCION FLAG=0,
INTCON2=0b11110000; //PULL UPS DIS=1,
INTCON3=0b00000000; //INDICA SI HUBO ALGUNA DE LAS INTERRUPCIONES.
INTCONbits.GIEH=1; //ENABLE HIGH INTERRUPT
PIR1=0b00000000;
PIR2=0b00000000;
PIE1=0b01000000;
PIE2=0b00000000;
IPR1=0b01000000;
IPR2=0b00000000;
RCONbits.IPEN=1;
Agradeceria que alguien me pudiera pasar algo de documentacion del adc como interrupcion, o algun ejemplo.