[AVR单片机] 请论坛高手指点一下

[复制链接]
 楼主| 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只灯亮灭, 会 触发同一中断吗?,该如何分别处理?,谢谢
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 很给力!

查看全部评分

 楼主| wuweige 发表于 2013-3-12 14:52 | 显示全部楼层
你的意思就是把按键检测放到中断中去判断,是吗????????
 楼主| wuweige 发表于 2013-3-12 15:13 | 显示全部楼层
讲的很对,有效果,接着再试................
lqlkmqj 发表于 2013-3-12 20:57 | 显示全部楼层
学习了,感谢楼主,
qin552011373 发表于 2013-3-13 00:02 | 显示全部楼层
yklstudent 发表于 2013-3-12 14:43
首先我也是新人啊 互相学习而已  师傅级的 应该是高手们才对,
其次 看MCU资料 PC0--PC6的电平变化中断, ...

最直接的方法就是这样子的  
qin552011373 发表于 2013-3-13 00:04 | 显示全部楼层
咋一看楼主的代码  吓了一下  调用的函数是GCC里面的  但是中断服务函数却是ICC的  吓得不轻
qin552011373 发表于 2013-3-13 00:07 | 显示全部楼层
楼主可以参阅GCC的英文手册  有一个interrupt.h的说明文档  如果楼主用的是WINAVR-2007  建议楼主使用ISR()  signal最少是在此之前的版本里中断服务函数  
yklstudent 发表于 2013-3-13 08:22 | 显示全部楼层
qin552011373 发表于 2013-3-13 00:04
咋一看楼主的代码  吓了一下  调用的函数是GCC里面的  但是中断服务函数却是ICC的  吓得不轻 ...

奇怪的是WIN2010却可以编译通过 而不报错误
qin552011373 发表于 2013-3-13 20:07 | 显示全部楼层
yklstudent 发表于 2013-3-13 08:22
奇怪的是WIN2010却可以编译通过 而不报错误

那个写法符合C语言规范  不会报错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

16

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部