📄 ir3.c
字号:
// ************************************************************************
// Infrared-Routines VERSION 1.1
// uses ext.Int0 (PIND.2) and Timer0 (Osz. 8MHz)
// IR_Code :(int) Highbyte = adress, lowbyte = command
//
// New_IR_Code : new IR-Code received (has to be cleared by polling!)
// ************************************************************************
#include <mega8515.h>
//#include <90s8515.h>
#include "IR3.h"
#include <stdio.h>
//#include <IR.h> // irfrared receiver on PORT D.2
//bit start1=0;
//bit start2=0;
//bit start3=0;
bit repeat=0;
bit ir_err=0;
unsigned char tcnt0_temp;
unsigned char shift_num;
//unsigned char shift_num1;
unsigned char New_IR_Code; // Globale Variable. Dieses Bit wird nach Empfang eines Zeichens gesetzt
unsigned int Shift,IR_Code_tmp;
unsigned int IR_Code; // Globale Variable. Enthaelt das empfangene Zeichen
bit Decodierung_Lauft; // ist gesetzt, waehrend Decodierung
// ************************************************************************
// Init IR
// ************************************************************************
void InitIR(void)
{
GICR |= 0x40; // ext. Int0 enable
MCUCR &= ~0x03; // Trigger
MCUCR |= 0x01; // on falling edge
// lcd_putsf("OK");
GIFR = 0x40; // clear Int0-Flag
TCCR0 = 0x05; // Timer0 auf 31,250kHz ( bei 8Mhz Osz.)
// Decodierung_Lauft = 0;
New_IR_Code = 0;
IR_Code=0;
#asm("sei") // interrupts global freigeben
}
// **************************************************************************
// * aufgerufen durch: externer Interrupt
// **************************************************************************
// * Die Funktion wird durch einen externen Interrupt aufgerufen.
// * Sie dient nur zum Starten der Abtastsequenz und zum Triggern auf die
// * Signalflanken in der Mitte der Daten.
// **************************************************************************
interrupt [EXT_INT0] void ext_int0_isr(void)
{
static unsigned char IR_Zaehler=0,IRSperrCounter=0;
tcnt0_temp= TCNT0;
TCNT0 =0;
if(start3==1)
{
Shift=0;
IR_Code_tmp = IR_Code_tmp>>1;
if (tcnt0_temp>11) Shift=0x8000;
IR_Code_tmp = IR_Code_tmp|Shift;
shift_num++;
if(shift_num>=40)
{
ir_e:
ir_err=1;
start1=0;
start2=0;
start3=0;
IR_Code_tmp=0;
// MCUCR &= ~0x03; // Trigger
// MCUCR |= 0x01; // change
goto sub_end;
}
else
goto sub_end;
}
else if(start2==1)
{
if(PIND.2==0)
{
if(tcnt0_temp>33&&tcnt0_temp<37)
{
start3=1;
GICR |= 0x40; // ext. Int0 enable
MCUCR &= ~0x03; // Trigger
MCUCR |= 0x02; // on falling edge
goto sub_end;
}
else if(tcnt0_temp>7&&tcnt0_temp<12)
{
repeat=1;
MCUCR &= ~0x03; // Trigger
MCUCR |= 0x01; // on falling edge
goto sub_end;
}
else
goto ir_e;
}
else
goto ir_e;
}
else if(start1==1)
{
if(PIND.2==1)
{
if(tcnt0_temp>68&&tcnt0_temp<72)
{
start2=1;
goto sub_end;
}
else
goto ir_e;
}
else
goto ir_e;
}
else
{
if(PIND.2==0)
{
start1=1;
goto sub_end;
}
else
goto ir_e;
}
sub_end:
GIFR = 0x40; // clear Int0-Flag
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
}
// **************************************************************************
// * aufgerufen durch: Timerueberlauf Timer 0
// **************************************************************************
// * Die Funktion wird durch einen Timer0-Interrupt aufgerufen.
// * Der Timer wird vom ext. Int0 gestartet.
// * Das Infrarotsignal wird hier abgetastet und die Wertigkeiten der
// * Bits entsprechend aufaddiert. Das empfangende Zeichen wird in der
// * globalen Variablen IR_Code gespeichert. Nach Empfang wird das Bit
// * Neues_Zeichen gesetzt.
// **************************************************************************
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0 =0;
if(start3==1&&IR_Code_tmp!=0)
{
if(shift_num==32)
{
IR_Code=IR_Code_tmp;
New_IR_Code=1;
IR_Code_tmp=0;
}
}
start1=0;
start2=0;
start3=0;
IR_Code_tmp=0;
MCUCR &= ~0x03; // Trigger
MCUCR |= 0x01; // change
shift_num1=shift_num;
shift_num=0;
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTB.4=~PORTB.4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -