Programación Específica > Programación en C

 Comunicación RS232-16F876A-MAX232

(1/1)

Ricardo.Ojeda:
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 --- #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT    // Los Fuses de siempre#use delay(clock=4000000)                       // Oscilador a 4 Mhz#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // RS232 Estándar   char rcvchar; // INTERRUPCON ///////////////////////////////////////////////////////////// #int_rdavoid serial_isr()       // Interrupción recepción serie USART{    rcvchar=0x00;        // Inicializo caracter recibido   if(kbhit())          // Si hay algo pendiente de recibir ...   {       rcvchar=getc();   // lo descargo y ...      printf(rcvchar);   }}//////// Programa Principal ///////////////////////////////////////////////////////// void main() {   setup_adc_ports(NO_ANALOGS);   setup_adc(ADC_OFF);   setup_spi(SPI_SS_DISABLED);   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);   setup_timer_1(T1_DISABLED);   setup_timer_2(T2_DISABLED,0,1);   setup_ccp1(CCP_OFF);   setup_comparator(NC_NC_NC_NC);   setup_vref(FALSE);    // TODO: USER CODE!!      set_tris_C(0x90);    enable_interrupts(int_rda);   // Habilita Interrupción RDA   enable_interrupts(global);    // Habilita interrupciones    do    {      // Con esta rutina cada dato que se recibe, lo devuelve (es bastante básico).      // Hay que modificar para hacer lo que se necesite con el dato recibido.   } while (TRUE); }  
A ver si alguien me puede hechar una mano para resolver este problema en la comunicación.

Muchas gracias y saludos!

allisap:
tu problema esta en la linea 18


--- Citar ---     printf(rcvchar);
--- Fin de la cita ---

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

Navegación

[0] Índice de Mensajes

Ir a la versión completa