Go Down

Topic: If-Switch-Array-Millis-For (Read 5638 times) previous topic - next topic

Testato

#120
May 02, 2012, 10:37 pm Last Edit: May 02, 2012, 10:39 pm by Testato Reason: 1

Ad esempio, tu scheduli faiA ogni 10s e faiB ogni 4s. Ma faiB dura 2s.... faiB viene eseguita dopo 4s e finisce a 6s. Dopo 4s dovrebbe essere rieseguita. Ma a 10s devi eseguire anche faiA. Come fai?

Infatti questo e' cio' che succede con il millis normale, l'inventiva sta proprio nel ricreare con millis il comportamento del delay.
Dovrebbe succedere quello che succede con il delay normale, ma usando millis

x Lesto, ora la guardo, grazie
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

#121
May 02, 2012, 11:26 pm Last Edit: May 02, 2012, 11:28 pm by Testato Reason: 1

in oltre esiste già una libreria che fa esattamente questo: timerAlarm!


e' stato tutto inglobato nella Time.
Quote
The libray has been superseded by a newer version that is available as part of the download here: http://www.arduino.cc/playground/Code/Time


vado a vedere di che si tratta

p.s. inoltre si scrive tutto attaccato  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

nooo
anche la time non va bene, si parla sempre di multitask,
mi sa che non esiste quello che dico io, e quindi sarebbe comodo inventarlo  :)

passo a tentare di usare i vostri consigli iniziali
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lesto

In arduino il multitask non esiste.
è solo un termine improprio per rendere l'idea

Comunque non è che è inglobato dalla time, ma INGLOBA la time, e ne fornisce servizi addizionali.

quello che tu cerchi:
Code: [Select]

void setup(){
AlarmA = dtAlarms.createRepeating( 15 ); //attiva l'allarme "AlarmA" ogni 15 secondi
}

void onAlarm(AlarmID_t Sender){ //funzione chiamata quando suona un allarme, stile interrupt :) (anzi, probabilmente usa un interrupt sul timer)
 if( Sender == AlarmA) { //se ha suonato l'allarme AlarmA
Serial.println("15 seconds Alarm"); //fai qualcosa
 }
}
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Testato

credo la parola esatta sia Protothreads (trovata su wiki)
ed anche questa Time e' di questo tipo, cioe' ritornando all'esempio di cui chiedeva anche Leo,

se faiA lo setto ogni 15sec
e faiB lo setto ogni 30sec

cosa succede con questa libreria e con le altre 3 consigliate e con il blinkwitoutdelay ?

che al 30esimo secondo vengono eseguiti sia faiA che faiB,

non esiste nulla invece che si comporti come delay ma sia fatto con millis
cioe' faiA - spetta 15 secondi - faiB - spetta30secondi
dopodiche' essendo finito il loop faiA temporalmente sara' eseguito a 45esimo secondo rispetto alla linea temporale.

Sembra una banalita', ma ricreare la funzione delay, temporalmente, usando millis, e' un algoritmo difficile, perche' ogni evento viene spostato temporalmente.
Da quel che ho letto forse c'entra qualcosa che si chiama RoundRobin, ma io mi fermo qui 
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Testato, ma tu vuoi banalmente una libreria che scheduli l'esecuzione di certe funzioni ad intervalli prefissati, fregandosene delle funzionalità di un vero multitasking, ossia l'esecuzione contemporanea di più compiti. Vuoi solo che una cosa del tipo:

Code: [Select]
setup:
pianifica(faiA, 10);
pianifica(faiB, 20);
endsetup

loop:
... un po' di cose...
endloop:

faiA:
....
endfaiA

faiB:
....
endfaiB


Vale a dire, imposti ogni quanto eseguire quelle 2 funzioni, poi nel resto del programma tu te ne sbatti di stargli dietro, sapendo che c'è un supervisore che al momento opportuno le esegue.

Torno alla questione: quando devo eseguire faiA o faiB, con che criterio interrompo ciò che sto facendo? Come faccio a fermare il resto del codice? Devo salvare lo stato di tutti i registri del micro per poter poi riprendere l'esecuzione del programma principale dal punto in cui è stato interrotto. E se l'operazione che devo interrompere non è interrompibile? Ad esempio una lettura di un pin analogico oppure una scrittura di un valore nella EEPROM interna (un'operazione che di per sé richiede esattamente 3,3 ms)?

Protothread, multitasking ecc... ma comunque sempre il problema dello stop&restart si presenta.

lesto

#126
May 03, 2012, 09:33 am Last Edit: May 03, 2012, 09:37 am by lesto Reason: 1

faiA lo setto ogni 30sec
delay (15 secondi)
faiB lo setto ogni 30sec


easy no?

Quote
Sembra una banalita', ma ricreare la funzione delay, temporalmente, usando millis, e' un algoritmo difficile, perche' ogni evento viene spostato temporalmente.


in realtà è una banalità.
il sistema è di fare un array di unsigned long, che contengono il numero di millis a cui eseguire una certa operazione.ogni cella corrisponde ad una azione: ogni loop scorri tutto l'array, se il valore contenuto è <= di millis() esegui la funzione corrispondente alla cella, e eventualemente aggiorni il valore della cella per fare in modo tale da "schedulare" la prossima operazione.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up