Pages: 1 ... 7 8 [9]   Go Down
Author Topic: If-Switch-Array-Millis-For  (Read 5360 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 48
Posts: 5991
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 02, 2012, 03:39:53 pm by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Offline Offline
Faraday Member
**
Karma: 48
Posts: 5991
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
« Last Edit: May 02, 2012, 04:28:48 pm by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Offline Offline
Faraday Member
**
Karma: 48
Posts: 5991
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

passo a tentare di usare i vostri consigli iniziali
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10505
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
  }
}
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 48
Posts: 5991
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22996
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged


0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10505
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: May 03, 2012, 02:37:55 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 ... 7 8 [9]   Go Up
Jump to: