Switch tra dispositivi sotto Arduino

Ho un commutatore a levetta che fornisce il +5 al dispositivo A o al dispositivo B.
Ad ogni commutazione ho la necessita di dare un reset ad Arduino in modo che possa correttamente inizializzare il dispositivo acceso dal commutatore.
La cosa + semplice che mi viene in mente e’ di leggere i pin terminali del commutatore in modo da sapere quando avviene una commutazione ed usare un pin di OUT collegato al reset tramite un diodo che in corrispondenza allo switch va alto.
Naturalmente il codice allo start non deve leggere alcuna commutazione.
Puo’ funzionare?

Seplicemente con un pin digitale leggi l'alimentazione del singolo dispositivo, quando vedi il passaggio da LOW ad HIGH esegui le funzioni di inizializzazione del dispositivo ... non vedo perché dover coinvolgere un "reset".

Ah, comunque il "reset" dato da un pin NON funziona ed è contrario alle specifiche di Atmel.

Guglielmo

E' un 'idea, potrei fare in mdo che quando sente l'off/on ad un dispositivo lancia il setup quando il codice passa all'inizio del loop, come prima istruzione sotto if... Grazie, Giorgio Padoan

Idea sbagliata ...
... se i comandi di inizializzazione li metti in un funzione, la prima volta la puoi richiamare dal setup() le volte successive, all'occorrenza, dal loop() senza fare porcherie varie !

Guglielmo

Un corsista su prodotti Arduino e periferiche mi ha spiegato come fare per ottenere un RESET hardware senza pericolo di inficiare l'avvio o provocare danni hardware.

Giorgio

… un emerita bojata e, chi te lo ha detto,non sa come funziona esattamente il ATmega328P. Meglio andarsi a studiare prima il datasheet … ::slight_smile:

Inoltre, un qualsiasi programma che faccia un “reset” per soli scopi software è un programma SBAGLIATO. Il “reset”, fatto tramite gli appositi strumenti software per farlo, si fa solo in casi di emergenza, quali perdita di controllo del programma a causa, ad esempio, di scariche elettromagnetiche o altri disturbi che hanno fatto impazzire la MCU.
In tutti gli altri casi si fa una gestione software delle funzioni che si debbono effettuare.

Guglielmo

P.S.: E, se facessi un po’ di ricerche su questo forum, troveresti varie discussioni in cui l’utente Astrobeed spiegava in dettaglio l’errore di concetto di voler fare il reset tramite un pin.

P.P.S: E, per il futuro, NON aprire nuovi thread per argomenti di cui stai già discutendo altrove (… crossposting, REGOLAMENTO punto 13)! Ho riunito io le due discussioni.

padoang:
E' un 'idea, potrei fare in mdo che quando sente l'off/on ad un dispositivo lancia il setup quando il codice passa all'inizio del loop, come prima istruzione sotto if... Grazie, Giorgio Padoan

Assicurati che sul setup ci sia l'inizializzazione di tutte le variabili globali, così da essere sicuro di partire da una situazione pulita anche quando il setup lo richiami da dentro il loop.

Questa soluzione hard. mi sembra molto piu' pulita della soft. suggeritami.
Daltronde se nella scheda c'e' il terminale che va al pin di reset vuol dire
che e' prvisto che venga usato. Il modo con cui viene usato cosa cambia?
l'importante e' che non infici l'avvio e non provochi danni hard.
Atmel non prevede che un pin direttamente collegato al pin-reset provochi
il reset, ma nel modo giusto non vedo alcuna controindicazioni.
Giorgio

… mi sono scocciato di dirti che, sia sotto il profilo hardware che concettualmente, E’ SBAGLIATO e che NON segue le specifiche di Atmel, ma tanto “non c’è peggior sordo di chi non vuol sentire”.

Fai come ti pare, io ci rinuncio. Bye.

Guglielmo

