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.
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.
- î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 – > .
- PinMode este redundant. PWM este un mod special care nu este controlat de GPIO, ci de un semnal de la un temporizator. – > .
- „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? – > . - @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 deDDRB
, , deoarece pinul 0 de pe Uno se află pe portul D și nu pe portul B. Cu ajutorul luipinMode()
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. – > . - @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. – > .
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.
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 scriesbi _SFR_IO_ADDR(DDRB), 0
. – > Por Edgar Bonet.DDRB |= 1<<DDB0;
ar fi echivalent cupinMode(0, OUTPUT);
. Acesta din urmă are însă efectul secundar de a fi mai lent. – > Por Gerben.pinMode()
formular invocă o funcție de bibliotecă care face același lucru ca și celălalt formular. – > Por Russell Borogove.