alternare hardware nello sketc

si potrebbe seleziona selezionare 2 hardware simili che utilizzano tutti e 2 i pin 2 e 3 (interrupt) ogni mezzo secondo
prima uno poi l'altro senza relè meccanico,
oppure spostare gli interrupt da i pin 2 e e3 ad altri pin liberi tramite sketc?

Gli Interrup "veri" sono solo il 2 ed il 3, Si possono usare anche altri pin ma con diverse limitazioni.

Cmq si, via Schetch puoi switchare i pin di Interrupt con continui switch software.

Quanto al fatto di usare due hardware distinti sugli stessi piedini, non vedo come si possa fare senza un sistema di commutazione, se non meccanico, cmq elettronico.

Devi usare la PinChangeInt e, via SW, assegni gli interrupt ai pin che vuoi e come vuoi (... o quasi :grin:) ...

Guglielmo

P.S. : leggi bene le note e guarda se sul gruppo Google c'è una versione aggiornata !

BaBBuino:
Gli Interrup "veri" sono solo il 2 ed il 3, Si possono usare anche altri pin ma con diverse limitazioni.

Cmq si, via Schetch puoi switchare i pin di Interrupt con continui switch software.

Quanto al fatto di usare due hardware distinti sugli stessi piedini, non vedo come si possa fare senza un sistema di commutazione, se non meccanico, cmq elettronico.

e "dove" posso documentarmi per cambiare pin di interrupt che faccio delle prove XD

Quelli HW non li puoi cambiare, per il resto ... t'ho già indicato la strada sopra ! ]:smiley:

Guglielmo

Edit : Altrimenti usi un ulteriore pin per commutare un "deviatore esterno" (solid state, no relè) che collega una volta certe cose ed un'altra volta altre cose sempre agli stessi due pin 2 e 3

L’ho fatto diverso tempo fa usando il C convenzionale di Atmel per gestire direttamente i registri della MCU. In codice Arduinesco non saprei.

Sostanzialmente quasi tutti i pin dell’ATmega328 sono configurabili come pin di interrupt, ma l’interrupt che intercettano è solo un cambiamento di stato, ovvero l’interrupt avviene se c’è un passaggio da zero a uno, o viceversa. Nella routine dell’interrupt devi poi mettere una maschera per discriminare se l’interrupt è avvenuto per un uno o per uno zero.

Inoltre un pin di ChangeInterrupt vincola tutto il PORx (ovvero tutto il blocco del PORTA, PORTB o PORTC), quindi se hai altre cose su quel PORTx (es. le linee dati di un Display), potresti avere dei malfunzionamenti.

La libreria indicata si prende proprio carico dei vari casini e complicazioni che ci sono dietro ...

"On the other hand the pin change interrupts can be enabled on any or all of the Arduino's signal pins. They are triggered equally on RISING or FALLING signal edges, so it is up to the interrupt code to set the proper pins to receive interrupts, to determine what happened (which pin? ...did the signal rise, or fall?), and to handle it properly. Furthermore, the pin change interrupts are grouped into 3 “port”s on the MCU, so there are only 3 interrupt vectors (subroutines) for the entire body of 20 pins. This makes the job of resolving the action on a single interrupt even more complicated. The interrupt routine should be fast, but complication is the enemy of speed.
The PinChangeInt library is designed to handle the Arduino's pin change interrupts as quickly and reasonably as possible."

Altre strade, oltre questa SW e quella di commutare gli input HW sui pin 2 e 3 ... non ce ne sono :wink:

Guglielmo

Se ho ben capito hai 2 hardware che OGNUNO usa 2 irq
Se è questa la situazione non è possibile commutare i 2 hardware sui 2 irq disponibile, in quanto è natura delle periferiche che usano irq avere eventi asincroni che avvengono IN QUALSIASI MOMENTO , quindi l'unica strada è quella di disabilitare alternativamente una periferica tramite il suo pin Chip Enable mediante un qualsiasi pin del MC, questo però è realizzabile SOLO SE la periferica consente di restare disabilitata per tutto il tempo SENZA perdita di dati

Tanto per capirci una periferica lettore chip-card tipo SLE4442 non può MAI essere disabilitata, se si perde anche un solo bit il tentativo di accesso alla card fallisce consumando uno dei 3 tentativi massimi di accesso , al terzo butti via al card

Altre periferiche invece sono così lente che si usa l'interrupt solo ..così per sport... :slight_smile: oppure sono così prevedibili che possono essere disabilitate o sono totalmente controllabili, in tal caso disabilitarle non solo è possibile ma si deve fare

Purtroppo se non specifichi di che periferiche si tratta non è possibile darti consigli certi!. Forse non c'è nemmeno bisogno di usare la tecnica interrupt

gpb01:
La libreria indicata si prende proprio carico dei vari casini e complicazioni che ci sono dietro ...

"On the other hand the pin change interrupts can be enabled on any or all of the Arduino's signal pins. They are action on a single interrupt even more complicated. The interrupt routine should be fast, but complication is the enemy of speed.
The PinChangeInt library is designed to handle the Arduino's pin change interrupts as quickly and reasonably as possible."

Altre strade, oltre questa SW e quella di commutare gli input HW sui pin 2 e 3 ... non ce ne sono :wink:

Guglielmo

mi sa che trovero una soluzione hardware tipo porte logiche in fine sono solo 2 pin oppure metto un altro 328 e poi spedisco via seriale