|
Внешнии прерывания atmega8L, трабл с перрыванием |
|
|
|
Nov 9 2011, 21:05
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
Прописал прерывание по спаду на INT0, а оно вызывается два раза подрят, причем когда отсоединяю землю еще два раза, пробовал и высокий уровень через 5кОм, и задержку менять, ничего не помогает(((( пишет подряд две "G" Код #include <io.h> #include <delay.h> extern void wrlcd(int rsi, int rwi, int arg); extern void initlcd(); int i=0; char fl=1; interrupt [EXT_INT0] int_0(void){ wrlcd(1,0,(int)'G'); delay_ms(200); } void main(){ delay_ms(100); initlcd(); wrlcd(1,0,(int)'E'); wrlcd(1,0,(int)'C'); DDRD.2=0; //порт с INT0 на вход PORTD.2=1; //подтяжка MCUCR=0b00000010; //прерывание по спаду GICR=0b01000000; //врубаю INT0 #asm("sei") while(1){ delay_ms(200); } } ХЭЛП
|
|
|
|
|
Nov 9 2011, 21:10
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
ничесе дребезг) задержка 200милисек!!!
|
|
|
|
|
Nov 10 2011, 07:53
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
Цитата Таймаут по таймеру и маскирование прерываний INT0, INT1. если под маскированием подразумевается вставка cli и sei в начало и в конец функции обработчика прерываний то не помогает, а что таймаут по таймеру даст?
|
|
|
|
|
Nov 10 2011, 09:55
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
Код #include <io.h> #include <delay.h> extern void wrlcd(int rsi, int rwi, int arg); extern void initlcd(); int i=0; char fl=1; interrupt [EXT_INT0] int_0(void){ wrlcd(1,0,(int)'G'); delay_ms(200); } void main(){ delay_ms(100); initlcd(); wrlcd(1,0,(int)'E'); wrlcd(1,0,(int)'C'); DDRD.2=0; //порт с INT0 на вход PORTD.2=1; //подтяжка MCUCR=0b00000010; //прерывание по спаду GICR=0b01000000; //врубаю INT0 #asm("sei") while(1){ delay_ms(200); } }
|
|
|
|
|
Nov 10 2011, 10:21
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Палыч @ Nov 10 2011, 14:11)  3. Перед выходом из процедуры прерывания по INT сбросить флаг прерывания по INT. Не нужно - прерывания от INT будут запрещены, поэтому повторного вызова не произойдет. Цитата 4. При истечении времени Т (прерывания от таймера) настроить прерывания по INT для фиксации последующих нажатий кнопки; остановить таймер. А вот тут-то нужно сбросить прерывание от INT, поскольку при дребезге флаг прерывания уже установлен и только дожидается, чтобы прерывания разрешили...
|
|
|
|
|
Nov 10 2011, 12:46
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
да, в этом дело похоже, что дожидается. а как сбросить?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|