AVR studio в вопросах и ответах
- WishMasterMax
- Потрогал лапой паяльник
- Сообщения: 389
- Зарегистрирован: Пн июл 09, 2012 11:07:59
- Откуда: Ukraine
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Ткните мордой как правильно смотреть состояние определенного пина и как определенному выводу установить значение в студии. До этого писал в кодевижне, и пользовался конструкциями PINB.1 и PORTB.0, и я так понял тут таких макросов нет 
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: AVR studio 4 в вопросах и ответах
Код: Выделить всё
#define bit_set(reg,bit) ((reg) |= (1<<(bit)))
#define bit_clr(reg,bit) ((reg) &= ~(1<<(bit)))
#define bit_test(reg,bit) ((reg) & (1<<(bit)))Ставим плюсы: )
- WishMasterMax
- Потрогал лапой паяльник
- Сообщения: 389
- Зарегистрирован: Пн июл 09, 2012 11:07:59
- Откуда: Ukraine
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Спасибо=)
А никто не подскажет как правильнее всего опрашивать кнопки с антидребезгом?
Просто чувствую что то что я пишу это даже не велосипед сделанный из костылей а что-то гораздо хуже...
Ооочень хочется избавиться от криворукости
А никто не подскажет как правильнее всего опрашивать кнопки с антидребезгом?
Просто чувствую что то что я пишу это даже не велосипед сделанный из костылей а что-то гораздо хуже...
Спойлер
Код: Выделить всё
#define AMP PINB.0
if(AMP)
{
delay_ms(50);
if(AMP)
{
}
}
Ооочень хочется избавиться от криворукости
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: AVR studio 4 в вопросах и ответах
использовать так:
Код: Выделить всё
#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 раз.
Ставим плюсы: )
- Pavel_1978
- Опытный кот
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
Re: AVR studio 4 в вопросах и ответах
Самый распространненый алгоритм:
создаете три флага
KeyState, KeyStateOld и KeyResult
в прерывании по таймеру опрашиваете кнопку полученый результат в флаг KeyState
выходите из прерывания в следующем прерывании переносите из KeyState в KeyStateOld снова опрашиваете кнопку
Если в течении нескольких опросов состояния равны то выставляете флаг KeyResult и его уже используете в процедурах работы с кнопкой
Ну как то так.
создаете три флага
KeyState, KeyStateOld и KeyResult
в прерывании по таймеру опрашиваете кнопку полученый результат в флаг KeyState
выходите из прерывания в следующем прерывании переносите из KeyState в KeyStateOld снова опрашиваете кнопку
Если в течении нескольких опросов состояния равны то выставляете флаг KeyResult и его уже используете в процедурах работы с кнопкой
Ну как то так.
- WishMasterMax
- Потрогал лапой паяльник
- Сообщения: 389
- Зарегистрирован: Пн июл 09, 2012 11:07:59
- Откуда: Ukraine
- Контактная информация:
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Много лишнего. Просто считывайте кнопку по таймеру с периодом около 10мс и никакой дребезг не страшен максимум чем это чревато - обнаружите нажатие на 0...10мс позже фактического. Можно конечно еще хранить предыдущее значение кнопки, тогда можно отлавливать моменты нажатия и отпускания.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Alexeyslav писал(а):Много лишнего.
Код: Выделить всё
KeyStateOld= KeyState;
KeyState= PINX.Y;
if(KeyStateOld== KeyState) KeyResult= 1;
// + к тому
if(KeyStateOld && !KeyState) ButtonPress();// момент нажатия кнопки
if(!KeyStateOld && KeyState) ButtonDerpess();// момент отпускания кнопки
Это много?
PS. Извините, на сях.
Docendo discimus
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Здесь нет проверки на "в течении нескольких опросов состояния равны" вот именно она и лишняя.
Да, и этот код тоже работать не будет, т.к. он выдает нажатие даже когда кнопка не нажата.
Проверки (KeyStateOld== KeyState) недостаточно, надо еще AND (KeyState==1{или 0, какое значение соответствует нажатию кнопки})
Да, и этот код тоже работать не будет, т.к. он выдает нажатие даже когда кнопка не нажата.
Проверки (KeyStateOld== KeyState) недостаточно, надо еще AND (KeyState==1{или 0, какое значение соответствует нажатию кнопки})
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Alexeyslav писал(а):тоже работать не будет
Мдя, сранно, а у меня везде и рядом работает. Пойду херить свои проекты.
Docendo discimus
Re: AVR studio 4 в вопросах и ответах
Поиск рулит...WishMasterMax писал(а):А никто не подскажет как правильнее всего опрашивать кнопки с антидребезгом?
viewtopic.php?f=61&t=39341&start=240
viewtopic.php?f=61&t=79801&start=160
viewtopic.php?f=57&t=101520
viewtopic.php?f=62&t=99360
Re: AVR studio 4 в вопросах и ответах
подскажите по такой проблемке:
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%
Но стоит в код добавить один nop, сразу компилировать отказывается. лезут ошибки.
Т.е. похоже как будто при загрузке более 50% код не умещается что ли?
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
А код можно? и место прокомментируйте, куда добавляете.
Fucking static initialization order fiasco
Re: AVR studio 4 в вопросах и ответах
код большой, как сделать что бы прокрутка была в поле code?
На всякий случай приаттачил.
Есть такое соображение, что память у Attiny13 512х16 бит.
Может поэтому и 50% максимум?
На всякий случай приаттачил.
Есть такое соображение, что память у Attiny13 512х16 бит.
Может поэтому и 50% максимум?
- Вложения
-
- CTCSS_asm.asm
- (7.32 КБ) 190 скачиваний
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: AVR studio 4 в вопросах и ответах
Так он же вам английским по белому пишет:
(144): error: Relative branch out of reach
И даже ссылку даёт какая строка ему не нравится:
brsh M12;
(144): error: Relative branch out of reach
И даже ссылку даёт какая строка ему не нравится:
brsh M12;
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: AVR studio 4 в вопросах и ответах
добавить еще пару 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 байта).
Буду теперь размышлять.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: AVR studio 4 в вопросах и ответах
Почитайте подробнее описание команд типа BRSH и заодно правила форума.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: AVR studio 4 в вопросах и ответах
Слушаюсь, КЭП
Re: AVR studio 4 в вопросах и ответах
Добавлю. Стек нужно правильно установить или воспользоваться тем, что он устанавливается аппаратно 0x9F.
Re: AVR studio 4 в вопросах и ответах
да, это уже поправил.
спасибо.
спасибо.

