AVR studio в вопросах и ответах
Ткните мордой как правильно смотреть состояние определенного пина и как определенному выводу установить значение в студии. До этого писал в кодевижне, и пользовался конструкциями PINB.1 и PORTB.0, и я так понял тут таких макросов нет 
- Реклама
Код: Выделить всё
#define bit_set(reg,bit) ((reg) |= (1<<(bit)))
#define bit_clr(reg,bit) ((reg) &= ~(1<<(bit)))
#define bit_test(reg,bit) ((reg) & (1<<(bit)))Ставим плюсы: )
Спасибо=)
А никто не подскажет как правильнее всего опрашивать кнопки с антидребезгом?
Просто чувствую что то что я пишу это даже не велосипед сделанный из костылей а что-то гораздо хуже...
Ооочень хочется избавиться от криворукости 
А никто не подскажет как правильнее всего опрашивать кнопки с антидребезгом?
Просто чувствую что то что я пишу это даже не велосипед сделанный из костылей а что-то гораздо хуже...
Спойлер
Код: Выделить всё
#define AMP PINB.0
if(AMP)
{
delay_ms(50);
if(AMP)
{
}
}
использовать так:
Код: Выделить всё
#include "buttons.h" // в этом файле меняем BUTTON_OK,BUTTON_UP,BUTTON_DOWN,BUTTON_LEFT,BUTTON_RIGHT на свои названия
/* в файле buttons.h меняем порт и номер бита вместо тех, что там написаны:
#define BUTTON_0_PORT C,4
#define BUTTON_1_PORT C,5
#define BUTTON_2_PORT C,6
#define BUTTON_3_PORT C,7
*/
buttons_init();
if(button_lock(BUTTON_OK)){
button_lock_clr(BUTTON_OK);
// действие по короткому нажатию
}
if(button_hold(BUTTON_OK)){
button_hold_clr(BUTTON_OK);
// действие по долгому нажатию
}
...
buttons_service(); - вызываем раз в 10мс
Последний раз редактировалось ibiza11 Чт июн 19, 2014 17:45:07, всего редактировалось 1 раз.
Ставим плюсы: )
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Самый распространненый алгоритм:
создаете три флага
KeyState, KeyStateOld и KeyResult
в прерывании по таймеру опрашиваете кнопку полученый результат в флаг KeyState
выходите из прерывания в следующем прерывании переносите из KeyState в KeyStateOld снова опрашиваете кнопку
Если в течении нескольких опросов состояния равны то выставляете флаг KeyResult и его уже используете в процедурах работы с кнопкой
Ну как то так.
создаете три флага
KeyState, KeyStateOld и KeyResult
в прерывании по таймеру опрашиваете кнопку полученый результат в флаг KeyState
выходите из прерывания в следующем прерывании переносите из KeyState в KeyStateOld снова опрашиваете кнопку
Если в течении нескольких опросов состояния равны то выставляете флаг KeyResult и его уже используете в процедурах работы с кнопкой
Ну как то так.
- Реклама
О, огромное спасибо 
Много лишнего. Просто считывайте кнопку по таймеру с периодом около 10мс и никакой дребезг не страшен максимум чем это чревато - обнаружите нажатие на 0...10мс позже фактического. Можно конечно еще хранить предыдущее значение кнопки, тогда можно отлавливать моменты нажатия и отпускания.
Alexeyslav писал(а):Много лишнего.
Код: Выделить всё
KeyStateOld= KeyState;
KeyState= PINX.Y;
if(KeyStateOld== KeyState) KeyResult= 1;
// + к тому
if(KeyStateOld && !KeyState) ButtonPress();// момент нажатия кнопки
if(!KeyStateOld && KeyState) ButtonDerpess();// момент отпускания кнопки
PS. Извините, на сях.
Docendo discimus
Здесь нет проверки на "в течении нескольких опросов состояния равны" вот именно она и лишняя.
Да, и этот код тоже работать не будет, т.к. он выдает нажатие даже когда кнопка не нажата.
Проверки (KeyStateOld== KeyState) недостаточно, надо еще AND (KeyState==1{или 0, какое значение соответствует нажатию кнопки})
Да, и этот код тоже работать не будет, т.к. он выдает нажатие даже когда кнопка не нажата.
Проверки (KeyStateOld== KeyState) недостаточно, надо еще AND (KeyState==1{или 0, какое значение соответствует нажатию кнопки})
Мдя, сранно, а у меня везде и рядом работает. Пойду херить свои проекты.Alexeyslav писал(а):тоже работать не будет
Docendo discimus
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Поиск рулит...WishMasterMax писал(а):А никто не подскажет как правильнее всего опрашивать кнопки с антидребезгом?
http://radiokot.ru/forum/viewtopic.php? ... &start=240
http://radiokot.ru/forum/viewtopic.php? ... &start=160
http://radiokot.ru/forum/viewtopic.php?f=57&t=101520
http://radiokot.ru/forum/viewtopic.php?f=62&t=99360
- Сообщения: 6
- Зарегистрирован: Пт дек 30, 2011 20:34:33
подскажите по такой проблемке:
AVR Studio 4.16, контроллер Attiny13, код на асме.
При компиляции пишет:
Но стоит в код добавить один nop, сразу компилировать отказывается. лезут ошибки.
Т.е. похоже как будто при загрузке более 50% код не умещается что ли?
AVR Studio 4.16, контроллер Attiny13, код на асме.
При компиляции пишет:
Код: Выделить всё
ATtiny13 memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x00020a 512 0 512 1024 50.0%
[.dseg] 0x000060 0x000060 0 0 0 64 0.0%
[.eseg] 0x000000 0x000000 0 0 0 64 0.0%
Т.е. похоже как будто при загрузке более 50% код не умещается что ли?
А код можно? и место прокомментируйте, куда добавляете.
Fucking static initialization order fiasco
- Сообщения: 6
- Зарегистрирован: Пт дек 30, 2011 20:34:33
код большой, как сделать что бы прокрутка была в поле code?
На всякий случай приаттачил.
Есть такое соображение, что память у Attiny13 512х16 бит.
Может поэтому и 50% максимум?
На всякий случай приаттачил.
Есть такое соображение, что память у Attiny13 512х16 бит.
Может поэтому и 50% максимум?
- Вложения
-
- CTCSS_asm.asm
- (7.32 КБ) 191 скачивание
Так он же вам английским по белому пишет:
(144): error: Relative branch out of reach
И даже ссылку даёт какая строка ему не нравится:
brsh M12;
(144): error: Relative branch out of reach
И даже ссылку даёт какая строка ему не нравится:
brsh M12;
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 6
- Зарегистрирован: Пт дек 30, 2011 20:34:33
добавить еще пару nop, или закомментировать часть строк, он будет ошибку на другую метку показывать.
Вот нашел на этом же сайте:
Не могу понять почему появляется ошибка: "Relative branch out of reach". Компилятор начал ругаться когда я добавил в программе несколько подпрограмм
(даже если они пустые) на brne, breq?
Ответ:
Команды условных переходов brne и breq имеют "дальность работы" от -64 до +63. У Вас расстояние до метки больше, поэтому ассемблер и выдает ошибку.
Используйте RCALL и RJMP, у которых дальность действия составляет от -2047 до +2047. И не строк, а команд (слов по 2 байта).
Буду теперь размышлять.
Вот нашел на этом же сайте:
Не могу понять почему появляется ошибка: "Relative branch out of reach". Компилятор начал ругаться когда я добавил в программе несколько подпрограмм
(даже если они пустые) на brne, breq?
Ответ:
Команды условных переходов brne и breq имеют "дальность работы" от -64 до +63. У Вас расстояние до метки больше, поэтому ассемблер и выдает ошибку.
Используйте RCALL и RJMP, у которых дальность действия составляет от -2047 до +2047. И не строк, а команд (слов по 2 байта).
Буду теперь размышлять.
Почитайте подробнее описание команд типа BRSH и заодно правила форума.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 6
- Зарегистрирован: Пт дек 30, 2011 20:34:33
Добавлю. Стек нужно правильно установить или воспользоваться тем, что он устанавливается аппаратно 0x9F.
- Сообщения: 6
- Зарегистрирован: Пт дек 30, 2011 20:34:33




