打印
[AVR单片机]

AVR外部中断计数不准确,请各位大神指教

[复制链接]
987|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦逍遥|  楼主 | 2015-5-23 12:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟正在用ATmega16做一个检测,目的是在外部中断1下降沿后检测外部中断0的脉冲数,中断0只可能是1个或两个脉冲,若是1则继电器动,否则不动,目前的状态是中断1每一个下降沿继电器都会动,不知道为什么?
后来自己测试 单独开外部0计数也并不准确,请各位指教
// Target : M16
#include <iom16v.h>
#include <macros.h>
//#include "lesson5.c"
unsigned char i=0,flag=0;
unsigned char j;
void delayms(unsigned int ms)         //ms延时程序
{
        unsigned int i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x01;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x0C; //使INT0,INT1对应口上拉电阻有效
DDRD = 0x00; //必须设置INT0,INT1对应口为输入
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
i++;//在中断里进行操作
if(i==2)
{
j=1;
i=0;
}   
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
//在中断里进行操作
flag=1;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x0a; //INT1 的下降沿产生异步中断请求,INT0上升沿
GICR = 0xC0; //INT0和INT1使能
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
                init_devices();
                while(1)
            {
                          if(flag==1)
                                         {
                                          if(j)
                                         {
                                          delayms(10);
                                          i=0;
                                         }
                                          else
                                          {
                                          DDRD|=BIT(6);  //控制继电器
                                          PORTD&=~BIT(6);
                                          delayms(100);
                                          DDRD|=BIT(6);
                                          PORTD|=BIT(6);
                                          }
                                         flag=0;
                                        }
                        }
}

相关帖子

沙发
laoxu| | 2015-5-25 05:30 | 只看该作者
输入信号要作消抖处理~~~

比如,输入端加RC网络,软件用滤波算法,等等。。。。。。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
梦逍遥 + 1 很给力!
板凳
梦逍遥|  楼主 | 2015-5-25 14:24 | 只看该作者
laoxu 发表于 2015-5-25 05:30
输入信号要作消抖处理~~~

比如,输入端加RC网络,软件用滤波算法,等等。。。。。。 ...

我找到问题所在了,你说的很对,确实是输入信号有抖动,需要滤波消抖

使用特权

评论回复
地板
梦逍遥|  楼主 | 2015-6-4 09:18 | 只看该作者
只有一个人回复不能结贴吗?我想结贴

使用特权

评论回复
5
梦逍遥|  楼主 | 2015-6-4 09:18 | 只看该作者
laoxu 发表于 2015-5-25 05:30
输入信号要作消抖处理~~~

比如,输入端加RC网络,软件用滤波算法,等等。。。。。。 ...

只有一个人回复不能结贴吗?我想结贴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

22

帖子

0

粉丝