# Comunicación serial entre 2 PIC´s



## lomesmo (Nov 16, 2011)

Hola saludos a todos, quería preguntar sobre un proyecto que estoy realizando. El proyecto consta de 2 PIC que se comunican de manera serial por los puertos TX/RX.

El primero de ellos 16F887 realiza 3 lecturas (Temperatura, Humedad y Presión) mediante el conversor A/D integrado, las cuales debe enviar el segundo PIC 18F2550 el cual se encargará de mostrarlas en una pantalla LCD. El problema que tengo es que no logro enviar más de una variable a la vez, o sea si envío temperatura la muestra pero no puedo enviar presión o humedad, necesito al menos ver 2 variables al mismo tiempo en la pantalla. Otro problema que tengo, es que en el 16F887 yo realizaba las conversiones a voltaje de una vez, pero esas conversiones no las muestra el 18F2550, o sea no muestra el valor real, esto lo solucione realizando las conversiones en el 18F2550 pero me gustaría saber si hay una solución.

PIC de envío:


```
#include <16F887.h>              //Declaracion del PIC
#device adc=10                   //Uso de conversor
#fuses XT,NOWDT                  //Fusibles
#use delay (clock=4000000)       //Frecuencia de reloj
#include <LCD.c>                 //Declaracion de LCD
#include <math.h>
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7)

void main (){                                //Inicio
int16 q;                                     //Entero de X bits
float error,presion,p,r,temp,TF,tr,x,y,z;  //Flotantes

setup_adc_ports(sAN0|sAN1|sAN2); //Declaracion de puertos A/D
setup_adc (adc_clock_internal);  //Uso de reloj interno

lcd_init ();                     //Inicia el LCD
for (;;){                        //Para
   set_adc_channel(0);           //Lectura de puerto
   delay_us (20);                //Retraso obligatorio
   q = read_adc();               //Asigna el valor
   putc (q);
   p = (q*100)*5.0/1024.0;       //Conversión de temperatura
   tr = p*10000.0/(5.0-p);       //Inicia proceso de error
   y = log(tr/20000.0);
   y = (1.0/298.15)+(y*(1.0/4050.0));
   temp = 1.0/y;
   temp = temp-273.15;
      if (temp>=0 && temp<=85) TF=1.0;
      else TF = 3.0;
      error = TF*1.5;            //Finaliza proceso de error
   set_adc_channel(1);           //Lectura de puerto
   delay_us (20);                //Retraso
   q = read_adc();               //Asignación
   r = q*5.0/1024.0;             //Conversión
   presion = (0.475+r)/0.045;    //Formula de presión
   presion = presion-error;      //Presión real
   set_adc_channel (2);
   delay_us (20);
   //q = read_adc();
   //x = q*5.0/1024.0;
   z = ((x/5)-0.2354)/0.00474;
   printf (lcd_putc, "\fETemp = %1.2fC", p);
   printf (lcd_putc, "\nPres = %1.2fKpa", presion);
   //printf (lcd_putc, "\nHrel = %1.2fP", z);
   delay_ms (200);
}
}
```


Lo que esta en negrita es lo que yo envío y convierto en el 18F2550, por que el valor *p* no se envía correctamente.

PIC de recepción:

```
#include <18F2550.h>             //Declaracion del PIC
#fuses XT,NOWDT                  //Fusibles
#use delay (clock=4000000)       //Frecuencia de reloj
#include <LCD.c>                 //Declaracion de LCD
#include <math.h>
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#byte trisA=0x85
#byte portA=0x05
int16 v,w,x;
float a,b,c;

#int_RDA
void RDA_ISR ()
{
v=getc ();
a = (v*100)*5.0/1024.0;
}
void main (){
bit_clear (trisA,0);
lcd_init ();
   enable_interrupts (INT_RDA);
   enable_interrupts (Global);
   for (;;){
   lcd_gotoxy (1,1);
   printf (lcd_putc, "\fTemp = %1.2fC", a);
   //printf (lcd_putc, "\nPres = %1.2fKpa", presion);
   //printf (lcd_putc, "\nHrel = %1.2fP", z);
   delay_ms (200);
}
}
```

Lo que esta en negrita es la recepción y conversión del valor de alguna variable. Yo puedo recibir un valor, pero no se como recibir 2,3 o más.

