digitalWrite()

Page

Stránky / Arduino / C++ pre Arduino / Funkcie API /

Funkcia slúži prepínanie digitálneho výstupu na hodnotu 0 alebo 1. Funkcia je naprogramovaná ako užívateľsky bezpečná. To znamená, že interne vykoná omnoho viac činností, než by bolo nevyhnutné. Na jednej strane je tak síce pomalá, ale na druhej strane môže neopatrného užívateľa uchrániť od možných problémov.

Syntax

void digitalWrite(uint8_t pin, uint8_t val);

Parametre

  • pin - Číslo pinu, ktorého digitálnu hodnotu chcete nastaviť.
  • val - Logická hodnota true alebo false.

Návratová hodnota

  • void - Nevracia žiadnu hodnotu.

Zdrojový kód

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;
 } 
Zdrojový kód je z verzie 1.0.5. Ako je z neho vidno, vo funkcii sa toho deje omnoho viac, než za bežných okolností treba. Funkcia je síce na jedne strane bezpečná, na druhej strane je ale pomalšia.
Funkcia robí nasledovné činnosti:
  • Najprv vykoná niekoľko konverzií z pinu rôzne hodnoty. V prípade, že užívateľ zadal nejakú hlúposť, vyskočí z funkcie.
  • Potom sa pokúsi vypnúť PWM, ak sa nachádza na pine, ktorý môže robiť PWM.
  • Potom získa reálnu adresu portu. Vyzerá to síce podivne, ale nakoniec sa len dostane ku PORTD alebo PORTB.
  • Potom zakáže prerušenia.
  • Konečne robí to, čo je treba. Nastavuje hodnotu pinu na logickú nulu alebo jednotku.
  • Na záver ešte drobné upratovanie registrov.

Ako to urýchliť

Pre nás je podstatné identifikovať port a príslušný bit, cez ktorý sa deje úprava. Samotná úprava sú len bitové manipulácie na porte. Ukážeme si to na príklade funkcie:
  • digitalWrite(10, LOW); - Port=PORTB, bit=0b00000100, hodnotu musíme zapísať logickú nulu.
  • digitalWrite(10, HIGH); - Port=PORTB, bit=0b00000100, hodnotu musíme zapísať logickú jednotku.
Priama manipulácia portu vyzerá takto:
  • Logická nula - PORTB&=~0b00000100;
  • Logická jednotka - PORTB|=0b00000100;

Podmienky na správne fungovanie funkcie

Niekde pred samotným použitím funkcie digitalWrite by sa mala použiť funkcia pinMode, ktorou nastavíme, že daný pin bude fungovať ako výstup. Obvykle sa to nastavuje vo funkcii setup.
void setup()
{
pinMode(10, OUTPUT);
} 
Ak sa to predtým nenastaví, stane sa to, že interne je na pine pripnutý pull-up rezistor, ktorý bude brániť pretekaniu prúdu. Nejaký malý prúd samozrejme potečie, takže ak tam bude pripojená LED, čosi by sa na nej mohlo rozsvietiť. V dokumentácii ATmega328P som našiel, že by hodnota rezistora mala byť 20-50 kohm.

05.07.2015


Menu