Autor Tema: Problemas Comunicacion Serial 16f84a  (Leído 2954 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Problemas Comunicacion Serial 16f84a
« en: 21 de Agosto de 2011, 11:06:53 »
Hola amigos de todopic, bueno creo debi haber echo esto desde hace mucho...preguntar a los expertos  :lol: .
Estoy aprendiendo a programar pics en C , y se me ha metido la idea de controlarlo mediante el puerto serial, realize un programa en VBasic (muy basico, igual estoy aprendiendo  :D) el cual envia la informacion,me referire a el como vSerial, y he implementado este programa en mi pic (ver codigo), pero el problema es que el LED solo enciende la primera vez y siendo el primer dato 's', y me gustaria que constantemente este leyendo los bits de entrada aun asi la cadena de caracteres de entrada sea 'sasw900s0kio' solo quiero que el LED encienda en las 's' y en los casos contrarios se apague, pero no lo, solo lee el primer dato.
Intente asignandole a la variable el valor de ' ' pero aun asi no funciono y no se si existe alguna manera de borrar los datos de entrada del serial (un reset de programa) y asi leyese el siguiente bit que envie. Espero haberme explicado  :shock: , y puedan ayudarme, les agradezco de antemano, adjunto la simulacion en proteus. Gracias.

Citar
/*------------------------------------------------------------*/
/*                                                            */
/*            Comunicacion Serial PC->PIC                     */
/*                                                            */
/*------------------------------------------------------------*/
          
#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)

#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)


//Config. de Puertos
#byte PORTA=0x05
#byte PORTB=0x06

void main()
{
   char seleccion;
 
  
   set_tris_a(0x02);
   set_tris_b(0x00);
   port_b_pullups(true);
   Output_Low(PIN_B0);
  
   seleccion = getch(); //El valor de entrada se almacena en seleccion
    switch(seleccion)
   {
    case 's':Output_High(PIN_B0); break; //Si la entrada es 's' encender el LED
    
    default: Output_Low(PIN_B0); //En caso contrario el LED se apagara
   }
  
}
« Última modificación: 21 de Agosto de 2011, 11:15:20 por man3s »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #1 en: 21 de Agosto de 2011, 13:00:08 »
lo ideal es que uses una interrupcion para leer los datos desde el puerto serie, ya que como tienes tu programa ahora esstas leyendo siempre, aunque no tengas datos en el buffer.

si quieres que solo prenda al recibir la letra 's' y envias una cadena como la que dices  "sasw900s0kio" ahi el led va a parpadear pero muy rapido y no veraz que se apague o prenda.

para ver mas clara la diferencia deberias enviar un caracter desde la computadora y esperar a ver si se prende o no el led, despues envias otro para hacer el toggle.
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #2 en: 21 de Agosto de 2011, 14:11:59 »
lo ideal es que uses una interrupcion para leer los datos desde el puerto serie, ya que como tienes tu programa ahora esstas leyendo siempre, aunque no tengas datos en el buffer.

 :shock:  El 16F84 no tiene módulo, aunque se puede aprovechar la interrupción externa de flanco descendente para capturar el bit de Start.

Luego tienes que quedar en un bucle infinito, sino se ejecuta una vez y el micro se resetea.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #3 en: 21 de Agosto de 2011, 14:17:34 »
:shock:  El 16F84 no tiene módulo, aunque se puede aprovechar la interrupción externa de flanco descendente para capturar el bit de Start.

Luego tienes que quedar en un bucle infinito, sino se ejecuta una vez y el micro se resetea.

Saludos!

 :oops: :oops:, estas en lo correcto suky, no habia visto que modelo era.
"Nada es imposible, no si puedes imaginarlo"

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #4 en: 21 de Agosto de 2011, 19:31:28 »
segun habia entendido al usar el kbhit() era para mostrar si habia un cambio en el envio de informacion, lo intente implementar y no me funciono, estoy muy perdido :lol: , y si enciende el LED la primera vez pero solo si el primer bit que envie es la 's' , inclusive pense asignarle a la variable seleccion el valor de ' ' para que no se cumpla pero aun asi no :( , de donde me puedo guiar que sea sencillo si es posible por que ya cheque varios post de aqui de todo pic y todos se complica, por que imprimien en LCD y con varias letra de seleccion y yo solo necesito que con una se encienda un simple LED y si entra una diferente se apague hasta que entre de nuevo 's'  :lol:, podrian mostrarme un ejemplo?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #5 en: 21 de Agosto de 2011, 19:41:20 »
Código: C
  1. while(1){
  2.    seleccion = getch(); //El valor de entrada se almacena en seleccion
  3.     switch(seleccion)
  4.    {
  5.     case 's':Output_High(PIN_B0); break; //Si la entrada es 's' encender el LED
  6.    
  7.     default: Output_Low(PIN_B0); //En caso contrario el LED se apagara
  8.    }
  9. }

Y envía letra por letra. También aprovecha la herramienta proteus, que te permite simular cargando el archivo *.cof paso a paso el código.



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #6 en: 21 de Agosto de 2011, 19:50:13 »
Código: C
  1. while(1){
  2.    seleccion = getch(); //El valor de entrada se almacena en seleccion
  3.     switch(seleccion)
  4.    {
  5.     case 's':Output_High(PIN_B0); break; //Si la entrada es 's' encender el LED
  6.    
  7.     default: Output_Low(PIN_B0); //En caso contrario el LED se apagara
  8.    }
  9. }

Si amigo, ya habia realizado eso, y viendo el debug si funciona pero el LED se apaga muy rapidamente, necesitaria enviar una cadena de sssssssssss continuamente para que el LED no se apague, creo sera la unica manera de hacerlo o cambiar el encendido al default y el apagado a la letra s.

Y envía letra por letra. También aprovecha la herramienta proteus, que te permite simular cargando el archivo *.cof paso a paso el código.



Saludos!

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #7 en: 21 de Agosto de 2011, 19:54:28 »
 :shock: Q raro, el mensaje no se envio, solo la cita, bno si me funciona de esa manera y ya lo habia hecho asi, pero el problema radica en que se apaga muy rapidamente debido a que el bit siguiente no se ha enviado y lo manda a default. Sera cosa de ingeniarselas, pero seria bno si me recomendaran un buen tuto de puerto serial con ccs , se los agradeceria mucho  y creo asi evitaria molestarlos tanto  :D .

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Re: Problemas Comunicacion Serial 16f84a
« Respuesta #8 en: 21 de Agosto de 2011, 20:43:54 »
Ya lo solucione   :-/:D, bueno tuve que poner una tecla 'n' para salir para evitar que salga de golpe, muchas gracias por la ayuda, y efectivamente usar en cof para la depuracion fue una muy buena idea que me ayudo, gracias  :D .