Metodos de programação

Este topico tem objetivo, de incentivar a troca de informação sobre meios de programar o arduino, atraves do software original que acompanha.

Primeiramente, ha questões basica a serem respondidas pelos experientes.

1-Uso do delay, pausa a execução do codigo? Ou o codigo pode processeguir para as proximas instruções ou funções chamadas

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

3-Quais o metodos de reduzir a necessidade de bytes- memoria flash - nos comandos de ler e escrever saidas? Direcionar para portas, economiza?

E outras, questoes que podem ser esclarecidas, que faz notavel, quando há necessidade de programar as soluções.

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 :slight_smile:

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!

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1167000525
http://www.gnu.org/savannah-checkouts/non-gnu/avr-libc/user-manual/group__avr__interrupts.html
http://members.shaw.ca/climber/avrinterrupts.html

3-Quais o metodos de reduzir a necessidade de bytes- memoria flash - nos comandos de ler e escrever saidas? Direcionar para portas, economiza?

Isso é facil, esta na documentação estendida do arduino,

Se tiver duvidas mande elas aqui!

até

Postei uma mensagem sobre isso aki:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1231200459/0#12

Utilizando timers por software, cada timer com um tempo de estouro determinado.

Quando o tempo do timer estoura é chamada a função correspondente ao timer, que chamo de task.

Não é multitask, porque não roda ao mesmo tempo, mas é possível fazer várias coisas sem bloquear a outra função.

Detalhe, dentro das funções de task não utilize delay !!!!!

O delay bloqueia, portanto utilize outro timer, verificando quando ele estourou.

Abraços

Bruno

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