el encoder por si solo ya me jala en fisico pero resulta que es solo una parte de un proyecto mas grande y ya dentro del codigo no me funciona la interrupcion espero puedan aportarme ideas para poder hacer que funcione por completo mi proyecto gracias
codigo completo///
#include <18F4550.h>
#fuses INTHS,NOPBADEN
#use delay(internal=16Mhz)
#include <lcdd.c>
#BYTE TRISA=0xF92
#BYTE PORTA=0xF80
#BYTE TRISB=0xF93
#BYTE PORTB=0xF81
#BYTE TRISC=0xF94
#BYTE PORTC=0xF82
#BYTE TRISD=0xF95
#BYTE PORTD=0xF83
int16 x=0;
int i;
int16 amper;
float amper3;
float amper4;
float amper1;
float amper2;
int16 q;
int flag2=0;
int flag1=0;
#Int_Ext // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0()
{
// CCS se encarga de desactiva automáticamente cualquier interrupción.
// No hace falta guardar contextos de registros.
If (Bit_Test(PortB, 0)) // Si RB0 se ha puesto a 1 (flanco de subida),
{
x++;
output_high(pin_c7);
}
}
Void nada ();
void enrollar();
void desenrollar();
void cero();
void veinticinco();
void mitad();
void setentaycinco();
void cien();
void corriente();
void main(){
Port_B_Pullups(FALSE);
Ext_Int_Edge(0,L_TO_H); // Inicialmente detectar interrupción por flanco de subida.
Enable_Interrupts(Int_Ext); // Activar Interrupción Externa por RB0/INT.
Enable_Interrupts(GLOBAL);
setup_adc_ports(all_analog);
setup_adc(ADC_CLOCK_INTERNAL);
//setup_ccp1(CCP_PWM);
//setup_timer_2(T2_DIV_BY_1, 127, 1); //Frecuencia de 15.62KHz
//set_pwm1_duty(500);
amper1=0.0;
amper2=0.0;
amper3=0.0;
amper4=0.0;
lcd_init();
while(true)
{
set_adc_channel(0);
delay_us(20);
q = read_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"\ %Lu",q);
lcd_gotoxy(10,2);
printf(lcd_putc,"%Lu",x );
if(q>200)
cero();
if((q>150)&&(q<200))
veinticinco();
if((q>151)&&(q<100))
mitad();
if((q>50)&&(q<99))
setentaycinco();
if ((q>49)&&(q<98))
cien();
}
}
void cero(){
lcd_gotoxy(10,1);
printf(lcd_putc," ");
lcd_gotoxy(10,1);
printf(lcd_putc,"0");
if (x>0)
enrollar();
}
void veinticinco(){
lcd_gotoxy(10,1);
printf(lcd_putc,"25");
if (x>25)
{ enrollar();
}
if(x==25)
{
nada ();
}
if(x<25)
{
desenrollar();
}
}
void mitad(){
lcd_gotoxy(10,1);
printf(lcd_putc,"50");
IF (x>50)
{enrollar();
}
if(x==50)
{
nada ();
}
if (x<50)
{
desenrollar();
}
}
void setentaycinco()
{
lcd_gotoxy(10,1);
printf(lcd_putc,"75");
IF (x>75)
{enrollar();
}
IF (x>50)
{enrollar();
}
if(x==75)
{ nada ();
}
if (x<75)
{desenrollar(); }
}
void cien ()
{
lcd_gotoxy(10,1);
printf(lcd_putc,"100");
IF (x>100)
{ enrollar();
}
if(x==100)
{ nada ();
}
if (x<100)
{desenrollar();
}
}
Void enrollar ()
{
//corriente();
lcd_gotoxy(12,1);
printf(lcd_putc,"EN");
delay_ms(500);
output_low(PIN_C4);
delay_ms(500);
output_high(PIN_C5);
IntRB0();
x--;
}
Void desenrollar ()
{
// corriente();
lcd_gotoxy(12,1);
printf(lcd_putc,"DE");
delay_ms(500);
output_low(PIN_C5);
delay_ms(500);
output_high(PIN_C4);
x++;
}
Void nada ()
{ lcd_gotoxy(12,1);
printf(lcd_putc,"na");
output_low(PIN_C5);
output_low(PIN_C4);
flag1=0;
flag2=0;
}
void corriente()
{
set_adc_channel(1);
delay_us(20);
amper3=0;
amper4=0;
for(i=0;i<=50;i++)
{
amper = read_adc();
amper3=amper3+amper;
amper4=amper3/51;
}
set_adc_channel(0);
delay_us(20);
//amper = read_adc();
amper1 = (1.0*amper4)/200;
amper2=(amper1*1.0)+(amper1*0.130);
//lcd_gotoxy(10,1);
// printf(lcd_putc,"\ %Lu ", amper);
lcd_gotoxy(1,2);
printf(lcd_putc,"\%04.4fjj", amper2);
}