Вопросы от нуба по внешним прерываниям
Добавлено: Ср авг 27, 2014 22:24:57
Добрый день.
Есть несколько вопросов по внешним прерываниям. Использую atmega8535.
1. Почему обработка прерывания не прекращается?
К INT0 через кнопку подключён +5V. Прерывание должно срабатывать по ниспадающему фронту:
Как только напряжение подаётся на микроконтроллер, прерывание начинает выполняться постоянно. Если нажать на кнопку (которая к +5V подключена), то прерывание перестаёт выполняться. Где логика? Настройка регистра MCUCR на другие типы событий ни к чему не приводит.
2. Имеются проблемы с наводками на лапке. Как решить?
Сейчас схема подключена через программатор к компьютеру. Наблюдаю остановку выполнения моего зацикленного прерывания при касании рук к клавиатуре. То же происходит при касании к макетной плате. Была такая же проблема с портами ввода, решилась включением pullup резисторов (pullup же, да?).
Пока всё, спасибо. На всякие случай прикладываю код прошивки. C, CodeVision AVR
main.c
semafor.c (для полноты картины)
Пробовал использовать код из этого сообщения. http://radiokot.ru/forum/viewtopic.php? ... r#p2110148 Такая же реакция, как и раньше.
Есть несколько вопросов по внешним прерываниям. Использую atmega8535.
1. Почему обработка прерывания не прекращается?
К INT0 через кнопку подключён +5V. Прерывание должно срабатывать по ниспадающему фронту:
Код: Выделить всё
GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2); 2. Имеются проблемы с наводками на лапке. Как решить?
Сейчас схема подключена через программатор к компьютеру. Наблюдаю остановку выполнения моего зацикленного прерывания при касании рук к клавиатуре. То же происходит при касании к макетной плате. Была такая же проблема с портами ввода, решилась включением pullup резисторов (pullup же, да?).
Пока всё, спасибо. На всякие случай прикладываю код прошивки. C, CodeVision AVR
main.c
Спойлер
Код: Выделить всё
/*
* InlineController.c
*
* Created: 10.08.2014 20:01:38
*/
#define F_CPU 8000000UL // 8 MHz
#include <io.h>
#include <delay.h>
#include "semafor.c"
#define MODE_AUTO 0x01
#define MODE_MANUAL 0x02
#define LIGHT_GREEN 0x01
#define LIGHT_RED 0x02
#define BIT(x,n) (((x) >> (n)) & 1)
interrupt [EXT_INT0] void ext_int0_isr(void){
char oldPort = PORTA;
PORTA = 0xFF;
delay_ms(200);
PORTA = oldPort;
}
void main(void){
unsigned short int isAutoMode = 1;
unsigned short int isRedNow = 1;
//SREG|=(1<<7);
GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
//вывод
//отключение подтягивающих резисторов. Без понятия зачем, но работает
PORTA = 0;
DDRA = 0xFF;
//ввод
//включение подтягивающих резистров. Пока не знаю, что это за хрень, но без него
//всё работает, как говно
PORTC = 0xFF;
DDRC = 0x00;
#asm("sei")
//инициализируем светофор. Включаем красный свет
semafor_init();
while(1)
{
//если нажата кнопка переключения режима работы
if (!(PINC & (1<<PINC1))){
isAutoMode = !isAutoMode;
//возможно стоит добавить задержку?
continue;
}
//если автоматический режим работы, сделаем переключение на зеленый и обратно
if(isAutoMode){
semafor_switch_to_green();
semafor_switch_to_red();
continue;
}else{
//если нажата кнопка переключения света светофора
if (!(PINC & (1<<PINC0))){
isRedNow = !isRedNow;
if(isRedNow){
semafor_switch_to_green();
}else{
semafor_switch_to_red();
}
}
}
}
}
Спойлер
Код: Выделить всё
void semafor_switch_to_green(){
//красный и желтый
PORTA = 0x06;
delay_ms(2000);
//зеленый горит
PORTA = 0x01;
delay_ms(5000);
}
void semafor_switch_to_red(){
//зеленый мигает
PORTA = 0x00;
delay_ms(500);
PORTA = 0x01;
delay_ms(500);
PORTA = 0x00;
delay_ms(500);
PORTA = 0x01;
delay_ms(500);
PORTA = 0x00;
delay_ms(500);
PORTA = 0x01;
delay_ms(500);
PORTA = 0x00;
//желтый горит
PORTA = 0x02;
delay_ms(2000);
//красный горит
PORTA = 0x04;
delay_ms(5000);
}
void semafor_init(){
//красный горит
PORTA = 0x04;
delay_ms(5000);
}
Пробовал использовать код из этого сообщения. http://radiokot.ru/forum/viewtopic.php? ... r#p2110148 Такая же реакция, как и раньше.