Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.12.2013, 00:45   #1
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Arduino, digitalRead(), замена, работа через порт

добрый день

- 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.
sunjob вне форума   Ответить с цитированием
Старый 09.12.2013, 01:50   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

Внутреннего подтягивающего резистора вполне хватает
Если не использовать прерывание, то бороться с дребезгом просто
А вот как Вы программно боретесь с дребезгом в прерывании?

Я борюсь с ними конденсатором 0,1 мКф
Admin вне форума   Ответить с цитированием
Старый 09.12.2013, 11:43   #3
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

тоже 0.1 мкф... но у меня прерывания и очень шумный кнопко-энкодер
sunjob вне форума   Ответить с цитированием
Старый 09.12.2013, 12:23   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

Цитата:
тоже 0.1 мкф... но у меня прерывания и очень шумный кнопко-энкодер
Для кнопки можно увеличить емкость

Для работы с Arduino на контроллере Atmega328
Есть библиотека CyberLib
Admin вне форума   Ответить с цитированием
Старый 09.12.2013, 15:05   #5
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

спасибо, с бибилотекой ознакомлен :о), но "для себя пишу под себя", тогда и понятно и приятно и... полезно

п.с. огромная просьба, по вопросам есть какие мнения? (имено по вопросам)

спасибо
sunjob вне форума   Ответить с цитированием
Старый 09.12.2013, 16:28   #6
SilverSwift
Senior Member
 
Регистрация: 21.09.2013
Сообщений: 109
Вес репутации: 0
SilverSwift is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

В Avr LibC есть макросы для работс с GPIO.
PINX << BIT - вернет бит из порта X.
Например:
int val = (PINB << 3); //чтение с 3 ноги порта B, нумерация с 0
SilverSwift вне форума   Ответить с цитированием
Старый 09.12.2013, 18:04   #7
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

поправьте, если не прав:

- ардуино
- PINB - регистр порта В, только чтение

PINB << X - это эквивалент: чтение порта и умножение на 2 в степени Х
возможно в AVR/LibC - это по другому, в данном контексте речь идет об Ардуино

я чего та не знаю или недопонимаю
комменты, ссылки, спасибо

зю

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

Последний раз редактировалось sunjob; 09.12.2013 в 19:55.
sunjob вне форума   Ответить с цитированием
Старый 09.12.2013, 20:00   #8
SilverSwift
Senior Member
 
Регистрация: 21.09.2013
Сообщений: 109
Вес репутации: 0
SilverSwift is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

Мой косяк
int val = (PINB & (1 << 3)); //чтение с 3 ноги порта B, нумерация с 0

PINB - содержит регистр чтения из порта B,
(1 << 3) - сдвигает единичку на 3 бита влево, получается маска,
логическим и (&) накладываем маску на регистр и получаем значение интересующей ноги.

edited: за это весьма сильно не люблю работу с GPIO на таком уровне и использую самописный API в стиле ардуино.
SilverSwift вне форума   Ответить с цитированием
Старый 09.12.2013, 20:15   #9
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

если внимааательно присмотреться к моим макросам, так как раз ТО-САМОЕ и сделано :о)

все библиотеки и исходники не пересмотреть, поэтому так же пишется "код под себя"
sunjob вне форума   Ответить с цитированием
Старый 09.12.2013, 20:29   #10
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Re: Arduino, digitalRead(), замена, работа через порт

хотелось бы УСЛЫШАТЬ МНЕНИЯ:
- где можно и корректно использовать "такую замену" ардуиновским функциям
- где нет
- какие особенности
- подводные камни
- итд
sunjob вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 14:35. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика