区分 XMEGA 中的下降沿和上升沿
DistinguishingFalling and rising Edges in XMEGA
我有 3 个按钮,每次按下或释放它们时都会产生中断,我遇到的问题是,我需要区分真正发生的事情(实际或按下按钮),这里是我的代码:
..................
ISR(PORTA_INT0_vect){
if(!(PORTA.IN & PIN1_bm)){ // Green LED pressed
printf(" Green button pressed\n");
}
if(!(PORTA.IN & PIN3_bm)){ // Blue LED pressed
printf(" Blue button pressed\n");
}
if (!(PORTA.IN & PIN5_bm)){ // Red LED
printf(" Red button pressed \n");
}
}
ISR(PORTA_INT1_vect){
printf(" I'm in \n");
if((PORTA.IN & PIN1_bm)){// Green LED released
printf("Green button released \n");
}
else if((PORTA.IN & PIN3_bm)){// Blue LED released
printf("Blue button released \n");
}
else if((PORTA.IN & PIN5_bm)){// Red LED released
printf("Red button released \n");
}
}
void buttonINT(){
// PORTA
PORTA.PIN1CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_FALLING_gc ;
PORTA.PIN3CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_FALLING_gc ;
PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_FALLING_gc ;
PORTA.INT0MASK = PIN1_bm | PIN3_bm | PIN5_bm;
PORTA.INTCTRL = PORT_INT0LVL0_bm;
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();
}
void buttonINT2(){
// PORTA
PORTA.PIN1CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_RISING_gc ;
PORTA.PIN3CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_RISING_gc ;
PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_RISING_gc ;
PORTA.INT1MASK = PIN1_bm | PIN3_bm | PIN5_bm;
PORTA.INTCTRL = PORT_INT1LVL1_bm;
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();
}
我遇到的问题是程序根本不通过上升沿生成中断?
知道我在这里做错了什么吗?
我建议使用定时器生成的中断每隔 -say- 10 毫秒轮询一次按键。在这里你可以
- debounce 按键(即仅当您有 2/3/4 次相同读数时才接受按键更改)...如今似乎常常被遗忘
- 检查上升沿和下降沿
- 提出一个 "key-status-change" 标志,可以从
main()
中处理和清除
- 奖励:检查 "long keypresses"
- 奖励:检查 "doubleclicks"
我有 3 个按钮,每次按下或释放它们时都会产生中断,我遇到的问题是,我需要区分真正发生的事情(实际或按下按钮),这里是我的代码:
..................
ISR(PORTA_INT0_vect){
if(!(PORTA.IN & PIN1_bm)){ // Green LED pressed
printf(" Green button pressed\n");
}
if(!(PORTA.IN & PIN3_bm)){ // Blue LED pressed
printf(" Blue button pressed\n");
}
if (!(PORTA.IN & PIN5_bm)){ // Red LED
printf(" Red button pressed \n");
}
}
ISR(PORTA_INT1_vect){
printf(" I'm in \n");
if((PORTA.IN & PIN1_bm)){// Green LED released
printf("Green button released \n");
}
else if((PORTA.IN & PIN3_bm)){// Blue LED released
printf("Blue button released \n");
}
else if((PORTA.IN & PIN5_bm)){// Red LED released
printf("Red button released \n");
}
}
void buttonINT(){
// PORTA
PORTA.PIN1CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_FALLING_gc ;
PORTA.PIN3CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_FALLING_gc ;
PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_FALLING_gc ;
PORTA.INT0MASK = PIN1_bm | PIN3_bm | PIN5_bm;
PORTA.INTCTRL = PORT_INT0LVL0_bm;
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();
}
void buttonINT2(){
// PORTA
PORTA.PIN1CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_RISING_gc ;
PORTA.PIN3CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_RISING_gc ;
PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc| PORT_ISC_RISING_gc ;
PORTA.INT1MASK = PIN1_bm | PIN3_bm | PIN5_bm;
PORTA.INTCTRL = PORT_INT1LVL1_bm;
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();
}
我遇到的问题是程序根本不通过上升沿生成中断?
知道我在这里做错了什么吗?
我建议使用定时器生成的中断每隔 -say- 10 毫秒轮询一次按键。在这里你可以
- debounce 按键(即仅当您有 2/3/4 次相同读数时才接受按键更改)...如今似乎常常被遗忘
- 检查上升沿和下降沿
- 提出一个 "key-status-change" 标志,可以从
main()
中处理和清除
- 奖励:检查 "long keypresses"
- 奖励:检查 "doubleclicks"