CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Кнопка подключена между PINB.0 и землей.
В прерывании по таймеру каждые 50мсек(или что-то вроде того):

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

{
old_knopka= knopka;
knopka= PINB.0;
if(old_knopka== 1 && knopka== 1) ....//кнопка не нажата
if(old_knopka== 1 && knopka== 0) ....//момент нажатия кнопки
if(old_knopka== 0 && knopka== 0) ....//кнопка нажата
if(old_knopka== 0 && knopka== 1) ....//момент отпускания кнопки
}

Можно троекратный опрос(как в UART'e), но практика показывает избыточность этого метода.
Docendo discimus
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

demiurg301 писал(а):Народ - а сделать програмно фильтр дребезга ?
вам же было сказано - вы не читаете ответов?
мое мнение - для работы с кнопками таймеры не нужны, прерывания - тоже излишество. бывают случаи, когда без прерываний никак, но чаще всего тупой опрос порта дает самый простой и надежный результат. примерно так:

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

#define KEY1 (1 << PB0)
#define KEY2 (1 << PB1)
#define KEY3 (1 << PB2)
// и так далее
#define ANYKEY (KEY1 | KEY2 | KEY3)

#define NOKEY 0


unsigned char gety_key(void){
   unsigned char key = ~(PINB & ANYKEY);
   delay_ms(20);
   if(~(PINB & ANYKEY) == key)
      return key;
   else
      return NOKEY;
}
в основном цикле с кнопками работать примерно так:

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

switch(get_key()){
case KEY1 :
   // обработка кнопки 1
   break;
case KEY2:
   // обработка кнопки 2
   break;
   // и так далее
}
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение IfoR »

Мастер Ломастер, нет, ну надо опять. Я говорю именно про текущию ситуацию: пара cli\sei.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

я только что рассказал, почему sei в обработчике прерывания имеет важный смысл. не имеет смысла cli - это да, но не sei. или вы о чем, IfoR?
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение IfoR »

Я о том, что нет смысла в прерывании запрещать глобальные прерывания, а потом в его конце их разрешать. Это делается аппаратно.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

IfoR писал(а):Я о том, что нет смысла в прерывании запрещать глобальные прерывания, а потом в его конце их разрешать. Это делается аппаратно.
с первой частью согласен на 100% - запрещать смысла нет. а вот разрешать - порой бывает нужно, правда, не в конце обычно :) в общем, это уже флуд
битва с дураками проиграна, победители торжествуют. слава победителям!
vovanxp
Родился
Сообщения: 2
Зарегистрирован: Пт сен 16, 2011 23:57:24

Re: CodeVision AVR в вопросах и ответах

Сообщение vovanxp »

Помогите плз.
Вот у меня такой код написан в void main(void) в CVAVR
{
int pressed ;
....


.....

while (1)
{
pressed = 1;

if (pressed = 105) {
lcd_clear();
delay_ms(30);
lcd_gotoxy(3,0);
lcd_puts("0x00");
delay_ms(300);

};

}
}

Не пойму но условие всегда исполняетя, хотя pressed = 1, а не 105.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

if (pressed == 105) {
Docendo discimus
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Мастер Ломастер писал(а):
demiurg301 писал(а):Народ - а сделать програмно фильтр дребезга ?
вам же было сказано - вы не читаете ответов?
мое мнение - для работы с кнопками таймеры не нужны, прерывания - тоже излишество. бывают случаи, когда без прерываний никак, но чаще всего тупой опрос порта дает самый простой и надежный результат. примерно так:

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

#define KEY1 (1 << PB0)
#define KEY2 (1 << PB1)
#define KEY3 (1 << PB2)
// и так далее
#define ANYKEY (KEY1 | KEY2 | KEY3)

#define NOKEY 0


unsigned char gety_key(void){
   unsigned char key = ~(PINB & ANYKEY);
   delay_ms(20);
   if(~(PINB & ANYKEY) == key)
      return key;
   else
      return NOKEY;
}
в основном цикле с кнопками работать примерно так:

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

switch(get_key()){
case KEY1 :
   // обработка кнопки 1
   break;
case KEY2:
   // обработка кнопки 2
   break;
   // и так далее
}


НЕ мне сказано!!! ДА я и влез то потомучто не понимаю как можно на пустом месте создавать проблему! Работа со счётчиком и таймерами проверена и является чуть ли не классическим "фильтром" дребезга. Для каждого типа кнопок можно настроить и программу не тормозит как 10-20 мс задержки в простом циклическом опросе...
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

demiurg301 писал(а):Работа со счётчиком и таймерами проверена и является чуть ли не классическим "фильтром" дребезга. Для каждого типа кнопок можно настроить и программу не тормозит как 10-20 мс задержки в простом циклическом опросе...
ну, если атомную бомбу считать классическим средством для уничтожения пауков - то и применение таймеров, прерываний и т.п. для работы с кнопками можно назвать классикой жанра :) хотя лично я считаю, что это скорее категория "из пушки по воробьям". ну а на счет торможения программы - это вообще смешно... однако я снова даю важную ремарку: бывают случаи, когда без прерываний и таймеров действительно не обойтись.
битва с дураками проиграна, победители торжествуют. слава победителям!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Мастер Ломастер писал(а):
demiurg301 писал(а):Работа со счётчиком и таймерами проверена и является чуть ли не классическим "фильтром" дребезга. Для каждого типа кнопок можно настроить и программу не тормозит как 10-20 мс задержки в простом циклическом опросе...
ну, если атомную бомбу считать классическим средством для уничтожения пауков - то и применение таймеров, прерываний и т.п. для работы с кнопками можно назвать классикой жанра :) хотя лично я считаю, что это скорее категория "из пушки по воробьям". ну а на счет торможения программы - это вообще смешно... однако я снова даю важную ремарку: бывают случаи, когда без прерываний и таймеров действительно не обойтись.


