feizhougod 发表于 2011-7-7 21:23:23

自己编写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);
        }

}

还请哪位大侠帮帮忙。

majianjia 发表于 2011-7-8 16:31:17

不懂AVR,帮不了你了。你用示波器或者逻辑分析仪能看到波形么?

feizhougod 发表于 2011-7-10 10:27:06

ok,试试

zht9961020 发表于 2011-7-10 11:08:32

回复【楼主位】feizhougod
-----------------------------------------------------------------------

全局中断开了吗

feizhougod 发表于 2011-7-13 19:46:32

嘿嘿,好像还真没开

feizhougod 发表于 2011-7-19 09:56:27

现在全局中断开启了,并且波形也正常,就是不能再数码管上显示,改正了程序,望高手指教!
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();

hurricanefred 发表于 2011-7-20 13:05:24

AVR没用过,但是我记得用51的时候是需要一个中断函数来刷新数码管的,不知道你数码管用的哪种方式?

feizhougod 发表于 2011-7-20 19:46:56

有波形,就说明信号已经进来了,但还是没显示,就可能是采集部分的代码有问题。各位谈一谈撒,给点建议。
页: [1]
查看完整版本: 自己编写rc.c程序无法采集遥控信号的问题