Хак №4: Читаем 6 энкодеров на 6 пинах
Энкодеры требуют мгновенной реакции. Используем PCINT для порта C (пины A0-A5): ISR(PCINT1_vect) { // Срабатывает при изменении на порту Cstatic uint8_t encState[6] = {0};uint8_t currentState = PINC;uint8_t changed = currentState ^ lastPINC; }
Читать далее »Полный хак: Подключаем 16 кнопок на 3 прерывания
Представьте: у вас есть клавиатура 4×4, и вы хотите обрабатывать нажатия без опроса в loop(). volatile bool keyPressed = false;volatile uint8_t lastState = 0; void setup() {// Настраиваем пины 0-7 (PORTD) как входы с подтяжкойDDRD = 0b00000000; // Все…
Читать далее »Часть 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 (минус). Хак-применение:
Читать далее »