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。这些是设置上升沿和下降沿的寄存器。
我正在尝试从 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。这些是设置上升沿和下降沿的寄存器。