Problema con 16F627A y RS232

Buenos dias a todos. Estoy programando un PIC16F627 con CCS C y tengo un ligero problema. El pic controla una fuente y si se pulsa un boton durante mas de 2 se enciende o se apaga la fuente, el caso es que tambien quiero apagarla si se recive una trama concreta, en este caso, por poner una es "@1234567@". El caso es que he simulado el circuito en ISIS Proteus funciona perfectamente, pero la programo y no funciona, si le pongo que cuando lea porejemplo un '2' se apague si que lo hace, pero como meta mas caracteres no. He comprobado que los datos realmente llegan al pic ya que lo he medido con un osciloscopio. Y ando algo desquiciado con esto y seguramente sea una pijada.Si me pueden echar una mano se lo agradeceria un saludo y gracias por leerme.


Dejo aqui el codigo

Código:
///////////////////////////
// CABECERA
///////////////////////////
#include "16f627A.h"
#FUSES   XT
#FUSES   NOWDT                    //No perro guardian
#FUSES   INTRC_IO                 //Internal RC Osc
#FUSES   NOPUT                    //No Power Up Timer
#FUSES   PROTECT                  //Proteger el codigo ante lecturas
#FUSES   BROWNOUT                 //Reset when brownout detected
#FUSES   NOMCLR                   //No usar MasterClear
#FUSES   NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES   NOCPD                    //No EE protection

#use delay(clock=4000000)
#use standard_io(b)
                              //xmit transmisor       rcv receptor
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)
#include <stdlib.h>

///////////////////////////
// VARIABLES GLOBALES
///////////////////////////
int boton=0;
int seg=0;
int TDOon=0;
int TDOoff=0;
int control=0;

int recivir=0;
char c;
int8 i=0;
char comando[10];
char comando2[10]="@1234567@";

void buffer (void);
///////////////////////////
// INTERRUPCIONES
///////////////////////////
#INT_RDA                   //Interrupcion para leer datos en los pines B1RX y B2TX
void leer(void){
   c=0x00;
   if(kbhit()){                                
      c=fgetc();
      buffer();
   }
}

#INT_RTCC            //asociado al TIMER 0 
void tiempo(void){   
   static int cont=12;   
   set_timer0(0);
   cont--;
   if (cont==0){       
      seg++;
      cont=12;}
}

void buffer (void){
      if(c=='@' || recivir==1){
         comando[i]=c;
         recivir=1;
            if(comando[8]=='@') i++;
            else i=0;
            if(comando[7]=='7') i++;
            else i=0;
            if(comando[6]=='6') i++;
            else i=0;
            if(comando[5]=='5') i++;
            else i=0;
            if(comando[4]=='4') i++;
            else i=0;
            if(comando[3]=='3') i++;
            else i=0;
            if(comando[2]=='2') i++;
            else i=0;
            if(comando[1]=='1') i++;
            else i=0;
            if(comando[0]=='@') i++;
            else i=0;
            if(i>=9) {
               recivir=0;
               i=0;}
       }
       if(!strcmp(comando,comando2)){         //comprobar si la trama que llega es buena
         strcpy(comando,"         ");
         output_high(PIN_B4);
         control=1;}
}


///////////////////////////
// PROGRAMA PRINCIPAL
///////////////////////////
void main (void){
   enable_interrupts(INT_RDA);                     //habilitar la interrupcion RDA
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);    //configurar TIMR0
   enable_interrupts(GLOBAL);                      //habilitar interrupciones globales
   output_low(PIN_B4);                             //encender 
   disable_interrupts(INT_RTCC);
   while(1){
         if(!input(PIN_B0)){                          //si esta pulsado el BOTON S1
            do{                                       //entramos en un bucle
               if(boton==0){                          //si boton esta a 0
                  enable_interrupts(INT_RTCC);        //habiltiamos el contador
                  seg=0;
                  boton=1;                            //se pone boton a 1
               }
               if(seg>=2){                            //si se ha pulsado mas de 2 segundos
                  disable_interrupts(INT_RTCC);       //se desabilita el contador       
                  if(TDOoff==1){                      //si esta apagado
                     output_low(PIN_B4);              //se enciende
                     control=0;
                     }                                //encender
                  if(TDOon==1){                       //si esta encendido
                     output_high(PIN_B4);             //se apaga
                     control=1;
                     }
               }
            }while(!input(PIN_B0));                   //si se deja de pulsar se sale del bucle
         }
         boton=0;
         if(control==1){                        //apagado
            TDOon=0;
            TDOoff=1;}
         if(control==0){                        //encendido
            TDOon=1;
            TDOoff=0;}
   }
}
 
Última edición por un moderador:
Atrás
Arriba