Laco While travando no timer

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Laco While travando no timer

Mensagempor sisae » 07 Jun 2018 17:11

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);
}
}
Avatar do usuário
sisae
Nibble
 
Mensagens: 65
Registrado em: 16 Dez 2006 14:57
Localização: Anapolis-GO

Re: Laco While travando no timer

Mensagempor Red Neck Guy » 07 Jun 2018 17:31

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)".
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: Laco While travando no timer

Mensagempor edsont » 07 Jun 2018 18:05

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.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Laco While travando no timer

Mensagempor andre_luis » 07 Jun 2018 20:18

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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Laco While travando no timer

Mensagempor eletroinf » 08 Jun 2018 08:03

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?
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Laco While travando no timer

Mensagempor sisae » 08 Jun 2018 17:32

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.
Avatar do usuário
sisae
Nibble
 
Mensagens: 65
Registrado em: 16 Dez 2006 14:57
Localização: Anapolis-GO

Re: Laco While travando no timer

Mensagempor andre_luis » 09 Jun 2018 13:03

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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Laco While travando no timer

Mensagempor Red Neck Guy » 09 Jun 2018 21:48

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...
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24


Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x