--------------------------------------------------------------------------------
Hola, aqui te pego lo que tengo andando, es un control remoto para alarma, veras lo unico que hace es recibir el codigo y cambiar el estado de un bit, puedes arreglar el codigo para que reciba el string y lo ponga en un LCD, afirmado lo que dicen mas arriba lo que hago, por que hay ruido continuamente en la salida digital del modulo, es 'validar' el primer dato en mi caso con el '*' y a partir de ahi recien comienzo a guardar lo que recibo, ademas el receptor antes de operar sobre la salida compara 2 veces el dato recibido, en mi aplicacion definitiva inclui en la trama un CRC32, entonces si se pierde algo el receptor puede 'analizar' lo que recibe antes de realizar alguna operacion, el modulo receptor esta conectado directamente al modulo, y el transmisor tambien, seria una buena idea hacer lo que comenta Chaly, invertir la trama para ahorrar energia, para esto habria que agregar la opcion 'INVERT' quedaria asi:
#use rs232(baud=300,xmit=PIN_A0,bits=8,invert) // como solo transmite solo configuro un pin
Claro, tambien habria que agregarlo en el receptor.
espero que te sirva.
--------------------------------------------------------------------------------
TRANSMISOR
#include <10F206.h>
#use delay(clock=4000000)
#use rs232(baud=300,xmit=PIN_A0,bits=8) // como solo transmite solo configuro un pin
#use fast_io (a)
const char password[5]="1234";
void main() {
setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
set_tris_a ( 0b111110 );
while (true){
PUTC ('*'); // START CARACTER
printf("%s",password); // PASSWORD O CODIGO DE 32 BITS
delay_ms (100);
}
}
RECEPTOR (uso un 16f627 que tiene modulo usart y me valgo de la interrupcion pero
se puede hacer con un 16f84 usando la interrupcion de rb0 o khbit())
#include <16F627.h>
#device *=16
#zero_ram
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, PUT, NOPROTECT, BROWNOUT, NOMCLR, NOLVP, NOCPD
#use rs232(baud=300,parity=N,xmit=PIN_B2,rcv=PIN_B1)
#use fast_io (B)
#priority RDA,RB,TIMER1
#byte RCREG=0x1a
#include <string.h>
char string[5];
char password[5]="1234";
short display,validar,bit;
int caracter,veces;
#INT_RDA // rutina de interrupcion por recepcion serial
rda_isr () {
int i;
if (RCREG=='*'){
for (i=0;i<=3;i++){
STRING=getc();
}
validar=1;
}
}
void main()
{
set_tris_A (0B11111011);
set_tris_b (0B11111111);
port_b_pullups(TRUE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
delay_ms (1000); // espero 1 segundo antes de arrancar
enable_interrupts(INT_RDA); // set interrupcion rs-232
enable_interrupts(global);
veces=0;
while(true){
if (validar){
if (!strcmp(string,password)){
validar=0;
if (++veces==2){
output_bit (PIN_A3,!input(PIN_A3)); // ENCIENDE O APAGA EL LED
// CADA VEZ QUE ENTRA 0N/OFF
delay_ms (500); // ESPERA 500 antes de leer de nuevo
veces=0;
}
}
}
}
}