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

标签 c avr uart atmega encoder

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

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

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

它仅适用于每个偶数轮换,并且程序会卡在奇数轮换中。 (看起来有点奇怪)

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

附注我是微 Controller 的新手。

#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。这些是设置上升沿和下降沿的寄存器。

关于c - ATmega2560 外部中断旋转编码器弹跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39430287/

相关文章:

c - 在 Arduino UNO 上通过 UART0 接收字符串的问题

linux - 连续 UART 传输之间的随机暂停

c - UART pic18 到 pic18

c - 如何限制PWM占空比值的范围?

c - 将数组分成 2^N 然后将后续数组中的所有数字加在一起

从 IP 范围到 CIDR 掩码的转换

改变字节顺序, union 是否比位移更有效?

c - 如何用C语言为时钟为16MHz的ATMega8计算时间

c - ATMega128 启动时输出闪烁

c - 通过C套接字发送图像