📄 smartcartimer.c
字号:
//SmartCarTimer.c : source file for the SmartCar Timers
//
#include "SmartCar.h"
#include "SmartCarTimer.h"
#include <delay.h>
#define LED_Front_Mid 0x40
#define Time_Const_38K_Trans 0xBA
#define Time_Const_38K_Receive_Next 0x84//等待5T延时常数
#define Wheel_Left 0
#define Wheel_Right 1
#define Run_Towards 0
#define Run_Backwards 1
#define Max_Speed 100
#define LED_Front_Mid 0x40
#define LED_Back_Mid 0x10
/////////////////////////////////////////////////////////////////////////////
//SmartCarTimer
bool LED_Front_Mid_State=0;
static unsigned int Receive_38K_Lenth=0;
static unsigned int Wait_Times=0,Times_2=2;
static bool Wait_Next_38K=true;
unsigned int Command_38K=0;
extern bool Front_38K_Head, Back_38K_Head;
extern unsigned int Time;
bool Not_Get_NewCommand=true;
void PWM_OC1_set(unsigned Side,unsigned int Run_Direct,unsigned int Speed);
bool Transmit_Command(unsigned int Command_x4,unsigned int Which_Led,bool Answer);
void timers_init(void)
{
//{{WIZARD_MAP(Timers)
// Timer/Counter0 Clock source: System Clock
// Timer/Counter0 Clock value: 8000.000kHz
// Timer/Counter0 Mode: CTC, TOP=OCR0A
// Timer/Counter0 Output: A: Toggle, B: Disconnected
sbi(DDRD, 6);//红外38K定时
OCR0A = 0x67;
OCR0B = 0x00;
TCNT0 = 0x00;
TCCR0A = 0x42;
TCCR0B = 0x01;
// Timer/Counter1 Clock source: System Clock
// Timer/Counter1 Clock value: 8000.000kHz
// Timer/Counter1 Mode: PWM, Phase and Frequency Correct, TOP=ICR1
// Timer/Counter1 Output: A: Inverted, B: Inverted
sbi(DDRB, 1);//电机
sbi(DDRB, 2);
OCR1A = 0x0065;
OCR1B = 0x0065;
TCNT1 = 0x0000;
TCCR1A = 0xf0;
TCCR1B = 0x11;
TCCR1C = 0x00;
ICR1=0x064;
// Timer/Counter2 Clock source: System Clock
// Timer/Counter2 Clock value: Stopped
// Timer/Counter2 Mode: Normal
// Timer/Counter2 Output: A: Disconnected, B: Disconnected
ASSR = 0x00;//红外接收5T定时
OCR2A = 0x00;
OCR2B = 0x00;
TCNT2 = 0x00;
TCCR2A = 0x00;
TCCR2B = 0x02;
TIMSK0 = 0x00;//初始化 关中断0//时间使用
TIMSK1 = 0x00;
TIMSK2 = 0x00;//初始化 关中断2//红外接收定时用
//}}WIZARD_MAP(Timers)
}
void Command_38K_Proc(unsigned int PINB_bit)
{
Command_38K=Command_38K<<1;//车头接收头接收命令左移1
if(bit_is_set(PINB,PINB_bit))
{
Command_38K=(Command_38K | 0x01);//末位置1//接收到低电平
Times_2=2;//15T就1,20T就2,25T就3
}
else
{
Times_2=4;//30T
}
Wait_Next_38K=true; //等待下一帧起始位标志置1
Receive_38K_Lenth++;
}
ISR(SIG_OVERFLOW0)
{
Time++;
}
ISR(SIG_OVERFLOW1)
{
}
ISR(SIG_OVERFLOW2)
{
// TODO: Add your code here
TCNT2=Time_Const_38K_Receive_Next;
if(Wait_Next_38K)
{
if(Wait_Times<Times_2)
{
//等待15T准备接收下一帧数据
Wait_Times++;
}
else
{
Wait_Times=0;
Wait_Next_38K=false;
}
}
else//第一次已经等待了15T所以直接进入
{
if (Front_38K_Head)//车头接收
{
if(Receive_38K_Lenth<3)//一共4帧数据//可随时改接收帧数
{
Command_38K_Proc(0);
}
else
{
Command_38K_Proc(0);
TIMSK2 = 0x00;//关 定时器2中断
Not_Get_NewCommand=false;
Receive_38K_Lenth=0;//初始化接收数据长度
Wait_Next_38K=true;//初始化接收数据
PCMSK0 = 0x21;//开 引脚电平变化中断
Front_38K_Head=false;
//delay(1,8000);
//Transmit_Command(Command_38K, LED_Front_Mid, false);//回复
}
}//End_if (Front_38K_Head)
else if (Back_38K_Head)//车尾接收
{
if(Receive_38K_Lenth<3)//一共4帧数据//可随时改接收帧数
{
Command_38K_Proc(5);
}
else
{
Command_38K_Proc(5);
TIMSK2 = 0x00;//关 定时器2中断
Not_Get_NewCommand=false;
Receive_38K_Lenth=0;//初始化接收数据长度
Wait_Next_38K=true;//初始化接收数据
PCMSK0 = 0x21;//开 引脚电平变化中断
Back_38K_Head=false;
//delay(1,8000);
//Transmit_Command(Command_38K, LED_Back_Mid, false);//回复
}
}//End_if (Back_38K_Head)
else//错误捕捉
{
}//End_if_38K_Head
}//End_if(38K_Wait_Next)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -