• Martes 16 de Abril de 2024, 15:19

Autor Tema:  Comunicación RS232-16F876A-MAX232  (Leído 2406 veces)

Ricardo.Ojeda

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Comunicación RS232-16F876A-MAX232
« en: Miércoles 21 de Octubre de 2009, 12:59 »
0
Hola buenas.

Estoy realizando un proyecto con el PIC 16F876A y necesito comunicarlo con el PC vía RS232. Mediante un programa (tipo hyperterminal) intento la transmisión al PIC y ocurre lo siguiente:

TRANSMITO: dsdeewrdzxzcc
RECIBO: €@€@€@€@€@DHDH €@ €@


Está configurado a 9600-8-n-1 y la conexión del MAX232 que utilizo es la de condensadores de 1 uF, usando los pines 11,14 y 12,13
Dejo el código del programa que tengo en el pic, por si el error se encuentra ahí:

Código: Text
  1.  
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT    // Los Fuses de siempre
  3. #use delay(clock=4000000)                       // Oscilador a 4 Mhz
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // RS232 Estándar
  5.  
  6.  
  7. char rcvchar;
  8.  
  9. // INTERRUPCON /////////////////////////////////////////////////////////////
  10.  
  11. #int_rda
  12. void serial_isr()       // Interrupción recepción serie USART
  13. {
  14.    rcvchar=0x00;        // Inicializo caracter recibido
  15.    if(kbhit())          // Si hay algo pendiente de recibir ...
  16.    {
  17.       rcvchar=getc();   // lo descargo y ...
  18.       printf(rcvchar);
  19.    }
  20. }
  21. //////// Programa Principal /////////////////////////////////////////////////////////
  22.  
  23. void main()
  24. {
  25.    setup_adc_ports(NO_ANALOGS);
  26.    setup_adc(ADC_OFF);
  27.    setup_spi(SPI_SS_DISABLED);
  28.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  29.    setup_timer_1(T1_DISABLED);
  30.    setup_timer_2(T2_DISABLED,0,1);
  31.    setup_ccp1(CCP_OFF);
  32.    setup_comparator(NC_NC_NC_NC);
  33.    setup_vref(FALSE);
  34.  
  35.    // TODO: USER CODE!!
  36.    
  37.    set_tris_C(0x90);
  38.  
  39.    enable_interrupts(int_rda);   // Habilita Interrupción RDA
  40.    enable_interrupts(global);    // Habilita interrupciones
  41.  
  42.    do
  43.    {
  44.       // Con esta rutina cada dato que se recibe, lo devuelve (es bastante básico).
  45.       // Hay que modificar para hacer lo que se necesite con el dato recibido.
  46.    } while (TRUE);
  47.  
  48. }
  49.  
  50.  

A ver si alguien me puede hechar una mano para resolver este problema en la comunicación.

Muchas gracias y saludos!

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Comunicación RS232-16F876A-MAX232
« Respuesta #1 en: Sábado 14 de Noviembre de 2009, 04:00 »
0
tu problema esta en la linea 18

Citar
    printf(rcvchar);

cuando recibes un caracter por ejemplo una A (ascci 65)
recibes un 65 decimal
pero cuando lo envías de regreso por el serial  usando

     printf(rcvchar);

estas enviando un 65 (un seis decimal y un cinco decimal separados)
para recibirlo correctamente prueba con esto

     printf('%c',rcvchar);

espero que te sirva, saludos

Victor Pasilla Campos