TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Abner_emanuel en 21 de Febrero de 2015, 12:13:45
-
Buen día, estoy realizando la comunicación serie de pic a pic con el pic18F4550. Pues resulta que no recibe bien la cadena de números que envía el TX. Etoy utilizando el pic a 32Mhz y pienso que eso tiene algo que ver, quizá la velocidad es elevada para la recepción en Baud. Por favor me podrían orientar.
Aquí pongo los códigos TX y RX.
EL CODIGO TX
#include <18F4550.h>
#device adc=10
#FUSES HSPLL,NOWDT,NOPROTECT,NOLVP,NOPUT,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN,MCLR
#use delay(clock=32MHz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS =8, STOP=1, TIMEOUT=1000, ERRORS)
#use fast_io(b)
int valor;
void main()
{
while(true)
{
for (valor=0;valor<=100;valor++) { printf("\f%2d",valor); delay_ms(100); }
}
}
EL RX
#include <18F4550.h>
#device adc=10
#FUSES HSPLL,NOWDT,NOPROTECT,NOLVP,NOPUT,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN,MCLR
#use delay(clock=32MHz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS =8, STOP=1, TIMEOUT=1000, ERRORS)
#include <lcd4x20.c>
#use fast_io(b)
int valor;
#int_RDA
void RDA_isr()
{valor=getc();}
void main()
{
lcd_init();
set_tris_b(0x0f);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
lcd_gotoxy(1,1); printf(lcd_putc,"recibiendo=%d",valor);
}
}
Anexo código para u descarga y simulación.
-
buenas tardes Abner_emanuel, muchas veces nos centramos en el código cuando el problema puede estar en el hardware, antes de nada asegurate de que los pinse tx y rx esten cruzados de un PIC a otro y que has referenciado las masas, si no referencias las masas los dispositivos tendrán una diferencia de potencial diferente y lo que pa uno puede ser un 0 para el otro puede ser un 1.
un saludo
-
Hola juaperser1
No lo tengo armado físicamente aun, pero si lo voy a armar el día de hoy y comento.
Yo imagine que hera por la velocidad del pic que no me permitía recibir bien los datos, pero lo armo físicamente y te digo.
Gracias por responder
-
:-/
Ya quedo solucionado, el problema estaba en el envío del dato por el transmisor
El dato lo envíe como: putc(valor); y yo lo estaba enviando como printf.
Saludos..
-
putc() es para una letra creo..
Si no me equivoco usan:
printf(putc,"Mensaje a enviar");
-
enorabuena trasteando se arreglan las cosas
-
Gracias por comentar, asi es como quedo el TX con algunos cambios.
Saludos a todos...
#include <18F4550.h>
#FUSES HSPLL,NOWDT,NOPROTECT,NOLVP,NOPUT,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN,MCLR
#use delay(clock=32MHz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS =8, STOP=1, TIMEOUT=1000, ERRORS)
#use fast_io(b)
unsigned int iluminacion=0;
int tiempo=10;
void main()
{
while(true)
{
if(input(pin_b1)==0 && iluminacion>=0&&iluminacion<100) {iluminacion++; delay_ms(tiempo); putc(iluminacion);} // No pasa de 100
if(input(pin_b2)==0 && iluminacion<=100&&iluminacion>0) {iluminacion--; delay_ms(tiempo); putc(iluminacion);} // No baja de 0
}
}
-
unsigned int iluminacion=0;
if(input(pin_b1)==0 && iluminacion>=0&&iluminacion<100) {iluminacion++; delay_ms(tiempo); putc(iluminacion);} // No pasa de 100
Lo definis sin signo por lo cual jamas va a ser menor que 0, y estas agregando un condicion mas. Y el maximo es 99
Al igual con:
if(input(pin_b2)==0 && iluminacion<=100&&iluminacion>0) {iluminacion--; delay_ms(tiempo); putc(iluminacion);} // No baja de 0
Aqui tambien tenes una condicion de mas ya que ese solo te importa que entre para bajar el numero de iluminacion, por lo cual solo te importaria el limite inferior que creo que la mejor conversion a codigo maquina seria si es iluminacion!=0 , ya que constaria con 2 instrucciones de ASM pero eso es otro capitulo aparte.
-
Una vez mas gracias por tu comentario KILLERJC, cada vez me sirven de mucho.
Realice un dimmer controlado por RF, en unos días subo el vídeo.
Saludos..
-
Por fin realice el Dimmer RF, aquí en enlace del vídeo:
https://www.youtube.com/watch?v=ZCmQHi93x_M
-
Funciona muy bien enorabuenA
-
Se ve muy bien tu Dimmer rf. Que distancia alcanzará el modulo del dimmer?.
-
Saludos...
E probado la comunicación a una distancia de 25 mts con linea de vista y con obstáculos el modulo alcanza 15 mtrs atravesando las paredes de mi habitación.
Gracias por su interés.