padoang:
Daltronde se nella scheda c'e' il terminale che va al pin di reset vuol dire
che e' prvisto che venga usato.

Questo è assolutamente corretto, ma è previsto che venga usato in un certo qual modo descritto nel datasheet, non così a caso.

Ma poi non capisco una cosa: se pensi di saperne abbastanza da contraddire un utente con ~27000 post, nonché moderatore globale (che dunque evidentemente proprio un cretino non sarà...), perché chiedi aiuto qua?

padoang:
Questa soluzione hard. mi sembra molto piu' pulita della soft. suggeritami.

spegnere e riaccendere tutto è tranne che una soluzione "pulita".
Vabbeh che ci siamo abituati grazie a :-X , però...

SukkoPera:
Questo è assolutamente corretto, ma è previsto che venga usato in un certo qual modo descritto nel datasheet, non così a caso.

Ma poi non capisco una cosa: se pensi di saperne abbastanza da contraddire un utente con ~27000 post, nonché moderatore globale (che dunque evidentemente proprio un cretino non sarà...), perché chiedi aiuto qua?

Contraddici anche a un secondo moderatore che ha ca 36500 posts :wink: :wink: :wink:
Ciao Uwe

Siamo d'accordo che basta mettere le inizializzazioni in una funzione e richiamarla (anch'io farei così), ma perché il reset tramite un pin è contrario alle specifiche Atmel? Mi incuriosisce... :slight_smile:
Forse andrebbe prolungato con un diodo, due resistenze e un condensatore ?

Datman:
... Forse andrebbe prolungato con un diodo, due resistenze e un condensatore ?

Sempre a pensare a emerite "porcherie" per aggirare cose che NON si fanno ! :smiling_imp:

Il datasheet di Atmel parla chiaro ... la durata del segnale di "reset", affinché la MCU resetti correttamente TUTTE le componenti hardware, deve essere minimo di 2.5 μsec che, con il clock a 16 MHz (con clock più lento la cosa peggiora), fanno circa 40 cicli macchina.

La prima cosa che fa la MCU quando il pin di "reset" va LOW e ... mettere in three-state tutti i pin con l'effetto che il LOW dura pochi cicli macchina (ovvero poche centiania di nsec.) e con il risultato che la MCU inizia il ciclo di "reset" e lo interrompe ... ottenendo:

  • se va bene la MCU non si blocca, ma si ha una parte di hardware interno resettato e un'altra parte in condizioni ignote. All'utente sembra che il sistema abbia fatto "reset", ma la cosa NON è vera e i risultati NON determinabili a priori, in funzione delle risorse che si usano.

  • se va male la MCU si blocca e tocca resettarla manualmente.

In un application note, che non ho sotto mano e non ho nenache voglia di andare a ricercare, specificava che la cosa è da evitare proprio per non avere i problemi sopra descritti.

Quindi ... lascia stare soluzioni "arraffazzonate" e segui le specifiche. Ove veramente occore (e ribadisco VERAMENTE), per fare il "reset", c'è il watchdog !

Negli altri casi ... dal loop() si richiama la funzione setup() (... che, a tutti gli effetti, è una funzione come un'altra) e, subito dopo, si fa "return" così da uscire e ricominciare dalla prima istruzione del loop() ... il tutto esattamente come se avessi fatto un riavvio.

Guglielmo

Secondo me quando un programmatore deve pensare ad un reset hardware significa che il suo programma non è ben pensato....
eventualmente può cercare lavoro alla piccolo&soffice dove sono abituati a questo
Io di mio farei un modo diverso:
Il selettore comanda un ingresso di Arduino e Arduino comanda l'alimentazione dei dispositivi eseguendone la corretta inizializzazione esattamente quando serve

@Datman solleva il dubbio e @gpb01 zack lo rade più a fondo!
Si chiama dinamica di coppia :wink: grazie a voi ora abbiamo capito tutti anche il perchè in modo inequivocabile!
Mi scappa un k+ a entrambi.

:smiley: