Care este diferența dintre DDRB și pinMode? (Arduino, Pini, Schiță, Avr)

johny de ce a intrebat.

Am înțeles că următoarele linii sunt echivalente. Ele par a fi interschimbabile în schița mea:

DDRB = 1<<DDB0;

și

pinMode(0, OUTPUT);

Este prima formă (DDRB...) setează direct o adresă a microcontrolerului? Este vorba de asamblor?

Și a doua formă (pinMode) utilizează o bibliotecă inclusă? Poate că avr/io.h bibliotecă?

Pe un Digispark ATTiny85.

Comentarii

  • Acestea nu sunt interschimbabile. DDRB = 1<<DDB0; setează PB0 la ieșire, și de asemenea setează toți ceilalți pini de I/O la intrare. Nu este un asamblor, nu. În asamblor ai scrie sbi _SFR_IO_ADDR(DDRB), 0. –  > Por Edgar Bonet.
  • DDRB |= 1<<DDB0; ar fi echivalent cu pinMode(0, OUTPUT);. Acesta din urmă are însă efectul secundar de a fi mai lent. –  > Por Gerben.
  • @EdgarBonet dacă nu este asamblor, ce este? C? Este într-adevăr același limbaj ca și pinMode(), doar că setează direct biții de nivel inferior? thx –  > Por johny de ce.
  • Este C (sau C++, sunt aceleași pentru această declarație). pinMode() formular invocă o funcție de bibliotecă care face același lucru ca și celălalt formular. –  > Por Russell Borogove.
2 răspunsuri
Majenko

Da, pe un microcontroler simplu precum ATTiny cele două linii de cod sunt echivalente. Funcția pinMode(...) doar caută ce pini se referă la ce porturi într-un tabel și setează registrele corecte.

Folosind DDRB în loc de pinMode(...) este în regulă atâta timp cât nu aveți de gând să rulați niciodată codul dumneavoastră pe altceva (sau să îl dați altcuiva să îl ruleze), deoarece acum ați codificat în schița dumneavoastră ce pini trebuie utilizați. Este mai eficient să folosiți DDRB totuși. Sacrifici portabilitatea pentru eficiență.

Cu toate acestea, pentru microcontrolerele mai complexe, care au mai multe funcții pe un singur pin, doar manipulând DDRB (sau echivalentul de pe microcontrolerul țintă) ar putea să nu fie suficient. Este posibil să aveți nevoie să comutați pinul în modul GPIO, să dezactivați intrările analogice de pe pin sau să efectuați și alte operațiuni. Toate acestea vor fi incluse în pinMode(...) pentru dvs. de către API-ul Arduino, astfel încât nu trebuie să vă faceți griji în această privință.

Deci, pe scurt, dacă nu vă interesează portabilitatea și vă interesează eficiența și dimensiunea codului (ceea ce ar putea fi cazul pe un ATTiny), atunci da, utilizați DDRB și prietenii săi.

Comentarii

  • înțeleg că analogWrite() elimină complet necesitatea de a activa modul de ieșire – nu sunt necesare nici declarațiile DDRB și nici pinMode(). Este analogWrite() chiar mai puțin eficient decât pinMode() + analogWrite()? -thx –  > Por johny de ce.
  • PinMode este redundant. PWM este un mod special care nu este controlat de GPIO, ci de un semnal de la un temporizator. –  > Por Majenko.
  • „atâta timp cât nu ai de gând să rulezi niciodată codul tău pe altceva” – presupun că DDRB sintaxa este valabilă cel puțin pentru întreaga linie ATTiny, dacă nu și mai mult. Nu? –  > Por johny de ce.
  • @johnywhy: Funcționează chiar și pe ATmegas. Rețineți, totuși, că pentru a seta pinul 0 la ieșire pe un Arduino Uno veți folosi DDRD în loc de DDRB, , deoarece pinul 0 de pe Uno se află pe portul D și nu pe portul B. Cu ajutorul lui pinMode() utilizați numerele pinilor care sunt tipărite pe serigrafia plăcii și nu trebuie să vă faceți griji cu privire la corespondența dintre pin și port, deoarece funcția se ocupă de acest lucru pentru dumneavoastră. Sacrifici eficiența pentru comoditate. –  > Por Edgar Bonet.
  • @johnywhy „orice altceva” include chiar și același cip într-o placă diferită, cu pini diferiți fiind necesar să fie manipulat. Dacă trebuie să folosești pinul B3 în loc de pinul B0 pe o altă placă cu același cip, va trebui să schimbi codul. Utilizarea pinMode, , atâta timp cât ambii pini sunt numerotați la fel în IDE, nu va trebui să schimbați nimic. –  > Por Majenko.
smajli

DDRB

este un registru. Exact: Registrul de direcționare a datelor din portul B. A se vedea fișa tehnică pentru ATtiny, capitolul 10.4. Descrierea registrului și 10.2.1 Configurarea pinului. În această parte se va explica de ce

DDB0

a fost utilizată valoarea DDB0.Utilizarea acestui mod de a seta direcția unui pin este mult mai rapidă decât pinMode(0, OUTPUT);
posibila problemă este atunci când doriți să utilizați același cod pentru a programa diferite Arduino. În acest caz trebuie să vă amintiți să verificați toate operațiile cu registre directe.