Definizioni pin IN/OUT

La domanda è così banale che non sono riuscito a trovare una risposta certa :disappointed_relieved: ed il dubbio mi è sorto quando, dopo ormai molti mesi che non mettevo mando ad uno sketch per Arduino, ne ho scritto uno semplice, dimenticandomi di definire i pin IN/OUT nel SETUP, eccetto due che controllano altrettanti LED, e tutto ha funzionato. Allora la mia situazione (ma è solo un esempio che mi farà avere una risposta esaustiva), ho definito: - due pin analogici per due sensori resistivi - due pin digitali usati come uscite (LED) - due pin digitali usati come ingressi con pull-down esterne (pulsanti, interruttori, o anche sensori digitali) - due pin digitali usati come uscite PWM Nel SETUP vanno dichiarati tutti obbligatoriamente, quindi 4 ingressi e 4 uscite? Perché lo sketch funziona senza apparenti problemi pur dichiarando solo le due uscite dei LED? Quali sono i problemi a cui si va incontro NON dichiarando i pin I/O in SETUP e poi usandoli indifferentemente? Grazie.

Non sono sicurissimo, ma mi pare che ci sono alcuni punti fermi e dipendono dallo stato iniziale dei registri oppure un comando di scrittura: - i pin analogici non richiedono di essere definiti come input. - i pin digitali non richiedono di essere definiti come input, non ricordo se di default hanno il pullup attivo ma mi pare di no - i pin usati come pwm, dal reference quando usi analogWrite() vengono settati in output dal comando quindi non è necessario dirlo con la pinMode() Da reference: "You do not need to call pinMode() to set the pin as an output before calling analogWrite()."

Tutto da confermare, non ne sono sicuro.

La pull-up non può essere attiva di default altrimenti toccherebbe in qualche modo disattivarla quando si usa una pull-down esterna, e la prova è data dall’opzione INPUT_PULLUP che si usa al posto del solo INPUT appunto quando vuoi attivare la pull-up.
Se fosse confermato quanto dici allora non avrei sbagliato nulla però sono poco convinto, almeno per i digitali “classici”, se la pinMode ha le opzioni INPUT, INPUT_PULLUP e OUTPUT, significa che si devono usare; se non ricordo male dovrebbero predisporre in modo corretto la coppia di mosfet che si trovano sul pin.
Aspettiamo qualche altro parere… Intanto grazie per l’intervento.

Se hai dichiarato i pin in OUTPUT per i LED questi funzionano normalmente, altrimenti siccome all'acensione tutti i pin sono in INPUT avresti attivato la pull'up interna facendo comunque scorrere una corrente attraverso il LED e si sarebbe acceso anche se con bassissima intensità. I pin analogici sono collegati sia agli I/O digitati sia all'ADC, non è necessario dichiararli come INPUT. Anzi ti ricordo che conviene staccarli per evitare disturbi dalla parte digitale dei circuiti interni. (DIDR0 e DIDR1) Per i PWM è il comando analogWrite che per sicurezza esegue un pinmode prima di eseguire le altre operazioni. (anche su IDE 1.0.5).

// Right now, PWM output only works on the pins with
// hardware support.  These are defined in the appropriate
// pins_*.c file.  For the rest of the pins, we default
// to digital output.
void analogWrite(uint8_t pin, int val)
{
    // We need to make sure the PWM output is enabled for those pins
    // that support it, as we turn it off when digitally reading or
    // writing with them.  Also, make sure the pin is in output mode
    // for consistenty with Wiring, which doesn't require a pinMode
    // call for the analog output pins.
    pinMode(pin, OUTPUT);
    if (val == 0)
    {
        digitalWrite(pin, LOW);
    }
    else if (val == 255)
    {
        digitalWrite(pin, HIGH);
    }
    else
    {
        switch(digitalPinToTimer(pin))
......

Paolo mi ha anticipato, comunque, per maggiori dettagli ... datasheet, pagina 77 e seguenti, dove trovi "Ports as General Digital I/O".

In particolare, da pagina 92 in poi, vedi bene che i registri DDRx hanno tutto valore iniziale 0 ovvero input.

Guglielmo

Troppo sintetico per i miei gusti :sweat_smile: Il circuito di esempio usa TUTTE le tipologie quindi: -sui led DEVO attivare l'OUTPUT -sui PWM non devo farlo un quanto ci pensa il core in automatico -i pin analogici, per la stessa ragione, saranno già impostati come ingressi dal comando analogRead?

e fin qui mi pare tutto chiaro, ma mi restano due dubbi:

  • tu dici che i pin in input attivano la pull-up interna di default, ma allora a che servirebbe l'opzione INPUT_PULLUP che peraltro è stata introdotta "recentemente"? A mio parere l'INPUT è senza pull-up e solo col comando specifico si attiva.

  • Chiariscimi questa cosa della disattivazione della parte digitale dei pin analogici; io ho sempre usato il comando DIDR0 = 0b00111111; perché mi parli anche di DIDR1? E' forse l'equivalente riferito alla condizione opposta... cioè se li uso come digitali con DIDR1 posso scollegare l'ADC? con che valore? Grazie

EDIT: Guglielmo ho visto l'intervento mentre pubblicavo il post, ma rimangono alcuni dubbi comunque, intanto mi guardo il ds, grazie.

tu dici che i pin in input attivano la pull-up interna di default

a me non sembra

Se imposto un pin in INPUT e non ci collego nulla, con un digitalread dovrei leggere HIGH, invece è LOW la prova è molto semplice - leggi il pin in input default - attivi la pullup e rileggi il pin

contrariamente al SAM che invece sono tutti HIGH

DIDR1 (pag. 240 del datasheet http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf) stacca il buffer digitale dai pin relativi al comparatore dell'ADC. Che però nessuno ha mai usato. Forse solo Leo quando ci scrisse una libreria apposita. :grin:

AnalogRead non ha nessun comando pinMode nel codice della funzione.

[quote author=Michele Menniti link=topic=256433.msg1813632#msg1813632 date=1406017114] La pull-up non può essere attiva di default altrimenti toccherebbe in qualche modo disattivarla quando si usa una pull-down esterna, ... [/quote] Quoto e sono d'accordo. E poi in qualsiasi tutorial [u]ufficiale[/u] se serve la pullup interna viene detto di attivarla esplicitamente.

Allora la questione pull-up è chiarita, a mio parere, quella del DDR1 mi sembra irrilevante se si imposta precedentemente DDR0, resta il solo dubbio sull’AnalogRead, perché non va settato come INPUT?
Probabilmente il comando stesso provvede a collegare il pin all’ADC che è utilizzabile solo come ingresso, quindi la dichiarazione diventa ininfluente.
In definitiva il pinMode serve solo se i pin si usano in modalità I/O digitale standard, mentre non serve per le modalità ADC-DAC.
Vado comunque ad approfondire sul datasheet per vedere se trovo qualche elemento di novità rispetto a tutto ciò.
Grazie e karma+1 a tutti e 4, per il contributo. Non metto ancora [RISOLTO] in quanto mi piacerebbe che arrivassero nuovi approfondimenti.