C ATmega2560外部中断旋转编码器反弹
我试图从3个旋转编码器(KY-040)获取读数,并通过UART发送值 我使用的是Arduino Mega 2560板,但由于需求原因,我用C语言编程 但当我试图从编码器中读取数据时,我会得到随机数 它只适用于每一个偶数的旋转,程序在奇数旋转时会卡住。(似乎有点奇怪) 谁能告诉我我的代码有什么问题吗 另外,我是一名新的微控制器工作人员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
#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例程…我会根据中断而不是延迟来选择一个。。。