Arduino Forum

International => Portugues => Topic started by: dandrade on Feb 06, 2011, 09:28 pm

Title: Método de Temporização
Post by: dandrade on Feb 06, 2011, 09:28 pm
Encontrei um metodo de executar ações sincronizadas no tempo, sem pausa e facil de expandir, replicar

Quote


#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 }
 


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
Title: Re: Método de Temporização
Post by: bubulindo on Feb 07, 2011, 09:43 am
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).
Title: Re: Método de Temporização
Post by: nofxx on Feb 07, 2011, 05:27 pm
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