Autor Tema: problema con la usart pic16f877  (Leído 2389 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dssss

  • PIC10
  • *
  • Mensajes: 7
problema con la usart pic16f877
« 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

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: problema con la usart pic16f877
« Respuesta #1 en: 16 de Febrero de 2010, 15:59:53 »
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.

Desconectado dssss

  • PIC10
  • *
  • Mensajes: 7
Re: problema con la usart pic16f877
« Respuesta #2 en: 16 de Febrero de 2010, 16:49:10 »
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
« Última modificación: 16 de Febrero de 2010, 17:20:42 por dssss »


 

anything