|
Внешнии прерывания atmega8L, трабл с перрыванием |
|
|
|
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
|
|
|