打印
[AVR单片机]

请论坛高手指点一下

[复制链接]
2108|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuweige|  楼主 | 2013-3-12 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用MEGA168    (PC0引脚对地接开关)     做中断试验,PB1接个发光管,为何进不了中断,灭不了发光管?请指教


#define         F_CPU        8000000                /* 单片机主频为7.3728MHz,用于延时子程序 */
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>   //中断信号头


#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)



#define LED0              PORTB &= ~(1 << PORTB1)        //LED关
#define LED1              PORTB |= (1 << PORTB1)          //LED开
#pragma  interrupt_handler pcint0_ier:8

void pcint0_ier(void)

{

LED0;

}


void port_init(void)
{
DDRC=0xFC;     //LED  (PC4)
PORTC=0xFD;
PCICR=0B00000010;
PCMSK1=0B00111111;
sei();
}


void  main()
{
   
     port_init();     //引脚初始化
     LED1;
       
    while(1);
       {
            }
}  


      

相关帖子

沙发
yklstudent| | 2013-3-12 12:40 | 只看该作者
本帖最后由 yklstudent 于 2013-3-12 12:51 编辑


GCC的中断方式SIGNAL看看 行不行

使用特权

评论回复
板凳
wuweige|  楼主 | 2013-3-12 13:13 | 只看该作者
谢谢二楼啦,问题已解,向量名错了,

SIGNAL(PCINT1_vect)

使用特权

评论回复
地板
wuweige|  楼主 | 2013-3-12 13:44 | 只看该作者
请问yklstudent 师傅,我如接5只发光管(PB0---PB4),5只开关(PC0---PC4)分别控制5只灯亮灭, 会 触发同一中断吗?,该如何分别处理?,谢谢

使用特权

评论回复
5
yklstudent| | 2013-3-12 14:43 | 只看该作者
本帖最后由 yklstudent 于 2013-3-12 15:17 编辑
wuweige 发表于 2013-3-12 13:44
请问yklstudent 师傅,我如接5只发光管(PB0---PB4),5只开关(PC0---PC4)分别控制5只灯亮灭, 会 触发同一中断 ...

首先我也是新人啊 互相学习而已  师傅级的 应该是高手们才对,
其次 看MCU资料 PC0--PC6的电平变化中断,都是同一个中断源,不好分开

修改下:
好像可以直接那么用
进入电平变化中断后,在判断PC0-PC4的每个引脚电平
如果是低电平有效,则进入电平变化中断后,检测哪个引脚电平为低
就说明哪个按键被按下了 楼主最好亲自去验证下  我没有板子 没法试

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
6
wuweige|  楼主 | 2013-3-12 14:52 | 只看该作者
你的意思就是把按键检测放到中断中去判断,是吗????????

使用特权

评论回复
7
wuweige|  楼主 | 2013-3-12 15:13 | 只看该作者
讲的很对,有效果,接着再试................

使用特权

评论回复
8
lqlkmqj| | 2013-3-12 20:57 | 只看该作者
学习了,感谢楼主,

使用特权

评论回复
9
qin552011373| | 2013-3-13 00:02 | 只看该作者
yklstudent 发表于 2013-3-12 14:43
首先我也是新人啊 互相学习而已  师傅级的 应该是高手们才对,
其次 看MCU资料 PC0--PC6的电平变化中断, ...

最直接的方法就是这样子的  

使用特权

评论回复
10
qin552011373| | 2013-3-13 00:04 | 只看该作者
咋一看楼主的代码  吓了一下  调用的函数是GCC里面的  但是中断服务函数却是ICC的  吓得不轻

使用特权

评论回复
11
qin552011373| | 2013-3-13 00:07 | 只看该作者
楼主可以参阅GCC的英文手册  有一个interrupt.h的说明文档  如果楼主用的是WINAVR-2007  建议楼主使用ISR()  signal最少是在此之前的版本里中断服务函数  

使用特权

评论回复
12
yklstudent| | 2013-3-13 08:22 | 只看该作者
qin552011373 发表于 2013-3-13 00:04
咋一看楼主的代码  吓了一下  调用的函数是GCC里面的  但是中断服务函数却是ICC的  吓得不轻 ...

奇怪的是WIN2010却可以编译通过 而不报错误

使用特权

评论回复
13
qin552011373| | 2013-3-13 20:07 | 只看该作者
yklstudent 发表于 2013-3-13 08:22
奇怪的是WIN2010却可以编译通过 而不报错误

那个写法符合C语言规范  不会报错

使用特权

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

本版积分规则

16

主题

36

帖子

0

粉丝