Увидев насколько медленно выполняются стандартные функции digitalWrite, digitalRead и PinMode, сделал модуль, которые позволяет выполнять эти операции за два такта процессора.

Однако есть ограничения:

1. Вы должны быть уверены, что на ногу, состояние которой Вы меняете, не запущен ШИМ (он же analogWrite)
2. Эти операции выполняются реально быстро только в случае, если на этапе компиляции известно, что и куда вы пишите.

То есть код
PHP код:
    PinModeOut(1);
    
PinModeIn(0);
    
DigitalWrite1(1);
    
DigitalWrite1(2);
    if (
DigitalReadF(1))
        
DigitalWrite0(2);
    
DigitalWrite0(3);
    
DigitalWrite1(8); 
будет выполняться со скоростью строчка за два такта (вместо 60-80 тактов оригинальных команд).

код
PHP код:
    for (int8_t i=0;i<22;i++)
        
PinModeOut(i); 
выполняется 483 такта - примерно 22 такта на итерацию с учетом цикла. Ну да все равно существенно быстрее оригинала.

Есть и недостаток, который я не знаю как победить: эта штука кушает порядка 88 байт памяти.

Сам код pins.h
PHP код:
#ifndef PINS_H
#define PINS_H

#include <avr/io.h>
 
#define PORTD_W (uint16_t) &PORTD
#define PORTB_W (uint16_t) &PORTB
#define PORTC_W (uint16_t) &PORTC

#define DDRD_W (uint16_t) &DDRD
#define DDRB_W (uint16_t) &DDRB
#define DDRC_W (uint16_t) &DDRC

#define PIND_W (uint16_t) &PIND
#define PINB_W (uint16_t) &PINB
#define PINC_W (uint16_t) &PINC

const uint8_t ArduinoRPin[22] = {(1<<0),(1<<1),(1<<2),(1<<3),(1<<4),(1<<5),(1<<6),(1<<7),(1<<0),(1<<1),(1<<2),(1<<3),(1<<4),(1<<5),(1<<0),(1<<1),(1<<2),(1<<3),(1<<4),(1<<5),(1<<6),(1<<7)};
const 
uint8_t ArduinoPinPORT [22] = {PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,
                                    
PORTB_W,PORTB_W,PORTB_W,PORTB_W,PORTB_W,PORTB_W,
                                    
PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W};

const 
uint8_t ArduinoPinDDR [22] = {DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,
                                    
DDRB_W,DDRB_W,DDRB_W,DDRB_W,DDRB_W,DDRB_W,
                                    
DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W};

const 
uint8_t ArduinoPinPIN [22] = {PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,
                                    
PINB_W,PINB_W,PINB_W,PINB_W,PINB_W,PINB_W,
                                    
PINC_W,PINC_W,PINC_W,PINC_W,PINC_W,PINC_W,PINC_W,PINC_W};

#define DigitalWrite1(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinPORT[ArduinoPin]) |= ArduinoRPin[ArduinoPin]
#define DigitalWrite0(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinPORT[ArduinoPin]) &= ~ArduinoRPin[ArduinoPin]

#define PinModeOut(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinDDR[ArduinoPin]) |= ArduinoRPin[ArduinoPin]
#define PinModeIn(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinDDR[ArduinoPin]) &= ~ArduinoRPin[ArduinoPin]

#define DigitalReadF(ArduinoPin) ((* ((volatile uint8_t *) (uint16_t) ArduinoPinPIN[ArduinoPin])& ArduinoRPin[ArduinoPin]))

#endif