问题描述
总的来说,我对 Atmel 和 C 编程比较陌生。 我一直在尝试在上面提到的 Attiny817 开发板上启用中断,但我肯定遇到了一些问题。为了更好地理解外设中断,我尝试使用板载按钮 (PC5) 来控制板载 LED (PC0)。我使用以下语句验证了这两个部分的工作:
#include <atmel_start.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void){
atmel_start_init();
PORTC_set_pin_dir(PIN5_bp,false);
PORTC_set_pin_dir(PIN0_bp,true);
PORTC_set_pin_pull_mode(PIN5_bp,PORT_PULL_UP);
while (1){
if (!PORTC_get_pin_level(PIN5_bp)){
PORTC_set_pin_level(PIN0_bp,true);
}
else{
PORTC_set_pin_level(PIN0_bp,false);
}
}
}
这很有效,所以我尝试通过编写以下内容来实现引脚更改中断:
#include <atmel_start.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void){
atmel_start_init();
PORTC_set_pin_dir(PIN5_bp,PORT_PULL_UP);
PORTC_pin_set_isc(PIN5_bp,PORT_ISC_BOTHEDGES_gc); //detect rising and falling edges
sei();
while (1) {
}
}
ISR(PORTC_PORT_vect){
PORTC_toggle_pin_level(PIN0_bp);
PORTC.INTFLAGS |= PORT_INT5_bm;
}
我从数据表中了解到,所有 PORTC 共享一个中断向量,该端口上的任何中断都会引发该向量内的相应标志。数据手册中还提到了向中断寄存器写入'1'来清除中断,这也是我选择这样编写ISR函数的原因。此外,PORTC_pin_set_isc() 函数应在 PORTC 寄存器中为 PC5 上的按钮执行正确的感测配置。
我错过了什么? 任何和所有帮助表示赞赏。
一些注意事项/更新:
很多这些函数是我使用 Atmel 时预先编写的
爱特梅尔 |启动网站为我初始化驱动程序。 (start.atmel.com/#)
另一个快速更新:我在 AVRFreaks 网站上找到了示例代码,但是当我使用代码(将 PC3 替换为 PC5)时,我遇到了从未调用中断的相同问题......(avrfreaks.net/comment/2435411#评论-2435411)
我也试过: 直接使用寄存器而不是 atmel 创建的函数:
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
PORTC.DIRCLR = PIN5_bm; // Pin PC3 = input
PORTC.DirsET = PIN0_bm; // Pin PC0 = output
PORTC.PIN5CTRL = PORT_PULLUPEN_bm; // enables the internal pull-up resistor on PC3
PORTC.PIN5CTRL |= PORT_ISC_FALLING_gc ; // Sense falling edge on PC3. PORT_INT3_bp = 0x03
// cpuINT.LVL0PRI = 0 << cpuINT_LVL0PRI_gp; // Interrupt Level Priority: 0
// cpuINT.LVL1VEC = 0x0A << cpuINT_LVL1VEC_gp; // Interrupt Vector with High Priority: 0x08
sei(); // Global interrupts enable
while (1)
{
}
}
ISR(PORTC_PORT_vect)
{
PORTC.OUTTGL = PIN0_bm; // Toggle LED
PORTC.INTFLAGS |= PORT_INT5_bm ; // Clear Interrupt
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)