[20111005]
遥控是FLYSKY 2.4G的 接收器发出的是20ms方波型号
接收器输出信号接到mega128 ICP1(29脚)
mega128 运行在16M
TIMER1 8分频
匹配以后进入中断服务程序 ISR(TIMER1_CAPT_vect)
ICP1接收上升沿->进入ISR 读取出当前定时器值并修改下降沿触发->ICP1接收到下降沿->进入ISR 读取当前定时器值并与在上升沿读到的值相减,得到两个边沿的时间差 并修改上升沿触发
unsigned int a,b中 若b-a b<a 减出来的值依然是两个数之间的间距而不会带负数
在ISR中,检测到下降沿后马上读出定时器计数值 做相减 否则出现相减错误????原因不明
if(READ_COMPA_EDGE==0x40)
{
a=compa_value;
COMPA_EDGE_FALLING;
}
else
{
c=compa_value-a;
COMPA_EDGE_RISING;
//compa_flag=1; //置位标志
}
源程序如下:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.c"
#define READ_COMPA_EDGE (TCCR1B&0x40) // 0:下降沿 1:上升沿
#define COMPA_EDGE_RISING (TCCR1B|=(1<<ICES1)) // 上升沿触发
#define COMPA_EDGE_FALLING (TCCR1B&=~(1<<ICES1)) // 下降沿触发
unsigned int compa_value=0;
unsigned int compa_flag=0;
unsigned volatile int a=0,b=0,c=0;
unsigned char led=0,temp;
//**** TIMER1 输入捕捉ISR
//*
//***********************
ISR(TIMER1_CAPT_vect)
{
PORTA=led++;
compa_value=ICR1; //读出当前计数值
if(READ_COMPA_EDGE==0x40)
{
a=compa_value;
COMPA_EDGE_FALLING;
}
else
{
c=compa_value-a;
COMPA_EDGE_RISING;
//compa_flag=1; //置位标志
}
}
//**** TIMER1 初始化
//* 设置 TIMER1 分频
//***********************
void TIMER1_INIT()
{
TCCR1B=0b110000010; // CS11 CS10
}
//**** PPM 初始化
//* 开中断
//***********************
void PPM_INIT()
{
TIMSK|=(1<<TICIE1);
}
//***********************************************************
int main()
{
TIMER1_INIT();
PPM_INIT();
uart_init();
DDRA=0xff;
PORTA=0x80;
sei();
uart_tx(0x14);
while(1)
{
uart_tx(c>>8);
uart_tx(c&0x00ff);
uart_tx(0x01);
}
}