Hola
Pues ahora me encuentro realizando un programa para realizar ciertas secuencias con unos leds. Basicamente lo que quiero es que al mandar un caracter con visual basic por el puerto serie pues se ejecute una secuencia y si oprimo otro botón que este envie otro caracter para realizar una secuencia diferente. El programa de c es el siguiente:
Codigo:
#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
char opcion;
izq()
{
do
{
output_b(5);
delay_ms(1000);
output_b(9);
delay_ms(1000);
output_b(10);
delay_ms(1000);
output_b(6);
delay_ms(1000);
}
while (opcion=="1");
}
der()
{
do
{
output_b(6);
delay_ms(1000);
output_b(10);
delay_ms(1000);
output_b(9);
delay_ms(1000);
output_b(5);
delay_ms(1000);
}
while (opcion=="2");
}
detener()
{
do
{
while(!kbhit());
opcion=getc();
}
while (opcion<"1"||opcion>"3");
}
main()
{
set_tris_b(0x00);
while (TRUE)
{
detener();
switch (opcion)
{
case "1":
izq();
break;
case "2":
der();
break;
case "3":
detener();
break;
}
}
}
La verdad no se si haya alguna forma de que cuando yo envíe un caracter diferente pues me saque del ciclo, de antemano gracias por la ayuda.
Se puede hacer de varias formas. Por seguir con lo que ya tienes puesto, la solución sería:
Codigo:
#include <16f876.h>
#fuses HS, NOPROTECT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
char opcion;
izq()
{
// do
// {
output_b(1);
delay_ms(1000);
output_b(2);
delay_ms(1000);
output_b(4);
delay_ms(1000);
output_b(8);
delay_ms(1000);
// }
// while (opcion=="1");
}
der()
{
// do
// {
output_b(8);
delay_ms(1000);
output_b(4);
delay_ms(1000);
output_b(2);
delay_ms(1000);
output_b(1);
delay_ms(1000);
// }
// while (opcion=="2");
}
/*
detener()
{
do
{
while(!kbhit());
opcion=getc();
}
while (opcion!="1" && opcion!="2");
}
*/
detener()
{
output_b(0);
}
main()
{
set_tris_b(0x00);
output_b(0);
while (TRUE)
{
//detener();
opcion=getc();
switch (opcion)
{
case "1":
do
izq();
while(!kbhit());
break;
case "2":
do
der();
while(!kbhit());
break;
case "3":
detener();
break;
}
}
}
Un saludo
Listo Amigos !!!
Ya quedó y justo como lo quería, ahora quisiera saber como sería la mejor forma de mandar el valor de la frecuencia, yo lo hago de la siguiente forma:
Codigo:
char opcion;
float duty,per;
izq()
{
output_b(5);
delay_ms(per);
output_b(9);
delay_ms(per);
output_b(10);
delay_ms(per);
output_b(6);
delay_ms(per);
}
der()
{
output_b(6);
delay_ms(per);
output_b(10);
delay_ms(per);
output_b(9);
delay_ms(per);
output_b(5);
delay_ms(per);
}
detener()
{
output_b(0);
}
main()
{
set_tris_b(0x00);
output_b(0);
while (TRUE)
{
opcion=getc();
switch (opcion)
{
case "1":
while(!kbhit());
duty=getc();
per=duty/4;
do
izq();
while (!kbhit());
break;
case "2":
while(!kbhit());
duty=getc();
per=duty/4;
do
der();
while (!kbhit());
break;
case "3":
do
detener();
while (!kbhit());
break;
}
}
}
Lo que en ocasiones me sucede es que al prender la fuente que alimenta el pic, pues se presenta una secuencia sin antes haber corrido el programa en visual. Saben a qué se pueda deber? Gracias por todo.