Subrutina de envio de 1 byte por RS232 a 4800 baudios

Jamas me lo hubiese imaginado!
nunca hubiese pensado que era por cambiar de lugar los registros... menos mal que me lo dijiste...
hoy voy a probar dejar todo declarado como en la librería que mandaste y voy a modificar todas mis variables del programa y te cuento como me fue.
También voy a leer de nuevo el datasheet para ver el tema de los registros y tenerlo presente.

Muchas gracias !!
 
¿Será que puedo utilizar el GP3 pin MCLR/Vpp. cómo recepción RS232 por software?

#define Rx_Pin PIN_A3
#define Tx_Pin PIN_A5
#use rs232(baud=2400,rcv=Rx_Pin,xmit=Tx_Pin)

Entre 2 PIC12F675 ambos con Rx_Pin PIN_A3

¿Me ayudarían con los códigos y la simulación?
He intentado y no he podido, quiero utilizar este porque el GP0 Y GP1 los estoy utilizando como entradas analógicas y GP4 Y GP5 como salidas digitales.

Claro el GP2 como TX y como el Data Sheet dice que GP3 también es una entrada de propósito general.
Utilizo Proteus y PIC C Compiler. Agradezco su colaboración que me serviría de gran utilidad.
 
Última edición por un moderador:
¿Será que puedo utilizar el GP3 pin MCLR/Vpp. cómo recepción RS232 por software?

#define Rx_Pin PIN_A3
#define Tx_Pin PIN_A5
#use rs232(baud=2400,rcv=Rx_Pin,xmit=Tx_Pin)

Entre 2 PIC12F675 ambos con Rx_Pin PIN_A3
Si puedes usar el pin RA3 si lo configuras como entrada RS-232. (Rx)
¿Me ayudarían con los códigos y la simulación?
He intentado y no he podido, quiero utilizar este porque el GP0 Y GP1 los estoy utilizando como entradas analógicas y GP4 Y GP5 como salidas digitales.
¿Por qué no has podido? ¿Cuál es el problema?

Adjunta lo que llevas hecho, dentro de un archivo comprimido, incluyendo esquema o simulación, y explica con detalle qué es lo que pretendes hacer.
 
hola D@rkbytes (y)
quiero utilizar GP3 Y GP2 cpn rs232 entre 2 pics 12f675
el problema es que no entran datos en GP3

estoy utilizando una simulación y código tuyo, lo único es que en ninguno recibe por GP3
te adjunto

no puedo utilizar los otros pines por que como te dije anterior mente ya esta ocupados
porque el GP0 Y GP1 los estoy utilizando como entradas analógicas y GP4 Y GP5 como salidas digitales en otro proyecto... pero en este simple no se logran comunicar.

Agradezco su colaboración que me serviría de gran utilidad. (y)



Estoy utilizando proteus 8 y pic c compiler
 

Adjuntos

  • 12F675 Recibir por GP3.rar
    85.5 KB · Visitas: 1
Última edición:
Tengo buenas y malas noticias.
La buena, es que si se logra recibir por GP3 pero únicamente un PIC lo puede hacer.
La mala, es que tuve que usar gets(); y eso congelará el proceso hasta que se reciba un CarReturn ("\r")
También se puede usar getc(); pero por razones desconocidas y que no logro entender, únicamente el PIC esclavo puede recibir datos constantemente, pero el PIC maestro no reacciona ante kbhit(); o gets();

Pensé que era el compilador y usé una versión anterior, pero obtuve el mismo resultado.
También usé Basic con Proton IDE, pero tampoco funcionó. :cry:
De hecho el PIC omite completamente la función kbhit(); (verificado en modo de depuración)
Al hacer la recepción por el pin GP3 se tiene que hacer por polling porque éste pin no tiene interrupción externa.
Pero en modo de depuración se puede observar que aunque el PIC esclavo mande los datos de retorno, nunca se entra a la rutina con kbhit(); en el PIC maestro.
Algo extraño pero así sucede. :confused:

Como quiera dejo los ensayos, posiblemente en algo estoy errando, aunque lo dudo. :unsure:
 

Adjuntos

  • 12F675 Recibir por GP3.rar
    70.2 KB · Visitas: 1
Última edición:
Hola D@rkbytes, muchísimas gracias. (y)

Descargué y quiero modificar tu programa Manch_Rx para utilizar el GP3 pin MCLR/Vpp. cómo recepción RS232 con PIC12F675

