Autor Tema: Problema con comunicacion serie PIC16F877A  (Leído 4012 veces)

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

Desconectado guille1984

  • PIC10
  • *
  • Mensajes: 8
Problema con comunicacion serie PIC16F877A
« en: 15 de Septiembre de 2007, 16:38:45 »
Como va gente, antes que nada les agradezco por tener tan buena onda y ayudarse de esta manera.

Tengo alguna experiencia con el PIC16F84A en Assembler, y ahora empeze con un proyecto en el cual usaremos el PIC16F877A programado en C. Estoy usando un XT de 20 MHz y un MAX232 para la interfaz PC-TTL.

He aqui mi primer programita, que cumpliendo con la ley del primer programa, no anda muy bien

(Algunas cosas las puse conscientemente, otras porque me canse de probar.)

Código: [Seleccionar]
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT     
#use delay (clock=20000000)         //F=20Mhz
#use rs232(baud=9600, xmit=PIN_D3, rcv=PIN_D2, FORCE_SW)

void luz();
void main(void)
{
    do
    {
      luz();
      printf("Hola");
      delay_ms(2500);
    }
    while(true);

}

void luz()
{
    int x;
    for(x=0;x<5;x++)
    {
     output_high(PIN_B0);         // Prendo Led 500ms
     delay_ms(500);
     output_low(PIN_B0);          // Apago Led 500ms
     delay_ms(500);
    }
}


El led anda barbaro, se prende y apaga. Pero por el puerto serie no recibo nada. A lo mejor estoy configurando mal el CCS, puse : Sin paridad, 8 bits, 1 Bit parada. Abro la ventana y no pasa nada. Tampoco usando el Advanced Serial Por Monitor.

Bueno, espero alguno pueda ayudarme!!.


Saludos desde Cordoba, Arg.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #1 en: 15 de Septiembre de 2007, 17:26:36 »
Hola guille1984!

Has comprobado la configuración del puerto de serie en el windows?? Lo tienes que poner de la misma forma, 9600, 8 bits, 1 Bit parada etc.

Mira también la configuración del Serial port monitor y asegurate que está bien.

Ya nos comentas.


Un saludo desde Alicante.

Desconectado guille1984

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #2 en: 15 de Septiembre de 2007, 21:47:36 »
Si, lo hice. Pero no veo absolutamente nada, ningun bit recibido siquiera. Al circuito lo he revisado muchas veces, me estoy bajando el proteus asi les muestro un grafico (aunque es muy simple).

Bueno, un gran saludo y gracias!

Desconectado guille1984

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #3 en: 16 de Septiembre de 2007, 03:38:17 »
Me sigue dando todo mal, aca  va un screen de la salida:




Sera el max232?. Lo revise 30 veces y parece estar bien,  o hay algo que me estoy perdiendo... Uso todos capacitores de 1uF en el max 232, excepto el de 100nF entre Vdd y GND. Lo digo porque vi que algunos usan otras capacitancias.

Lo que obtengo es que se prende el led un rato, y despues se queda esperando que yo escriba con el teclado, pero no hay manera, no recibe.

El codigo es otro ahora, mas simple:


Código: [Seleccionar]
#include <16f877a.h>         
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT     
#use delay (clock=20000000)                      //F=20Mhz
#use rs232(baud=9600, xmit=PIN_D3, rcv=PIN_D2)

void luz(void);

void main()
{
   printf("Que pasa che \n" );               
   do
   {
      luz();
      putc(getc());                 //Reescribo lo recibido   
   }
   while(true);
}

void luz()
{
    int x;
    for(x=0;x<5;x++)
    {
     output_high(PIN_B0);         // Prendo Led 500ms
     delay_ms(500);
     output_low(PIN_B0);          // Apago Led 500ms
     delay_ms(500);
    }
}
« Última modificación: 16 de Septiembre de 2007, 03:41:18 por guille1984 »

Desconectado jdaniels

  • PIC10
  • *
  • Mensajes: 49
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #4 en: 16 de Septiembre de 2007, 12:03:32 »
guille1984 porque no comienzas por algo "mas facil" como putc('A') en el main y mas nada? asi sales de duday vas verificando que la comunicacion serial esta bien y el fallo no es por ahi, otra cosa eso que dices es que el max parece estar bien? o esta bien o esta mal, ve prueba esto desconecta el max232 del pic y une el rx y tx del max232 que van al pic, entonces abres el serial input y todo lo que escribes lo debes recibir, asi lo pruebo yo o tambien poniendo un led bajas la tasa de bauds la pones lo mas baja que es 110 o tu mismo la puedes poner y lo ves prender y apagar, no se si se he explicado bien

