|
各位大侠:
小弟的想法就是采用mega48单片机采集JRPROPO遥控器的通道信号(定时器1输入捕获中断),再将采集到得信号值转换为0-255之间,在数码管上显示。现在的问题是代码不知道哪儿有问题,没有采集到遥控信号,数码管部分正常。rc.c部分代码如下:
#include "rc.h"
void rc_init(void) //PPM解码初始化函数,使用定时器1的输入捕捉功能
{
TCCR1B|=((1<<ICNC1)|(1<<ICES1));//输入噪声抑制模式,上升沿触发
TIMSK1|=(1<<ICIE1); //使能输入捕捉中断
}
ISR(TIMER1_CAPT_vect) //捕捉中断函数
{
static uint signal=0,oldsignal=0,index=0,tmp=0;
signal=(uint)(ICR1-oldsignal);
oldsignal=ICR1;
if((signal>7500)&&(signal<13750))
{
index=1;
}
else
{
if((signal>1100)&&(signal<1700))
{
if(index<4)
{
signal=signal-1031;
tmp=(PPM[index]*3+signal)/4;
}
index++;
}
}
}
rc.h部分代码如下:
#include <avr/io.h>
//#include <avr/iom48p.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define uint unsigned int
#define uchar unsigned char
#define MAX_CHAN 4;
static uint PPM[4];
void rc_init();
入口函数程序如下:
#include "rc.h"
extern uint PPM[4];
extern uint index;
uint chan_data;
static unsigned char ledbuf[3];
void ppm_dig(uint data)
{
uchar digdata[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xf0,0x90};
uint d;
d=data;
PORTD=digdata[d];
}
int main()
{
//for(uint i=0;i=1000;i++);
DDRD=0xff;
PORTD=0xff;
DDRC=0xff;
PORTC=0xff;
//ledbuf[0]=0x01;//共阳极数码管,则共高电平
//ledbuf[1]=0x02;
//ledbuf[2]=0x04;
PPM[1]=0;
chan_data=PPM[1]%256;//只显示通道1的值
rc_init();
while(1)
{
//chan_data=(uint)(PPM[index]*0.128);
PORTC=0x01;
ppm_dig((chan_data%100)/10);
_delay_us(10);
PORTC=0x02;
ppm_dig((chan_data%100)%10);
_delay_us(10);
PORTC=0x04;
ppm_dig(chan_data/100);
_delay_us(10);
}
}
还请哪位大侠帮帮忙。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|