TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: sparta13 en 21 de Febrero de 2014, 22:28:22
-
buenas...
estoy trabajando con el micro controlador PIC18f4550, no tiene mucho que me he introducido en este tema y lo que quiero hacer es comunicar mediante puerto serial al PIC con mi pc, bueno que al introducir cadenas como "ledon" y "ledoff" se habiliten o deshabiliten pines del micro mi idea va por aquí espero contar con su ayuda a gradeciendo por adelantado...
#include <18f4550.h>
#include <string.h>
#FUSES INTHS,MCLR,PUT,NOBROWNOUT, CPUDIV1, PLL1
#use delay(INTERNAL=4MHZ)
#use rs232 (BAUD=9600 , XMIT=PIN_c6 , RCV=PIN_c7, bits=8, parity=N, STOP=1)
#use standard_io(a)
void main ()
{
int resultado;
char string
char string2
for (;;)
{
gets (string);
strcpy (string,"ledon");
resultado=strcmp(string,string2);
if (resultado==1)
{
output_high(PIN_A0);
}
if (resultado==0)
{
output_low(PIN_A0);
}
}
}
-
no necesiyas enviar una cadena completa para lograr lo que quieres, podría funcionar con solo un caracter, por ejemplo, 'a' para encender y 'b' para apagar.
algunos comenarios sobre tu código asi como lo tienes:
--string y string2 deber ser vectores, es decir:
char string[15];
--te falta activar la interrupion por recepción de rs232 (Int_rda)
--para usar el oscilador interno usa el fuse INTRC_IO
-
ha, ok lo de los vectores error mío, al poner el ejemplo si lo he colocado bien, ammm si ya se que se puede mandar con solo una sola letra con función getchar ya lo he conseguido de la forma siguiente:
#include <18f4550.h>
#FUSES INTHS,MCLR,PUT,NOBROWNOUT, CPUDIV1, PLL1
#use delay(INTERNAL=8MHZ)
#use rs232 (BAUD=9600 , XMIT=PIN_c6 , RCV=PIN_c7, bits=8)
#use fixed_io(A_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
//#use standard_io(a)
///PROGRAMA
void main()
{
puts("Interaccion PC->PIC ");
puts("¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨");
puts(" VeRDE1->Led on Verde");
puts(" RoJO2->Led on Rojo");
puts(" VeRDE3->Led on Verde");
while(1)
{
switch(getch())
{
case 'a':
{ output_high(PIN_A0); //se activa el pin a 0 led verde
delay_ms(300);
output_low(PIN_A0); ///se apaga el led verde
}
break;
case 'b':
{
output_high(PIN_A1); //led on rojo
delay_ms(300);
output_low(PIN_A1); ///se apaga
}
break;
case 'c':
{
output_high(PIN_A2); //led on verde
delay_ms(300);
output_low(PIN_A2);
}
break;
}
} //...infinito
}
pero ahora deseo mandar cadenas como lo mencione, por lo que entiendo se usa la función gets ya lo he intentado de esta forma pero no hacepta mas de un carácter 'a' y no me lo reconoce "ledon" no se si puedas ayudarme con esto ?????
-
buenas...
estoy trabajando con el micro controlador PIC18f4550, no tiene mucho que me he introducido en este tema y lo que quiero hacer es comunicar mediante puerto serial al PIC con mi pc, bueno que al introducir cadenas como "ledon" y "ledoff" se habiliten o deshabiliten pines del micro mi idea va por aquí espero contar con su ayuda a gradeciendo por adelantado...
#include <18f4550.h>
#include <string.h>
#FUSES INTHS,MCLR,PUT,NOBROWNOUT, CPUDIV1, PLL1
#use delay(INTERNAL=4MHZ)
#use rs232 (BAUD=9600 , XMIT=PIN_c6 , RCV=PIN_c7, bits=8, parity=N, STOP=1)
#use standard_io(a)
void main ()
{
int resultado;
char string
char string2
for (;;)
{
gets (string);
strcpy (string,"ledon");
resultado=strcmp(string,string2);
if (resultado==1)
{
output_high(PIN_A0);
}
if (resultado==0)
{
output_low(PIN_A0);
}
}
}
Debes tener en cuenta que gets() recibirá una cadena terminada con el caracter decimal 13 (el correspondiente al enter del teclado).
Recibes la cadena y la almacenas en la variable string. Pero luego almacenas el valor "ledon" en la variable string, por lo tanto pierdes el valor recibido. Tendrías que almacenar el valor "ledon" en la variable string2.
rivale, no creo que sea necesario activar la interrupción puesto que está utilizando la función gets() en el bloque principal.
-
como te comenta AngelGris la cadena la terminas con un \n.
lo de la interrupción lo comentaba para que no tengas que estar leyendo constantemente dentro del main, también podrias checar con el kbhit para saber si hay datos en el buffer, y solo leer en ese momento
saludos