Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/09/2011 #1


Problemas de comunicación serial de 2 PIC18F4550
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.
08/09/2011 #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
08/09/2011 #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

Código 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,voltportb,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;
         
volt5.0*(lectura/255);
         
calc volt /;
         
calc1 calc /;
         
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;
         
volt5.0*(lectura/255);
         
calc volt /;
         
calc1 calc /;
         
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)


Código 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))
      {      
         
         
         
lecturagetc();
         
enable_interrupts(INT_RDA);
         
enable_interrupts(GLOBAL);
         
delay_ms(20);
         
lectura1=lectura*0.4;
         
volt5.0*(lectura/1023);
         
calc volt /;
         
calc1 calc /;
         
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
      {
      
         
lecturagetc();
         
enable_interrupts(INT_RDA);
         
enable_interrupts(GLOBAL);
         
delay_ms(20);     
         
lectura1=lectura*0.4;
         
volt5.0*(lectura/255);
         
calc volt /;
         
calc1 calc /;
         
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);
      }       
        
   }


08/09/2011 #4


veo que trabajs en CCS por lo los registros no los vas a tocar. Lo has probado asi? funciona?
09/09/2011 #5


Asi como esta funciona pero como dije antes lo unico q falta es la trasmision serial..
09/09/2011 #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
09/09/2011 #7


Gracias mi pana ! Saludos
10/10/2011 #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!
12/10/2011 #9
Moderador

Avatar de D@rkbytes

loloco dijo: Ver Mensaje
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

Imágenes Adjuntas
Tipo de Archivo: gif modedefs.gif (6,2 KB (Kilobytes), 209 visitas)
15/10/2011 #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!!!!
15/10/2011 #11
Moderador

Avatar de D@rkbytes

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
13/01/2012 #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/01/2012 #13
Moderador

Avatar de D@rkbytes

joselo27 dijo: Ver Mensaje
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
13/01/2012 #14


Darkbytes dijo: Ver Mensaje
Toda esa información la encuentras en el archivo P18F4550.INC y en el archivo 18F4550TEMP.ASM
muchas gracias por su respuesta ,.,.,. ya resolvi mis dudas,..,,.,.
13/01/2012 #15


Hola amigo alguien de ustedes sabe como se declara un espacio de memoria en el Pic 18f4550 porfavor me pueden ayudar
04/10/2012 #16


Problema con comunicación serial entre pics 18f4550
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
Archivos Adjuntos
Tipo de Archivo: rar Programa Synchono.rar (66,6 KB (Kilobytes), 57 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.