Problemas de comunicación serial de 2 PIC18F4550

#1
Buenas amigos estoy haciendo un proyecto donde debo hacer la comunicacion serial entre 2 pics 18f4550, pero tengo dudas en cuanto a la programacion de los registros asociados a este procedimiento.
 
#2
que tipo de comunicacion necesitas? sincrona (i2c o spi) o asincrona (rs232 rs485). Si necesitas asincrona la configuracion de los registros es similar a cualquier comunicacion como por ejemplo con el pc, solo que has de colocar los cables cruzados. si necesitas comunicacion sincrona la cosa cambia ya que debes designar un maestro y un esclavo, direcciones etc. ¿que necesitas?
un saludo
 
#3
bueno hermano yo estoy haciendo un verniel digital con transmision inhalanbrica, esta transmision la voy a realizar de forma serial mediante dispositivos rf y lo unico que me falta es programar el puerto serial, pero como no tengo experiencia trabajando con estos protocolos en realidad no estoy muy claro. lo que yo tengo pensado es hacerlo de forma asincrona rs232. aqui coloco los 2 codigos que hasta ahora he hecho


codigo pic 1 envio

PHP:
#include "C:\trabajao de grado\Cyfon\main.h"
#include <LCD.C>
#include <math.h>
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#BYTE TRISd=0XF95
#BYTE PORTd=0XF83
#byte trisc=0XF94
#byte portd=0xf83
//#byte TXSTA= 0XFAC
//#byte baudcon =0XFB8
//#byte CSRC=(CSRC,1)


int i;
int16 lectura,lectura1;
float mm,calc,calc1,pulg,volt, portb,valorb;

void main()
{
   
   setup_adc_ports(AN0|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);  
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
 
  
   
   set_tris_b(0x00);   
   set_tris_c(0b10000000);
   set_tris_a(0x0f);
   set_tris_d(0x00);
   
   setup_adc_ports(AN0);
   set_adc_channel(0);
 
   lcd_init();
   lcd_putc ('\f');
   lcd_gotoxy(1,1);
   
   for (i=0;i<1;i++)
   {

      printf(lcd_putc,"\f");
      lcd_gotoxy(4,1);
      printf(lcd_putc,   "Bienvenido");
      delay_ms(1000);
      printf(lcd_putc,"\f");
      lcd_gotoxy (4,1);
      printf(lcd_putc,"Calibrador ");
      lcd_gotoxy (5,2);
      printf(lcd_putc,"UNEXPO");
      delay_ms(1000);

   }

   while (TRUE)
   {

      if (input (pin_A3))
      {      
         delay_ms(20);
         lectura=read_adc();
         putc (lectura);            //envio de dato serial
         delay_ms(20);
         lectura1=lectura*0.4;
         volt= 5.0*(lectura/255);
         calc = volt /6 ;
         calc1 = calc /2 ;
         pulg = calc1 ;
         mm = pulg*25.4;
         delay_ms(10);
         printf(lcd_putc,"\f");  // Borro la pantalla LCD
         lcd_gotoxy(1,1);
         portb=lectura;  // Lo mando al puerto b         
         printf(lcd_putc,"Pulgadas  = %2.2g ",pulg); // Mando a mostrar el valor del conversor en la LCD
         delay_ms(500);
      }  

      else
      {
      
         delay_ms(20);
         lectura=read_adc();
         putc (lectura);            // envio de dato serial
         delay_ms(20);
         lectura1=lectura*0.4;
         volt= 5.0*(lectura/255);
         calc = volt /6 ;
         calc1 = calc /2 ;
         pulg = calc1;
         mm = pulg*25.4;
         delay_ms(10);
         printf(lcd_putc,"\f");  // Borro la pantalla LCD
         lcd_gotoxy(1,1);
         portb=lectura;                          // Lo mando al puerto b
         printf(lcd_putc,"Milimetros = %2.2g",mm);
         delay_ms (500);
      }       
         
   }

}
codigo pic 2 (recepcion)


PHP:
#include "C:\trabajao de grado\Cyfon\main2.h"
#include <LCD.C>
#include <math.h>
#use delay ()
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#BYTE TRISd=0XF95
#BYTE PORTd=0XF83


int16 lectura,lectura1,volt;
float mm,calc,calc1,pulg,portb;

//#INT_RDA
//RDA_isr()
//{
//lectura=GETC();
//}

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
   lcd_init();
   lcd_putc ('\f');
   lcd_gotoxy(1,1);
   
   
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   set_tris_b (0x00);   
   set_tris_c (0x00);
   set_tris_a (0x0f);
   set_tris_d(0xff);
   lcd_init();
   lcd_putc ('\f');
   lcd_gotoxy(1,1);
   
while (true)
          
