(25-08-2019, 18:59)twjx napisał(a): Doczytałem że używanie PORT jest 20x szybsze od digitalWriteŻeby tylko 20 razy
Kod:
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG = oldSREG;
}
Kod:
uint8_t oldSREG = SREG;
cli();
Kod:
SREG = oldSREG;
(25-08-2019, 18:59)twjx napisał(a): ale czy z tego powodu warto zaczynać się uczyć programować bezpośrednio rejestry uC ???Zawsze warto poznać sprzęt. Kod funkcji digitalWrite potwierdza tezę, że gdy coś jest do wszystkiego to jest do niczego. Przekaźnikiem można sobie posterować ale zrobić np programowe SPI jest już nierozsądne. Używając rejestrów można programowo uzyskać prędkość interfejsu sprzętowego z digitalWrite też ale CPU taktowanego 500kHz.