#use rs232(baud = 2400, rcv = pin_a3, xmit=pin_a2)

Tu respuesta fue:
D@rkbytes dijo:
En el transmisor no hay problema si se usa cualquier pin como Tx, menos GP3 que es únicamente entrada.
Y el receptor no va a funcionar con otro pin, porque se está usando la interrupción externa por GP2.
En ambos casos esto vendría siendo usando el oscilador interno para poder usar GP4 y GP5 (OSC2, OSC1)

Si quieres que la recepción sea por otro pin, tienes que hacerlo por poleo usando "kbhit()" dentro del bucle principal.
Pero no entiendo cómo se hace. ¿Podrías ayudarme? :cry:

HTML:
#include <12f675.h>
#fuses   NOMCLR
#use     delay(internal = 4MHz)
#use     fast_io(a)

#use rs232(baud = 2400, rcv = pin_a3, xmit=pin_a2)   // ojo aqui quiero que reciba por
                                                     //  el GP3 pin
char a,b,c,deco1,deco2,deco3,codif,patron,resultado;
char nibble[2] = {0,0};
char x = 0;

int8 decodificar();

#int_ext
void sdi_externa (void)
// Servicio de interrupción para recibir los datos codificados.
{
   b = getc();       // Se lee el buffer de recepción y se guarda el dato en "b"
   
   if(x < 2)         // Si x es menor a 2...
   {
      nibble[x] = b; // El vector "x" del array "nibble" será = a "b"
      x += 1;        // Se incrementa "x"
   }
}

void main (void)
{  
   set_tris_a(0xDF);
   output_low(pin_a5);
   port_a_pullups(0x04);
   
   enable_interrupts(int_ext);
   enable_interrupts(global);
   ext_int_edge(h_to_l);

   while (true)
   {
      if(x > 1)                  // Si "x" es mayor a 1...
      {
         x = 0;                  // "x" = 0
         
         a = decodificar();      // En "a" se obtendrá el valor de retorno de la función.
         
         if(a == 0b10101010)     // Si "a" es igual a 0xAA...
         {
            output_high(pin_a5); // Se pone en 1 GP5
         }
         if(a == 0b10100101)     // Si "a" es igual a 0xA5...
         {
            output_low(pin_a5);  // Se pone en 0 GP5
         }        
      }
   }
}

int8 decodificar()
{
// Función para decodificar los datos Manchester.
   codif = nibble[0];
       
   if(codif == 0xF0)                // Si el dato es 240 (condición de Inicio/Final encontrado)...
   {
      return 0xF0;                  // Se retorna el mismo valor (0xF0 = 240 Decimal.)
   }
   
   deco1 = 0;                       // Se limpia "deco1"
   
   for(c=0;c<4;c++)                 // Bucle de 4 ciclos.
   {
      deco1 >>= 1;                  // Ir desplazando los bits de deco1 hacia la derecha.
      
      patron = codif & 0b11;        // Se hace una operación And entre "codif" y 3 (patron = codif And 3)
      
      if(patron == 0b01)            // Si el bit 1 de "patron" es 0 y el bit 0 es 1...
      {
         bit_set(deco1,3);          // Poner en 1 el bit 3 de "deco1"
      }
      else if(patron == 0b10)       // Pero si el bit 1 de "patron" es 1 y el bit 0 es 0...
      {
         bit_clear(deco1,3);        // Poner en 0 el bit 3 de "deco1"
      }
      else                          // Y si el dato es 0...
      {
         return 0xFF;               // Es un código ilegal y se retorna 0xFF (255 en decimal)
      }
           
      codif >>= 2;                  // Desplazar 2 bits de "codif" hacia la derecha.
      
      deco2 = deco1;                // "deco2" será igual a "deco1"
   }
      
   codif = nibble[1];               // "codif" será igual al vector 1 del array "nibble"
   
   // Aquí se repite el proceso para obtener el valor de "deco3"...
   if(codif == 0xF0)                // Si el dato es 240 (condición de Inicio/Final encontrado)...
   {
      return 0xF0;                  // Se retorna el mismo valor (0xF0 = 240 Decimal.)
   }
       
   deco1 = 0;
   
   for(c=0;c<4;c++)
   {
      deco1 >>= 1;
      patron = codif & 0b11;       
      if(patron == 0b01)            // 1
      {
         bit_set(deco1,3);
      }
      else if(patron == 0b10)
      {
         bit_clear(deco1,3);        // 0
      }
      else
      {
         return 0xFF;               // Código ilegal.
      }
           
      codif >>= 2;
      deco3 = deco1;
   }

   deco3 <<= 4;                     // Desplazar 4 bits de "deco3" hacia la izquierda.

   resultado = (deco2 | deco3);     // Se hace una operación OR entre "deco2" y "deco3"
   // resultado = (deco2 OR deco3)
   
   x = 0;                           // Se limpian las variables.
   deco1 = 0;
   deco2 = 0;
   deco3 = 0;
   return resultado;                // Se retorna el resultado.
}
Agradezco su colaboración que me sería de gran utilidad. (y):apreton:
y quiciera saber a que horas entras al foro para poder comunicarnos GRACIAS
 