{
       
      if (input (pin_A3))
      {      
         
         
         lectura= getc();
         enable_interrupts(INT_RDA);
         enable_interrupts(GLOBAL);
         delay_ms(20);
         lectura1=lectura*0.4;
         volt= 5.0*(lectura/1023);
         calc = volt /6 ;
         calc1 = calc /2 ;
         pulg = calc1;
         mm = pulg*25.4;
         delay_ms(10);
         printf(lcd_putc,"\f");  // Borro la pantalla LCD
         lcd_gotoxy(1,1);
         portb=lectura;  // Lo mando al puerto b         
         printf(lcd_putc,"pulgadas = %2.2g", pulg); // Mando a mostrar el valor del conversor en la LCD
         delay_ms(500);
      }  

      else
      {
      
         lectura= getc();
         enable_interrupts(INT_RDA);
         enable_interrupts(GLOBAL);
         delay_ms(20);     
         lectura1=lectura*0.4;
         volt= 5.0*(lectura/255);
         calc = volt /6 ;
         calc1 = calc /2 ;
         pulg = calc1;
         mm = pulg*25.4;
         delay_ms(10);
         printf(lcd_putc,"\f");  // Borro la pantalla LCD
         lcd_gotoxy(1,1);
         portb=lectura;                          // Lo mando al puerto b
         printf(lcd_putc,"Milimetros = %2.2g",mm);
         delay_ms (500);
      }       
        
   }

}
 
Última edición por un moderador:
#6
pues solo te falta añadir los comandos putc(dato) con los datos que quieras enviar. la configuracion ya la has hecho aquí
Código:
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
un saludo
 
#8
Hola a todos!

Quisiera pedirles ayuda, sucede que estoy tratando de enviar una cadena de caracteres desde un pic18f4550 usando el puerto serial, todo en proteus va bien pero al hacer pruebas ya con el ciruito armado me envía una serie de caracteres muy raros, realice pruebas con un pic16f877 y funciona correctamente, les menciono que he realizado los cambios pertinentes para compilar el 16f y el 18f, pienso que alguna configuración de fusibles o velocidad de reloj se me esté pasando, por favor necesito su ayuda!
 
#9
Hola a todos!

Quisiera pedirles ayuda, sucede que estoy tratando de enviar una cadena de caracteres desde un pic18f4550 usando el puerto serial, todo en proteus va bien pero al hacer pruebas ya con el ciruito armado me envía una serie de caracteres muy raros, realice pruebas con un pic16f877 y funciona correctamente, les menciono que he realizado los cambios pertinentes para compilar el 16f y el 18f, pienso que alguna configuración de fusibles o velocidad de reloj se me esté pasando, por favor necesito su ayuda!
Prueba cambiando el modo de transmisión de datos.
A mi me paso igual una vez y era por eso.
Si los envias a N2400 el receptor tambien los debe recibir a N2400 :apreton:

modedefs.gif
 
Última edición:
#10
Muchas gracias Darkbytes, resulta que en el progama que publicó aestanga se encuentra la siguiente linea: "setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);" la agregué a mi codigo ya que solo la tenia de la siguiente manera: "setup_oscillator(false);" despues de esto todo funcionó de maravilla MUCHAS GRACIAS!!!!
 
#11
Ok. Bueno, como no mencionaste que te referias al código de aestanga,
pense que se debia a otro proyecto, ya que ese tema se trato hace un mes.
Que bien que ya te funciono el programa.
BYE4NOW :apreton:
 
#12
ola compañeros de foro,.,.

la presente es para solicitar información de la programación de la velocidad de reloj del pic18f4550.,. como se configura en asembler,

es que estoy realizando comunicación serial entre dos de estos pics,, entre ellos funciona de maravilla, pero el incoveniente surge al querer utilizarlos con otros dispositivos como un xbee en este caso,.,..,
e intentado de todo, pero no veo incovenientes,, por lo cual mi sospecha radica en el manejo del cristal, ya que este pic tiene un pll y una variedad de formas para configurar la frecuencia del dispositivo,.,.,.

les agradezco su pronta respuesta,.,. no siendo mas me despido
 
#13
ola compañeros de foro,.,.

la presente es para solicitar información de la programación de la velocidad de reloj del pic18f4550.,. como se configura en asembler,

es que estoy realizando comunicación serial entre dos de estos pics,, entre ellos funciona de maravilla, pero el incoveniente surge al querer utilizarlos con otros dispositivos como un xbee en este caso,.,..,
e intentado de todo, pero no veo incovenientes,, por lo cual mi sospecha radica en el manejo del cristal, ya que este pic tiene un pll y una variedad de formas para configurar la frecuencia del dispositivo,.,.,.

les agradezco su pronta respuesta,.,. no siendo mas me despido
Toda esa información la encuentras en el archivo P18F4550.INC y en el archivo 18F4550TEMP.ASM
 
#16
Hola en si el problema no es la comunicacion serial, eso esta funcionando bien, el unico y gran problema que tengo es que no copia el PWM generado a un puerto diferente, he intentado probar con otros puertos, con LAT con PORT y nada de nada, cabe aclarar que lo he hecho antes y me ha funcionado a la perfeccion, esto lo utilizare para mi tesis y me queda poco tiempo jejeje :(, es un control para motores, las salidas se conectan a un puente h para controlar el sentido y velocidad del motor. Gracias por su ayuda y su tiempo.
En esta parte del codigo esta el error creo:

Código:
        if (valor<36 && valor>28)
		{
			PORTBbits.RB0=1;
			PORTBbits.RB1=1;
		}
	if (valor<28)
		{	
			LATBbits.LATB0 = PORTCbits.RC2;
			CCPR1L=(valor-28)*(-9);
			LATBbits.LATB1=0;
		}	
	if (valor>36)
		{
			LATBbits.LATB1 = PORTCbits.RC2;
			CCPR1L=(valor-36)*(9);
			LATBbits.LATB0=0;
		}
Les envio el proyecto con los programas y la simulacion!!
Y de paso si no es mucha molestia, si conocen un transmisor de video que funcione bien. Gracias otra vez
 

Adjuntos

Arriba