Программируем по настоящему. Загадочные регистры
Немного о том, что знают настоящие не “ардуино-зависимые” программисты о микроконтроллерах
И еще о том, зачем в школе мучают булевой алгеброй
Регистры процессора (микроконтроллера) — блок ячеек памяти, образующий сверхбыструю оперативную память внутри процессора. Есть регистры, используемые самим процессором для вычислений, например, при выборке из памяти очередной команды она помещается в регистр команд, а при выборке переменных они помещаются в регистры операндов.
Но в микроконтроллере есть ещё и другие регистры – хранящие настройки разных периферийных устройств (портов ввода/вывода, например). С ними в основном и имеет дело программист. Например регистр PORTB, хранящий состояние выводов (пинов), или регистр DDR, хранящий настройки, находятся ли выводы (пины) в состояние входа или выхода.
Конфигурировать регистры будем булевыми операциями – AND (&) и OR(|).
Ну, говорить о том, что представлять содержание регистра удобнее всего в шестнадцатеричной или двоичной системе не будем.
Также умолчим о возможности калькулятора (вид->инженерный) переводить числа между разными системами
.
Вот таблица истинности – правила двоичной арифметики, ну это уж почти всем известно
Ну раз регистр это просто ячейка, например, из 8 бит, то выставим в регистре с именем PORTB восемь единичек:
Или все нули:
А теперь, как выставить 1 в первом бите (обратите внимание на нумерацию битов в регистре – начинается 0), не изменив состояние других – при помощи OR (операция выполняется побитово):
Как же выставить 0 в любом бите – при помощи AND
Выставляем 0 в первом бите, не изменив состояние других – при помощи AND (операция выполняется побитово):
Вот целый курс по программированию МК AVR “правильно” таким hard core способом, который в общем то и используют настоящие разработчики (customelectronics.ru)
Зажжем диод на ардуино, заодно попрактикуемся с регистрами.
Заглянув в datasheet на микроконтроллер ATmega8 семейства AVR (да, да, именно такой и в вашей ардуине), в ужасе ничего не понимаешь понимаешь, что выходы соответствуют трем портам B, C, D – PB0-5, PC0-5, PD0-7. В Arduino эти названия переименованы в цифровые выводы D0-D13 и аналоговые входы A0-A5.
Выводы управляются регистрами PORTх и DDRх.
Например, вывод PB5 управляется пятым битом в регистрах PORTB (состояние вывода – 0 или 1, 0В или 5В) и DDRB (настройка вывода – на вход(0) и выход(1));
Итак, чтобы подать 1 (5В) на 13 пин ардуино (PB5):
Вот так просто