Otra cosa porque si usas el 877A no usas sus pines respectivos de Rx y Tx? quieres hacerlo por software?

Desconectado guille1984

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #5 en: 17 de Septiembre de 2007, 15:54:45 »
Muchas gracias jdaniels. Segui tus consejos de hacer algo mas "facil" y me asegure que el MAX232 anduviera bien.

Tambien pude transmitir con el pic "putc('a')"  y todo en orden.

Ahora los problemas:

1) No puedo usar ninguna funcion para leer chars, como "getc". Simplemente el programa NO anda (ni siquiera la funcion de prender el led).

2) Cuando envio strings, no manda las mayusculas o los espacios.

3) Cada vez que el pic transmite, marca el estado "Error" en el siow de CCS.


Adjunto codigo y screenshot:

Código: [Seleccionar]
#include <16f877a.h>         
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT     
#use delay (clock=20000000)                      //F=20Mhz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)

void luz(void);

void main()
{
   delay_ms(5000);
   puts(" Que pasa che " );       
   do
   {
      luz();
      putc('h');
   }
   while(true);
}

void luz()
{
    int x;
    for(x=0;x<5;x++)
    {
     output_high(PIN_B0);         // Prendo Led 500ms
     delay_ms(500);
     output_low(PIN_B0);          // Apago Led 500ms
     delay_ms(500);
    }
}






« Última modificación: 17 de Septiembre de 2007, 16:04:14 por guille1984 »

Desconectado jdaniels

  • PIC10
  • *
  • Mensajes: 49
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #6 en: 17 de Septiembre de 2007, 17:01:14 »
Ok bueno otra pregunta porque usas los 9 bits? pon solo esto #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) y nuevamente si ya comprobaste que el max esta fino y toda la comunicacion esta bien entonces ahora prueba los comando para leer como el getc que mencionas crea una variable por ejem.

Código: CSS
  1. char a;
  2.  
  3. void main()
  4. {
  5. a=getc();
  6. putc(a);
  7. }

Algo asi mas o menos, que la tecla que escribas la mande y la veas en el monitor, si todo anda bien le entramos al led entonces

Desconectado guille1984

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #7 en: 17 de Septiembre de 2007, 23:46:42 »
Use los 9 bits porque con 8 no me anda... cual es la configuracion por default?.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema con comunicacion serie PIC16F877A
« Respuesta #8 en: 18 de Septiembre de 2007, 01:22:05 »
Tal como te dice el amigo jdaniels pon el el PIC el #use rs232 como

Código: C++
  1. #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

Y configura el Puerto COM en el Monitor Serie como

COM1 8 bits, Paridad None, bit de stop 1 y 9600 baudios o sea COM1 8N1 9600. Porque veo que el tuyo está como COM1 8N2 9600 (dos bits de stop) que es el error que creo que tienes.
« Última modificación: 18 de Septiembre de 2007, 01:24:38 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nachogn

  • PIC10
  • *
  • Mensajes: 4
Re:Problema con comunicacion serie PIC16F877A
« Respuesta #9 en: 19 de Julio de 2023, 09:12:06 »
Tengo el mismo problema aunque yo uso transmision inalambrica (433MHz y uso 4800 baudios) me falla cada vez que uso la funcion "delay_ms", pero necesito generar un retardo y no se como hacer, es probable que si sacas la funcion delay si te responda

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema con comunicacion serie PIC16F877A
« Respuesta #10 en: 19 de Julio de 2023, 09:44:17 »
Tengo el mismo problema aunque yo uso transmision inalambrica (433MHz y uso 4800 baudios) me falla cada vez que uso la funcion "delay_ms", pero necesito generar un retardo y no se como hacer, es probable que si sacas la funcion delay si te responda

¿Crees que el delay_ms te deshabilita alguna interrupción y por eso falla?

Tal vez un retardo asincrónico sea la solución.

http://www.todopic.com.ar/foros/index.php?topic=51542.msg424750#msg424750

http://www.todopic.com.ar/foros/index.php?topic=51495.msg424364#msg424364
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything