Board logo

标题: 急问:关于按键中断 [打印本页]

作者: avery095    时间: 2008-5-24 09:22     标题: 急问:关于按键中断

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]
作者: thanksat    时间: 2008-5-24 22:02

http://bbs.eccn.com/ecbbs/dispbbs.asp?BoardID=9&ID=37788&replyID=&skin=1[em01][em01]
作者: avery095    时间: 2008-5-27 11:57

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

问题在哪啊?

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


作者: kzw    时间: 2008-5-27 16:54

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


作者: avery095    时间: 2008-5-28 08:50

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

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]
作者: thanksat    时间: 2008-5-28 10:03


耐心点呐,慢慢来

[em01][em01][em01]

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


作者: avery095    时间: 2008-5-28 13:27

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

先谢了啊


作者: kzw    时间: 2008-5-29 21:20

如果时间不多,按照标准给的pio的例子照着做一个,包括软件和硬件。
作者: avery095    时间: 2008-5-31 12:02

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

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

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


作者: avery095    时间: 2008-6-1 09:55

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编辑过]


作者: avery095    时间: 2008-6-1 22:30

高手帮一下忙啊,拜托
作者: thanksat    时间: 2008-6-2 09:31

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

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

[em01][em01][em01]
作者: CXD    时间: 2008-7-23 22:45

楼主,中断只是暂停当前主程序去执行中断里面的任务,当中断里面的任务执行完了,会返回接着执行开始的主程序,而你的主程序是一个死循环,所以跳不出来,你可以考虑在死循环里判断一些变量的值(在中断里面设置),使之跳出死循环,这样应该可以了
作者: dalianxwj    时间: 2008-8-13 19:47

我今天也看到这个例程拉,while(1)循环是用break和continue跳出来的把




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0