roboforum.ru

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

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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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

Сообщение ferio » 31 мар 2009, 10:00

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

Может ли кто помочь примером на Си. Или хотя бы подсказать алгоритм работы прерывания в этом случае.
ferio
 
Сообщения: 27
Зарегистрирован: 31 мар 2009, 09:57
Откуда: Мск

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

Сообщение EdGull » 31 мар 2009, 10:19

кнопку с подтяжкой повесь на любое прерывание и будет тебе счастье.
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

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
ferio
 
Сообщения: 27
Зарегистрирован: 31 мар 2009, 09:57
Откуда: Мск

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

Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

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;
ferio
 
Сообщения: 27
Зарегистрирован: 31 мар 2009, 09:57
Откуда: Мск

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

Сообщение EdGull » 31 мар 2009, 11:57

ну тогда жди Сишников.
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

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

Сообщение ferio » 31 мар 2009, 12:00

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

Ждем-с. Надеюсь, что подскажут. :)
ferio
 
Сообщения: 27
Зарегистрирован: 31 мар 2009, 09:57
Откуда: Мск

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

Сообщение blindman » 31 мар 2009, 12:34

1. Прерывание сделать по переходу из 1 в 0.
2. В прерывании ввести задержку для устранения дребезга контактов.
3. Проверять состояние ноги в прерывании нет необходимости, сам факт прерывания будет говорить о том, что кнопка нажата.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение ferio » 31 мар 2009, 14:09

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

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

Согласен, просто сначала не подумал. ))
ferio
 
Сообщения: 27
Зарегистрирован: 31 мар 2009, 09:57
Откуда: Мск

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

Сообщение blindman » 31 мар 2009, 14:13

Edge = переход
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение avr123.nm.ru » 31 мар 2009, 14:38

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

Нафига тогда на дребезг проверять ???
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение blindman » 31 мар 2009, 14:41

Чтобы не выхватить еще одно прерывание
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение avr123.nm.ru » 31 мар 2009, 14:44

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


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

blindman писал(а):Чтобы не выхватить еще одно прерывание
Задержка наверно не поможет без очистки флага от дребезга.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение blindman » 31 мар 2009, 14:46

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

Опа, а при размыкании кнопки же тоже дребезг будет. Надо это тоже как-то учитывать.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение avr123.nm.ru » 31 мар 2009, 14:50

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

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


Наверно в прерывании надо делать паузу 50-100 мС и потом смотреть все же какой уровень на ноге.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36