Завод кнопок на прерывание бывает важен например для кнопки аварийного выключения или для немедленной реакции на человека( секундомер например встроеный в устройство).

Делать задержку ( а они бывают очень большие - в зависимости от массы кнопок, степени защиты , времени работы) после выставки "1" в матрице - накладно по времени цикла.

Я использовал фильтр ( как описал выше) для работы с обычной матричной клавой - и ничего ужасного в задействовании одного 8 битного таймера не увидел. Зато точно не сработает от 50Гц наводки или жира с пальцев - а время опрос существенно уменьшается.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

demiurg301 писал(а):Завод кнопок на прерывание бывает важен например для кнопки аварийного выключения или для немедленной реакции на человека( секундомер например встроеный в устройство).
мда... какую бы систему вы не делали, завод кнопки на прерывание с целью обеспечения быстрого аварийного отключения СОВЕРШЕННО БЕСМЫСЛЕННО. кнопку нажимает человек, а его мышечная реакция даже у самых-самых тренированных людей редко бывает лучше 0,1 секунды, т.е. 100 миллисекунд. если аварийное отключение должно что-то там опасное остановить, например, пресс или циркулярную пилу, то надо учесть, что быстродействие электромеханических исполнительных устройств не может превысить 0,1 сек, т.е. те же самые 100 миллисекунд. итого даже в самом супер-идеальном случае быстрее, чем 200 миллисекунд никакая аварийная кнопка не сработает. и ваши потуги уменьшить время реакции на нажатие кнопки на жалкие 10-20 миллисекунд - просто пустая трата сил.

demiurg301 писал(а):Делать задержку ( а они бывают очень большие - в зависимости от массы кнопок, степени защиты , времени работы) после выставки "1" в матрице - накладно по времени цикла.
ничуть не так. задержку надо делать после съема значений со всех кнопок. будь их хоть 100, алгоритм прежний:
1. запоминаем состояние всех кнопок
2. делаем задержку
3. сравниваем текущее состояние кнопок с запомненным
4. если оба состояния равны - дребезг кончился, значение можно анализировать.
задержка всегда будет определяться длительностью дребезга, который для обычных кнопок длится не более 20 миллисекунд.
demiurg301 писал(а):ничего ужасного в задействовании одного 8 битного таймера не увидел. Зато точно не сработает от 50Гц наводки или жира с пальцев - а время опрос существенно уменьшается.
а ничего ужасного и нет. просто бесполезно, имхо.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

Подскажите пожалуйста помню как то создавал такие шняги типа main led (main)
А дальше писал как моргать светском потом еще такую хрень создавал но led1 и другой цикл...
Так вот как бы это написать то?мэин название мэин скобка не помню какая алгоритм и скобка закрываеться,как это правильно написать?и как потом вызвать?спасибо!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

ничуть не так. задержку надо делать после съема значений со всех кнопок. будь их хоть 100, алгоритм прежний:
1. запоминаем состояние всех кнопок
2. делаем задержку
3. сравниваем текущее состояние кнопок с запомненным
4. если оба состояния равны - дребезг кончился, значение можно анализировать.
задержка всегда будет определяться длительностью дребезга, который для обычных кнопок длится не более 20 миллисекунд.


И что вам даст запоминание всех кнопок в матричной клавиатуре? 4х4 хотябы
1) выставляем единицу в строке
2) задержка
3) опрос столбцов
4) повторяем 1-3 - 4 раза для каждой строки.
Итого 80мс. А есть кнопки у которых дребезг и 50 и 100мс. Да и кнопки могут банально ржаветь, а там начинает пробивать жир, налёт и окислы... задрежка ещё увеличивается.

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

Re: CodeVision AVR в вопросах и ответах

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

