20111005 用mega128读取遥控接收机信号

[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);
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值