TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kovian en 10 de Noviembre de 2013, 14:23:29

Título: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: kovian en 10 de Noviembre de 2013, 14:23:29
Hola buenos dias,soy nuevo en este foro y en la programacion de pic en lenguaje c,tengo un problema con un programa y que no puedo hacer que se comunique pic con pc, ya que quiero que mediante la pc mandar un numero de 1 a 3 y segun el numero , encender una salida del pic un led...pero al simularlo no envia nada..al precionar la tecla...este programa me lo pasaron en el trabajo ya hecho pero no funciona...lo hizo otra persona y no funcona y estoy tratando de hecharlo a funcionar...pero tengo dudas de como cacha los valores que le envio de pc...se que con getc se la asigno a una variable pero como los recibe o loas cacho del pc?...envio copia de programa...

#if defined( __PCM__ )
   #include <16f877A.h>
   #fuses HS, NOWDT,NOPROTECT,NOLVP
   #use delay(clock=4000000,RESTART_WDT)
#endif

#include <string.h>

#define SALIDA1 PIN_D0
#define SALIDA2 PIN_D1
#define SALIDA3 PIN_D2
#define SALIDA4 PIN_D3
#define SALIDA5 PIN_D4

//====================PINES DE COMUNICACION==================
//----- PINES PARA COMUNICACION CON EL CONTROL              |
#define RX_EXT PIN_C7                                    // |
#define TX_EXT PIN_C6                                    // |
//===========================================================

// COMANDO A MODULOS


//=================== DECLARACION DE LOS PUERTOS DE COMUNICACION ==================================
#use rs232(baud=4800, xmit=TX_EXT, rcv=RX_EXT, ERRORS, RESTART_WDT)

char buffer[64];
char salida;
int1 datoRS232;

void apagaSalidas()
{
   output_low(SALIDA1);
   output_low(SALIDA2);
   output_low(SALIDA3);
   output_low(SALIDA4);
   output_low(SALIDA5);
}

#INT_RDA
void serial()
{
int i;
   i=0;
   do
   {
      buffer = getc();
      i++;
   }while(buffer[i-1] != 0x0C);
   buffer = '\0';

   disable_interrupts(INT_RDA);
   apagaSalidas();
   //printf("%s",buffer);
   datoRS232 = TRUE;
}

//===============================================================================
// FUNCION main() ***************************************************************
void main() {
int16 tiempo;
char salida;
int i;

   for(i=1;i<=2;i++)
   {
      output_high(SALIDA1);
      delay_ms(160);
      output_low(SALIDA1);
      output_high(SALIDA2);
      delay_ms(160);
      output_low(SALIDA2);
      output_high(SALIDA3);
      delay_ms(160);
      output_low(SALIDA3);
      output_high(SALIDA4);
      delay_ms(160);
      output_low(SALIDA4);
      output_high(SALIDA3);
      delay_ms(160);
      output_low(SALIDA3);
      output_high(SALIDA2);
      delay_ms(160);
      output_low(SALIDA2);
   }
   output_high(SALIDA1);
   delay_ms(160);
   output_low(SALIDA1);

   datoRS232 = FALSE;
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);

   printf("Empaque V1.0 \n\r Listo!");
 

   while(1)
   {
      if(datoRS232 == TRUE)
      {
         salida = 0;
         for(i=0;i<strlen(buffer);i++)
         {
            if(isdigit(buffer)) salida = buffer;
         }

         if(salida >= 0x31 && salida <= 0x35)
         {
            printf("\r\nSalida: %c", salida);
                 if(salida == '1' ) output_high(SALIDA1);
            else if(salida == '2' ) output_high(SALIDA2);
            else if(salida == '3' ) output_high(SALIDA3);
            else if(salida == '4' ) output_high(SALIDA4);
            else if(salida == '5' ) output_high(SALIDA5);
         }
         else
         {
            printf("\r\nValor no valido");
         }
         datoRS232 = FALSE;
         tiempo = 0;
         delay_ms(2000);

         while(kbhit())
         {
            salida = getc();
         }
         for(i=0;i<64;i++)
         {
            buffer = '\0';
         }
         enable_interrupts(INT_RDA);
      }

      if(tiempo < 30000)
      {
         tiempo++;
      }
      else if(tiempo == 30000)
      {
         tiempo++;
         apagaSalidas();
      }
      delay_ms(10);

   }
}

Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: thegame en 11 de Noviembre de 2013, 03:06:25
Hola kovain

