Обработка нажатия кнопки в AVR...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

:))) а в чем разница? программа уже не переносима. Если перехожу я, то я знаю что и как делал. Если кто-то пытается изменить мой код, то это уже не мои проблемы. Да и будут проблемы, так как пользуюсь дополнительными прелестями С++.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):И заметьте, ни одного примера или совета я не употреблял со словами "так надо делать". Примеры приводятся под конкретную задачу, советы озвучиваются как вариант решения.
где-то я читал, что многоопытные сталевары на глазах у новичка могут сунуть палец в расплавленный металл - и палец остается невредимым. они, правда, усмехаясь в усы, говорят "никогда так не делай, сынок", но тем не менее находятся сынки, остающиеся без пальцев... вы сами по себе можете писать быдлокод, лизать рельс на морозе, совать гвозди в розетку, пить уксус - пожалуйста, вам это, может быть, только на пользу будет! но публично демонстрировать это не следует, как пример явно неположительный и недостойный подражания. даже при наличии оговорок, которых, кстати, вы не делаете все равно (вы постоянно подразумеваете, что это пример для то ли IAR-а, то ли для ***ра)
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а)::))) а в чем разница? программа уже не переносима. Если перехожу я, то я знаю что и как делал. Если кто-то пытается изменить мой код, то это уже не мои проблемы. Да и будут проблемы, так как пользуюсь дополнительными прелестями С++.

с вами все ясно. а чего я ждал? :dont_know:
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

:))) т.е. лучше делать как вы и выкладывать не рабочий код? мысленно комментируя - найди и доделай сам.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Обработка нажатия кнопки в AVR...

Сообщение ploop »

Так, народ, прекращайте письками мериться. Всё равно моё кун-фу круче! :)
Автор уже забыл, про что спрашивал...
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

Могу ошибиться, но вы упустили главное: автор вроде уже разобрался с данной проблемой :)))
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

Было интересно следить за вашей полемикой :) зря вы так "ругаетесь"...
BerZerK-ku писал(а):Могу ошибиться, но вы упустили главное: автор вроде уже разобрался с данной проблемой :)))

с этой темой вроде как да ) но как говорится песня только начата. Это было мое второе устройство вообще за всю жизнь ) первое было с запоминанием количества нажатий Ресетов, где уважаемые BerZerK-ku с Мастер Ломастер и другие товарищи, наставляли меня на путь истинный )

З.Ы. если наша с другом задумка пойдет в массы с меня по бутылке балантайса )
Аватара пользователя
noll
Открыл глаза
Сообщения: 73
Зарегистрирован: Сб янв 10, 2009 13:15:33

Re: Обработка нажатия кнопки в AVR...

Сообщение noll »

Код: Выделить всё

/МИГАНИE СВЕТОДИОДАМИ/ 

#define F_CPU 8000000UL // 8 000 000 Hz
#include <avr/io.h>
#include <util/delay.h>

int main(void) // начало основной программы
{

DDRD = 0x60; /* выводы порта D: D5, D6 сконфигурировать как выходы */

while (1) { // Бесконечный цикл

PORTD = 0x20; /* установить "1" на D5, остальные в "0" */
_delay_ms(500); // Ждем 0.5 сек.

PORTD = 0x40; /* установить "1" на D6, остальные в "0" */
_delay_ms(500); // Ждем 0.5 сек.

}

}


друзья здравия Вам. вот только второй раз я взялся за МК, программку что выше в WinAVR попробовал и прошил ATmega16 всё заработало -светодиоды мигают в противофазе как и задумано. нашёл программе практическое применение -облучение семян инфракрасными световыми импульсами, - подключил к МК ИК светодиод с резистором. частоты облучения могу подбирать задержками, что и делаю, подбираю и контролирую частотомером. у меня заготовлено три такие прошивки, -ну и перепрошиваю каждый раз когда мне нужна одна из заготовленных частот -что конечно же глупо. прошу у вас помощи как мне сделать так: я добавлю к порту два перключателя -замыкать на землю D0,D1, ну и перключать этими перключателями три частоты которые я заранее подберу, -ну для примера скажем три частоты 4020 Гц, 3010 Гц, 2030 Гц. спасибо Вам заранее.
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

noll писал(а):

Код: Выделить всё

/МИГАНИE СВЕТОДИОДАМИ/ 

#define F_CPU 8000000UL // 8 000 000 Hz
#include <avr/io.h>
#include <util/delay.h>

