Este programa que pueda realizar una comunicación infrarroja
empleando la codificación Manchester.
Además de que se requiere de haya un emisor y un
receptor. En esta ocación yo seré el receptor y un compañero será el emisor.
Se emplearán un LED infrarrojo y un módulo receptor que pueda modular la señal.
- Código del receptor:
#include <receptor.h>
//recibe
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
//recibe
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int tecla,i;
int tecla,i;
#INT_EXT
void EXT_isr(void) //interrupt service request
{
delay_us(300); //para estar a la mitad del dato
output_toggle(Pin_B5);//ve muestreo
output_toggle(Pin_B5);
if(!input(PIN_B0))
{ delay_us(1200);
for(i=0;i<=7;i++)
{
if(!input(PIN_B0))
bit_clear(tecla,i); //el 0 de la tecla lo pone en 0
else
bit_set(tecla,i); //el 1 de la tecla lo pone en 1
output_toggle(Pin_B5);
output_toggle(Pin_B5);
delay_us(1200);
}
if(input(Pin_B0)) tecla='N';//de que no es numero, si es basura muestra N
lcd_gotoxy(10,2);
lcd_putc(tecla);
}
}
void EXT_isr(void) //interrupt service request
{
delay_us(300); //para estar a la mitad del dato
output_toggle(Pin_B5);//ve muestreo
output_toggle(Pin_B5);
if(!input(PIN_B0))
{ delay_us(1200);
for(i=0;i<=7;i++)
{
if(!input(PIN_B0))
bit_clear(tecla,i); //el 0 de la tecla lo pone en 0
else
bit_set(tecla,i); //el 1 de la tecla lo pone en 1
output_toggle(Pin_B5);
output_toggle(Pin_B5);
delay_us(1200);
}
if(input(Pin_B0)) tecla='N';//de que no es numero, si es basura muestra N
lcd_gotoxy(10,2);
lcd_putc(tecla);
}
}
void main()
{
{
enable_interrupts(INT_EXT);
ext_int_edge( H_TO_L ); // detecta flancos de bajada
enable_interrupts(GLOBAL);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("SUSANA");
lcd_gotoxy(1,2);
lcd_putc("Tecla RX= ");
while(TRUE)
{
output_toggle(Pin_B7);//para dejar espacio a la interrupción
}
}
ext_int_edge( H_TO_L ); // detecta flancos de bajada
enable_interrupts(GLOBAL);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("SUSANA");
lcd_gotoxy(1,2);
lcd_putc("Tecla RX= ");
while(TRUE)
{
output_toggle(Pin_B7);//para dejar espacio a la interrupción
}
}
- Código del emisor:
//transmite
#include <KBD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int tecla, i, j;
void cero()
{
//se modula a 600 us, entonces si fsk=38KHz, 600/26 = 23 pulsos
for (i=0;i<=23;i++)
{
output_high(Pin_B0);
delay_us(10);
output_low(Pin_B0);
delay_us(7);
}
delay_us(580);
}
{
//se modula a 600 us, entonces si fsk=38KHz, 600/26 = 23 pulsos
for (i=0;i<=23;i++)
{
output_high(Pin_B0);
delay_us(10);
output_low(Pin_B0);
delay_us(7);
}
delay_us(580);
}
void main()
{
kbd_init();
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("SUSANA");
lcd_gotoxy(1,2);
lcd_putc("Dato TX= ");
{
kbd_init();
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("SUSANA");
lcd_gotoxy(1,2);
lcd_putc("Dato TX= ");
while(TRUE)
{
while (tecla=='\0')
tecla= kbd_getc();
lcd_gotoxy(1,2);
lcd_putc("Dato TX= ");
lcd_putc(tecla);
cero();
for(j=0;j<=7;j++)
{
if(bit_test(tecla,j))//ve que bit hay TRUE si es 1, FALSE si es 0
delay_us(1200);
else
cero();
}
cero();
tecla='\0';
}
}
{
while (tecla=='\0')
tecla= kbd_getc();
lcd_gotoxy(1,2);
lcd_putc("Dato TX= ");
lcd_putc(tecla);
cero();
for(j=0;j<=7;j++)
{
if(bit_test(tecla,j))//ve que bit hay TRUE si es 1, FALSE si es 0
delay_us(1200);
else
cero();
}
cero();
tecla='\0';
}
}
- Simulación en Proteus:
- Armado y ejecución:
No hay comentarios:
Publicar un comentario