Bueno no se si esto te ayude pero.... a simple vista en tus fuses de configuracion yo observo algunos detalles, yo realizaria los siguientes cambios para empezar:

1.- declaras el bit de configuracion HS que es para trabajar con frecuencias mayores a 4Mhz, por cual yo lo cambiaria a XT
2.- usas NOWDT y sin embargo colocas RESTART_WDT, que segun leo en la ayuda de CCS, se usa cuando habilitamos el WDT, yo quitaria la instruccion RESTART_WDT, tanto en #use delay, como en #use rs232

eso en caso de que desees usar ese codigo, yo realmente considero que en muchos casos es mejor empezar de 0, que querer adivinar que hizo alguien mas, ese es mi muy particular punto de vista, consideralo y si deseas empezar de 0, no creo que sea tan complicado por lo que pones que quieres que haga tu programa y seguro encontraras mucha ayuda en este genial foro.

otra sugerencia, lee en los post que estan en el foro lo de la recepcion de los datos, o revisa la ayuda de CCS que vienen algunos ejemplos.

saludos y suerte.

Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 10 de Enero de 2014, 16:27:40
Pregunta:

yo estoy utilizando este código:

 #include <16f887.h>

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #use delay(clock=4000000)
 #use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N)
 #BYTE TRISA=0x85
 #BYTE PORTA=0x05
 #BYTE TRISB=0x86
 #BYTE PORTB=0x06
 #BYTE TRISE=0x89
 #BYTE PORTE=0x09
#BYTE ANSEL=0x188
#define LED PIN_C0
#define SW1 PIN_B0
#define SW2 PIN_B1
#define LED1 PIN_C1
char recep;

#int_RDA
void  RDA_isr(void)
{
recep=getchar();
output_high(LED);
delay_ms(300);
printf("llego");
output_low(LED);
delay_ms(300);
if(recep==0x61){
output_high(LED1);
delay_ms(1000);
puts("recibido");
}
else {
output_low(LED1);
delay_ms(50);
}

disable_interrupts(global);
delay_ms(30);
putc(recep);
enable_interrupts(global);
}
 void main(void)
{
int valor;
valor=0;
TRISB=0xFF;
ANSEL=0x00;
setup_oscillator(OSC_4MHZ);
setup_adc_ports(NO_ANALOGS); //Selecciona terminales
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(1)// ciclo for infinito
if(input(SW1))   //lee entrada
{
output_high(LED);
delay_ms(1000);
output_high(LED1);
delay_ms(2000);
}
else {
output_low(LED);
delay_ms(300);
output_low(LED1);
delay_ms(300);
}


}