Diagrama:


----------



## CARLOS0907 (Nov 16, 2011)

Hola lomesmo si quieres enviar los datos por serial, para facilitarte las cosas de recomiendo usar datos de 8bit, puedes cambiar la resolución del adc a 8 bits,

una forma seria que el pic 18f2550 solicite los datos con eso lo que puedes hacer es definir usar lo siguiente en el pic 16f877



```
if(kbhit()){ // en espera de nuevo(s) carácter(es) en el buffer.

switch(getc()) {

case 'x':

putc(a);

break;
case 'y':
;
putc(b);

break;
case 'z':

putc(c);

break;
default:
}
}

y desde el pic 18 algo como lo siguiente

void main(){
float fa,fb,fc;
int8 a,b,c;
while(true){

putc('x');
getc(a);
fa=........a;
delay_ms(500);
putc('y');
getc(b);
fb=........b;
delay_ms(500);
.......
......
//al final visualizasas todos lo datos

}
```

espero te sea útil, nos cuentas como te va.


----------



## lomesmo (Nov 16, 2011)

Gracias funciono muy bien, pero ahora me surgio otro problemilla. Por algún motivo no puedo enviar data entre los PIC'S que supere los 255 me explico, si utilizo el conversor A/D para medir 25mV obtengo un valor en el PIC supongamos de 58, cuando la medición en el PIC supera los 255 entonces se reinicia el valor haciendo una resta (ValorX-255= Resultado de pantalla). Ya intente varias cosas pero no me funciona, tampoco logro enviar valores FLOAT unicamente INT.


----------



## CARLOS0907 (Nov 16, 2011)

