Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ATmega2560外部中断旋转编码器反弹_C_Avr_Uart_Atmega_Encoder - Fatal编程技术网

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

C ATmega2560外部中断旋转编码器反弹,c,avr,uart,atmega,encoder,C,Avr,Uart,Atmega,Encoder,我试图从3个旋转编码器(KY-040)获取读数,并通过UART发送值 我使用的是Arduino Mega 2560板,但由于需求原因,我用C语言编程 但当我试图从编码器中读取数据时,我会得到随机数 它只适用于每一个偶数的旋转,程序在奇数旋转时会卡住。(似乎有点奇怪) 谁能告诉我我的代码有什么问题吗 另外,我是一名新的微控制器工作人员 #define F_CPU 16000000 //Clock Speed #define UART_BAUD 9600 #include <stdio.h

我试图从3个旋转编码器(KY-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);  
}
#定义F#U CPU 16000000//时钟速度
#定义UART_波特率9600
#包括
#包括
#包括
#包括
#包括
#包括“uart.h”
#包括
易失性无符号整数encPosZ=0;
void sendEncValue(无符号整数值){
字符串[5];
itoa(值,字符串,10);
uart_put(字符串);
}  
//主要
内部主(空)
{
//禁用所有中断
cli();
uart_init(uart_BAUD_SELECT(uart_BAUD,F_CPU));

DDRE&=~(1MCUCR不用于您使用它的目的。事实上,它的大部分位都是只读的


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

一个人的随机数是另一个人解决问题的重要线索。你能在你的帖子中包含一些吗?我已经附上了输出的屏幕截图。请单击帖子末尾的输出屏幕截图!不要添加纯文本的屏幕截图。你可以只需将文本输入到您的帖子中。除了UncleO的答案,encorer是机械的,可能需要一些类似于按钮的去盎司…@RadLexus如果它是一个模拟器,那么它可能没有复制/粘贴感谢@UncleO指出它。我一直在挠头。现在我得到的值只是一起递增或递减有很多反弹。你能建议一些可行的解决方案吗?你应该修改你的问题,或者用最新的代码和问题开始一个新的问题。@0我做了!任何关于去bouncing的建议!网络上充满了好的去bouncing例程…我会根据中断而不是延迟来选择一个。。。