C语言 ATmega2560外部中断旋转编码器反弹



我正试图从3个旋转编码器(key -040)获得读数,并通过UART发送值。

我正在使用Arduino-Mega 2560板,但由于要求原因,我正在用c编程。

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

它只适用于每一个偶数的旋转和程序卡在奇数旋转。(似乎有点奇怪)

谁能建议什么是错误的我的代码。

注:我是微控制器的新工作。

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

最新更新