реклама на сайте
подробности

 
 
> Внешнии прерывания atmega8L, трабл с перрыванием
failguru
сообщение Nov 9 2011, 21:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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);
        }
}

ХЭЛП
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
failguru
сообщение Nov 10 2011, 09:55
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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);
        }
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 10 2011, 10:11
Сообщение #3


Гуру
******

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



Дребезг контактов можно подавить двумя способами;
1. Аппаратный - поставить RS-триггер. Вероятно, не хотите ставить...
2. Программный. В этом случае необходимо после первого изменения состояния кнопки не реагировать на её изменение в течении некоторого времени, большего чем время дребезга (обычно, для этого задействуют таймер).

В Вашем случае:
1. При входе в процедуру прерывания нужно запретить прерывания от INT.
2. Запустить таймер на время Т, большее чем время дребезга.
3. Перед выходом из процедуры прерывания по INT сбросить флаг прерывания по INT.
4. При истечении времени Т (прерывания от таймера) настроить прерывания по INT для фиксации последующих нажатий кнопки; остановить таймер.

P.S. Описанное выше Вам рекомендавал x736C в сообщении #6
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 10 2011, 10:21
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Палыч @ Nov 10 2011, 14:11) *
3. Перед выходом из процедуры прерывания по INT сбросить флаг прерывания по INT.

Не нужно - прерывания от INT будут запрещены, поэтому повторного вызова не произойдет.
Цитата
4. При истечении времени Т (прерывания от таймера) настроить прерывания по INT для фиксации последующих нажатий кнопки; остановить таймер.

А вот тут-то нужно сбросить прерывание от INT, поскольку при дребезге флаг прерывания уже установлен и только дожидается, чтобы прерывания разрешили...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 10 2011, 16:03
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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) *
Лучше фиксировать не первое попавшееся изменение, а стабильность уровня сигнала кнопки в течение промежутка времени, превышающего время дребезга.

Не всегда это лучше. Пример: "ручная" синхронизация времени устройств, когда важно уловить "начало" нажатия на кнопку.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2011, 16:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Палыч @ Nov 10 2011, 20:03) *
Не всегда это лучше. Пример: "ручная" синхронизация времени устройств, когда важно уловить "начало" нажатия на кнопку.

На кнопку нажимает спринтер Болт? Или у нее дребезг 0.5с?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 10 2011, 16:26
Сообщение #7


Гуру
******

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



Цитата(aaarrr @ Nov 10 2011, 20:08) *
Или у нее дребезг 0.5с?
Пару-тройку лет назад мне попались внешне очень привлекательные китайские кнопки со временем дребезга более 120 мс.

Цитата(aaarrr @ Nov 10 2011, 20:08) *
На кнопку нажимает спринтер Болт?
Бывает, что момент наезда механизма на концевик нужно зафиксировать поточнее...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2011, 18:40
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Палыч @ Nov 10 2011, 20:26) *
Пару-тройку лет назад мне попались внешне очень привлекательные китайские кнопки со временем дребезга более 120 мс.

И мне попадались. Точнее, не мне - клиенту понравились. Дрянь редкостная, да ведь не объяснишь sad.gif Но это все же исключение.

Цитата(Палыч @ Nov 10 2011, 20:26) *
Бывает, что момент наезда механизма на концевик нужно зафиксировать поточнее...

Ну, концевик - это все же несколько из другой оперы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- failguru   Внешнии прерывания atmega8L   Nov 9 2011, 21:05
- - aaarrr   Цитата(failguru @ Nov 10 2011, 01:05) оно...   Nov 9 2011, 21:08
- - failguru   ничесе дребезг) задержка 200милисек!!!   Nov 9 2011, 21:10
|- - aaarrr   Цитата(failguru @ Nov 10 2011, 01:10) нич...   Nov 9 2011, 21:14
- - failguru   что делать? как же кнопки делают на INT0 INT1   Nov 9 2011, 21:20
|- - x736C   Таймаут по таймеру и маскирование прерываний INT0,...   Nov 9 2011, 21:46
|- - aaarrr   Цитата(failguru @ Nov 10 2011, 01:20) что...   Nov 9 2011, 21:48
|- - ILYAUL   Цитата(aaarrr @ Nov 10 2011, 01:48) Для к...   Nov 10 2011, 05:15
- - failguru   ЦитатаТаймаут по таймеру и маскирование прерываний...   Nov 10 2011, 07:53
|- - ILYAUL   Цитата(failguru @ Nov 10 2011, 11:53) есл...   Nov 10 2011, 09:22
|||- - ILYAUL   Цитата(Палыч @ Nov 10 2011, 20:26) Бывает...   Nov 10 2011, 18:01
||- - rx3apf   Цитата(Палыч @ Nov 10 2011, 20:03) При др...   Nov 10 2011, 16:18
|- - aaarrr   Цитата(Палыч @ Nov 10 2011, 14:11) 2. Про...   Nov 10 2011, 12:52
- - failguru   да, в этом дело похоже, что дожидается. а как сбро...   Nov 10 2011, 12:46
|- - rx3apf   Цитата(failguru @ Nov 10 2011, 16:46) да,...   Nov 10 2011, 13:15
- - failguru   Вот в таком варианте работает. Странно почему надо...   Nov 10 2011, 13:31
|- - rx3apf   Цитата(failguru @ Nov 10 2011, 17:31) Два...   Nov 10 2011, 13:39
|- - rx3apf   Цитата(failguru @ Nov 10 2011, 17:31) Вот...   Nov 10 2011, 14:21
- - failguru   уже два раза не пишет, все ок. теперь осталось тол...   Nov 10 2011, 13:54
- - ILYAUL   Цитата(failguru @ Nov 10 2011, 17:54) уже...   Nov 10 2011, 14:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 17:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016