ATmega2560 外部中断旋转编码器弹跳

ATmega2560 External Interrrupts rotary encoder Bouncing

我正在尝试从 3 个旋转编码器 (KY-040) 获取读数并通过 UART 发送值。

我正在使用 Arduino-Mega 2560 开发板,但由于要求原因,我正在用 C 语言对其进行编程。

但是当我尝试从编码器获取读数时,我得到了随机数。

而且它只适用于每一个偶数旋转并且程序卡在奇数旋转。 (好像有点奇怪)

任何人都可以建议我的代码有什么问题。

P.S。我是使用微控制器的新手。

#define F_CPU 16000000  //Clock Speed
#define UART_BAUD 9600

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include "uart.h"
#include <stdlib.h>

volatile unsigned int encPosZ=0;

void sendEncValue(unsigned int value){
    char string[5];
    itoa(value, string, 10);
    uart_puts(string);      
}  

// main
int main(void)
{
    //disable all interrupts
    cli();      
    uart_init(UART_BAUD_SELECT(UART_BAUD,F_CPU));                   
    DDRE &=~ (1 << PE4);
    DDRE &=~ (1 << PE5);

    /* set pull-up enabled   */     
    PORTE |= (1 << PE4)|(1 << PE5);

    EIMSK |= (1 << INT4)|(1 << INT5);       

    /* INT4 - falling edge, INT5 - rising edge */       
    EICRB|= (1<<ISC41)|(1<<ISC51)|(1<<ISC50);

    // Enable the Global Interrupt Enable flag
    sei();          
    uart_puts("Started... "); 

    while(1)
    {
        _delay_ms(5);           
    }
    return 0;
}       

//INT4 interrupt
ISR(INT4_vect)
{
    if(!bit_is_clear(PINE, PE5)){
        encPosZ++;
    }else{
        encPosZ--;
    }
   sendEncValue(encPosZ);       
}

//INT5 interrupt
ISR(INT5_vect)
{
    if(bit_is_clear(PINE, PE4)){
        encPosZ++;
    }else{
        encPosZ--;
    }
    sendEncValue(encPosZ);  
}

MCUCR 未用于您使用它的目的。事实上,它的大部分位都是只读的。

也许您打算使用 EICRA 和 EICRB。这些是设置上升沿和下降沿的寄存器。