Última edición:
gracias a Dios respondistes... quiero recibir datos en comunicación serial rs232 por el pin GP3
a través de codificación manchester
utilizo dos entradas analógicas GP0 Y GP1, y 2 salidas digitales GP4 Y GP5 por lo que
me seria de gran utilidad utilizar el pin de recepción por rs232 el pin GP3
te agradecería muchísimo si me puedes ayudar (y)

la cuestión es si me puedes hacer el favor y acomodar el código anterior Manch_Rx para que reciba por GP3 GRACIAS
por ultimo quisiera saber tu horario en el foro para charlar a respecto
 
Última edición:
Elimina la interrupción por GP2 y recibe los datos en el bucle principal usando kbhit();
Por ejemplo:
PHP:
while (true)
    {
        if(kbhit())
        {
            dato = getc();
            
            switch (dato)
            {
                case 0x80:
                    // Código
                    break;
                case 0x81:
                    // Código:
                    break;
                default:
            }
        }
    }
 
ok gracias pruebo y te comento (y)

mmm no he podido me puedes hacer ya el ultimo favor y enviarme el código como quedaría completo por favor

he logrado acomodarlo y que funcione, pero tiene errores en la simulación, tal vez mi programación no sea muy buena por lo que no he logrado hacerlo a tu manera con el switch () y el case
HTML:
#include <12f629.h>
#fuses   NOMCLR
#use     delay(internal = 4MHz)
#use     fast_io(a)

#use rs232(baud = 2400, rcv = pin_a3)

char a,b,c,deco1,deco2,deco3,codif,patron,resultado;
char nibble[2] = {0,0};
char x = 0;

int8 decodificar();


void main (void)
{  
   set_tris_a(0xDF);
   output_low(pin_a5);
   port_a_pullups(0x04);
   

  while (true)
    {
        if(kbhit())
        {
            b = getc();
            
               if(x < 2)         // Si x es menor a 2...
               {
                 nibble[x] = b; // El vector "x" del array "nibble" será = a "b"
                 x += 1;        // Se incrementa "x"
               }
               if(x > 1)                  // Si "x" es mayor a 1...
               {
                  x = 0;                  // "x" = 0
                           
                  a = decodificar();      // En "a" se obtendrá el valor de retorno de la función.
         
                    if(a == 0b10101010)     // Si "a" es igual a 0xAA...
                     {
                      output_high(pin_a5); // Se pone en 1 GP5
                     }
                    if(a == 0b10100101)     // Si "a" es igual a 0xA5...
                     {
                      output_low(pin_a5);  // Se pone en 0 GP5
                     } 
               }
        }
    }
}

