⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir3.c

📁 AVR8515单片机接收控制计算机的源码,使用CVAVR编译器
💻 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 + -