- Вложения
-
- enc.7z
- (1.17 КБ) 199 скачиваний
Знакомства с помехами на AVR
Вот, нашел, код опроса энкодера. От Леонида Ивановича, если не ошибаюсь:
- Реклама
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
К вопросу о незадействованых пинах. Обычно в ДШ пишут, что с ними рекомендуется делать. Читайте даташит, да.
Вот, например, из ДШ на ATmega48:
К слову, внутренняя подтяжка vs конфигурация как выход. Если мы сконфигурируем пины как выход, это даст нам совершенно железный уровень на них. Это конечно хорошо. Но проблемы могут начаться, если на работающую плату ВНЕЗАПНО упадет какая-нибудь железяка и закоротит эти выводы на что-то. Так что мой выбор для неиспользуемых пинов - внутренняя подтяжка. И конечно, если я читаю из такого порта, я просто обрезаю неиспользуемые биты или сразу проверяю только тот бит, который интересует.
10.2.6 Unconnected Pins
If some pins are unused, it is recommended to ensure that these pins have a defined level. Even
though most of the digital inputs are disabled in the deep sleep modes as described above, floating
inputs should be avoided to reduce current consumption in all other modes where the digital
inputs are enabled (Reset, Active mode and Idle mode).
The simplest method to ensure a defined level of an unused pin, is to enable the internal pull-up.
In this case, the pull-up will be disabled during reset. If low power consumption during reset is
important, it is recommended to use an external pull-up or pull-down. Connecting unused pins
directly to VCC or GND is not recommended, since this may cause excessive currents if the pin is
accidentally configured as an output.
Ну, в том смысле, что там резисторы достаточно высокоомные. Там что-то около 30 - 50 килоом (точность не нормируется). Если это просто один пин, висящий в воздухе (просто незадействованный пин), такой подтяжки хватит. Если же к этому пину подключен еще и метровый провод, ессно надо ставить что-то внешнее.но везде пишут, что она не айс
К слову, внутренняя подтяжка vs конфигурация как выход. Если мы сконфигурируем пины как выход, это даст нам совершенно железный уровень на них. Это конечно хорошо. Но проблемы могут начаться, если на работающую плату ВНЕЗАПНО упадет какая-нибудь железяка и закоротит эти выводы на что-то. Так что мой выбор для неиспользуемых пинов - внутренняя подтяжка. И конечно, если я читаю из такого порта, я просто обрезаю неиспользуемые биты или сразу проверяю только тот бит, который интересует.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 204
- Зарегистрирован: Вт июл 21, 2009 20:57:09
Энкодер я использовал именно с контролем 3-х состояний и анализом каждой ситуации в общем-то о теории не думал а просто перенёс в код человеческую логику если самому смотреть на энкодер.
А вот на прерываниях с контролем соседнего датчика в обработчике не стоит, ловит и помехи и дребезг.
А вот на прерываниях с контролем соседнего датчика в обработчике не стоит, ловит и помехи и дребезг.
Неиспользуемые выводы плохо делать как выходы из соображения, что если было КЗ при пайке, то контроллер может сгореть, при первом включении, а с резисторами подтяжки этого не будет. Ну так не надо делать КЗ.
Затвор??? Вы наверное что-то путаете. Выходной драйвер никак не связан с подтяжкой. Подтяжка стоит после драйвера.ploop писал(а):Стоп. Что внутренняя, что внешняя, грубо говоря, тупо подтягивает к шине затвор полевика.
Ставим плюсы: )
- Реклама
А как это делать?YS писал(а): И конечно, если я читаю из такого порта, я просто обрезаю неиспользуемые биты или сразу проверяю только тот бит, который интересует.
Там лежит два файла, я не нашёл отличий.ploop писал(а):Вот, нашел, код опроса энкодера. От Леонида Ивановича, если не ошибаюсь:
Там есть #include "Encoder.h". Это какая-то стандартная библиотека типа delay или что-то другое?
И ещё я там не увидел антидребезговой проверки. Она делается в основной программе?
И можете показать тему, о антидребезговом последовательном проверянии состояний, пожалуйста?
Код: Выделить всё
void Encoder_Init(void)
{
DDRC &= ~(ENC_F1 | ENC_F2); //настройка портов на ввод
[b]PORTC |= ENC_F1 | ENC_F2; //включение подтягивающих резисторов[/b]
EncPrev = State0; //инициализация предыдущего состояния
EncPrevPrev = State0; //инициализация пред-предыдущего состояния
}Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
А как это делать?
Код: Выделить всё
if (PINC & SW_PIN)
{
...
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Можно немного подробнее про SW_PIN?, пожалуйста? А ваша ссылка не открывается =((YS писал(а):А как это делать?Вот методичка, которую я писал, когда вел кружок. Почитайте, вдруг чего интересное найдете.Код: Выделить всё
if (PINC & SW_PIN) { ... }
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
SW_PIN - это я так символически обозначил битовую маску проверяемого вывода. ОК, пример. Пускай у нас на выводе 2 порта PORTC кнопка, замыкающая на землю, а на выводе 5 - светодиод. И примитивная задача: зажечь светодиод, когда кнопка нажата.Можно немного подробнее про SW_PIN?
Код: Выделить всё
#include <avr/io.h>
#define SW_PIN (1<<PB2)
#define LED_PIN (1<<PB5)
void main(void)
{
DDRC=LED_PIN;
PORTC=0;
while (1)
{
if (!(PINC & SW_PIN))
{
PORTC|=LED_PIN;
}
else
{
PORTC&=~LED_PIN;
}
}
}
http://embedderslife.wordpress.com/2012/04/06/avr-mcus/
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ссылка тоэже не работает. Попробовал с компа и с яблобука - не открываетсяYS писал(а):SW_PIN - это я так символически обозначил битовую маску проверяемого вывода. ОК, пример. Пускай у нас на выводе 2 порта PORTC кнопка, замыкающая на землю, а на выводе 5 - светодиод. И примитивная задача: зажечь светодиод, когда кнопка нажата.Можно немного подробнее про SW_PIN?
while (1)
{
if (!(PINC & SW_PIN)) //Если значение порта С не равно 0b10 - правильно? Я никак не вникну в это. Постоянно путаю, что происходит в таких строках, если смотреть на них как на двоичные числа(
{
PORTC|=LED_PIN; //Побитовое или между 0b00000000 и 0b100000?
}
else
{
PORTC&=~LED_PIN; //Побитовое И с 0b011111
[/code]
Попробуйте эту ссылку:
http://embedderslife.wordpress.com/2012/04/06/avr-mcus/
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Если там не стоит второй бит.Если значение порта С не равно 0b10 - правильно?
SW_PIN будет замещено препроцессором на 1 << 2 = 0b00000100.
Тогда, если бит №2 (нумерация с нуля!) стоит, получим
PINC = 0bxxxxx1xx, (x - неважно, что).
SW_PIN = 0b00000100.
0bxxxxx1xx & 0b00000100 = 0b00000100, что для условного оператора есть "истина". Любое ненулевое значение признается как "истина".
В противном случае получим 0bxxxxx0xx & 0b00000100 = 0, что для условного оператора есть "ложь".
Получается, что все биты, кроме ненулевого в маске, не важны - побитовое И с нулями отрежет их.
Да. По сути - установка бита, не трогая остальные.Побитовое или между 0b00000000 и 0b100000?
Да. Снятие бита, не трогая остальные.Побитовое И с 0b011111
Что пишет?не открывается
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Спасибо за подробное объя\снение. Я это спрашиваю, тк то, что сделает команла мне, в принципе, понятно. Вернее мне понятен результат. Но что именно пошагово произойдёт дохоодит не сразу. А поскольку самые начинания были на ассемблере, хочется понять всё 
Пишет вот что:

Пробовал на хроме, на фаерфоксе. Пробовал выключить экраны антивируса. Пробовал с яблобука. На яблобуке тоже хром. Результат одинаковый везде.
Пишет вот что:
Пробовал на хроме, на фаерфоксе. Пробовал выключить экраны антивируса. Пробовал с яблобука. На яблобуке тоже хром. Результат одинаковый везде.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Попробуйте вставить ссылку в поиск Google и перейти по найденной статье...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
100% работает. Где-то у Вас в URL ошибка. Но при таком разрешении скриншота этого не увидеть...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Странно. А попробуйте зайти просто на wordpress.com, embedderslife.wordpress.com .
Разница между теорией и практикой на практике гораздо больше, чем в теории.
wordpress.com открывает, а вот с адресом вашего сата нет. Ни в ввв, ни с хттп, ни с планшета 
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
ХЗ, это какие-то чудеса. Я даже попробовал через прокси зайти, чтобы точно кэш не мешал, - все ОК.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Мож у меня с инетом чего, щас покидаю ссылку друзьям, попробуем 
UPD Хренотень какая-то, у друга открылось. У меня через анонимайзер тоже... Оо
UPD Хренотень какая-то, у друга открылось. У меня через анонимайзер тоже... Оо
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.



