Pages: [1] 2   Go Down
Author Topic: Gestire attachInterrupt Falling e Rising sullo stesso pin  (Read 867 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti!!
Sarei grato se qualcuno mi sapesse dare qualche dritta sull'argomento che vado a presentare.
Ho un a scheda elettronica che voglio alimentare con una batteria tampone, quando viene a meno la tensione di rete(220V), si attiva una batteria che mi tiene in vita arduino.
Quello che intendo fare è gestire l'evento di connessione della batteria tampone con un attachInterrupt(RISING) che mi rileva la presenza di alimentazione della batteria.
Fino a qui la cosa penso sia facilmente gestibile. smiley-eek-blue
Il problema è che il  sistema arduino + (sensori, display) consumano abbastanza (80-100 mA)e la vita della batteria è molto ridotta.
Cercando nel forum e in internet ho visto che c'è la possibilità di mettere in sleep l'arduino per farlo consumare meno, è possibile risvegliare arduino con lo stesso attachInterrupt che uso per batteria tampone? in questo caso quando ritorna la tensione di rete voglio rilevare il fronte di discesa è fare in modo che l'arduino si risvegli.
La mia prima idea è stata quella di gestire la cosa in questo modo, ma se avete soluzioni più semplici sono ben accette!! smiley-grin
 
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

l'interrupt che vuoi usare è il CHANGE, che rileva il cambio stato di un pin. Poi rilevi lo stato attuale del pin e se rising fai X, se falling fai y... no?
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lesto grazie per le dritte!!!
Non avevo mai usato l'interrupt CHANGE. Si penso possa andare bene.
Dopo aver riconosciuto l'interrupt mi basta verificare lo stato del pin con un semplice digitalRead?Poi posso eseguire X se è basso o Y se è alto, giusto?

Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

esatto! però al contrario, se ora leggi che il pin è ALTO, allora hai avuto un rising... perchè l'interrupt ovviamente viene lanciato dopo il cambio, il chip non legge nel futuro smiley
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Gli eventi in pratica avvengono in 2 momenti differenti.
Il primo evento, se non è capito male, è RISING: nel momento in cui un pin ti manda un segnale alto, vuol dire che si è attivato il circuito di emergenza. Poi tu fai delle cose e dopo metti in sleep il micro. Lo vuoi risvegliare quando il pin torna low, quindi con un evento FALLING.
E' giusto?

L'Arduino che cosa fa, nel frattempo? Nel senso: puoi metterlo in sleep su due piedi?
Oppure devi salvare lo stato in cui si trova?

Io opterei per 2 interrupt differenti, ognuno per i 2 stati:
1) primo interrupt: evento RISING. Attivi un interrupt che cambia una var di stato
2) se nel codice ti accorgi che quella var è cambiato di stato, stacchi il primo interrupt, salvi lo stato, attacchi il secondo interrupt sull'evento FALLING e poi metti in sleep il micro
3) al verificarsi dell'evento FALLING, il micro viene risvegliato.

Controlla bene sul datasheet che modalità di sleep puoi usare. Non tutte lasciano attivi tutti gli interrupt, alcune ne disattivano alcuni tipi. Forse in sleep ti converrebbe usare un PCINT, un interrupt sul cambio di stato di un pin, perché non tutti gli interrupt lavorano senza clock di sistema.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si Leo il funzionamento che voglio ottenere è proprio quello.
Ci sono punti in cui il software è in attesa, mentre altri in cui il software esegue delle scritture sul display o altri in cui legge sensori, più raramente effettua movimentazioni di un motore. Le casistiche sono molte, forse la cosa migliore al ripristino è ricordarsi in che modalità ero e attivare una procedura di inizializzazione che mi riporta alla modalità in cui il micro è andato in sleep.

Quello che mi hai suggerito tu se non ho capito male, è di usare lo stesso pin ma di associargli due interrupt in manera sequenziale, cioè disattivi un L'interrupt rising metti in sleep e attivi quello di falling.
Io sto utilizzando un mega 2560, quello che mi consigli è di guardare il data sheet in modo da capire quali pin di interrupt rimangono abilitati nelle varie modalità di sleep?
Cosa intendi quando dici usare un PCINT?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se usi l'Atmega2560 hai a disposizione 8 interrupt esterni, non 2 come nel caso dell'Atmega328. Per cui dovresti essere a posto senza dover ricorrere agli interrupt di cambio di stato (PCINT).

Se usi gli interrupt, questi restano attivi anche in modalità asincrona, cioè senza clock di sistema (quindi col chip in sleep) ma solo per "sentire" lo stato LOW. Ma questa è la condizione che ti serve, giusto?
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quindi ogni pin di interrupt è utile alla causa, indipendentemente dalla modalità di sleep,anche per quella a maggior risparmio  SLEEP_MODE_PWR_DOWN, giusto?
Se dovessi gestirlo con un cambio di stato alto? Cioè sentire l'alimentazione della rete invece che lo stacco della batteria....
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto alcune prove di messa in modalità sleep e come mi dicevi funziona solo con lo stato LOW, quindi devo rivedere la parte elettronica, cioè fare in modo che riconosco lo stacco della batteria e non l'attacco della rete.Grazie!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora prova la PinChangeInt, è una lib che serve ad usare gli interrupt PCINT.
http://code.google.com/p/arduino-pinchangeint/
Questi funzionano anche in modalità power down, ma solo in modalità CHANGE, quindi un passaggio da alto a basso o viceversa. Ma penso che potrebbe fare al caso tuo.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,sono riuscito a far funzionare il codice per la gestione dello stand-by di arduino e sembra andare bene.
Praticamente quando si attiva la batteria vado a dare un +5 all'interrupt che manda in stand-by con la modalità  set_sleep_mode(SLEEP_MODE_PWR_DOWN) l'arduino.
Quando si verifica uno stato low sull'interrupt questo si risveglia.Ho usato due attachInterrupt sullo stesso pin, attivandoli in maniera sequenziale.
Anche togliendo la retro illuminazione del display con l'arduino in modalità stand-by rimane sempre un consumo che si aggira sui 90-100mAh, quello che vi chiedo è se c'è un modo per ridurre ulteriormente i consumi modificando il software.O secondo voi non si possono ulteriormente abbassare i consumi.
Avete qualche consiglio a proposito!Ringrazio in anticipo per le risposte  smiley
Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 37
Posts: 1479
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi disalimentare Sensori e display

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se tolgo l'alimentazione al display perdo le informazioni che c'erano riportate, ma se mi confermi che l'unica possibilità è questa vedo di programmare l'arduino in questo senso.
Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 37
Posts: 1479
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comunque il discorso Sleep mode ha senso solo se usi uno standAlone.
In una mega 2560, anche se metti il processore in sleep, tutto il resto continua ad assorbire la stessa Q.ta di corrente.
( sia della scheda 2560, sia della circuiteria esterna )

In pratica cambia molto poco
Logged

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi sembra di ricordarmi che esiste un'altra modalità di interrupt, la LOW, e può servire per mantenere il micro in sleep fino a che il pin è basso, però bisognerebbe leggere i datasheet del micro...
Logged

Pages: [1] 2   Go Up
Jump to: