He conseguido simularlo en Proteus, aunque el enlace es directo sin IR pero funciona. Pero aun tengo algunos problemas.
El dioso led del emisor se queda encendido despues de enviar el mensaje y eso gasta bateria.
Ademas no se si funcionara el tiempo de espera del receptor para que me pare si no detecta mensaje en un tiempo prudencial. Vuelvo a pegar el codigo que ya funciona en proteus y si alguie quiere el fichero de proteus que me lo pida a
masmontero@hotmail.comLA idea es hacer un sistema de calefaccion en que el sensor de temperatura este alejado del radiador para que este no falsee la medida y que el enlace no sea por cables.
Emisor
//***************************************************************************
//******
//******
//****** NOTE: usa compilador: PCW v2.619
//******
//******
//******
//****************************************************************************
#include <16F84A.H>
#fuses XT,NOWDT
#use delay(clock=4000000,RESTART_WDT)
// define el puerto serie como 9660. 8 bits sin paridad y
// salida por pin RB0 y entrada de datos por pin RB6
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_B4, RCV=PIN_B6, RESTART_WDT)
#use fast_io(B)
// definiciones de posiciones de memoria
#byte TMR0=0x01
#byte PORTA=0x05
#byte PORTB=0x06
#byte INTCON=0x0b
#byte OPTION_REG=0x81
// el emisor usa la entrada RB1 como deteccion de puesta en marcha y paro
// la salida RB4 es la salida de datos al diodo IR
//*********************
// PROGRAMA PRINCIPAL *
//*********************
void delay_seconds(int n) {
for (;n!=0; n--)
delay_ms( 1000 );
}
void main()
{
set_tris_b(0x0f); //
output_low(PIN_B4);
While(1)
{
// el retardo se usa para no estar enviando permanentemente en mensaje y conservar la bateria del emisor
delay_seconds(5);
// si esta activa RB1 envia por el puerto E de Encender
// si Rb1 esta a cero envia por el puerto A de Apagar
if(input(PIN_B1))
{
putc("E");
}
else
{
putc("A");
}
}
}
Receptor
//***************************************************************************
//******
//******
//****** NOTA: usa compilador: PCW v2.619 o posterior
//******
//******
//******
//****************************************************************************
#include <16F84A.H>
#fuses XT,NOWDT
#use delay(clock=4000000,RESTART_WDT)
// define el puerto serie como 9660. 8 bits sin paridad y
// salida por pin RB0 y entrada de datos por pin RB6
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_B0, RCV=PIN_B6, RESTART_WDT)
#use fast_io(B)
// definiciones de posiciones de memoria
#byte TMR0=0x01
#byte PORTA=0x05
#byte PORTB=0x06
#byte INTCON=0x0b
#byte OPTION_REG=0x81
// la entrada RB6 como entrada de datos del receptor
// la salida RA1 sera la que active el rele
//*********************
// PROGRAMA PRINCIPAL *
//*********************
void delay_seconds(int n)
{
for (;n!=0; n--)
delay_ms( 1000 );
}
byte int_count; // Numero de interrupciones antes de que el segundo contador este a cero
// esta funcion se llama cada vez que el timer rebosa
// se decrementa en 1 int_cont y si llega a cero
// entonces se pone a cero la salida del rele
#int_rtcc
clock_isr()
{
if(--int_count==0)
{
int_count=255;
output_bit(PIN_A1,0);
}
}
void main()
{
short Salida;
int_count=255;
set_rtcc(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
Salida=0;
set_tris_b(0x00); // PIN_B6 = Entrada(RxD)
set_tris_a(0xff); // PIN_A0 = Salida al rele
While(1)
{
switch(getch())
{
case "E": Salida = 1; break;
case "A": Salida = 0; break;
}
int_count=255;
output_bit(PIN_A1,Salida);
}
}