自己编写rc.c程序无法采集遥控信号的问题
各位大侠:小弟的想法就是采用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*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;
void rc_init();
入口函数程序如下:
#include "rc.h"
extern uint PPM;
extern uint index;
uint chan_data;
static unsigned char ledbuf;
void ppm_dig(uint data)
{
uchar digdata={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xf0,0x90};
uint d;
d=data;
PORTD=digdata;
}
int main()
{
//for(uint i=0;i=1000;i++);
DDRD=0xff;
PORTD=0xff;
DDRC=0xff;
PORTC=0xff;
//ledbuf=0x01;//共阳极数码管,则共高电平
//ledbuf=0x02;
//ledbuf=0x04;
PPM=0;
chan_data=PPM%256;//只显示通道1的值
rc_init();
while(1)
{
//chan_data=(uint)(PPM*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);
}
}
还请哪位大侠帮帮忙。 不懂AVR,帮不了你了。你用示波器或者逻辑分析仪能看到波形么? ok,试试 回复【楼主位】feizhougod
-----------------------------------------------------------------------
全局中断开了吗 嘿嘿,好像还真没开 现在全局中断开启了,并且波形也正常,就是不能再数码管上显示,改正了程序,望高手指教!
ppm_digital.c程序如下:
#include "rc.h"
extern uint PPM;
extern uint index;
uint chan_data;
static unsigned char ledbuf;
#define scale 6
void ppm_dig(uint data)
{
uchar digdata={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xf0,0x90};
uint d;
d=data;
PORTD=digdata;
}
int main()
{
//for(uint i=0;i=1000;i++);
DDRD=0xff;
PORTD=0xff;
DDRC=0xff;
PORTC=0xff;
PORTB=0x01;
//ledbuf=0x01;//共阳极数码管,则共高电平
//ledbuf=0x02;
//ledbuf=0x04;
PPM=0;
sei();
rc_init();
//chan_data=PPM%256;//只显示通道1的值
while(1)
{
//chan_data=(uint)(PPM*0.128);
chan_data=PPM%256;//只显示通道1的值
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);
}
}
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=(int16_t)(ICR1-oldsignal);
oldsignal=ICR1;
if((signal>7500)&&(signal<13750))
{
index=1;
}
else
{
if((signal>1100)&&(signal<1700))
{
if(index<4)
{
signal=signal-500;
tmp=(PPM*3+signal)/4;
PPM=tmp;
}
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;
void rc_init(); AVR没用过,但是我记得用51的时候是需要一个中断函数来刷新数码管的,不知道你数码管用的哪种方式? 有波形,就说明信号已经进来了,但还是没显示,就可能是采集部分的代码有问题。各位谈一谈撒,给点建议。
页:
[1]