Estoy intentando que un Pic 16f628A se comunique con el Pc, he utilizado un max 232 para convertir la señal y un programa creado con visual basic 6 para enviar los datos.
He probado el circuito y el programa utilizando proteus y funciona perfecto, pero al armar el circuito el PIC no reaciona.
Hice puente entre los pines 2 y 3 del cable que utilizo y recibo lo mismo que transmito por lo tanto el programa envia correctamente y el cable esta perfecto. Tambien conecte los pines 11 y 12 del max 232 y nuevamente recibo lo mismo que envio, por lo tanto el max232 esta convirtiendo los niveles 232 a TTL correctamente. He revisado el circuito decenas de veces asi que no creo que sea algo mal conectado. Pense que podria ser el pic que estubiera dañado, pero probe con varios y siguen sin reaccionar, por lo tanto concluyo que el fallo esta en el programa, lamentablemente estoy empezando a programar en C (antes programaba en Basic) asi que no puedo estar seguro si el codigo esta bien.
Este es el codigo:
#include<16F628A.H>
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=20000000)
#use RS232 (baud=9600, bits=8, parity=N, xmit=PIN_B2, rcv=PIN_B1)
#use fast_io(A)
#use fast_io(B)
#priority timer1,rda
int Conexion='D';
unsigned long tick;
unsigned int NSERVO=0;
short FASE=1;
short RX_FLAG=0;
unsigned long CARGA_TMR1;
unsigned int RX_SERVO;
unsigned long RX_POSICION;
//VARIABLE DE CONTROL DE LA POSICION DE LOS SERVOS
unsigned long PSERVOS[]={10,90,80};
void config(void){
set_tris_a(0b10100000);
set_tris_b(0b00000010);
output_a(0x00);
output_b(0x00);
output_bit(PIN_B3,1);
setup_comparator(NC_NC_NC_NC);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(tick);
disable_interrupts(INT_TIMER1);
disable_interrupts(INT_RDA);
disable_interrupts(GLOBAL);
delay_ms(200);
}
#INT_TIMER1
void Interrupcion_timer1(void){
if(FASE==1){
bit_set(*5,NSERVO);
CARGA_TMR1 = 65536 -((PSERVOS[NSERVO] * 50) + 3000);
set_timer1(CARGA_TMR1);
FASE=0;
}else if(FASE==0){
bit_clear(*5,NSERVO);
CARGA_TMR1 = 65536 - 12500 + ((PSERVOS[NSERVO] * 50) + 3000);
FASE=1;
if(NSERVO>=2){ //SI LLEGA AL ULTIMO SERVO
CARGA_TMR1 = 65536 - 62500;
set_timer1(CARGA_TMR1);
NSERVO=0;
}else if(NSERVO<2){
NSERVO++;
}
}
}
#INT_RDA
void Interrupcion_recepcion(void){
disable_interrupts(INT_TIMER1);
if(kbhit()){
RX_SERVO=getc();
RX_POSICION=getc();
}
RX_FLAG=1;
set_timer1(get_timer1());
enable_interrupts(INT_TIMER1);
}
void main(void){
config();
Conexion=getc();
if(Conexion=='C'){
printf("---- Conexion Establecida ----\r\n");
output_bit(PIN_B0,1);
output_bit(PIN_B3,0);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RDA);
}
while(TRUE){
if(RX_FLAG==1 && NSERVO ==2){
PSERVOS[RX_SERVO]=RX_POSICION;
RX_FLAG=0;
enable_interrupts(INT_RDA);
}
};
}
Lo que deberia hacer el pic es iniciar -> encender el led en portb.3 y esperar a recibir por serie el caracter C, para informar que se establecio la comunicacion y empezar a controlar los servos.
He configurado el Comm 1 del pc para que funcione a 9600, he intentado enviar la 'C' como caracter, como hex (43) y como ASCII (67) pero el pic no hace nada, Tambien comprobe la configuracion del programa en basic y esta bien.
El circuito es asi:
y aqui les dejo los archivos en proteus:
http://www.mediafire.com/download.php?wqocdtetyd7bag4Cualquier consejo o ayuda es bienvenida, seguramente la falla debe ser una tonteria pero me tiene muy frustrado este circuito. Saludos y Gracias.