AVR的INT外部中断和PCINT中断之区…

INT外部中断是几乎所有通用单片机,嵌入机中都会带有的,早期的51系列和arm系列也都有,然而大多数因为设计原因,多只有带两个INT,最近别人提到了一个“所有端口都可以外部中断”这样的说法,因为表示存疑,因此找了些资料,也就找到了avr328p自带的PCINT引脚功能

 

AVR的INT外部中断和PCINT中断之区别与使用

 

INT外部中断和AVR和PCINT具体区别如下:

 

差别1. INT限制在了两个端口上面,而PCINT则是所有接口都具备。

 

差别2. INT具有上沿,下沿,低电平,高电平触发这几种模式,而PCINT只有测量电平的变化这一个模式。

 

差别3. INT可以了解具体是哪个口触发的,而PCINT不行。

 

差别4. PCINT不会直接跳转入指定的程序,用户需要读取寄存器来做判断是哪个PCINT端口产生了变化。

 

差别5. INT0和INT1各自可配置一个中断程序入口,而所有的PCINT都只会触发跳转进入一条指定的程序。

 

 

 

 

 

 

提供一道avr环境下的PCINT相关代码与注释,代码功能是初始化三个PCINT

 

参考地址:https://sites.google.com/site/qeewiki/books/avr-guide/external-interrupts-on-the-atmega328

 

#include
#include              // 头文件,内含了uint8的声明

#include     // Needed to use interrupts    


volatile uint8_t portbhistory = 0xFF;      // default is high because the pull-up


int main(void)
{
    DDRB &= ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2)); //拉低PB0,1,2三个口的电平
    // PB0,PB1,PB2 (PCINT0, PCINT1, PCINT2 pin) 现在处于输入态

    PORTB |= ((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2))// 开启上拉
    // PB0, PB1 , PB2 现在处于上拉输入状态下
    
    PCICR |= (1 << PCIE0);     // 设置 PCIE0 以启用 PCMSK0 侦测
    PCMSK0 |= (1 << PCINT0);   // 设置 PCINT0 来测量状态变化并产生中断

    sei();                     // turn on interrupts

    while(1)
    {
        
    }
}



ISR (PCINT0_vect)
{
    uint8_t changedbits;//设立一个无符号整数来记录寄存器的变化


    changedbits = PINB ^ portbhistory;
    portbhistory = PINB;

    
    if(changedbits & (1 << PINB0))
    {
        
    }
    
    if(changedbits & (1 << PINB1))
    {
        
    }

    if(changedbits & (1 << PINB2))
    {
        
    }

}


结论:

 

PCINT在当年的设计中堪称创新,但和所谓的全端口外部中断依然有一定差距,但相对于按键扫描等方式来说,依然有一部分中断服务的优势

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值