hola lomesmo eso sucede por varias cosas:
1. 255 es el máximo valor que puedes representar con 8 bits(1 byte), por eso te aconseje que usaras las resolución del adc a 8 bits (#device adc=8).
2 un dato float en ccs esta representado por 2 bytes en los que se define un formato de signo-mantisa-valor,es decir los números se representan en un formato algo diferente definido por la IEEE. como putc imprime un dato de 1 byte  solo tomara el byte menos significativo. Cuando pasa de 255 (0x00ff)el siguiente valor 256(0x0100) si te fijas es cero en el byte menos significativo.


solución: cambia la resolución del adc, define el dato leído como int8 o char, y la operación para convertir el dato la haces en el pic18.esta es la sencilla.

para 10 bits podrías enviar los datos con "puts()"(imprime un string en donde si podrías enviar la palabra de 2 bytes) pero se te va a complicar cuando recibas el dato porque la función par recibir string es gets(), la dificultad esta en que tienes que enviar el caracter de fin de carro para que el dispositivo receptor pueda continuar el programa.que equivale a enviar después del puts(float);un putc('\n'); en el transmisor.

espero haberme hecho entender, éxitos, nos cuentas como te va.


----------



## josb86 (Nov 16, 2011)

si tienes una variable de por lo menos 10 bit trata de dividir los 8 bits menos significativos y envía la variable y después envías los mas significativos, lo puedes hacer con una instrucción que es de corrimiento hacia la derecha.


----------



## lomesmo (Nov 17, 2011)

Buenas podrian explicarme mejor ambos metodos, el de dividir los bits mas significativos y luego correr los demás y el de enviar float con puts(). Es que ya intente colocar lo de int8 y adc=8 pero no obtengo los valores que si obtengo con int16 y adc=10.


----------



## CARLOS0907 (Nov 17, 2011)

con 8 bits haces la conversión así :  a = (v*100)*5.0/256.0;


----------



## lomesmo (Nov 17, 2011)

Gracias carlos funciono al fin funciono  aunque la presición se va un poco al caño  pero funciona todo. Gracias por la ayuda.


----------



## CARLOS0907 (Nov 17, 2011)

Por nada, para eso estamos, me alegra mucho que todo te haya salido bien. Exitos


----------



## josb86 (Nov 21, 2011)

lomesmo dijo:


> Buenas podrian explicarme mejor ambos metodos, el de dividir los bits mas significativos y luego correr los demás y el de enviar float con puts(). Es que ya intente colocar lo de int8 y adc=8 pero no obtengo los valores que si obtengo con int16 y adc=10.



bueno mira te explico,

digamos que tienes unas variable int16 A_D, en esta variable guardas la conversión de 10bits ahora lo que hacemos es que dividimos la variable en dos variables mas

int8 A_D_1 
int8 A_D_2

por ejemplo si alguna conversion en int16 A_D = 0000 0010 0110 1100
entonces

int8 A_D_2 = int16 A_D; con esto copiamos los 8 bits menos significativos de la variable int16 a la bariable int8 (0110 1100)

para corrimiento hacia la derecha utilizamos el operador >> buscar en ccs "Operadores de manejo de bits"


int8 A_D_1 = int16 A_D >> 8; el 8 es para mover 8 bits hacia la derecha, con esto te quedarían dos variables de 8 bits (0000 0010) que puedes enviar por serial.


ahora en el pic que recibe crea una variable int16 A_D y haces corrimiento hacia la izquierda;

int16 A_D = int8 A_D_1 << 8; (int16 A_D = 0000 0010)

y haces una AND entre int16 A_D y int8 A_D_2 que recibes 

int16 A_D = int16 A_D & int8 A_D_2; (int16 A_D = 0000 0010 0110 1100)


----------



## josb86 (Nov 23, 2011)

perdon en la ultima parte no es int16 A_D = int16 A_D & int8 A_D_2; (int16 A_D = 0000 0010 0110 1100)

si no

int16 A_D_2 = int16 A_D & int8 A_D_2;


----------



## robertosebastian92 (May 29, 2013)

Hola gente del foro, hago un nuevo tema debido a que no hay ninguna propuesta de comunicación serie entre pics que no tengan registros "PORT" y que hallan sido en PSI. 

Hoy por primera vez estoy trabajando con la gama chica de PIC, estoy usando el PIC12F675 jamas lo había usado antes. Y estoy programando en el Pic Simulator Ide que trae algunos modelos de la gama 12FXXX

Verán, la *c*uestión es que quiero comunicar los 2 pic por medio del UART, osea datos serie,
pero no logro hacer nada, he tratado de muchas formas pero todo se resume a formas sencillas,
no me he metido muy adentro en las configuraciones del pic.

Mi pic transmisor (12F675) tiene este código



```
Define CLOCK_FREQUENCY = 4


Define SEROUT_DELAYUS = 5000

Dim ocho As Byte
Dim nueve As Byte

ocho = 8
nueve = 9

loop:
Serout GP0, 9600, #nueve
WaitMs 500
Serout GP0, 9600, #ocho  
WaitMs 500

Goto loop
```
Mi pic receptor (12F675) tiene este código



```
Define CLOCK_FREQUENCY = 4

Dim i As Byte

AllDigital

Define SEROUT_DELAYUS = 5000

TRISIO.5 = 0
'TRISIO.3 = 0
'TRISIO.4 = 0

loop:



Serin GP0, 9600, i



If i = 8 Then
GP5 = 1
WaitMs 50
Endif


If i = 9 Then
GP5 = 0
WaitMs 50
Endif

Goto loop
```
Como verán básicamente al reci*b*ir un 8, el pic esclavo debe encender el puerto GP5 y al reci*b*ir un 9 debe apagarlo.

He conseguido enviar el 8 y logre encender el led (en la vida real fuera del PSI) pero el 8 parece ser el único número que reconoce si envío el 9 después de hacer unas cuantas pruebas es como si enviara ochenta y pico.. Es algo bastante raro, esto me cuesta mucho entenderlo, se que a estos micros que no traen (XR,XT) hay que hacerles una implementación por software.
¿Alguien me puede dar una mano con un ejemplo simple o me dirían en que me equivoco?
Muchas gracias de antemano


----------



## D@rkbytes (May 29, 2013)

En el código del transmisor agrega AllDigital y envía los datos sin usar #

Saludos.


----------



## robertosebastian92 (May 29, 2013)

Muchas gracias D@rkbytes. Recién testeando en el osciloscopio me di cuenta de la diferencia. Ahora se invirtió la señal de transmisión, y ciertamente parece haber mejorado en cuanto a velocidad, el tema está en que aun no puedo apagar el led, no veo ninguna razón aparente. Este es el código actual con la modificación que me propusiste.

transmisor

```
Define CLOCK_FREQUENCY = 4



AllDigital


Define SEROUT_DELAYUS = 5000



loop:
Call transmitir(0x01)  '8
Call transmitir(0x02)  '3
Goto loop


End                                               




Proc transmitir(dato As Byte)
Serout GP0, 9600, dato
WaitMs 500
End Proc
```

RECEPTOR


```
Define CLOCK_FREQUENCY = 4


AllDigital

Define SEROUT_DELAYUS = 5000

Dim i As Byte


TRISIO.5 = 0
TRISIO.4 = 0

loop:
Serin GP0, 9600, i
WaitMs 50

If i = 0x01 Then
GP5 = 0
'GP4 = 1
WaitMs 50
Endif

If i = 0x02 Then
GP5 = 1
WaitMs 50
Endif


Goto loop
```

Esto es algo realmente extraño a que se debe? no encuentro ninguna razón aparente. Saludos y muchas gracias por colaborar.


----------



## D@rkbytes (May 30, 2013)

robertosebastian92 dijo:


> Esto es algo realmente extraño a que se debe? no encuentro ninguna razón aparente. Saludos y muchas gracias por colaborar.


Definitivamente yo tampoco sé a que se deba el mal funcionamiento.
Todo parece indicar que es el PIC Simulator IDE el que tiene problemas con la instrucción SerIn.

Estuve tratando de hacerlo funcionar usando Select Case y cambiando los retardos, pero nada.
Sin embargo los mismos programas funcionan bien con PICBasic Pro.
El problema no está en el código de transmisor, sino en el receptor,
ya que el programa del receptor compilado con PBP funciona con ambos programas transmisores.

En la simulación funcionan ambos programas, pero físicamente el programa Rx compilado con el PSI, no funciona.
PICBasic Pro tiene el uso de la instrucción SerIn mas amplia que la del PIC Simulator IDE.

Envío el proyecto con ambos programas, los archivos *.hex con guión bajo son los de PSI, los otros de PBP.
Notarás que los programas son similares, pero el código del receptor compilado con PBP, si funciona.

Nota:
La única forma de que en PIC Basic Pro funcionara, fue cambiando la velocidad a 2400bps, y usando Select Case.

Si logras encontrar la posible causa, coméntanos por favor.

Saludos.


----------



## D@rkbytes (Jun 1, 2013)

Estudiando un poco el comportamiento de la transmisión y recepción con PIC simulator IDE, logré la comunicación.
Los problemas eran debido a los retardos, usar If para comparar, la velocidad de transmisión y el uso de SEROUT_DELAYUS.

Adjunto los programas con los cambios realizados, y ya funcionando físicamente.

Notas:
Agregué la palabra de configuración habilitando el Master Clear, ya que por alguna razón que desconozco,
al compilar los programas con los fuses predeterminados del PSI, al tratar de regrabar los PIC,
el programa WinPic800 ya no los reconocía, así que habilite el pin de Master Clear para solucionarlo.
Con PICBasic Pro y otros compiladores no me pasa esto, solo con PIC simulator IDE.

Saludos.


----------



## robertosebastian92 (Jun 5, 2013)

Hola D@rkbytes muchísimas gracias por tu ayuda, sin embargo logre una comunicación perfecta usando “if” y en PSI sin ningún problema, luego de hacer muchísimas pruebas en el osciloscopio de recepción y transmisión de datos. Llegue a la conclusión de que había una desincronización terrible de información. Lo solucione usando números múltiplos de la freq del pic 4.000Mhz, use 1000 baudios, 4000 baudios y 10000 baudios. Para el de 10000 baudios realmente anduvo excelente pero con distancia de cable corta. mas de 15 centímetros ya perdía información.

Para explicar un poco de que se trata y le den un poco de sentido al programa, se trata de una llave electrónica. Envía un código y el receptor da un flanco alto si el código es exactamente igual. Anda perfecto!

Datos:
uC: 2 x 12F675
XTal: 4Mhz (interno)

Advertencia: Sacar fuses anti copia para no bloquear la lectura del pic!

LLAVE (Transmisor)

```
Define CLOCK_FREQUENCY = 4
Define CONF_WORD = 0x3044 'Configuración anti copia

TRISIO.1 = 1
TRISIO.2 = 0
TRISIO.5 = 0
GP2 = 0
GP5 = 0
AllDigital
Define SEROUT_DELAYUS = 5000

loop:
Call transmitir(1)
Call transmitir(2)
Call transmitir(3)
Call transmitir(4)
Call transmitir(5)
Call transmitir(6)
Call transmitir(7)
Call transmitir(8)
Call transmitir(9)
Call transmitir(10)
Goto loop

End                                               


Proc transmitir(dato As Byte)
Serout GP0, 1000, dato
GP2 = GP1
GP5 = Not GP1
WaitMs 5
End Proc
```

RECEPTOR


```
Define CLOCK_FREQUENCY = 4
Define CONF_WORD = 0x3044  'Configuracion anti copia
AllDigital
Define SEROUT_DELAYUS = 5000
Dim i As Byte
TRISIO.5 = 0
TRISIO.4 = 0
GP5 = 0
GP4 = 0


Dim codigo(9) As Byte
codigo(0) = 1
codigo(1) = 2
codigo(2) = 3
codigo(3) = 4
codigo(4) = 5
codigo(5) = 6
codigo(6) = 7
codigo(7) = 8
codigo(8) = 9
codigo(9) = 10
Dim posicion_de_respuesta As Byte
posicion_de_respuesta = 0


loop:
	Serin GP0, 1000, i
	GP4 = GP5
	If codigo(posicion_de_respuesta) = i Then
		If posicion_de_respuesta = 9 Then GP5 = 1
		posicion_de_respuesta = posicion_de_respuesta + 1
		If posicion_de_respuesta > 9 Then posicion_de_respuesta = 0
	Else
		posicion_de_respuesta = 0
		GP5 = 0
Endif

i = 0

Goto loop
```

Espero que les sea de mucha utilidad estos datos! 
Si me hago un poco de tiempo otro día subo el circuito.


----------



## Sant0 (Oct 18, 2013)

Por favor pueden subir el proyecto completo de CCS y el esquema por favor!!!

Tengo 2 PIC 18f2550 y no logro hacerlos comunicar entre ellos... 

EMISOR:

```
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#include <comunicacion.h>
#use delay(clock=20000000)

#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232

#use fast_io(b) 


#define OUT output_b
#define PS delay_ms(100);

#define SW1 PIN_C0 
#define SW2 PIN_C1
#define SW3 PIN_C2


void main()
{

   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   set_tris_b(0x00);    //Salidas
   //set_tris_c(0x10111111);    //Pin C6 salida, resto entradas
   char salida;
   
   
   while(true)
   {
      salida = 0x00;
      OUT(salida);
      
      if( input(SW1) == 1 )
      {
         salida = 0xFF;
         OUT(salida);
         PS;
         salida = 0x00;
         OUT(salida);
         salida = 'R';
         putc(salida);
      }
      
      if( input(SW2) == 1 )
      {
         salida = 0xFF;
         OUT(salida);
         PS;
         salida = 0x00;
         OUT(salida);
         salida = 'G';
         putc(salida);
      }
      
      if( input(SW3) == 1 )
      {
         salida = 0xFF;
         OUT(salida);
         PS;
         salida = 0x00;
         OUT(salida);
         salida = 'B';
         putc(salida);
      }
      
   
   }


}
```


RECEPTOR:

```
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#include <comunicacion.h>
//#include <Receptor RS232.h>

#use delay(clock=20000000)

#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232

#use fast_io(b) 

#define SW1 PIN_C0 
#define SW2 PIN_C1
#define SW3 PIN_C2

#define PS delay_ms(100)
#define OUT output_b




/*#int_RDA
void RDA_ISR ()
{
   data=getc ();

}*/

void main(void)
{
   //int8 data;
   //enable_interrupts (INT_RDA);
   //enable_interrupts (Global);
   char salida;
   char data;
   
   
   set_tris_b(0x00);    //Salidas
   //set_tris_c(0xBF);    //Pin C6 salida, resto entradas
   OUT(0xFF);
   
   while(true)
   {
      
      if(kbhit())
      {
         data = getc();
         
         switch(data)
         {
            case 'R':
                  
                  salida = 0x80;
                  OUT(salida);
                  PS;
                  break;
            case 'G':
                  
                  salida = 0x40;
                  OUT(salida);
                  PS;
                  break;            
            case 'B':
                  
                  salida = 0x20;
                  OUT(salida);
                  PS;
                  break;        
            default:
                  
                  salida = 0xF0;
                  OUT(salida);
                  PS;
                  break;
         }
         
         
               
      }        
   }
}
```


GRACIAS!


----------



## Henry1990 (Dic 24, 2014)

Hola compañeros. ¿Cómo están? Disculpen que moleste en navidad, lo que pasa es que quiero ver si me pueden ayudar con un problema que tengo.

Verán, estoy haciendo un proyecto pero tengo un problema, quiero mandar datos de un PIC16F628A a un PIC18F4550.
El problema que tengo es al momento de transmitir los datos del PIC16F al PIC18F.
Verán mi programación.

Transmisor:

```
include "modedefs.bas"
; Declaraciones de Variables del LCD
CMCON=7
TRISB=0
TRISA=%11100001
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2

HH var byte
H var byte
L var byte
LL var byte
HH=5/2
H=2
L=1
LL=1/2

Altura var word
Sirena1 var byte
Sirena2 var byte
Sirena3 var byte
Sirena4 var byte


dato VAR BYTE


; Fin de las Declaraciones de Variables
; Inico del Programa a transmitir
transmitir:
POT porta.0,255,dato ;leer el potenciómetro y guardar en dato
pause 200
LCDOUT $FE, 1
LCDOUT $FE, $80,"Rango" ;limpiar pantalla y escribir rango=
LCDOUT $FE, $C0, dec dato ;mostrar el valor decimal de dato



LCDOUT $FE, $85,"Altura"
LCDOUT $FE, $C5, dec Altura
PAUSE 200

Altura=(dato/(85))
Sirena1=((2125/4)/(dato))
Sirena2=((340)/(dato))
Sirena3=(85/dato)
Sirena4=((85/4)/dato)

IF Sirena1>=HH THEN GOSUB sonido1
IF Sirena1>=HH THEN GOSUB envio1
IF Sirena2<HH AND Sirena2>=H THEN GOSUB sonido2
IF Sirena3<H and sirena3>=L THEN GOSUB sonido3
IF Sirena4<=LL THEN GOSUB sonido4


goto transmitir
; Fin del inicio del programa a transmitir

sonido1: ;Alarma HH
SOUND portb.0, [80,10]
high led3
low led1
low led2
high led4
return

sonido2: ; Alarma H
high led1
pause 200
low led1
low led2
high led4
low led3
pause 300

return

sonido3: ; Alarma L

high led2
pause 200
low led2
return

sonido4: ; Alarma LL
SOUND portb.1, [100,10]
low led4
pause 200
high led4
low led2
low led3
low led1
return

; Datos a enviar
envio1:
SEROUT porta.6,N2400,["A"] ;enviar "A" a 24008N1
PAUSE 500
GOTO transmitir
```
RECEPTOR:

```
include "modedefs.bas"
cmcon=7
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2

 ledr var porta.0
 leda var porta.1
 ledv var porta.2
 led4 var porta.3
 datos var byte
 
 
high ledr
pause 500
low ledr

recibir:
serin portb.0, N2400, datos
if datos="A" then mostrar  



goto recibir
; muestra de LED
mostrar : 
POT porta.0,255,dato ;leer el potenciómetro y guardar en dato
pause 200
LCDOUT $FE, 1
LCDOUT $FE, $80,"Rango" ;limpiar pantalla y escribir rango=
LCDOUT $FE, $C0, dec dato ;mostrar el valor decimal de dato

LCDOUT $FE, $85,"Altura" 
LCDOUT $FE, $C5, dec Altura
PAUSE 200
; FIN DE MUESTRA
end
```
Como ven en la imagen, quiero que los datos que me salen en el LCD del PIC16F628A, me salgan en el LCD del PIC18F4550 y no sé que está mal.
PD: los datos varían dependiendo como varío el potenciómetro.

Gracias de antemano.


----------



## D@rkbytes (Dic 24, 2014)

Henry1990 dijo:


> Verán, estoy haciendo un proyecto pero tengo un problema, quiero mandar datos de un PIC16F628A a un PIC18F4550.
> El problema que tengo es al momento de transmitir los datos del PIC16F al PIC18F.
> Verán mi programación.
> 
> ...


¿Cuál es la palabra de configuración que estás usando en cada PIC?
En los códigos no la estás poniendo, eso es importante y puede ser el problema.


----------

