![]() |
![]() |
#1 |
Member
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0 ![]() |
![]()
добрый день
- Atmega328P - на 3м порту (PD3/INT1) висит кнопка - порт сконфигурирован на вход, подтяжка установлена - дребезг контактов давится программно попытался заменить ардуиновскую функцию digitalRead() на более низкоуровневую: #define _L( BIT) ( _BV( BIT ) ) #define _R(PORT,BIT) ( PORT >> BIT ) #define PORTD_GET(BIT) ( _R ( ( PIND & _L(BIT) ) , (BIT) ) ) #define D03_GET (PORTD_GET (3)) #define PORT_GET_BTN ( D03_GET ) т.е. в коде digitalRead(3) меняется на PORT_GET_BTN при быстрой проверке работает нормально, читат все ок, но вот при дотошном прогоне кода, программа начинает подглючивать причем при замене макроопределения на след. программа перестает тупить: #define PORT_GET_BTN (digitalRead(3)) ВОПРОСЫ: - привильно ли определен PORT_GET_BTN ? - правомерная ли такая замена? - из за чего может глючить (хотя бы потенциально) ? - где то читал, что для кнопок внутреннего подтягивающего сопротивления не достаточно и надо ставить внешние, кто что думает по этому поводу ? можно ключевые слова, ссылки, в личку итд... ОБНОВЛЕНИЕ глюки выловлены, проблема была в том, что я решил полностью заменить ардуиновские digitalWrite() digitalRead() - на низкоуровневые аналоги а так поступать, как оказалось, не следовало, т.к. голова дана не только что бы ею лопать... :о) сначало восстановил все как было, проверил, действительно из за этого ну и пока отложил это серьезное дело "замену ардуиновских функций на низкоуровневые" пожалуйста, продолжаем высказываться, буду следить за топиком хотелось бы УСЛЫШАТЬ МНЕНИЯ: - где можно и корректно использовать "такую замену" ардуиновским функциям - где нет - какие особенности - подводные камни - итд Последний раз редактировалось sunjob; 09.12.2013 в 20:29. |
![]() |
![]() |
![]() |
#2 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Внутреннего подтягивающего резистора вполне хватает
Если не использовать прерывание, то бороться с дребезгом просто А вот как Вы программно боретесь с дребезгом в прерывании? Я борюсь с ними конденсатором 0,1 мКф |
![]() |
![]() |
![]() |
#3 |
Member
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0 ![]() |
![]()
тоже 0.1 мкф... но у меня прерывания и очень шумный кнопко-энкодер
|
![]() |
![]() |
![]() |
#4 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Для работы с Arduino на контроллере Atmega328 Есть библиотека CyberLib |
|
![]() |
![]() |
![]() |
#5 |
Member
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0 ![]() |
![]()
спасибо, с бибилотекой ознакомлен :о), но "для себя пишу под себя", тогда и понятно и приятно и... полезно
п.с. огромная просьба, по вопросам есть какие мнения? (имено по вопросам) спасибо |
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 21.09.2013
Сообщений: 109
Вес репутации: 0 ![]() |
![]()
В Avr LibC есть макросы для работс с GPIO.
PINX << BIT - вернет бит из порта X. Например: int val = (PINB << 3); //чтение с 3 ноги порта B, нумерация с 0 |
![]() |
![]() |
![]() |
#7 |
Member
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0 ![]() |
![]()
поправьте, если не прав:
- ардуино - PINB - регистр порта В, только чтение PINB << X - это эквивалент: чтение порта и умножение на 2 в степени Х возможно в AVR/LibC - это по другому, в данном контексте речь идет об Ардуино я чего та не знаю или недопонимаю комменты, ссылки, спасибо зю глюки пойманы за соотв. нежные органы и выкорчеваны из кода, топик дополнил пожалуйста, продолжаем высказываться Последний раз редактировалось sunjob; 09.12.2013 в 19:55. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Регистрация: 21.09.2013
Сообщений: 109
Вес репутации: 0 ![]() |
![]()
Мой косяк
![]() int val = (PINB & (1 << 3)); //чтение с 3 ноги порта B, нумерация с 0 PINB - содержит регистр чтения из порта B, (1 << 3) - сдвигает единичку на 3 бита влево, получается маска, логическим и (&) накладываем маску на регистр и получаем значение интересующей ноги. edited: за это весьма сильно не люблю работу с GPIO на таком уровне и использую самописный API в стиле ардуино. |
![]() |
![]() |
![]() |
#9 |
Member
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0 ![]() |
![]()
если внимааательно присмотреться к моим макросам, так как раз ТО-САМОЕ и сделано :о)
все библиотеки и исходники не пересмотреть, поэтому так же пишется "код под себя" |
![]() |
![]() |
![]() |
#10 |
Member
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0 ![]() |
![]()
хотелось бы УСЛЫШАТЬ МНЕНИЯ:
- где можно и корректно использовать "такую замену" ардуиновским функциям - где нет - какие особенности - подводные камни - итд |
![]() |
![]() |
![]() |
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
|
|