Go Down

Topic: [RESOLVIDO] Código para criação de timers de modo simples. (Read 1 time) previous topic - next topic

wizarcl

Sep 15, 2012, 07:54 pm Last Edit: Sep 17, 2012, 04:07 am by wizarcl Reason: 1
Pessoal, estou com dificuldade em criar uma função, eu quero chamar a função com um parâmetro VAR1 por exemplo e dentro da função ela carregar as demais variáveis.. tipo assim:

int xVAR1 = 1;
int yVAR1 = 2;
int zVAR1 = 3;

void setup(){
...}

int set(PARAMETRO)
{
 xPARAMETRO = 31;              // gostaria que a palavra PARAMETRO fosse substituída por VAR1
 yPARAMETRO = 50;
 zPARAMETRO = 80;
...
}

void loop(){
   set(VAR1);
}

alguem pode me ajudar? teria como criar uma função dessas semelhante para criar variáveis? No caso a função ia receber a palavra VAR1 e iria criar as variáveis xVAR1, yVAR1 e zVAR1. Tem como?
Obrigado desde já.
;)

bubulindo

procura por estruturas...

http://www.arquivodecodigos.net/dicas/c-aprenda-a-usar-estruturas-struct-em-c-2275.html
http://pt.wikibooks.org/wiki/Programar_em_C/Estruturas
http://www.dcc.fc.up.pt/~nam/aulas/9798/pi/estruturas.html

Acho que é isso que pretendes.
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).

wizarcl

Não sei se é bem isso, mas acho q é... só tenho q enteder agora como é que eu vou fazer isso, pq ficou um pouco confuso... hoje estou sem tempo agora, mas vou tentar e vou postar, minha intenção é facilitar para aqueles como eu que veio da programção de CLP's (em diagrama de blocos e ladder) que é mais fácil para C (que é novidade para mim ainda, mas já andei brincando com matrizes e laços no Dev)....
Mas pelo pouco que li e intendi é que do jeito que eu quero simplificar acho q n vai dar...

Vlw.

bubulindo

C é mais simples que ladder... para operações complexas.

Se juntares estruturas a ponteiros, a função faz exactamente o que pretendes.


Code: [Select]


struct point_def{
int parX;
int parY;
int parZ;
} ;


setup () {

struct point_def MyPoint;

MyPoint.parX = 1;
MyPoint.parY = 2;
MyPoint.parZ = 3;

change_par(&MyPoint);


}


change_par(struct point_def * ptr) {

ptr->parX = 5;
ptr->parY = 5;
ptr->parZ = 5;
}




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).

wizarcl

Obrigado bubulinho por me ajudar... lembrei me de algumas coisas quanto postou.... acho q consegui o que eu queria, da uma olhada no código e me de alguma sugestão de como posso simplificar mais... a intenção é facilitar a criação de temporizadores dentro do programa, imagino que este código seja viável quando se usar dois timers ou mais... algumas coisas não são necessárias como a função de setar e resetar e talvez nem mesmo a de criar "createTimers", pois posso declarar no global os valores das variaveis.
se voce tiver mais alguma sugestao ou alguem mais, por favor... sintam-se a vontade, estou aki para aprender e espero aprender mt.... XD

Code: [Select]
#define led 13                                // define led como pino 13
#define timers 2                              // define a quantidade de timers
boolean Tset[timers];                         // declara a variavel de set (Tset[i]) do timer[i]
boolean Tout[timers];                         // declara a variavel de saida (Tout[i]) do timer[i]
unsigned long Tstart[timers];                 // declara a variavel de ponto de partida (Tstart[i] do timer[i]
unsigned int Ttemp[timers] = {1000, 50};      // declara os tempos dos timers

void createTimers(){                          // funcao para atribuir os valores dos timers
  for (short i = 0 ; i <= timers ; i++){      // realiza a varredura de timer[i]
    Tset[i] = false;                          // atribui o valor inicial de set do timer[i] como falso
    Tout[i] = LOW;                            // atribui o valor inicial de saida do timer[i] como baixo
    Tstart[i] = 0;                            // atribui o valor inicial do tempo de partida do timer[i] como 0
  }
}

void checkTimers(){                            // funcao para verificacao dos timers
  for (short i = 0 ; i <= timers ; i++){       // realiza a varredura dos timers
    if (Tset[i] == true && Tstart[i] == 0)     // se o timer[i] estiver setado Tset[i] e seu valor inicial Tstart[i] em 0
      Tstart[i] = millis();                    // atribui o valor inicial Tstart[i] do timer[i] com valor atual de millis()
    if (Tset[i] == true && Tstart[i] != 0){    // se o timer[i] estiver setado e seu valor inicial nao for 0
      if (millis() - Tstart[i] >= Ttemp[i])    // verifica se ja trancorreu o tempo Ttemp[i] setado do timer[i]
        Tout[i] = HIGH;                        // se ja tiver transcorrido, leva a saida Tout[i] do timer[i] em nivel alto
    }
    else{                                      // se o timer[i] nao estiver setado
      Tout[i] = LOW;                           // mantem sua saida Tout[i] em nivel baixo
      Tstart[i] = 0;                           // e o tempo de partida Tstart[i] em 0
    }
  }
}

void setTimer(unsigned short i){               // funcao para setar o timer[i], recebe o numero do timer
  Tset[i] = true;                              // seta Tset[i] do timer[i] como verdadeiro
}

void resetTimer(unsigned short i){            // funcao para resetar o timer[i], recebe o numero do timer
  Tset[i] = false;                            // seta Tset[i] do timer[i] como falso
}

void setup(){               
  pinMode (led, OUTPUT);     // seta o pino 13 - led - como saida digital
  Serial.begin(9600);        // abre porta de comunicacao - para diagnose
  createTimers();            // carrega a funcao de atribuicao de valores das variaveis de cada timer
}

void loop(){
  checkTimers();            // carrega a funcao de verificacao dos timers
  setTimer(0);              // liga timer 0
  if (Tout[0] == HIGH)      // se a saida do timer 0 estiver em nivel alto
    setTimer(1);            // liga o timer 1
  if (Tout[1] == HIGH){     // se a saida do timer 1 estiver em nivel alto
    resetTimer(0);          // reseta o timer 0
    resetTimer(1);          // reseta o tmer 1
  }
  digitalWrite (led, Tout[0]);   // escreve saida digital no pino 13 como o estado da saida do timer 0
}

Fernando d'RG

Há uma maneira mais "bonita", que utiliza ponteiro. Descrevo abaixo:

1º passo: Sua função setTimer deve ficar assim:

void setTimer(boolean *timer) {
  timer = true;
}

2º passo: alterar a chamada da função setTimer para:

setTimer(&Tset[N]);
// onde N é igual à posição do timer na lista
Fernando Gonçalves (FdRG) - Business Intelligence / Data Warehouse
 - Cell: (21) 8181-8725
 - Skype: fernando.drg
 - Mail: fernandodrg@me.co

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview