Micro 18f4550, compilador ccs, Aquí adjunto el codigo, es super importante poder arreglarlo!
El problema es que el primer bucle, el do, funciona perfectamente, hace una interrupción, y vuelve al bucle, pero cuando pulso reset, el do este se queda parado, y no hace nada, no actualiza la Bandera 1, la 2 ni la 3, ni tampoco el conteo de ejes. O sea el do se para, cuando pulsas una interrupción la hace, pero da todo zeros porque el do del principio no funciona, necesito ayuda super urgente. Cuando le das reset todo va fatal
.
#include <18F4550.h> //Declaración de librería del pic que estamos usando.
#use delay(clock=20000000)//Frecuencia en la que trabaja
#use standard_io(b)
#bit Verde1=0XF83.0
#bit Rojo1=0XF83.1
#bit Verde2=0XF83.2
#bit Rojo2=0XF83.3
#bit Sensor1=0XF81.0
#bit Sensor2=0XF81.1
#bit Sensor3=0XF81.2
#byte port_a=0XF80
#byte port_b=0XF81 // Este te dice que el nombre port_b es la dirección, así escribiendo port_b ya accedes a el.
#byte port_c=0XF82
#byte port_d=0XF83 // Declaración port d como antes.
#byte port_e=0XF84
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)// Comunicacion serial
#fuses HSPLL, MCLR,NOWDT,PROTECT,NOLVP,PUT,BROWNOUT, NOVREGEN // Opciones de configuración
#byte tris_a=0XF92
#byte tris_b=0XF93
#byte tris_c=0XF94
#byte tris_d=0XF95
char estado_sensores;//La combinación de los sensores activos nos da un caracter el cual se usa como identificación.
char Comando; //Es la tecla pulsada en concreto, depende de la tecla pulsada enviará información o activara otra cosa.
char Bandera1='0';
char Bandera2='0';
char Bandera3='0';
char Contador_eje1char='0';
char Contador_eje3char='0';
char po=' ';
int Contador_eje1=0;
int Contador_eje3=0;
int Est_act1=0;
int Est_ant1=0;
int Est_act2=0;
int Est_ant2=0;
int salir=0;
void main(){//Programa principal
tris_a=0XFF; //Declaramos los puertos como entrada o salida, 0 salida, 1 entrada.
tris_b=0XFF;
tris_c=0X80;
tris_d=0X00;
port_a=0X00;
port_b=0X00;
port_c=0X00;
port_d=0X00;
port_e=0X00;
printf("\r\n\Eperando ordenes (Int)\r\n");
do{
Est_ant1=Est_act1;
Est_act1=input(PIN_B0);
if(input(PIN_B0)&&(Est_ant1!=Est_act1)){
Bandera1='1';
Contador_eje1=Contador_eje1+1;
printf("\r\n\Eperando ordenes (Int)\r\n");
if(Contador_eje1==0){
Contador_eje1char='0';
}
else if(Contador_eje1==1){
Contador_eje1char='1';
}
else if(Contador_eje1==2){
Contador_eje1char='2';
}
else if(Contador_eje1==3){
Contador_eje1char='3';
}
else if(Contador_eje1==4){
Contador_eje1char='4';
}
else if(Contador_eje1==5){
Contador_eje1char='5';
}
else if(Contador_eje1==6){
Contador_eje1char='6';
}
else if(Contador_eje1==7){
Contador_eje1char='7';
}
else if(Contador_eje1==8){
Contador_eje1char='8';
}
else if(Contador_eje1==9){
Contador_eje1char='9';
}
}
if(input(PIN_B1)){
Bandera2='1';
}
Est_ant2=Est_act2;
Est_act2=input(PIN_B2);
if(input(PIN_B2)&&(Est_ant2!=Est_act2)){
Bandera3='1';
Contador_eje3=Contador_eje3+1;
if (Contador_eje3==0){
Contador_eje3char='0';
}
else if(Contador_eje3==1){
Contador_eje3char='1';
}
else if(Contador_eje3==2){
Contador_eje3char='2';
}
else if(Contador_eje3==3){
Contador_eje3char='3';
}
else if(Contador_eje3==4){
Contador_eje3char='4';
}
else if(Contador_eje3==5){
Contador_eje3char='5';
}
else if(Contador_eje3==6){
Contador_eje3char='6';
}
else if(Contador_eje3==7){
Contador_eje3char='7';
}
else if(Contador_eje3==8){
Contador_eje3char='8';
}
else if(Contador_eje3==9){
Contador_eje3char='9';
}
}
if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)){
estado_sensores='0';
}
else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)){
estado_sensores='1';
}
else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)){
estado_sensores='2';
}
else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)){
estado_sensores='3';
}
else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)){
estado_sensores='4';
}
else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)){
estado_sensores='5';
}
else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)){
estado_sensores='6';
}
else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)){
estado_sensores='7';
}
enable_interrupts(GLOBAL);//habilito interrupción global
enable_interrupts(int_rda); //habilito interrupción interna
}
while(true);
}
#int_rda
void serial_isr() {
while(kbhit()){//Esto espera a que se introduzca un caracter para hacer la interrupción.
Comando=getchar();// El caracter ecrito se guarda en la variable comando.
switch(Comando){
case 'z':
putc(estado_sensores);
break;
case 'a':
putc(Bandera1);
putc(po);
putc(Bandera2);
putc(po);
putc(Bandera3);
putc(po);
putc(Contador_eje1char);
putc(po);
putc(Contador_eje3char);
putc(po);
putc(po);
putc(po);
printf("\r\n\Miau (Int)\r\n");
break;
case 'b':
verde1=1;
break;
case 'c':
verde1=0;
break;
case 'd':
rojo1=1;
break;
case 'e':
rojo1=0;
break;
case 'f':
verde2=1;
break;
case 'g':
verde2=0;
break;
case 'h':
rojo2=1;
break;
case 'i':
rojo2=0;
break;
case 'j':
Bandera1='0';
break;
case 'k':
Bandera2='0';
break;
case 'l':
Bandera3='0';
break;
case 'm':
Contador_eje1char='0';
break;
case 'n':
Contador_eje3char='0';
break;
case 'o':
while(salir==0){
verde1=0;
verde2=0;
rojo1=0;
rojo2=0;
delay_ms(500); //Espero 500ms.
rojo1=1;
rojo2=1;
delay_ms(500); //Espero 500ms.
Comando=getchar();
if(comando=='p'){salir=1;}
}
rojo1=0;
rojo2=0;
salir=0;
break;
}
}
}