微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ATTiny817 XPlained mini 启用中断

如何解决ATTiny817 XPlained mini 启用中断

总的来说,我对 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 举报,一经查实,本站将立刻删除。