一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3094|回复: 11

[avr] 外部中断我实在是找不出问题所在了,请指点一下,谢谢

[复制链接]
发表于 2017-2-16 00:35 | 显示全部楼层 |阅读模式
就是个开发板带的例程,我居然死活运行不出结果。代码如下,现在的现象就是按键时数码管有闪动一下,但是显示的值根本不变,一直是125 。折腾一晚上了,把数码管换成led或者蜂鸣器都试过,感觉中断发生了,但是中断处理程序根本没运行。

#include "iom16v.h"
#include "macros.h"
#pragma interrupt_handler Increase_INT0_Ir:2
#pragma interrupt_handler Decrease_INT1_Ir:3  

//变量定义
unsigned char Click=125;

//数码管显示函数
void Number_Show(unsigned char Num)
{
   unsigned char Hundred,Ten,One;
   Hundred=Num/100;       //取百位
   Ten=Num%100/10;        //取十位
   One=Num%10;            //取个位
   
   //显示百位
   PORTB=Number[Hundred];     //送模码
   PORTA|=BIT(PA3);    //PA3高电平
   PORTA&=~BIT(PA3);   //PA3低电平
         
   PORTB=~BIT(0);      //送位选
   PORTA|=BIT(PA4);    //PA3高电平
   PORTA&=~BIT(PA4);   //PA3低电平
   Delay(100);         //稍微延迟
   
   //显示十位
   PORTB=Number[Ten];  //送模码
   PORTA|=BIT(PA3);    //PA3高电平
   PORTA&=~BIT(PA3);   //PA3低电平
         
   PORTB=~BIT(1);      //送位选
   PORTA|=BIT(PA4);    //PA3高电平
   PORTA&=~BIT(PA4);   //PA3低电平
   Delay(100);         //稍微延迟
   
   //显示个位
   PORTB=Number[One];  //送模码
   PORTA|=BIT(PA3);    //PA3高电平
   PORTA&=~BIT(PA3);   //PA3低电平
         
   PORTB=~BIT(2);      //送位选
   PORTA|=BIT(PA4);    //PA3高电平
   PORTA&=~BIT(PA4);   //PA3低电平
   Delay(100);         //稍微延迟
}
//中断初始化函数
void Interrupt_Init()
{
MCUCR&=0xF0;    //INT0,1为低电平触发
GICR|=BIT(7)|BIT(6);  //GICR|=0xC0; INT0,1中断允许位为1
GIFR|=BIT(7)|BIT(6);   //GIFR|=0xC0; INTO,1中断标志位清零
}
//数码管(引脚)初始化函数
void LED7_Init()
{
   DDRA|=BIT(PA3);      //PA3状态为输出
   DDRA|=BIT(PA4);      //PA4状态为输出
   DDRB=0xff;           //PB状态为输出
}
//IO初始化函数
void Port_Init()
{
DDRD|=BIT(PD7);   //PD7为输出状态
PORTD&=~BIT(PD7);  //PD7为输出低电平

DDRD&=~BIT(2)&~BIT(3); //PD2~3为输入状态
PORTD|=BIT(2)|BIT(3); //PD2~3带上拉输入
}
//主函数
void main()
{
Port_Init();   //调用IO初始化函数
LED7_Init();   //调用数码管初始化函数
Interrupt_Init(); //调用中断初始化函数
SREG|=BIT(7);  //全局中断使能位置一

while(1)
{
   Number_Show(Click); //不停显示
}
}
//INT0中断函数-加一
void Increase_INT0_Ir()
{
unsigned int i=100;  
while(i--)
   Number_Show(Click); //适当的按键消抖
Click++;     //Click变量+1
}
//INT0中断函数-减一
void Decrease_INT1_Ir()
{
unsigned int i=100;
while(i--)
   Number_Show(Click); //适当的按键消抖
Click--;     //Click变量-1
}
 楼主| 发表于 2017-2-16 00:38 | 显示全部楼层
虽然代码比较多,但主要是那个数码管显示函数比较长,不看它就行
回复

使用道具 举报

发表于 2017-2-16 08:59 | 显示全部楼层
不懂AVR,帮顶一下
回复

使用道具 举报

 楼主| 发表于 2017-2-16 09:14 | 显示全部楼层
用avrstudio编译不行,用iccavr编译就行,原因我也不知道了
回复

使用道具 举报

发表于 2017-2-16 09:55 | 显示全部楼层
大致看了下,软件好像没什么问题,感觉不应该用低电平中断,而应该用下降沿中断。
反正建议你在两个中断里加上IO输出,同时在对应的IO接上LED看下是不是进入中断了。
回复

使用道具 举报

 楼主| 发表于 2017-2-16 13:14 | 显示全部楼层
sln.1550 发表于 2017-2-16 09:55
大致看了下,软件好像没什么问题,感觉不应该用低电平中断,而应该用下降沿中断。
反正建议你在两个中断里 ...

数码管显示不变,我就试了在中断里点亮一个led,一样没反应。
反正同样的代码,在avrstudio里不行,在iccavr里可以,不知道两者有哪里的设置不一样。
回复

使用道具 举报

发表于 2017-2-16 15:50 | 显示全部楼层
benxiong22 发表于 2017-2-16 13:14
数码管显示不变,我就试了在中断里点亮一个led,一样没反应。
反正同样的代码,在avrstudio里不行,在ic ...

难怪呢,avrstudio里中断设置方式和ICCAVR是不一样的,你这个代码应该只能在ICCAVR里用
回复

使用道具 举报

发表于 2017-2-16 19:23 | 显示全部楼层
简单的东西就用arduino的开发环境测试比较好。什么avrstudio  ICCAVR这些更底层一些的语言与硬件挂钩的代码坑比较多。未必能查到资料。有时怎么回事都不知道。
回复

使用道具 举报

 楼主| 发表于 2017-2-16 19:31 | 显示全部楼层
现在发现,例程里稍微代码多一点的,就只能在icc里编译,在avrstuio里通不过,不知道两者到底有哪些使用区别?
另外,还有个问题,比如同一个例程,直接打开工程文件就能编译,新建一个工程文件再把所有c文件添加进去就不能编译,看来要找两者的教程来看看才行
回复

使用道具 举报

 楼主| 发表于 2017-2-16 20:47 | 显示全部楼层
顶楼的问题已经解决了,原因是中断函数名在icc里是可以自定义的,而在avrstudio里固定为 ISR(中断向量)
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-29 16:18 , Processed in 0.038614 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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