Come usare pin alternativamente tra ingresso e uscita

salve, non riesco a capire se è possibile programmare un pin di attiny o arduino in una prima fase come input analogico per riconoscere la pressione di vari tasti, dopodichè trasformarlo come output per comandare dei mosfet.... normalmente si dichiara il pin nel setup... è possibile ridefinirlo durante lo svolgimento del loop?
grazie

Il pinMode() lo puoi chiamere quando e dove ti pare, quindi, SI, puoi usare un pin come analogico e poi definirlo come pin di output . Quello che mi preoccupa è ... e quello che c'è collegato che genera il segnale analogico come lo isoli quando il pin lo devi usare come output?

Guglielmoglielmo

Ah ... dimenticavo ... ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato :roll_eyes:

Guglielmo

Salve Guglielmo, ti ringrazio per la gentile risposta,
voglio approfondire chiedendo se sarebbe possibile utilizzare lo schema in allegato…. (Pin fisici dell’Attiny 84) In prima istanza vorrei utilizzare i pin 9 e 12 come I2C per collegare un display lcd per controllare funzioni e Setup del programma poi, una volta avviato il programma, potrei spegnere il display e porre i Pin come ingressi.
In considerazione che i pin sono mantenuti in stato alto dalle resistenze di Pullup R1 e R2 mettendoli a massa con S1 e S2 posso discriminare lo stato…..
Anche per utilizzare il pin 4 (reset dell’Attiny) ho pensato questa soluzione: la resistenza R3 funziona da Pullup e mantiene i 5 volt sul pin 4, ma se metto a massa S3, il partitore di tensione R3 eR4 porta il valore di tensione sul pin 4 a circa 3.3 volt e quindi posso discriminarlo…. (Nello stesso tempo non interviene il reset perché non scendo sotto i 2,5 volt)

Potrebbe essere funzionale.... oppure????

Il pin di Reset è dedicato al Reset e per usarlo come pin di I/O devi cambiare un FUSE, ma poi ... perdi la possibilità di Reset e per ripristinarla ci vuole un programmatore HV, quindi ... lascia stare il pin di Reset che è l'unico che non va mai usato per evitare problemi.

Per il resto, si, se spegni il LCD e non usi più il bus I2C chiaramente poi puoi usare i pin come pin in ingresso.

Guglielmo

ho letto da molte parti che il pin di reset può essere utilizzato anche senza cambiare il settaggio fuse...
[Using the Attiny’s Reset Pin without setting Fuse Bits – Arduino, ESP8266, ESP32 & Raspberry Pi stuff]
conosci qualche controindicazione in merito?

per quanto riguarda l'attivazione e la disattivazione del I2C quali sono i comandi in sequenza?
per l'inizializzazione del display uso una funzione all'interno del setup():
void setup()
{ inizializza() }

void inizializza() {
ssd1306_128x64_i2c_initEx(4, 6, 0); // (pin fisici 9 e 7)
ssd1306_clearScreen();
txt();
}
all'interno del corpo loop()....
per disabilitare i pin I2C e trasformarli in pin Input, è sufficente utilizzare il pinMode()?
per riabilitare i pin I2C è possibile richiamare nuovamente la funzione di inizializzazione?

Dal datasheet ...

The reset pin can also be used as a (weak) I/O pin.

The RESET pin must tolerate high voltages when entering and operating in programming modes and, as a consequence, has a weak drive strength as compared to regular I/O pins.

... io ho sempre evitato di usarlo per altro (... non amo falsi reset per tolleranze sulle tensioni), però, nel rispetto delle curve che vengono indicate nel datasheet, puoi provare ad usarlo come pin di I/O.

Guglielmo

dovrei usare il pin solo per una lettura in ingresso.... ma non capisco come fanno visto che, dal pinout di attiny84, il pin fisico 4 (reset) non viene evidenziato come analogico ma solo digitale pin 11 software

invece, per quanto riguarda la problematica dell'I2C, hai qualche soluzione nel cassetto.... :sweat_smile:

Infatti, mentre su ATTiny85 questo è possibile (attraverso PB5 che è anche ADC0), su ATtiny84 no. Su quest'ultimo il reset è collegato a PB3:

Port B output buffers have symmetrical drive characteristics with both high sink and source capability except PB3 which has the RESET capability.

... mentre il ADC è collegato con il suo MUX alle varie porte PA0 .. 7 ...

Port A has alternate functions as analog inputs for the ADC, analog comparator, timer/counter, SPI and pin change interrupt

Per l'I2C devi provare fare come hai detto, ogni volta che vuoi i pin come I/O devi provare ad usare il pinMode(), quando li vuoi come I2C devi provare a rifare la Wire.begin() ed inizializzare i vari devices che devi aver spento. Scrivo provare perché non l'ho mai fatto e non ho idea se poi saltano fuori problemi.

Guglielmo

io temo però che non sia tanto semplice nemmeno lo switch tra IIC e i/o convenzionali