int main(void) // начало основной программы
{

DDRD = 0x60; /* выводы порта D: D5, D6 сконфигурировать как выходы */

while (1) { // Бесконечный цикл

PORTD = 0x20; /* установить "1" на D5, остальные в "0" */
_delay_ms(500); // Ждем 0.5 сек.

PORTD = 0x40; /* установить "1" на D6, остальные в "0" */
_delay_ms(500); // Ждем 0.5 сек.

}

}


друзья здравия Вам. вот только второй раз я взялся за МК, программку что выше в WinAVR попробовал и прошил ATmega16 всё заработало -светодиоды мигают в противофазе как и задумано. нашёл программе практическое применение -облучение семян инфракрасными световыми импульсами, - подключил к МК ИК светодиод с резистором. частоты облучения могу подбирать задержками, что и делаю, подбираю и контролирую частотомером. у меня заготовлено три такие прошивки, -ну и перепрошиваю каждый раз когда мне нужна одна из заготовленных частот -что конечно же глупо. прошу у вас помощи как мне сделать так: я добавлю к порту два перключателя -замыкать на землю D0,D1, ну и перключать этими перключателями три частоты которые я заранее подберу, -ну для примера скажем три частоты 4020 Гц, 3010 Гц, 2030 Гц. спасибо Вам заранее.


вот почитай это, думаю будет оптимально ) сам учусь пока
viewtopic.php?f=20&t=62240&hilit=%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE+reset
Аватара пользователя
noll
Открыл глаза
Сообщения: 73
Зарегистрирован: Сб янв 10, 2009 13:15:33

Re: Обработка нажатия кнопки в AVR...

Сообщение noll »

AR_AROV писал(а):вот почитай это, думаю будет оптимально ) сам учусь пока

спасибо дружище, -буду вникать, -расти над собой. спасибо :)
UR5FDG
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт мар 23, 2012 17:11:00

Re: Обработка нажатия кнопки в AVR...

Сообщение UR5FDG »

Народ, подскажите что не так делаю, пожалуйта.
Пітаюсь написать программу, которая по нажатию кнопки будет менять направление движения бегущего огонька. В программе организовал счетчик который отсчитывает количество нажатий кнопки и отправляет в соответствующую функцию. При залитии программы на контроллер, оно как бы отправляет в функцию, но бесконечный цикл вложенный в эту функцию не работает, т.е. дорожка пробегает один раз и все. Пишу под АТтини 2313.
Строго не судите, только начал разбираться в написании программ под мк, это так сказать мой первый блин...

Код: Выделить всё

include <avr/io.h>
#include <avr/delay.h>

char eye(unsigned char *i){
   unsigned char c =1;
   while(1){
   if ( (PINB & (1 << PINB0)) == 0 ){
      PORTD = 0x00;
      *i++;
      break;}
      
   PORTD = c;
   c = c << 1;
   _delay_ms(200);
   if (c==0){c=1;}
   }
   return 0;
}

char morg (unsigned char *i){
   unsigned char c = 128;
      while (1){
         if ( (PINB & (1 << PINB0)) == 0 ){
            PORTD = 0x00;
            *i++;
            break;}
            
         PORTD = c;
         c = c >> 1;
         _delay_ms(200);
         if (c==0){c=128;}
      }
}

char mig (unsigned char *i){
   while (1){
      if ( (PINB & (1 << PINB0)) == 0 ){
         PORTD = 0x00;
         *i++;
         break;}
   PORTD = 0x00;
   _delay_ms(200);
   PORTD = 0xFF;
   _delay_ms(200);
   }   
}      

int main(void){
   unsigned char i = 0;
   DDRD = 0xFF;
   DDRB = 0x00;
   PORTB = 0xFF;
    while(1){

       if ( (PINB & (1 << PINB0)) == 0 ){
         i++;}
         
         if(i==1){
            eye(i);
         }
         if(i==2){
            morg(i);
         }
         if(i==3){
            mig(i);
         }
         if(i>3){
         i=1;    }
   }         
   return 0;
}
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Обработка нажатия кнопки в AVR...

Сообщение SubDia »

бесконечных циклов во все функции натыкали, конечно...
Скажите, какую роль во всех вызываемых функциях играет

Код: Выделить всё

while(1){}

?
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
UR5FDG
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт мар 23, 2012 17:11:00

Re: Обработка нажатия кнопки в AVR...

Сообщение UR5FDG »

