搜索
bottom↓
回复: 7

自己编写rc.c程序无法采集遥控信号的问题

[复制链接]

出0入0汤圆

发表于 2011-7-7 21:23:23 | 显示全部楼层 |阅读模式
各位大侠:
    小弟的想法就是采用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, 杜汶泽)

出0入0汤圆

发表于 2011-7-8 16:31:17 | 显示全部楼层
不懂AVR,帮不了你了。你用示波器或者逻辑分析仪能看到波形么?

出0入0汤圆

 楼主| 发表于 2011-7-10 10:27:06 | 显示全部楼层
ok,试试

出0入0汤圆

发表于 2011-7-10 11:08:32 | 显示全部楼层
回复【楼主位】feizhougod
-----------------------------------------------------------------------

全局中断开了吗

出0入0汤圆

 楼主| 发表于 2011-7-13 19:46:32 | 显示全部楼层
嘿嘿,好像还真没开

出0入0汤圆

 楼主| 发表于 2011-7-19 09:56:27 | 显示全部楼层
现在全局中断开启了,并且波形也正常,就是不能再数码管上显示,改正了程序,望高手指教!
ppm_digital.c程序如下:
#include "rc.h"

extern uint PPM[4];
extern uint index;
uint chan_data;
static unsigned char ledbuf[3];
#define scale 6

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;
        PORTB=0x01;
    //ledbuf[0]=0x01;//共阳极数码管,则共高电平
        //ledbuf[1]=0x02;
        //ledbuf[2]=0x04;
        PPM[1]=0;
    sei();
        rc_init();
        //chan_data=PPM[1]%256;//只显示通道1的值
        while(1)
        {   
            //chan_data=(uint)(PPM[index]*0.128);
        chan_data=PPM[1]%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[index]*3+signal)/4;
             PPM[index]=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[4];
void rc_init();

出0入0汤圆

发表于 2011-7-20 13:05:24 | 显示全部楼层
AVR没用过,但是我记得用51的时候是需要一个中断函数来刷新数码管的,不知道你数码管用的哪种方式?

出0入0汤圆

 楼主| 发表于 2011-7-20 19:46:56 | 显示全部楼层
有波形,就说明信号已经进来了,但还是没显示,就可能是采集部分的代码有问题。各位谈一谈撒,给点建议。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 06:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表