Arduino digitalWrite vs rejestry

148kHz digitalWrite 50%

const byte LED_PIN = 8;

void setup(){
  pinMode(LED_PIN, OUTPUT);
}

void loop(){
  digitalWrite(LED_PIN, 1);
  digitalWrite(LED_PIN, 0);
}

Używając rejestrów możemy wykonywać operacje na pinach w bardzo szybki sposób. Za pomocą 1 linii kodu możemy ustawić lub włączyć 8 różnych pinów.

2MHz PORTB OR AND 25%

const byte LED_PIN = 8;

void setup(){
  DDRB = B00000001; 
}

void loop(){
  PORTB |= (1 << PB0); 
  PORTB &= ~(1 << PB0);
}

2.66MHz PORTB przypisanie 17%

const byte LED_PIN = 8;

void setup(){
  DDRB = B00000001; 
}

void loop(){

  PORTB = B00000001;
  PORTB = B00000000;
}

//odwracanie pinu za pomocą rejestru PINB 2.66Mhz duty 50%

void setup() {
  DDRB |= (1 << PB0);  // Ustawienie PB0 (D8) jako wyjście

  while (1) {
    PINB = (1 << PB0);  // Odwrócenie stanu pinu PB0
  }
}

4MHz PORTB while loop przypisanie 25%

const byte LED_PIN = 8;

void setup() {
  DDRB = B00000001;
  while (1) {
    PORTB = B00000001;
    PORTB = B00000000;
  }
}

void loop() {
}

Użycie adresów zamiast makr dla rejestrów DDRB i PORTB

void setup() {
  *(volatile uint8_t*)0x24 = B00000001;
}

int main() {
    setup();
    while (1) {
    *(volatile uint8_t*)0x25 = B00000001;
    *(volatile uint8_t*)0x25 = B00000000;
    }
}

Leave a Comment

Scroll to Top