TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cryn en 18 de Mayo de 2006, 13:22:26
-
Hola saludos debo realizar una comunicación entre dos PICs, cual es la mas óptima? use Usart, este es mi codigo para el transmisor:
#include<16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)
#use rs232 (baud=240,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#use fast_io(b)
#byte port_b=0x06
void main()
{
int dato=0; // Reserva de espacio de memoria
set_tris_b(0xff); // Se usarán RB4 a 7 para el ingreso de los datos
port_b=0; // Se inicializa puerto B
while(true) // Ciclo infinito
{
//while(dato!=0) // Si se ha presionado ningún pulsador
// {
// dato variará segun pulsador presionado, pulsadores en RB4 a RB7
dato=port_b; // Se copia el valor del puerto B a la variable dato
switch(dato)
{
case 0x10: putc('A'); // por cada pulsador se envia un codigo diferente
break;
case 0x20: putc('B');
break;
case 0x40: putc('C');
break;
case 0x80: putc('D');
break;
default:
break;
}
// }
}
}
hay partes del código que estan en comentario ya que haciendo la simulación en Proteus si estan presentes esas líneas no envia nada, descartando eso envia pero creo muchas veces porque hace habilitar en el receptor muchas veces la accion y no para, y existe error, solucionandolo con el reset por hardware.
este mi codigo en el receptor:
#include<16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)
#use rs232 (baud=240,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#use fast_io(b)
#byte port_b=0x06
void main()
{
int dato=0,i;
set_tris_b(0x0f);
port_b=0;
while(true)
{
if(kbhit()) // si hay algo pendiente de descargar en la USART...
{
dato=getc(); // lo descargo sobre la variable -dato-
switch(dato) // según dato recibido se hace lo que corresponda
{
case 'A': //for (i=0;i<=3;i++)
{
output_high(PIN_B4);//port_b=0x10;
delay_ms(500);
output_low(PIN_B4);//port_b=0;
delay_ms(500);
}
break;
case 'B': //for(i=0;i<=3;i++)
{
output_high(PIN_B5);//port_b=0x20;
delay_ms(500);
output_low(PIN_B5);//port_b=0;
delay_ms(500);
}
break;
case 'C': //for(i=0;i<=3;i++)
{
output_high(PIN_B6);//port_b=0x40;
delay_ms(500);
output_low(PIN_B6);//port_b=0;
delay_ms(500);
}
break;
case 'D': //for(i=0;i<=3;i++)
{
output_high(PIN_B7);//port_b=0x80;
delay_ms(500);
output_low(PIN_B7);//port_b=0;
delay_ms(500);
}
break;
default: port_b=0;
break;
}
dato=0; // restablesco dato
}
}
}
en este caso quisiera que un led segun el codigo recibido parpadee cuatro veces, eso lo hice con el ciclo for, y como mencione creo ocurre error o recibe muchas veces la señal del transmisor y parpadea exactamente doce veces a la primera presion del pulsador, y si presiono otro pulsador vuelve a parpadear el mismo led mas veces, creo nunca deja de parpadear, lo que no deberia pasar, deberia parpadear otro led, y no deberia parpadear 12 veces sino tan solo 4, y quitando el for, parpadea 4 veces, pero solo deberia parpadear una, bueno todo un problemota, como puedop solucionarlo, ayuda porfavor!!!!, despues pienso impleentarlo con un tx y rx en rf (a 4800 b/s en receptor), por eso use la velocidad de 240 bauds, esta bien, o que velocidad podria usar despues??; ayuda porfavor, necesito terminar con exito este trabajo lo mas rápido que pueda!!
estare muy agredecido a los que me respondieran y siempre mi ayuda en lo que pueda, muchas gracias
chao.
-
int dato=0;
...
while(true) // Ciclo infinito
{
while(dato!=0) // Si se ha presionado ningún pulsador
{
dato=port_b; // Se copia el valor del puerto B a la variable dato
Inicializas dato a cero ... entras en el bucle infinito .... y ahí se queda porque el while(dato!=0) con dato=0 impide que entre y puedas hacer el dato=port_b;
Descomenta y prueba a empezar con ...
int dato=1;
... creo ... :shock:
-
muchas gracias!!! por la respuesta :-/, estabas en lo correcto, cambie por esta sentencia:
void main()
{
int dato; // Reserva de espacio de memoria
...
while(true) // Ciclo infinito
{
dato=port_b; // copiar el valor del puerto B en la variable Dato
if(dato!=0) // Si se ha presionado algún pulsador ingresa al ciclo
//(pulsadores en Rb4 a Rb7 normalmente en cero)
{
switch(dato)
{
case 0x10: putc('A'); // por cada pulsador se envia un codigo diferente
break;
....
}
}
}
}
Ahora si esta parte funciona correctamente, lo que sigue fallando es el receptor, mantiene el mismo error que mencione en el post anterior. alguna sugerencia??
Como podria utilizar interrupciones para este programa (intrrupcion en tx y en rx), talvez pueda solucionar el problema usando interrupciones??, pero como configurar y hacer las rutinas, no se como hacerlo, alguien sabe del tema??
muchas gracias, chao.