|
por 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); } }
-

sisae
- Nibble
-
- Mensagens: 65
- Registrado em: 16 Dez 2006 14:57
- Localização: Anapolis-GO
-
por Aquino » 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)".
"...People who are really serious about software should make their own hardware..." Alan Kay
-

Aquino
- Dword
-
- Mensagens: 1825
- Registrado em: 12 Out 2006 22:24
por 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.
-

edsont
- Byte
-
- Mensagens: 421
- Registrado em: 22 Mai 2007 17:19
- Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea
por andre_teprom » 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."
-

andre_teprom
- Dword
-
- Mensagens: 5267
- Registrado em: 11 Out 2006 18:27
- Localização: Brasil - RJ
-
por 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."
-

eletroinf
- Word
-
- Mensagens: 743
- Registrado em: 12 Out 2006 14:59
- Localização: Santa Maria - RS
-
por 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.
-

sisae
- Nibble
-
- Mensagens: 65
- Registrado em: 16 Dez 2006 14:57
- Localização: Anapolis-GO
-
por andre_teprom » 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."
-

andre_teprom
- Dword
-
- Mensagens: 5267
- Registrado em: 11 Out 2006 18:27
- Localização: Brasil - RJ
-
por Aquino » 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...
"...People who are really serious about software should make their own hardware..." Alan Kay
-

Aquino
- Dword
-
- Mensagens: 1825
- Registrado em: 12 Out 2006 22:24
| |