int8 decodificar()
{
// Función para decodificar los datos Manchester.
   codif = nibble[0];
       
   if(codif == 0xF0)                // Si el dato es 240 (condición de Inicio/Final encontrado)...
   {
      return 0xF0;                  // Se retorna el mismo valor (0xF0 = 240 Decimal.)
   }
   
   deco1 = 0;                       // Se limpia "deco1"
   
   for(c=0;c<4;c++)                 // Bucle de 4 ciclos.
   {
      deco1 >>= 1;                  // Ir desplazando los bits de deco1 hacia la derecha.
      
      patron = codif & 0b11;        // Se hace una operación And entre "codif" y 3 (patron = codif And 3)
      
      if(patron == 0b01)            // Si el bit 1 de "patron" es 0 y el bit 0 es 1...
      {
         bit_set(deco1,3);          // Poner en 1 el bit 3 de "deco1"
      }
      else if(patron == 0b10)       // Pero si el bit 1 de "patron" es 1 y el bit 0 es 0...
      {
         bit_clear(deco1,3);        // Poner en 0 el bit 3 de "deco1"
      }
      else                          // Y si el dato es 0...
      {
         return 0xFF;               // Es un código ilegal y se retorna 0xFF (255 en decimal)
      }
           
      codif >>= 2;                  // Desplazar 2 bits de "codif" hacia la derecha.
      
      deco2 = deco1;                // "deco2" será igual a "deco1"
   }
      
   codif = nibble[1];               // "codif" será igual al vector 1 del array "nibble"
   
   // Aquí se repite el proceso para obtener el valor de "deco3"...
   if(codif == 0xF0)                // Si el dato es 240 (condición de Inicio/Final encontrado)...
   {
      return 0xF0;                  // Se retorna el mismo valor (0xF0 = 240 Decimal.)
   }
       
   deco1 = 0;
   
   for(c=0;c<4;c++)
   {
      deco1 >>= 1;
      patron = codif & 0b11;       
      if(patron == 0b01)            // 1
      {
         bit_set(deco1,3);
      }
      else if(patron == 0b10)
      {
         bit_clear(deco1,3);        // 0
      }
      else
      {
         return 0xFF;               // Código ilegal.
      }
           
      codif >>= 2;
      deco3 = deco1;
   }

   deco3 <<= 4;                     // Desplazar 4 bits de "deco3" hacia la izquierda.

   resultado = (deco2 | deco3);     // Se hace una operación OR entre "deco2" y "deco3"
   // resultado = (deco2 OR deco3)
   
   x = 0;                           // Se limpian las variables.
   deco1 = 0;
   deco2 = 0;
   deco3 = 0;
   return resultado;                // Se retorna el resultado.
}
corrigiendo esto termino, y tu quedaras en las referencias de mi tesis Gracias.. (y)
 
Última edición:
Lo veo bien, y así es como tenía que quedar.
Pero prueba sin compilar el que adjunto, porque está funcionando correctamente.
 

Adjuntos

  • 12F629-675 Manchester Coder-Decoder GP3 Rx.rar
    42.6 KB · Visitas: 5
Muchísimas gracias por esa respuesta, D@rkbytes.

Nunca pensé que sería por ahí el problema, ya corregido (y aprendido):aplauso::aplauso::aplauso:
 
Última edición por un moderador:
El error lo tenías seguramente en la simulación, porque el código así debía de quedar sin la interrupción.
De hecho eso fue lo mismo que hice, porque así tenía que ser.

Suerte.
 
Hola D@rkbytes (y)
tengo otro problema
ya tengo lo anterior: recibir por pin_a3 en rs232...
pero al leer una entrada analógica en pin_a0 y enviar su valor por xmit pin_a2 en rs232
ya no puedo leer mas por rcv pin_a3.

puedo enviar y recibir si desactivo //comprueba (); en la linea 79.. pero solo al llegar el valor correcto del transmisor por cod manchester.
PHP:
#include <12f675.h>
#device adc = 10
#fuses   NOMCLR
#use     delay(internal = 4MHz)
#use     fast_io(a)

#use rs232(baud = 2400, rcv = pin_a3, xmit = pin_a2 )

char a,b,c,deco1,deco2,deco3,codif,patron,resultado;
char nibble[2] = {0,0};
char x = 0;
int16 q = 0;     /// guarda el valor en la entrada adc
//float vol;
int8 decodificar();

void comprueba (void)      //SERIAL RS232
{
      if(q==0){
      putc(q);
      //printf("off\n\r");                    // Enviar dato de pina0
      delay_ms(10);}
      else{
      putc(q);
      //printf("on\n\r");                    // Enviar dato de pina0
      delay_ms(10);}
}

