Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola a todos. Vereis estoy intentando comunicar el pic con el ordenador, usando una conexion RS232. Las conexiones electricas estan bien, porque el los leds a probar he probado otros programas y si van, y cuando pulso teclas el pic hace eco de ellas, asi que eso deberia estar bien. El problema viene cuando quiero que el pic haga algo en funcion de la tecla que pulso.
Este es el codigo del programa:
#include <16f876A> // pic a utilizar
#fuses HS, NOWDT, NOPROTECT, NOLVP // instrucciones
#use delay(clock=20000000) //XT de 20 MHz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // max232, TX es RC6, RX es RC7
#define leda PIN_A4
#define ledb PIN_B7
#use fast_io(B)
#use fast_io(C)
void main()
{
char tecla;
int a;
set_tris_a(0x1F);
set_tris_b(0x7F);
set_tris_c(0x80);
printf("Pulsa a para encender el LED Anr");
printf("Pulsa b para encender el LED Bnr");
printf("Pulsa p para que parpadeen los 2 LEDsnr");
output_high(leda);
output_low(ledb);
while(1)
{
tecla=getc();
putc(tecla); // eco de lo que recibe
switch(tecla)
{
case'a':
output_low(leda);
delay_ms(2000);
break;
case'b':
output_high(ledb);
delay_ms(2000);
break;
case'p':
for(a=0;a<5;a++)
{
output_low(leda);
output_high(ledb);
delay_ms(500);
output_high(leda);
output_low(ledb);
}
break;
}
}
}
Teoricamente, al pulsar la b, deberia encenderse 2 segundos el ledb y luego apagarse. Si la pulso, se queda encendido, y si pulso el reset vuelve a quedarse encendido... Si pulso la p, se queda encendido 2 segundos y pico, y se apaga. Y si pulso la a no hace nada...
¿Que puede estar pasando??
Un saludo y gracias. 🙂
No conozco ese compilador así que no me hagas mucho caso, pero unas cosillas.
Si pulsas B entra en su case lo pone a alto espera 2 segundos y se sale, es decir que lo tienes que volver a apagar tú. Prueba con esto
output_high(ledb);
delay_ms(2000);
output_low(ledb);
break;
Aunque con el reset debería volverse a apagar, a no ser que el registro de tecla conserve el valor de b, por lo que entraría directamente en el case del b, después de un reset, (aunque resetees el pic el registro conserva el último valor, si quitas la alimentación y esperas unos minutos ya veras como no pasa) prueba a inicializar el registro char tecla a 0 en su declaración.
Respecto a la A me parece que en ese puerto hay un adc, que por defecto va configurado como adc el puerto después del reset, puede que eso te este fallando, que no hayas tocado el addcon1 (creo que este es el registro) para configurar el puerto como digital. Y otra cosa en el trisa el a4 no está como 1? input 0x1f = 0001 1111 ? si vas a usarlo para encender un led debería ser 0 output.
Si pulsas la p se queda encendido 2.5 segundos por que hace 5 veces el bucle, es decir lo tienes 2.5 segundos encendido y x microsegundos apagado, no te da tiempo a verlo
for(a=0;a<5;a++)
{
output_low(leda);
output_high(ledb);
delay_ms(500);
output_high(leda);
output_low(ledb);
delay_ms(500);
}
break;
Añade ese delay a ver que pasa.
Una última cosa, a la hora de declarar variables cuando programas en un compilador de c para pic es preferible declarar todas como char, por aquello de los 8 bits frente a los 16 del int, espero no equivocarme, que tengo algo olvidado el c, corregidme. s2.
Bueno, he conseguido arreglar unas cosas. Lo del led A lo consegui encender, resulta que una via en la placa se habia roto, el caso es que no le llegaba corriente. El parpadeo tambien va bien, parpadean los 2 leds a la vez 5 veces, durante medio segundo, y luego se apagan
Pero el problema sigue siendo el que no se apagan los leds A y B (cuando pulso la a o la b). He puesto esto haber si conseguia algo pero que va:
while(1)
{
tecla=0;
tecla=getc();
putc(tecla);
output_high(leda);
output_low(ledb);
switch(tecla)
{
case'a':
output_low(leda);
delay_ms(2000);
tecla=0;
break;
........sigue el programa......
segun esto, teoricamente al pasar 2 segundos encendido el led, deberia poner tecla en 0, salir del case y volver al principio del while 1, donde apago los leds... ¿donde esta el fallo??
Saludos y gracias por contestar