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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Внешнии прерывания 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
aaarrr
сообщение Nov 9 2011, 21:08
Сообщение #2


Гуру
******

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



Цитата(failguru @ Nov 10 2011, 01:05) *
оно вызывается два раза подрят, причем когда отсоединяю землю еще два раза

Так дребезг, наверное.
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 9 2011, 21:10
Сообщение #3


Участник
*

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



ничесе дребезг) задержка 200милисек!!!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 9 2011, 21:14
Сообщение #4


Гуру
******

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



Цитата(failguru @ Nov 10 2011, 01:10) *
ничесе дребезг) задержка 200милисек!!!

А толку-то в этой задержке? Фронт ловится снова во время выполнения прерывания.
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 9 2011, 21:20
Сообщение #5


Участник
*

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



что делать? как же кнопки делают на INT0 INT1 wacko.gif
Go to the top of the page
 
+Quote Post
x736C
сообщение Nov 9 2011, 21:46
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Таймаут по таймеру и маскирование прерываний INT0, INT1.

Сообщение отредактировал x736C - Nov 9 2011, 21:47
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 9 2011, 21:48
Сообщение #7


Гуру
******

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



Цитата(failguru @ Nov 10 2011, 01:20) *
что делать? как же кнопки делают на INT0 INT1 wacko.gif

Для кнопок совсем не нужны INTx, если только они не служат для пробуждения процессора из спячки. Обычно кнопки опрашиваются по таймеру с программным антидребезгом.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 10 2011, 05:15
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(aaarrr @ Nov 10 2011, 01:48) *
Для кнопок совсем не нужны INTx, если только они не служат для пробуждения процессора из спячки.

И в таком случае используют только одно из Х INT прерываний суммируя сигналы со всех кнопок.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 10 2011, 07:53
Сообщение #9


Участник
*

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



Цитата
Таймаут по таймеру и маскирование прерываний INT0, INT1.

если под маскированием подразумевается вставка cli и sei в начало и в конец функции обработчика прерываний то не помогает, а что таймаут по таймеру даст?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 10 2011, 09:22
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(failguru @ Nov 10 2011, 11:53) *
если под маскированием подразумевается вставка cli и sei в начало и в конец функции обработчика прерываний то не помогает, а что таймаут по таймеру даст?


Это не предметно - код в студию


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 10 2011, 09:55
Сообщение #11


Участник
*

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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 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
failguru
сообщение Nov 10 2011, 12:46
Сообщение #14


Участник
*

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



да, в этом дело похоже, что дожидается. а как сбросить?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2011, 12:52
Сообщение #15


Гуру
******

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



Цитата(Палыч @ Nov 10 2011, 14:11) *
2. Программный. В этом случае необходимо после первого изменения состояния кнопки не реагировать на её изменение в течении некоторого времени, большего чем время дребезга (обычно, для этого задействуют таймер).

Лучше фиксировать не первое попавшееся изменение, а стабильность уровня сигнала кнопки в течение промежутка времени, превышающего время дребезга.
Go to the top of the page
 
+Quote Post

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

 


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


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