void main (void)
{  
   putc(0);// Estabilizar el bus antes de transmitir datos.
   delay_ms(10); // Retardo de 100Ms antes de empezar

   set_tris_a(0xCB);
   port_a_pullups(0xC0);
   output_low(pin_a5);
   setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC
   setup_adc_ports(sAN0|VSS_VDD);  //configuramos el pin RA0 como analógico
   

   while (true)
   {  set_adc_channel(0);//SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA  LEER.
      delay_us(20);
      q=read_adc();      //guarda en q la lectura adc
      delay_us(20);
      //vol=((5.0*q)/(255.0));

      if(kbhit())
      {
         b = getc();       // Se lee el buffer de recepción y se guarda el dato en "b"
   
         if(x < 2)         // Si x es menor a 2...
         {
            nibble[x] = b; // El vector "x" del array "nibble" será = a "b"
            x += 1;        // Se incrementa "x"
         }
      }
      
      if(x > 1)                  // Si "x" es mayor a 1...
      {
         x = 0;                  // "x" = 0
         
         a = decodificar();      // En "a" se obtendrá el valor de retorno de la función.
         
         if(a == 0b10101010)     // Si "a" es igual a 0xAA...
         {
            output_high(pin_a5);// Se pone en 1 GP5
            putc(q);  // se envía el valor solo si entra el código del transmisor
                       
         }
         if(a == 0b10100101)     // Si "a" es igual a 0xA5...
         {
            output_low(pin_a5);  // Se pone en 0 GP5
            putc(q);  // se envía el valor solo si entra el código del transmisor
                        
         }        
      }
      //comprueba ();  OJO -- ACTIVARLO PARA ENVIAR SIN NECESIDAD DE HABER RECIBIDO
   }  
}

int8 decodificar()
{
// Función para decodificar los datos Manchester.
   codif = nibble[0];
       
   if(codif == 0xF0)                // Si el dato es 240 (condición de Inicio/Final encontrado)...
   {
      return 0xF0;                  // Se retorna el mismo valor (0xF0 = 240 Decimal.)
   }
   
   deco1 = 0;                       // Se limpia "deco1"
   
   for(c=0;c<4;c++)                 // Bucle de 4 ciclos.
   {
      deco1 >>= 1;                  // Ir desplazando los bits de deco1 hacia la derecha.
      
      patron = codif & 0b11;        // Se hace una operación And entre "codif" y 3 (patron = codif And 3)
      
      if(patron == 0b01)            // Si el bit 1 de "patron" es 0 y el bit 0 es 1...
      {
         bit_set(deco1,3);          // Poner en 1 el bit 3 de "deco1"
      }
      else if(patron == 0b10)       // Pero si el bit 1 de "patron" es 1 y el bit 0 es 0...
      {
         bit_clear(deco1,3);        // Poner en 0 el bit 3 de "deco1"
      }
      else                          // Y si el dato es 0...
      {
         return 0xFF;               // Es un código ilegal y se retorna 0xFF (255 en decimal)
      }
           
      codif >>= 2;                  // Desplazar 2 bits de "codif" hacia la derecha.
      
      deco2 = deco1;                // "deco2" será igual a "deco1"
   }
      
   codif = nibble[1];               // "codif" será igual al vector 1 del array "nibble"
   
   // Aquí se repite el proceso para obtener el valor de "deco3"...
   if(codif == 0xF0)                // Si el dato es 240 (condición de Inicio/Final encontrado)...
   {
      return 0xF0;                  // Se retorna el mismo valor (0xF0 = 240 Decimal.)
   }
       
   deco1 = 0;
   
   for(c=0;c<4;c++)
   {
      deco1 >>= 1;
      patron = codif & 0b11;       
      if(patron == 0b01)            // 1
      {
         bit_set(deco1,3);
      }
      else if(patron == 0b10)
      {
         bit_clear(deco1,3);        // 0
      }
      else
      {
         return 0xFF;               // Código ilegal.
      }
           
      codif >>= 2;
      deco3 = deco1;
   }

   deco3 <<= 4;                     // Desplazar 4 bits de "deco3" hacia la izquierda.

   resultado = (deco2 | deco3);     // Se hace una operación OR entre "deco2" y "deco3"
   // resultado = (deco2 OR deco3)
   
   x = 0;                           // Se limpian las variables.
   deco1 = 0;
   deco2 = 0;
   deco3 = 0;
   return resultado;                // Se retorna el resultado.
}

lo que quiero es enviar y recibir en simultáneamente, incluso tan solo activando el switch de la entrada analógica sin antes haber recibido desde el transmisor.

espero me puedas ayudar GRACIAS.. (y)
 

Adjuntos

  • 12F675 GP3 Rx Y input analogica.rar
    85.8 KB · Visitas: 1
No sé qué es lo que quieres hacer, pero debes tener en cuenta que en una comunicación bilateral RS-232, los retardos afectan la sincronización de ambas partes.