lo schermo LCD si può anche spegnere, ma chi glielo dice al resto dell'hardware attaccato agli stessi pin di accendersi quando deve e sopratutto spegnersi quando non deve disturbare il display?

... ma dal suo schema ci sono solo DUE bottoni (N.O.) sul I2C e non c'è altro HW (oltre lo schermo da spegnere) ... certo che se così non fosse la cosa si complica parecchio ... :roll_eyes:

Guglielmo

in effetti il percorso I2C è abbastanza complesso e non sicuro.... ho risolto riservando i pin 4 e 5 come I2C sia per collegare un display che per comunicare con un arduino centralizzato... e, trattandosi di un antifurto auto, utilizzo i pin Output per la sirena e le luci, con pinMode() in INPUT per controllare dei sensori e quando il sistema va in allarme ritorno i Pin in OUTPUT sempre con pinMode() per far suonare la sirena e lampeggiare le luci...
peccato non si possa utilizzare il pin 4 del reset per l'Attiny84.... ero andato fuori strada prendendo in riferimento l'Attiny85...
grazie per le dritte...

salve Guglielmo, per rimanere in tema... volevo conferma se lo schema allegato e il ragionamento fatto è corretto...

il pin 8 ogni 5 secondi cambia da

pinMode(8, INPUT)
if (analogRead(8) < 500) " S1 = Allarme ON " else "S1 = Allarme OFF"

i partitori sul pin 8 dovrebbero dare 4.55 volt quando S1 è aperto e 1,61 volt quando S1 è chiuso attivando l'allarme... T1 dovrebbe rimane sempre interdetto e la sirena spenta...

pinMode(8,OUTPUT)
digitalWrite(8,HIGH)
if (Allarme ON) digitalWrite(8,LOW)

quando il pin 8 in fase di OUTPUT si porta a LOW per allarme innescato T1 va in conduzione e quindi la sirena suona....

si ricomincia il ciclo
pinMode(8, INPUT)
if (analogRead(8) < 500) " S1 = Allarme ON " else "S1 = Allarme OFF"

se Allarme OFF
pinMode(8,OUTPUT)
if (Allarme OFF) digitalWrite(8,HIGH)

inoltre e corretto il funzionamento di T1 alimentato a 12V e pilotato dai 5V?
grazie di nuovo...

mi sono dimenticato l'allegato

io temo che non funzionerà

ad esempio T1 ha all'emettitore una tensione di 12 V
alla sua base hai una uscita che può essere a 5V (alta) o a 0 (bassa)
oppure quando settata a input sarebbe ad alta impedenza
esaminiamo prima quest'ultimo caso

tra base del T1 e massa hai una resistenza di 10K (R3+R4, a proposito 5K non è un valore normalizzato) se il pulsante è chiuso, con una differenza di tensione di circa 11 V (0,7 li perdi nella giunzione CE del transistor) la corrente che scorre è di circa 1mA
che potrebbe oppure no portare in saturazione il transistor
speriamo che lo saturi, perché senno' scalda, comunque la sirena suona

se invece il pulsante fosse aperto avresti una corrente di base che passa attraverso R3, R1 e il +5V
e speriamo che ci possa passare, ovvero che il consumo della linea a+5V sia almeno pari a questa corrente (dovrebbe esserlo) altrimenti metteresti pure in crisi il regolatore di tensione, che dovrebbe "assorbire" la corrente in eccesso
comunque tale corrente dovrebbe valere circa mezzo milliAmpere
il transistor difficilmente saturerà, ma comunque la sirena rischia di suonare e il transistor di scaldare

invece analizzare il caso che il piedino sia un'uscita è pure più "strano"

se fosse uscita bassa la sirena suonerà certamente, e il transistor sarà in saturazione
ma se fosse uscita alta....
sarebbe l'uscita alta del micro a dover "rimangiare indietro" la corrente di base del transistor
e non voglio nemmeno pensarci, a quello che potrebbe succedere...

Salve Standaroil, in effetti questa configurazione avevo il dubbio che funzionasse perchè se il T1 si satura quando la tensione di base è più bassa di 0,6v rispetto a quella di emettitore.... comunque devo trovare una soluzione che quando la tensione sul pin 8 del micro è superiore ad 1 volt circa la sirena non deve suonare mentre quando il pin 8 e LOW deve suonare.....
allego nuovo schema...


(la sirena è comadata da un MOS)

io ti consiglio di usare un micro che abbia piedini sufficienti ...

ho a disposizione anche l'Attiny 2313 ma non ha ingressi analogici.... potrei usare un 84 e un 85 ma volevo contenere i consumi.... prima di stravolgere il circuito vorrei provare a trovare una soluzione.... a proposito.... vorrei chiederti delle dritte su come calcolare gli assorbimenti di corrente, in particolare quando si pilotano BJT o in caso di resistenze pullup...

grazie....

ecco un paio di schemi.... dove ho difficoltà a calcolare i valori di resistenze se non in modo empirico.... i BJT sono comuni TO92 con hf 200

naturalmente devo ottenere il minor consumo di corrente possibile....