Página 1 de 1

Laco While travando no timer

MensagemEnviado: 07 Jun 2018 17:11
por sisae
Meus amigos, estava brincando com o Arduino e resolvi fazer um timer sendo verificado por uma condicao WHILE verificando o estado da variavel FLAG1, porem ele nao olha a mudanca do estado da variavel, achei estranho, resumi o programa apenas no timer e no while, se tirar o argumento do while, vai notar que trava e se retira o led da placa do arduino volta a piscar. Coloquei o if apenas para ver se passa ou nao da função. Alguem tem uma luz?

cpp code
unsigned char flag1 = 1;

void setup(void) {
pinMode(13, OUTPUT);
TCCR1A = 0; //configura timer para operação normal pinos OC1A e OC1B desconectados
TCCR1B = 0; //limpa registrador
TCCR1B |= (1 << CS10) | (1 << CS12); // configura prescaler para 1024: CS12 = 1 e CS10 = 1
TCNT1 = 0xFA24; //
TIMSK1 |= (1 << TOIE1); // habilita a interrupção do TIMER1
}

ISR(TIMER1_OVF_vect) { //interrupção do TIMER1
flag1 = 1;
digitalWrite(13, LOW);
TCNT1 = 0xFA24; // Renicia TIMER
}

void loop(){
while(1){
//while(flag1 == 0); //o while nao confere a condicação
if (flag1 == 1){
delay(500);
flag1 = 0;
}
digitalWrite(13, HIGH);
delay(50);
}
}

Re: Laco While travando no timer

MensagemEnviado: 07 Jun 2018 17:31
por Red Neck Guy
Olha, eu não sou arduinista, mas numa pesquisa de 10 segundos no google vi uma coisa que pode ser o teu problema:
A função loop é chamada várias vezes, teu código lá dentro não pode ser um loop infinito.
A função loop é o teu "while(1)".

Re: Laco While travando no timer

MensagemEnviado: 07 Jun 2018 18:05
por edsont
O void loop() já é um laço infinito, porém ele tem que terminar periodicamente.

É só tirar o laço while(1){} que vai funcionar normalmente.

Se algum loop for muito demorado, o arduino vai resetar pelo estouro do watchdog. Para evitar isso, quando necessário, é só usar wdt_reset() para zerar o watchdog periodicamente.

Agora, eu não entendi porque usar interrupção se está usando delay(). Uma opção mais fácil para evitar deixar o programa parado no delay() é usar millis() em vez de recorrer a interrupção.

Re: Laco While travando no timer

MensagemEnviado: 07 Jun 2018 20:18
por andre_luis
Embora eu concorde totalmente com o que foi colocado acima quanto á inutilidade do While(true) dentro do Loop(), no seu caso em particular, a causa raiz do problema pode ser que o timer esteja realizando o update do flag1 = 1 dentro da ISR_TIMER1 num intervalo bem inferior aos 500ms do delay, ou seja, uma vez acionada a primeira interrupção, a condição while(flag1 == 0) nunca vai ser atingida, pois após terminar a sequencia abaixo...

Código: Selecionar todos
  delay(500);
  flag1 = 0;


...sabe-se lá o que mais o 'cabeçalho' do Loop() faz, e nesse intervalo a interrupção pode estar sendo acionada e passando o valor da variável acima para "1". Uma possibilidade para resolver isso - caso seu pre-scaler nao consiga um intervalo tao grande para o Timer - poderia ser inserir um contador dentro da Interrução (com variável global volatile), de modo que a variável flag1 vai passar para 1 apenas após alguns eventos de interrupção.

Re: Laco While travando no timer

MensagemEnviado: 08 Jun 2018 08:03
por eletroinf
Uma sugestão de teste é colocar os comandos de piscar o led na interrupção para verificar a velocidade da mesma.
Outra coisa, o Atmega limpa o flag de interrupção automaticamente?

Re: Laco While travando no timer

MensagemEnviado: 08 Jun 2018 17:32
por sisae
Boa tarde Aquino,

Este é so um programa para teste, para verificar onde estava o problema, a questao do timer é para fazer um tempo mais preciso e tambem fazer um sistema real time,
mas ja resolvi, chutei o arduino pra longe, consegui a rotina de TFT para winavr, voltei correndo para o AVR Studio, ja esta sendo resolvido esta questao no puro AVR, sem um "zoi" a mais processando la dentro do MCU. Estava usando o Arduino pq achei a biblioteca pronta do TFT, mas agora implementado no winavr ja ficou facil resolver isto., mas o loop While nao gera pilha uma fez que ele fica preso, estouraria a pilha se um estivesse chamando o outro muitas vezes sem fechar, não é o que acontece. vou fazer este mesmo laço (que ja faço a mais de 15 anos no AVR e vai dar certo, pode ter certeza, quanto a velocidade andre_teprom, tambem ja tentyei, coloquei retardo dentro da interrupcao e nao deu certo. é uma coisa muito esquisita neste arduino. mas deve ter um jeito.

Re: Laco While travando no timer

MensagemEnviado: 09 Jun 2018 13:03
por andre_luis
sisae escreveu:quanto a velocidade andre_teprom, tambem ja tentyei, coloquei retardo dentro da interrupcao e nao deu certo.


Se já resolveu, ótimo, mas só pra voce saber que colocar delay dentro de uma interrupçao de Timer é algo que não se pode fazer, o programa não se comporta como esperado.

Re: Laco While travando no timer

MensagemEnviado: 09 Jun 2018 21:48
por Red Neck Guy
Eu transmiti em FM e você captou em AM.
Mas em código, o que eu disse foi:

Supostamente o arduino "runtime" é assim
Código: Selecionar todos

void main(void){
  for(;;){
    reset_watch_dog();
    periodic_tick_for_libs();
    call_user_loop();
  }
}



Então, se tu criar um loop infinito na tua função loop lá na IDE do arduino o programa não vai funcionar, pois não vai executar as outras coisas que precisa para que o "runtime" funcione corretamente.
Bom, isso foi o que eu disse, como falei fiz uma pesquisa muito rápida. Pode ser que o "runtime" não seja assim.
Vai saber...