Tampoco entiendo por qué en la rutina "comprobar" en cualquier circunstancia se envía el mismo dato.

Prueba de esta forma, ya está funcionando con la rutina "comprobar".
Aunque sólo tú sabrás para qué servirá el programa.

Suerte.
 

Adjuntos

  • 12F675 GP3 Rx y entrada analógica.rar
    35.1 KB · Visitas: 2
Tienes razón
el problema es que tengo que esperar el dato del transmisor para que me muestre el estado de la entrada analógica.

lo que quiero es que me muestre el estado de la entrada analógica sin necesidad de esperar dato del transmisor osea sin haber presionado los botones del transmisor.
y que me muestre el cambio de estado de la entrada analógica con tan solo presionar el switch.

si presiono switch me envié el valor de pin_A0 osea FF (hay corriente)
si no lo presiono me envié el valor del pin_A0 osea 00 estado inicial (no hay corriente)
luego
si presiono algún botón del transmisor, se active o de desactive el led en el receptor..

tu código esta perfecto solo le falta que me muestre el valor 00 o FF desde el inicio y que se cambien tan solo presionando el switch.

o cambia para que dentro de la rutina "comprobar" me envie "on" si (q!=0) en ves de FF, o "off" si (q==0) en ves de 00..

Gracias ante todo te doy muchas Gracias por tu tiempo (y):apreton:

Estoy atascado en este problema ... espero puedas ayudarme a encontrar la solución (y):apreton:
 
Última edición:
Estoy atascado en este problema ... espero puedas ayudarme a encontrar la solución.
¿El problema es sobre lo que mencionas aquí?
Tu código está perfecto, solo le falta que me muestre el valor 00 o FF desde el inicio y que se cambien tan solo presionando el switch.
¿O cambia para que dentro de la rutina "comprobar" me envíe "on" si (q!=0) en ves de FF, o "off" si (q==0) en ves de 00?
Si únicamente quieres comprobar estados lógicos, no es necesario que uses el ADC.
Si envías un "on" tendrás que comprobar una cadena, (dos bytes) y no un carácter. (Un byte)
Y si quieres que se muestre el valor desde el inicio, pues envía el valor desde el inicio. :rolleyes:
 
Hola D@rkbytes (y)
antes que nada, darte las Gracias por toda tu ayuda:aplauso:
¿El problema es sobre lo que mencionas aquí?
Y si quieres que se muestre el valor desde el inicio, pues envía el valor desde el inicio. :rolleyes:
te comento no logre, que desde el principio enviara y recibiera, si envió desde el inicio no ejecuta nada al recibir, no vuelve a funcionar...

"pero logre solucionarlo".. mandando otro valor manchester, y creando la condición,

ya puedo enviar los estados del puerto analógico, pero para enviarlos tengo que recibir primero, un valor manchester para que después imprima la variable que se guarda del estado del puerto analógico, osea recibo y luego si envió... no las dos al tiempo. nunca me funciono o no supe como

pero entonces recibo una variable estado, y hay si envío el resultado...
me toco así para no complicarme, (y)

Agradezco mucho tu tiempo :aplauso::aplauso::aplauso: Graciasssssssssssss
:aplauso: (y) :aplauso: (y) :aplauso: (y) :aplauso: (y) :aplauso: (y) :aplauso: :aplauso: (y) :aplauso: (y) :aplauso: (y)
 
Última edición:
hola puedes creer que todo funciono perfecto en la simulación.:confused: pero a la hora de de probarlo en protoboard no funciona no recibe por GP3 con ninguno de los programas anteriores, solo funciona en simulacion:cry::unsure:
 
Probé físicamente el circuito de los programas del post #35 y funcionan bien, pero noté un detalle que no tomé en cuenta cuando los modifiqué.
A pesar de que el envío y recepción si funcionan, no vi que estás enviando el valor de una variable de 16 bits.
Por RS-232 sólo puedes enviar en byte, no más de forma directa.
Así que la variable "q" debe ser int8 y el ADC a 8 bits.
Y si quieres usar el ADC a 10 bits y enviar la lectura, deberás enviar el MSB y el LSB y ya en el receptor convertirlo a int16.

Pero en fin, el programa funciona en lo que se refiere a Rx y Tx.
Posiblemente tus PIC ya perdieron el valor de fábrica de OSCCAL y por eso no funcionan correctamente.
 
Atrás
Arriba