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
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: