TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dssss en 16 de Febrero de 2010, 15:39:13
-
Saludos a todos, tengo un problema con un programa aver si me pueden ayudar.
El programa es bien simple consta de 2 micos 16f877 los cuales uno hace de emisor y otro de receptor mediante la usart. A la entrada del emisor hay un pulsador, cuando se pulsa el emisor emite el numero 23 y el receptor recibe el dato mediante una interrupcion, chequea una varialbe donde se guarda lo que ha recibido y si es 23 pone el puerto d a 1.
los programas serian estos
Emisor:
#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay (clock = 4000000)
#use rs232(uart1, baud=2400)//usart1 -->ajuste de XMIT y RCV para la USART 1
#byte porta = 0x05
void main()
{
char c;
set_tris_a(0xff);
c = 23;
while(1)
{
while(porta == 0x01)
{
putc(c);//Envía el caracter vía serie por la USART del PIC
}
}
}
Receptor
#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay (clock = 4000000)
#byte puerto_d = 0x08
#use rs232(uart1, baud=2400)
char dato;
#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{
dato = getc();
if (dato==23)
puerto_d = 0xff;
}
void main()
{
enable_interrupts(global);//Habilito interrupción USART
enable_interrupts(int_rda);
set_tris_d( 0x00 ); // Puerto D como salida.
puerto_d = 0x00;
while(true){
}
}
he simulado y probado el circuito en la practica real y el emisor va bien transmite el dato , sin embargo nose porque no consigo por mas que modifico el programa que el receptor reciba el dato.
¿podeis ayudarme?
muchas gracias a todos
-
Lo he simulado tal y como está el codigo y si recibe el dato. Solo que una vez que activas el puertod ya no lo vuelves a desactivar. Verifica tus conexiones, los fuses cuando quemas el micro, los cristales(deben ser de 4Mhz ),los pines a los cuales tienes conectados el TX y el RX, y que los dos micros tengan el pin MCLR a positivo.
-
gracias por contestar pablomanieri , he podido solucionar el problema en el simulador , era un parametro de las opciones del micro. En cuanto a la vida real... sigo igual el montaje esta bien hecho los los reset a vcc el oscilador bien puesto y de 4 mhz etc. me pasa lo que decia antes el micro emisor se que transmite porque le tengo un osciloscopio enganchao sin embargo el receptor no recibe nada. he pensado que puede ser que tenga que poner algun delay o algo parecido entre lecturas o envios. y sobre la perdida de datos no creo que sea porque los micros estan a a 5 centimetros , ¿se os ocurre alguna otra cosa o error a alguno?
en cuanto lo de resetear el puerto d no lo hago porque solo estoy intentando enviar un dato haciendo el programa mas simple que se pueda, es decir el programa no tiene ningun fin solo encender un led conectado al puerto d cuando se transmita el dato correcto
EDITO: he soucionado el problema, lo que daba problemas era la interrupcion, parece ser que en la practica da problemas. El codigo del receptor quedaria asi
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay (clock = 4000000)
#byte puerto_d = 0x08
#use rs232(uart1, baud=2400)
char dato=0;
void main()
{
set_tris_d(0x00); // Puerto D como salida.
puerto_d = 0x00;
while(true){
dato = getc();
if (dato==23)
{
puerto_d = 0xff;
}
}
}
aun sigo teniendo la duda de porque la interrupcion de recepcion funciona en la simulacion y en la practica no, poque es una cosa curiosa de verdad xD
gracias y saludos