Método de Temporização

Encontrei um metodo de executar ações sincronizadas no tempo, sem pausa e facil de expandir, replicar

#define NUMBER_OF_ACTIONS 2

typedef struct{
unsigned long previousTrigger;
unsigned int interval;
void (*function)();
}ProtoThread;

ProtoThread protoThreads[NUMBER_OF_ACTIONS] = {
{0,600,action1}, //triggers every 600 millisecond -a cada 600ms
{1000,1000,action2} //predelay 1000 milliseconds, then from then on always trigger every 1000 millisecond - REPETE CADA 1s
};

// funcao comum do ARDUINO
void loop(){

for (byte i=0; i<NUMBER_OF_ACTIONS; i++) {
if (millis() - protoThreads_.previousTrigger > protoThreads*.interval) {_
_ protoThreads.previousTrigger = millis();
protoThreads.function();
}
}
}
void action1(){
//executo unica vez após energizar coma traso de 600ms*

}
void action2(){
//executo a cada 1 segundo completado }
* [/quote]
Um erro o forum, nao permite mostrar o codigo corretamente adicione a funcao loop um campo do array
referenciando a variavel i, nas variaveis protoThreads.previousTrigger e protoThreads.interval*

void loop(){
for (byte i=0; i<NUMBER_OF_ACTIONS; i++) {
* if (millis() - protoThreadsAQUI.previousTrigger > protoThreadsAQUI.interval) {
protoThreadsAQUI.previousTrigger = millis();
protoThreadsAQUI.function();
}}}*

Agora estou pensado como adaptar, um enable_

Para isso terás de abrir a biblioteca das Protothreads e ver como é que a temporização é feita...

Ou...

Podes pegar no manual do ATmega, e ver como utilizar os timers para conseguires o mesmo efeito. Aí terás muito mais controlo dos tempos bem como, começar e parar (o tal Enable que referes).

Interessante essa protothreads.

Vou experimentar, atualmente verifico os millis()... if (time_now > last_run)

Um tut sobre os timers:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106