|
Внешнии прерывания 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

|
да, в этом дело похоже, что дожидается. а как сбросить?
|
|
|
|
|
Nov 10 2011, 13:31
|
Участник

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

|
Вот в таком варианте работает. Странно почему надо устанавливать флаг в GIFR. Типо он думает что еще обрабатывается прошлое прерывание) Остался один вопрос. Когда убираешь землю, мол фронт возрастает, а он все равно прерывание вызывает. Тоже дребезг??? И как исправить. Код interrupt [EXT_INT0] int_0(void){ GICR=0x00; wrlcd(1,0,(int)'G'); TCNT0=0; TCCR0=0b00000101; //включаю счетчик с делителем 1024 (1/(8мГц/1024)*256=0.033 секунды переполнение) } interrupt [TIM0_OVF] void tin(void) { i++; if(i==30){ //проходит примерно секунда!!!!!! GIFR=0b01000000; //устанавливаю флаг GICR=0b01000000; //включаю опять внешнее прерывание TCCR0=0x00; //торможу счетчик i=0; } } void main(){ delay_ms(100); initlcd(); wrlcd(1,0,(int)'E'); DDRD.2=0; //порт с INT0 на вход PORTD.2=1; //подтяжка TIMSK=0b00000001; MCUCR=0b00000010; //прерывание по спаду GICR=0b01000000; //врубаю INT0 #asm("sei") while(1){ delay_ms(500); } }
Сообщение отредактировал failguru - Nov 10 2011, 13:44
|
|
|
|
|
Nov 10 2011, 13:54
|
Участник

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

|
уже два раза не пишет, все ок. теперь осталось только когда отжимаю кнопку срабатывает, а не должен
Сообщение отредактировал failguru - Nov 10 2011, 13:54
|
|
|
|
|
Nov 10 2011, 16:03
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(rx3apf @ Nov 10 2011, 14:21)  Не нужно - прерывания от INT будут запрещены, поэтому повторного вызова не произойдет. При дребезге условие прерывания может возникнуть в интервал времени от входа в прерывание до запрещения этого прерывания, поэтому сбросить флаг всё-таки нужно. Цитата(rx3apf @ Nov 10 2011, 14:21)  А вот тут-то нужно сбросить прерывание от INT, поскольку при дребезге флаг прерывания уже установлен и только дожидается, чтобы прерывания разрешили... Естественно. При инициализации большинства устройств желательно сбрасывать флаги - мало ли что было на входах до этого... Цитата(aaarrr @ Nov 10 2011, 16:52)  Лучше фиксировать не первое попавшееся изменение, а стабильность уровня сигнала кнопки в течение промежутка времени, превышающего время дребезга. Не всегда это лучше. Пример: "ручная" синхронизация времени устройств, когда важно уловить "начало" нажатия на кнопку.
|
|
|
|
|
Nov 10 2011, 16:18
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Палыч @ Nov 10 2011, 20:03)  При дребезге условие прерывания может возникнуть в интервал времени от входа в прерывание до запрещения этого прерывания, поэтому сбросить флаг всё-таки нужно. Оно же не может произойти рекурсивно ? Мы вошли в обработчик прерывания, ну получили еще одно (флаг выставился), но запрещаем-то перед выходом из обработчика. А раз прерывание запрещено - то повторного вызова обработчика не будет. Цитата(aaarrr @ Nov 10 2011, 20:08)  На кнопку нажимает спринтер Болт? Или у нее дребезг 0.5с? Кнопки разные бывают, частота опроса тоже может быть весьма разной. Вполне можно представить ситуацию, когда и десяток mS критичен.
|
|
|
|
|
Nov 10 2011, 18:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Палыч @ Nov 10 2011, 20:26)  Пару-тройку лет назад мне попались внешне очень привлекательные китайские кнопки со временем дребезга более 120 мс. И мне попадались. Точнее, не мне - клиенту понравились. Дрянь редкостная, да ведь не объяснишь  Но это все же исключение. Цитата(Палыч @ Nov 10 2011, 20:26)  Бывает, что момент наезда механизма на концевик нужно зафиксировать поточнее... Ну, концевик - это все же несколько из другой оперы.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|