cuando lo simulo anda de 10 en el proteus, pero cuando lo pruebo en el circuito con el SIOW de CCS no hace la parte del if de la comunicación rs232, o sea, yo quiero que compare la letra que envio y si es correcta que encienda un led y responda con un "recibido" pero no lo hace, y en la simulacion si, es más los puts y los printf no los veo con el SIOW, cual puede ser el problema?
Saludos
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 10 de Enero de 2014, 17:08:33
Creo que el problema es que no estas poniendo fuses para configurar el micro, entonces no le espécificas si usar el cristal interno o el externo, eso podria explicar porque en proteus si funcion y en hardware no
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 10 de Enero de 2014, 17:33:46
Ahhhhhh, tenes razón! lo voy a probar y te digo!
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 10 de Enero de 2014, 17:44:32
No es ese el problema :-( no devuelve nada de lo de printf o puts, si devuelve putc, alguna otra recomendación?
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 10 de Enero de 2014, 17:53:47
tu while no abarca nada, no le pusiste las llaves, tienes un if inmediatamente despues, tal vez sea eso
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 10 de Enero de 2014, 18:37:37
Nop, tampoco es eso!  :( , lo raro es que el putc si lo toma
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 10 de Enero de 2014, 18:40:07
Nop, tampoco es eso!  :( , lo raro es que el putc si lo toma

Código: C
  1. #int_RDA
  2. void  RDA_isr(void)
  3. {
  4. recep=getchar();
  5. output_high(LED);
  6. delay_ms(300);
  7. printf("llego");
  8. output_low(LED);
  9. delay_ms(300);
  10. if(recep==0x61){
  11. output_high(LED1);
  12. delay_ms(1000);
  13. puts("recibido");
  14. }
  15. else {
  16. output_low(LED1);
  17. delay_ms(50);
  18. }
  19.  
  20. disable_interrupts(global);
  21. delay_ms(30);
  22. putc(recep);
  23. enable_interrupts(global);
  24. }
de esta parte lo unico que te imprime es la variable recep?
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 10 de Enero de 2014, 18:45:24
como comentario adicional, no debes poner delays o printf dentro de una interrupcion, mejor solo activa una bandera y la verificas dentro del main y ahí imprimes lo que quieras y pones retardos
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 10 de Enero de 2014, 23:03:30
Si, lo unico es la variable recep que muestra. Tambien probe lo del printf en el main (antes) y nada, me extraña, modifique la configuracion del puerto com y es lo mismo. Revise y estan iguales los parametros de configurscion del pic y de configuracion del puerto
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 11 de Enero de 2014, 20:47:00
de que manera estas leyendo los datos, como tienes programada tu hiperterminal
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 13 de Enero de 2014, 16:34:10
Estoy usando el SIOW de ccs
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 13 de Enero de 2014, 17:12:05
porque no intentas usando otra hiperterminal, se me hace muy extraño que el putc si funcione y los otros 2 no lo hagan

podrías probar con la que hizo el amigo labmouse

http://www.todopic.com.ar/foros/index.php?topic=35482.0 (http://www.todopic.com.ar/foros/index.php?topic=35482.0)
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 13 de Enero de 2014, 19:23:31
yo tambien pienso que puede ser el soft, voy a probar con este y te digo, muchas gracias
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 14 de Enero de 2014, 11:18:50
14/01/2014 11:14:09 a.m.[Rx]>> öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁìÏò=öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁìÏò=öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁÌÏò=öÁìÏò=öÁÌÏò==öÁÌÏò=öÁÌïò=öÁÌÏò=öÁÌÏò=öáÌÏò=öÁÌÏòöÁÌÏò=öÁÌÏò=

14/01/2014 11:14:37 a.m.[Tx]>> q

14/01/2014 11:14:38 a.m.[Rx]>> öÁÌÏòqöÁÌÏòqöÁÌïòq

14/01/2014 11:14:40 a.m.[Tx]>> q

14/01/2014 11:14:40 a.m.[Rx]>> öÁÌÏòqöÁÌÏòqöÁÌÏò

14/01/2014 11:14:42 a.m.[Tx]>> a

14/01/2014 11:14:42 a.m.[Rx]>> aöáÌÏòaöÁÌÏò

14/01/2014 11:14:44 a.m.[Tx]>> s

14/01/2014 11:14:44 a.m.[Rx]>> söÁÌÏòsöÁÌÏòsöÁÌïòsöáÌÏòs

14/01/2014 11:14:47 a.m.[Tx]>> d

14/01/2014 11:14:48 a.m.[Rx]>> öÁÌÏòDöáÌÏòDöÁÌïòd


Eso me aparece!!!! "öáÌÏò" eso tendria quee decir "valor". Lo otro que observé es que si envio la "a" me devuelve "A" y ocurre lo mismo con otras teclas. Ayuda!!!!
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 14 de Enero de 2014, 11:20:59
 :shock:  pensé que era spam  :D :D


verifica que la velocidad de tu hiperterminal y la de tu pic sean la misma
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 14 de Enero de 2014, 13:02:44
eso lo tengo re contra re chequeado!!!, no se si patear el pic o la pc! jeje
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 14 de Enero de 2014, 13:19:35
eso lo tengo re contra re chequeado!!!, no se si patear el pic o la pc! jeje
:D :D :D

se me ocurre que tal vez tu cristal no esta bien configurado, tal ves esta corriendo a otra velocidad, podrias poner tu código para revisar
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 14 de Enero de 2014, 13:25:26
#include <16f887.h>
#fuses  NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP, INTRC
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #use delay(clock=8000000)
 #use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N)
 #BYTE TRISA=0x85
 #BYTE PORTA=0x05
 #BYTE TRISB=0x86
 #BYTE PORTB=0x06
 #BYTE TRISE=0x89
 #BYTE PORTE=0x09
#BYTE ANSEL=0x188
#define LED PIN_C0
#define SW1 PIN_B0
#define SW2 PIN_B1
#define LED1 PIN_C1
char Keypress=' ';

#int_rda
void serial_isr() {

  Keypress=0x00;
  if(kbhit()){
    Keypress=getc();
    if(Keypress!=0x00){
      putchar(keypress);
      keypress=0x00;
    }
  }
}


void main() {
setup_oscillator(OSC_8MHZ);
  enable_interrupts(global);
  enable_interrupts(int_rda);

  printf("\r\n\Listen on RS232 (Int)\r\n");

  do {


  } while (TRUE);
}
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 14 de Enero de 2014, 13:26:26
Ahora busqué esa template sencilla y tampoco anda, ahi esta la configuración del cristal interno del micro
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 14 de Enero de 2014, 14:15:20
no te imprime el letrero del inicio?

Pues no encuentro algún problema en el codigo, los caracteres raros generalmente son debido a problemas en la sincronia de las velocidades.

no será algún problema de hardware, tal vez tu cable de conexion tiene ruido. no se me ocurre otra cosa
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 14 de Enero de 2014, 14:23:21
Claro, el letrero de inicio es este: "ÉóôÅÎ@ÏÎ@²³rsr@H‰ÎôI" y deberia ser "Listen on RS232 (Int)"
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 14 de Enero de 2014, 14:28:58
estas usando algun convertidor de usb-rs232?

y que pasa si lo haces a la inversa, enviando datos de la pc hacia el pic
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 21 de Enero de 2014, 00:13:00
si, estoy usando un conversor usb-rs232, si envio datos desde la pc el pic no los reconoce
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: PCCM en 21 de Enero de 2014, 01:14:17
Si verificaste el código y estas convencido que esta bien.
Entonces el error es por hardware.
- Por el cable usb-serial ya que como la mayoría que venden son copias baratas(caso en mi pais), algunos no funcionan bien y obtienes ruido, me sucedió con 2 cables  que eran de color verde, no me acuerdo la marca.
- Por la tierra del rs232, cuando no hay una buena conexión entre la pata 5 del conector rs232 y la tierra de tu placa.

Saludos.
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 21 de Enero de 2014, 11:09:06
ese error es comun cuando no tienes las mismas velocidades de transimisión, pero si eso ya esta revisado opino lo mismo que PCCM, debe ser error en harware.


otra prueba que podrias hacer es, desconectar tu pic del pc y puentear tus pines de tx y rx y ver si puedes leer lo que estas enviando y ver que este correcto
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 21 de Enero de 2014, 12:15:42
Parece que es el cable, probe poner la mitad de velocidad en la configuracion del puerto en la pc y ahi reconoce las letras y ejecuta tareas, pero a la hora de transmitir desde el pic hacia la pc pasa lo mismo, envia cualquier cosa. Voy a ver si consigo otro cable. Lo de las tierra lo tengo casi descartado porque tengo una tierra en comun para los dos circuitos, el del max y la placa del pic
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 21 de Enero de 2014, 12:18:07
otro factor podría ser el max, quizás se daño y te esta metiendo ruido
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: diegocipo en 21 de Enero de 2014, 12:47:34
lo cambié tres veces  :(
Título: Re: ayuda comunicacion rs232 pic -pc pic 877a en ccs
Publicado por: rivale en 21 de Enero de 2014, 12:55:41
 :shock:, solo queda el cable.

también podrias probar comunicar 2 pics o intenta hacer el puente entre rx y tx del cable y envias datos desde la pc para ver si hace bien la comunicación