Ну я только учусь. По задумке каждый бесконечный цикл в функциях гоняет огонек вправо или влево в третей функции оно заставляет моргать все светодиоды. Выход из функции я предусмотрел если нажать кнопку. И с нажатием походу надо угадать, когда программа будет вначале цикла, нужно было делать через прерывания походу.
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Обработка нажатия кнопки в AVR...

Сообщение SubDia »

Все учатся, но надо же понимать, что втыкаете в код программы, и как оно будет работать.
Да, сделайте на прерываниях (я бы так и сделал изначально).
Скажем, в основном цикле проверяете, чему в данный момент равняется i, и вызываете соответствующую функцию. По нажатию кнопки увеличиваете i в обработчике прерывания.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
UR5FDG
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт мар 23, 2012 17:11:00

Re: Обработка нажатия кнопки в AVR...

Сообщение UR5FDG »

И еще вопрос, а если у меня матричная клавиатура, то при нажатии любой кнопки генерировать сигнал прерывания?
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Обработка нажатия кнопки в AVR...

Сообщение SubDia »

Некорректный вопрос. Я, например, не знаю, зачем нужна матричная клавиатура, если переключение режимов осуществляется с помощью одной всего кнопки.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25150
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Обработка нажатия кнопки в AVR...

Сообщение КРАМ »

UR5FDG писал(а):И еще вопрос, а если у меня матричная клавиатура, то при нажатии любой кнопки генерировать сигнал прерывания?

Ни при одной кнопке ни при матрице прерывания от клавиатуры формировать не нужно. Делают это так.
Изображение

Верхняя эпюра - это входной сигнал от кнопки (кнопок).
Средняя - это прерывания от таймера.
Нижняя - это программное состояние кнопки (кнопок).
Т.е. в прерываниях от таймера, которые должны следовать реже, чем длительность дребезга, но чаще, чем необходимая скорость реакции на нажатие кнопки, происходит защелкивание состояния входа от кнопки. Программное состояние кнопки фиксируется только тогда, когда два защелкнутых состояния подряд одинаковы.
UR5FDG
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт мар 23, 2012 17:11:00

Re: Обработка нажатия кнопки в AVR...

Сообщение UR5FDG »

SubDia писал(а):Некорректный вопрос. Я, например, не знаю, зачем нужна матричная клавиатура, если переключение режимов осуществляется с помощью одной всего кнопки.


Я спрашиваю на будущее, не для этого проекта конкретно. Начал разбираться с прерываниями, у меня компилятор ругается на
следующий код
#include <avr/io.h>
#include <avr/interrupt.h>


ISR (SIG_INTERRUPT1){
PORTD ^= 0x00;
}

int main(void)
{
DDRD = 0xFF;
GIMSK = 0x40;
MCUCR = 0x02;
sei();
while(1);
}

пишет: Изображение
Юзаю АТМЕЛЬСтудио 6
Последний раз редактировалось UR5FDG Пн июн 11, 2012 16:45:28, всего редактировалось 2 раза.
UR5FDG
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт мар 23, 2012 17:11:00

Re: Обработка нажатия кнопки в AVR...

Сообщение UR5FDG »

КРАМ писал(а):....
Т.е. в прерываниях от таймера, которые должны следовать реже, чем длительность дребезга, но чаще, чем необходимая скорость реакции на нажатие кнопки, происходит защелкивание состояния входа от кнопки. Программное состояние кнопки фиксируется только тогда, когда два защелкнутых состояния подряд одинаковы.


а можно пример кода? ато мне не совсем понятно.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25150
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Обработка нажатия кнопки в AVR...

Сообщение КРАМ »

Нет, уважаемый, код Вы будете писать сами.
А вот алгоритм я Вам опишу.
Выбираете свободный таймер или используете уже имеющийся. Интервал переполнения этого таймера (прерываний от него) берете больше времени дребезга выбранных кнопок (смотрите в даташите, обычно порядок этого времени 10...50 мс). Пусть это будет 65 мс. Значит если таймер 16 битный, а частота на его входе 1 МГц, то прерывания будут следовать примерно через 65 мс.
Вот в обработчике этого прерывания читаете состояние порта к которому подключена кнопка. Это состояние вдвигаете справа на лево в некую переменную и тут же маскируете у нее все разряды кроме двух младших. Если значение этой переменной = 0, то пишите в программное состояние кнопки 0, если значение этой переменной = 3, то программное состояние кнопки 1, а если переменная равна 1 или 2, то изменять значение программной кнопки нельзя - оно останется прежним.
В программе пользуетесь только программным значением кнопки (0 или 1).
Дребезга у программного значения не будет.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»