demiurg301 писал(а):И что вам даст запоминание всех кнопок в матричной клавиатуре? 4х4 хотябы
1) выставляем единицу в строке
2) задержка
3) опрос столбцов
4) повторяем 1-3 - 4 раза для каждой строки.
мне - ничего не даст, я глупостями не занимаюсь :)
а алгоритм должен быть таким:
1) выставляем 1 в строке
2) считываем ВСЕ столбцы одновременно
3) далее п. 1 и 2 по всем строкам.
4) задержка
5) повторяем опрос ВСЕХ кнопок
6) сравниваем старое и новое, как я описывал ранее и принимаем решение.

алгоритм упрощенный, и не для всех случаев применим "тупо", однако сам подход прежний. Интересно, как в вашем алгоритме вы сможете обрабатывать одновременное нажатие нескольких кнопок? число повторов и опросов возрастет... а в моем алгоритме - все делается на раз.

собственно, мой алгоритм рассчитан на небольшое количество кнопок, до 8 оптимально, и его прямой перенос на матрицу может оказаться невыгодным. однако, его модификация может применяться и для матрицы, но об этом в другой раз :)
битва с дураками проиграна, победители торжествуют. слава победителям!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

мне - ничего не даст, я глупостями не занимаюсь :)
а алгоритм должен быть таким:
1) выставляем 1 в строке
2) считываем ВСЕ столбцы одновременно
3) далее п. 1 и 2 по всем строкам.
4) задержка
5) повторяем опрос ВСЕХ кнопок
6) сравниваем старое и новое, как я описывал ранее и принимаем решение.

алгоритм упрощенный, и не для всех случаев применим "тупо", однако сам подход прежний. Интересно, как в вашем алгоритме вы сможете обрабатывать одновременное нажатие нескольких кнопок? число повторов и опросов возрастет... а в моем алгоритме - все делается на раз.

собственно, мой алгоритм рассчитан на небольшое количество кнопок, до 8 оптимально, и его прямой перенос на матрицу может оказаться невыгодным. однако, его модификация может применяться и для матрицы, но об этом в другой раз :)


Да, вот только после выставки 1 в строку - даже при ранее нажатой кнопке может возникнуть "дребезг"( например если масло в кнопку попало или ещё что) и вы не получите нажатие(или получите на несколько циклов позже, если палец не уберёте - получается эффект задержки реакции кнопки) . Поэтому я и делаю задержку после кажой выставки 1 . Т.е. пункт 3 и 4 местами поменен. А так смысл тотже - переждать дребезг. Я использовал такой алгоритм и таймер для клавиатур 4*4 , 16*16.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

по какой бы причине дребезг не возникал, что мой, что ваш алгоритмы его подавляют, внося дополнительную задержку - принцип подавления одинаков. все прочее - от лукавого
битва с дураками проиграна, победители торжествуют. слава победителям!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Подскажите такой момент по CV(да и вообще С ). Я могу брать указатели на массив или строку таким вот образом

unsigned char *PtS
unsigned char stroka[n];

1) PtS=(unsigned char*) stroka;
2) PtS=&stroka[0] ;

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

Re: CodeVision AVR в вопросах и ответах

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

demiurg301 писал(а):Подскажите такой момент по CV(да и вообще С ). Я могу брать указатели на массив или строку таким вот образом

unsigned char *PtS
unsigned char stroka[n];

1) PtS=(unsigned char*) stroka;
2) PtS=&stroka[0] ;

Какой из этих вариантов правильней и заведомо менее глючный (ну там оптимизатор, логика компилятора) .
Использую 1й вариант, но появились сомнения, а всегда ли будет взят 1й элемент массива.
нормальный компилятор ДОЛЖЕН понимать ПРАВИЛЬНУЮ запись:
PtS = stroka;
битва с дураками проиграна, победители торжествуют. слава победителям!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Мастер Ломастер писал(а):
demiurg301 писал(а):Подскажите такой момент по CV(да и вообще С ). Я могу брать указатели на массив или строку таким вот образом

unsigned char *PtS
unsigned char stroka[n];

1) PtS=(unsigned char*) stroka;
2) PtS=&stroka[0] ;

Какой из этих вариантов правильней и заведомо менее глючный (ну там оптимизатор, логика компилятора) .
Использую 1й вариант, но появились сомнения, а всегда ли будет взят 1й элемент массива.
нормальный компилятор ДОЛЖЕН понимать ПРАВИЛЬНУЮ запись:
PtS = stroka;


действительно, вы сделали для меня открытие. А я всегда разадресацию и адресацию ( ну или приведение к типу = хотя видать автоматом всё компилятор делает) делал :dont_know: Не знаю даже, чот в голову не приходило, что указателю просто массив "присвоить". Ща перемучу кое какую прогу -грешу на глюки в указателях.
Так а всётаки - конкретно куда этот указатель будет "указывать". На 1й ( нулевой точнее) элемент массива? Т.е. практически на него ... а документально?
Ответить

Вернуться в «AVR»