Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

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

Ср янв 18, 2012 18:18:05

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

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

Ср янв 18, 2012 18:25:21

BerZerK-ku писал(а):И заметьте, ни одного примера или совета я не употреблял со словами "так надо делать". Примеры приводятся под конкретную задачу, советы озвучиваются как вариант решения.
где-то я читал, что многоопытные сталевары на глазах у новичка могут сунуть палец в расплавленный металл - и палец остается невредимым. они, правда, усмехаясь в усы, говорят "никогда так не делай, сынок", но тем не менее находятся сынки, остающиеся без пальцев... вы сами по себе можете писать быдлокод, лизать рельс на морозе, совать гвозди в розетку, пить уксус - пожалуйста, вам это, может быть, только на пользу будет! но публично демонстрировать это не следует, как пример явно неположительный и недостойный подражания. даже при наличии оговорок, которых, кстати, вы не делаете все равно (вы постоянно подразумеваете, что это пример для то ли IAR-а, то ли для ***ра)

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

Ср янв 18, 2012 18:29:00

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

с вами все ясно. а чего я ждал? :dont_know:

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

Ср янв 18, 2012 18:56:40

:))) т.е. лучше делать как вы и выкладывать не рабочий код? мысленно комментируя - найди и доделай сам.

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

Ср янв 18, 2012 18:59:09

Так, народ, прекращайте письками мериться. Всё равно моё кун-фу круче! :)
Автор уже забыл, про что спрашивал...

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

Ср янв 18, 2012 19:00:29

Могу ошибиться, но вы упустили главное: автор вроде уже разобрался с данной проблемой :)))

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

Ср янв 18, 2012 22:54:09

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

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

З.Ы. если наша с другом задумка пойдет в массы с меня по бутылке балантайса )

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

Ср янв 25, 2012 10:49:09

Код:
/МИГАНИ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 Гц. спасибо Вам заранее.

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

Ср янв 25, 2012 15:35:00

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

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

Ср янв 25, 2012 18:57:48

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

спасибо дружище, -буду вникать, -расти над собой. спасибо :)

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

Вс июн 10, 2012 21:48:36

Народ, подскажите что не так делаю, пожалуйта.
Пітаюсь написать программу, которая по нажатию кнопки будет менять направление движения бегущего огонька. В программе организовал счетчик который отсчитывает количество нажатий кнопки и отправляет в соответствующую функцию. При залитии программы на контроллер, оно как бы отправляет в функцию, но бесконечный цикл вложенный в эту функцию не работает, т.е. дорожка пробегает один раз и все. Пишу под АТтини 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;
}

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

Вс июн 10, 2012 22:57:58

бесконечных циклов во все функции натыкали, конечно...
Скажите, какую роль во всех вызываемых функциях играет
Код:
while(1){}

?

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

Пн июн 11, 2012 09:11:26

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

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

Пн июн 11, 2012 13:23:25

Все учатся, но надо же понимать, что втыкаете в код программы, и как оно будет работать.
Да, сделайте на прерываниях (я бы так и сделал изначально).
Скажем, в основном цикле проверяете, чему в данный момент равняется i, и вызываете соответствующую функцию. По нажатию кнопки увеличиваете i в обработчике прерывания.

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

Пн июн 11, 2012 15:32:07

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

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

Пн июн 11, 2012 15:36:26

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

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

Пн июн 11, 2012 16:20:55

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

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

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

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

Пн июн 11, 2012 16:36:40

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 раз(а).

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

Пн июн 11, 2012 16:41:21

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


а можно пример кода? ато мне не совсем понятно.

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

Пн июн 11, 2012 17:19:26

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