首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

急问:关于按键中断

急问:关于按键中断

volatile int edge_capture;

static void handle_button_interrupts(void*context,alt_u32 id)
{
volatile int*edge_capture_ptr=(volatile int*)context;
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);
}

static void init_button_pio()
{
void*edge_capture_ptr=(void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);
alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);
}
int main(void)

{

while(1)
{
switch(edge_capture)
{case 0x08:
musicplay();
break;
case 0x04:
IOWR(SEG7_DISPLAY_BASE,0,0X00001234);
break;

}
}
}

其中musicplay()是一个音乐不断播放的循环函数,为什么当我按了key2(即0x04)时,不会执行IOWR(SEG7_DISPLAY_BASE,0,0X00001234),是不是musicplay()是一个循环函数,程序跳不出来了?可是按键中断应该可以跳到相应的中断服务啊?不懂啊,谁帮帮我啊?

[em06][em06][em06]
http://bbs.eccn.com/ecbbs/dispbbs.asp?BoardID=9&ID=37788&replyID=&skin=1[em01][em01]
热情,直爽

还是找不出来啊,楼主能不能说得清楚点啊?

问题在哪啊?

拜托了啊,万分感激!!!

楼主,你的终端初始化程序在主程序中并没有被调用,你的main就是那点内容吗?

在交流中前进,共同实现nios的应用。

哦,写错了,主程序还有按键的初始化

int main(void)

{

init_button_pio();

while(1)
{
switch(edge_capture)
{case 0x08:
musicplay();
break;
case 0x04:
IOWR(SEG7_DISPLAY_BASE,0,0X00001234);
break;

}
}
}

其实我的想法是每一个按钮控制不同的播放功能,但现在的问题是按键中断不起作用。

我试过了,如果把musicplay()换成IOWR(SEG7_DISPLAY_BASE,0,0X00005678);

那按KEY3(0X08),KEY2(0X04)就会显示相应的程序。但是如果我用了musicplay()后,

我按了KEY3(0X08),可以音乐播放,但再按KEY2,数码管就不能显示1234了,为什么啊?

版主多多指点啊!真是谢谢了呀

[em09][em09]


耐心点呐,慢慢来

[em01][em01][em01]

[此贴子已经被作者于2008-5-28 10:04:49编辑过]

热情,直爽

可是时间不多了啊,还要写文章,高手知道的话,多多指点啊

先谢了啊

如果时间不多,按照标准给的pio的例子照着做一个,包括软件和硬件。
在交流中前进,共同实现nios的应用。

我做了niosii中自带的count_binary的例子,就是PIO的控制,但是好像也还是按键中断不能执行,是不是跟cpu的reset address和exception address有关啊,这个count_binary的program memory,read_only data memory,rwdata,heap,stack都是在sdram里的,那cpu的reset 和exception的地址应该是哪里啊?如果不是这个问题,那是什么问题

哪位高手知道,请速告知!万分火急!

小妹在这里先谢过大家了,请高手多多指点

volatile int edge_capture;

static void handle_button_interrupts(void*context,alt_u32 id)
{
volatile int*edge_capture_ptr=(volatile int*)context;
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);
}

static void init_button_pio()
{
void*edge_capture_ptr=(void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);
alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);
}
int main(void)

{

while(1)
{

init_button_pio();
switch(edge_capture)
{case 0x08:

while(1) {IOWR(SEG7_DISPLAY_BASE,0,0x12345678);}
break;
case 0x04:
IOWR(SEG7_DISPLAY_BASE,0,0X00001234);
break;
}
}

}

我只想用这个例子来验证按键中断,为什么当中断程序里有一个while(1)的循环,中断就跳不出来了呢?难道DE2板上的按键中断就只有这样?

还有就是一旦我在SOPC builder中改变原来中断的IRQ(原来的IRQ只是自动排列而已)时,程序就不能显示先前的效果了,为什么?我不明白

请各位高手多多帮忙啊,因为交稿时期快到了

如果按键中断没搞定,我先前做的很多东西都白做了,希望各位高手帮忙一下

[此贴子已经被作者于2008-6-1 9:57:57编辑过]

高手帮一下忙啊,拜托

1\首先确定按键中断是否已经注册

2\每句case后面加一句子:edge_capture = 0x00;

[em01][em01][em01]
热情,直爽
楼主,中断只是暂停当前主程序去执行中断里面的任务,当中断里面的任务执行完了,会返回接着执行开始的主程序,而你的主程序是一个死循环,所以跳不出来,你可以考虑在死循环里判断一些变量的值(在中断里面设置),使之跳出死循环,这样应该可以了
我今天也看到这个例程拉,while(1)循环是用break和continue跳出来的把
返回列表