ola,
não sei se é bem isso que procuras mas tem algo aqui, não sobre o delay mas sobre multithreding em arduino ,inclusive com um código bem didatico. http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1231200459
eu achava que não dava pra fazer
Eu estava para responder essa mensagem há algum tempo..
1-Uso do delay, pausa a execução do codigo? Ou o codigo pode processeguir para as proximas instruções ou funções chamadas
Não , o delay é uma pausa onde o o stack fica preso em um loop, um contador, que o tempo que ele gasta para contar a infinidade de numero é igual ao tempo que você definiu como parâmetro delay(tempo)
2-Se não existe pausa, junto com o delay() Aonde e como deve ser , inseridas as funções que permanente ficam em execução e são independentes
Acho que o que você procura é a interrupção por estouro de tempo,
você define que a cada estouro do timer,, o atmega168 e 328, possui alguns timers, de 8 e 16 bits. Por exemplo o de 8 bits, é um registrador que é incrementado de 0 a 255, quando chega a 255 ele volta a 0, isto é o estouro, assim a cada estouro ele chama um função que você define.
Portanto, se você habilitar os timer poderá ter algo assim
void loop(){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
void timer_interrupcao_funcao(){
//faca alguma coisa a cada interrupcao
}
tente acompanhar essa discussão aqui, se tiver duvidas coloque aqui o fórum,
desculpe não ser mais claro, quando tiver mais tempo crio um post aqui com alguns codigos em que eu uso interrupção de timers
obs: Tem que ficar atento pois isso pode conflitar com funções básicas do arduino , como por exemplo PWM, que esta sempre a utilizar os timers para seu funcionamento, portanto pense bem antes de utilizar isso tudo junto!
A melhor forma de trabalhar com interrupção sem parar o sistema ( comando deley() ) e fazer sincronismo de tempo.
Um exemplo de como isto funciona pode ser visto no exemplo "blick without delay" : http://arduino.cc/en/Tutorial/BlinkWithoutDelay.
Segue um pseudo código para exemplificar:
//defina uma variável global para armazenar o tempo anterior:
Long tempoAnterior = 0;
//dentro do loop principal
If( (millis() - tempoAnterior) > 2000)
{
tempoAnterior = millis();
//Execute a rotina. Esta rotina será executada a casa 2 segundos
Rotina();
}
A melhor forma de trabalhar com interrupção sem parar o sistema ( comando deley() ) e fazer sincronismo de tempo.
Um exemplo de como isto funciona pode ser visto no exemplo "blick without delay" : http://arduino.cc/en/Tutorial/BlinkWithoutDelay.
O problema é que você não consegue ter eventos sobre eventos, a interrupção possibilita você executar uma tarefa sobre outra tarefa, pausando e voltando para onde parou. Da maneira que você colocou isso fica um pouco chato, mas da para fazer também.
O legal é que desta maneira você não interfere por exemplo no PWM, comunicação serial, Tone()...