roboforum.ru

Технический форум по робототехнике.

Как запрограммировать "кнопку" вкл/выкл

Как запрограммировать "кнопку" вкл/выкл

ferio » 31 мар 2009, 10:00

Здравствуйте!
Программирую в CodeVisonAVR.
Хочу сделать, чтобы МК переходил в спящий режим и возвращался из него по нажатию кнопки. По аналогии с кнопкой включения/выключения как на сотовом телефоне.

Может ли кто помочь примером на Си. Или хотя бы подсказать алгоритм работы прерывания в этом случае.

Re: Как запрограммировать "кнопку" вкл/выкл

EdGull » 31 мар 2009, 10:19

кнопку с подтяжкой повесь на любое прерывание и будет тебе счастье.

Re: Как запрограммировать "кнопку" вкл/выкл

ferio » 31 мар 2009, 11:37

Ставлю следующий код в прерывание:
Код: Выделить всёРазвернуть
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)

{
if(PIND.2 == 0 && flag1==0)
    {
    sleep_enable();
    powerdown();
    flag1=1;   
    }
if(PIND.2 == 0 && flag1==1)
    {
    sleep_disable();
    }
     
   
}


он не работает, в чем ошибка?

ЗЫ. МК тина2313

Re: Как запрограммировать "кнопку" вкл/выкл

EdGull » 31 мар 2009, 11:44

я конечно в Сях полный ноль, но думаю всё таки нужно не только влючить прерывание, но сконфигурировать его
в васике это делается вот так

Код: Выделить всёРазвернуть
$regfile = "2313def.dat"
$crystal = 4000000

Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Falling

Dim Wtime As Byte

On Int0 Stopbutton

Cls

Wtime = 255

Enable Interrupts
Enable Int0

Do
  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime
Loop

Stopbutton:
  Lcd "stopъ!"
Return

End


Re: Как запрограммировать "кнопку" вкл/выкл

ferio » 31 мар 2009, 11:54

Сконфигурированно по изменению напряжения.
Код: Выделить всёРазвернуть
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: On
// INT1 Mode: Any change
// INT2: Off
GICR|=0xC0;
MCUCR=0x05;
MCUCSR=0x00;
GIFR=0xC0;

Re: Как запрограммировать "кнопку" вкл/выкл

EdGull » 31 мар 2009, 11:57

ну тогда жди Сишников.

Re: Как запрограммировать "кнопку" вкл/выкл

ferio » 31 мар 2009, 12:00

EdGull писал(а):ну тогда жди Сишников.

Ждем-с. Надеюсь, что подскажут. :)

Re: Как запрограммировать "кнопку" вкл/выкл

blindman » 31 мар 2009, 12:34

1. Прерывание сделать по переходу из 1 в 0.
2. В прерывании ввести задержку для устранения дребезга контактов.
3. Проверять состояние ноги в прерывании нет необходимости, сам факт прерывания будет говорить о том, что кнопка нажата.

Re: Как запрограммировать "кнопку" вкл/выкл

ferio » 31 мар 2009, 14:09

1. Прерывание сделать по переходу из 1 в 0.
Это Low Level или Falling Edge?

2. В прерывании ввести задержку для устранения дребезга контактов.
3. Проверять состояние ноги в прерывании нет необходимости, сам факт прерывания будет говорить о том, что кнопка нажата.

Согласен, просто сначала не подумал. ))

Re: Как запрограммировать "кнопку" вкл/выкл

blindman » 31 мар 2009, 14:13

Edge = переход

Re: Как запрограммировать "кнопку" вкл/выкл

avr123.nm.ru » 31 мар 2009, 14:38

blindman писал(а):1. Прерывание сделать по переходу из 1 в 0.
2. В прерывании ввести задержку для устранения дребезга контактов.
3. Проверять состояние ноги в прерывании нет необходимости, сам факт прерывания будет говорить о том, что кнопка нажата.

Нафига тогда на дребезг проверять ???

Re: Как запрограммировать "кнопку" вкл/выкл

blindman » 31 мар 2009, 14:41

Чтобы не выхватить еще одно прерывание

Re: Как запрограммировать "кнопку" вкл/выкл

avr123.nm.ru » 31 мар 2009, 14:44

ferio писал(а):1. Прерывание сделать по переходу из 1 в 0.
Это Low Level или Falling Edge?


ПЕРЕВОД он-лайн http://www.Translate.ru <- ИСПОЛЬЗУЙТЕ !

blindman писал(а):Чтобы не выхватить еще одно прерывание
Задержка наверно не поможет без очистки флага от дребезга.

Re: Как запрограммировать "кнопку" вкл/выкл

blindman » 31 мар 2009, 14:46

blindman писал(а):Чтобы не выхватить еще одно прерывание

Опа, а при размыкании кнопки же тоже дребезг будет. Надо это тоже как-то учитывать.

Re: Как запрограммировать "кнопку" вкл/выкл

avr123.nm.ru » 31 мар 2009, 14:50

blindman писал(а):
blindman писал(а):Чтобы не выхватить еще одно прерывание

Опа, а при размыкании кнопки же тоже дребезг будет. Надо это тоже как-то учитывать.


Наверно в прерывании надо делать паузу 50-100 мС и потом смотреть все же какой уровень на ноге.


Rambler\'s Top100 Mail.ru counter