Go Down

Topic: Método de Temporização (Read 3172 times) previous topic - next topic

Daniel Andrade

Feb 06, 2011, 09:28 pm Last Edit: Feb 13, 2011, 02:15 pm by Daniel Andrade Reason: 1
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

bubulindo

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).
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

nofxx

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

Go Up