Часть 2: Прерывания по изменению состояния на ЛЮБОМ пине (Pin Change Interrupts)
Все знают про стандартные прерывания attachInterrupt() на пинах 2 и 3 (INT0 и INT1). Но что, если нужно обрабатывать 5 энкодеров, 10 кнопок или считывать 6 датчиков вибрации одновременно? На помощь приходят Pin Change Interrupts (PCINT) — они работают на всех пинах, кроме 2…
Читать далее »Хак №3: Идеальный ШИМ на максимальной скорости
Самый быстрый способ менять ШИМ для RGB-светодиода на пинах 9, 10, 11 (PORTB): void setup() {DDRB = 0xFF; // Все пины PORTB как выходы} void loop() {// Меняем состояния за 1 такт без задержек!PORTB = 0b00101000; // PB3…
Читать далее »Хак №2: Меняем только конкретные пины, не трогая остальные
Если вы не хотите трогать другие пины порта, используйте побитовые операции: // Включаем только 13-й пин (PB5), не трогая PB0-PB4PORTB |= (1 << PB5); // Устанавливаем бит 5 в 1 (HIGH) // Выключаем 13-й пинPORTB &= ~(1 << PB5);…
Читать далее »Хак №1: Устанавливаем 8 пинов за 1 такт!
Допустим, у нас на PORTD сидят светодиоды на пинах 0–7. Чтобы зажечь их все одновременно, мы пишем: // Старый, медленный способ (8 вызовов digitalWrite) for (int i = 0; i < 8; i++) { digitalWrite(i, HIGH); // Это…
Читать далее »Часть 1: Прямое управление портами (Регистры PORTB, PORTC, PORTD)
Добро пожаловать в мир регистров портов и Pin Change Interrupts — это джедайские техники, которые сделают ваш код быстрее в сотни раз и позволят обрабатывать события так, как не снилось обычным digitalRead(). Почему digitalWrite() — это зло? Когда вы пишете digitalWrite(13, HIGH), Arduino IDE…
Читать далее »Заключение: Свобода начинается здесь
Расширение возможностей Arduino — это не про покупку дорогих шилдов. Это про глубокое понимание схемотехники и архитектуры AVR. Научившись управлять таймерами, использовать сдвиговые регистры и усыплять контроллер, вы перестанете быть просто «кодером», который копирует скетчи. Вы станете настоящим хардкорным хакером,…
Читать далее »Программируем «голый» чип (Без платы)
Когда вы натренируетесь на Uno, вы поймете, что покупать целую плату ради одного датчика — дорого. ATmega328P в отдельном корпусе стоит 1.5 доллара. Как захачить бюджет: В результате вы получаете полноценный компьютер размером с ноготь, который можно зашить…
Читать далее »Используем встроенный компаратор вместо АЦП
Мало кто знает, но внутри ATmega328P есть отдельный аналоговый компаратор, который работает независимо от АЦП. Он подключен к пинам A0 (плюс) и A1 (минус). Хак-применение:
Читать далее »Режим глубокого сна (Deep Sleep): Проекты на одной батарейке
Если ваш проект автономен (метеостанция в лесу), нельзя позволять Arduino жрать 50 мА тока постоянно. Внутренний хак:В ATmega328P есть режимы сна. С помощью библиотеки <avr/sleep.h> вы можете: В режиме Power-Down плата потребляет всего 0.1 мкА (это в 500 раз меньше, чем обычно!)….
Читать далее »Поднимаем частоту: Разгон Arduino (Overclocking)
Да, это возможно! ATmega328P официально работает на 16 МГц, но может стабильно работать на 20 МГц, если заменить кварцевый резонатор. Зачем это нужно? Как сделать:
Читать далее »