Go Down

Topic: Problema com watchdog (resolvido) (Read 2819 times) previous topic - next topic

mmoscz

Mar 14, 2013, 04:02 am Last Edit: Mar 15, 2013, 12:34 am by mmoscz Reason: 1
Quote

Bom coloquei o optiboot 4.4 no meu ATMEGA328 que esta "travando",  e agora o watchdog está funcionando.
Tentei usar um .hex chamado "ATmegaBOOT_168_atmega328_pro_8MHz.hex" e continuou o mesmo problema

Realmente era algo quanto ao BOOTLOADER, eu descobri o problema e como contorna-lo

Obrigado a todos que contribuíram (bubulindo, HUGOPT e outros)


Bom, amigos,
Não sei se estou implementando incorretamente o watchdog ou se eu interpretei incorretamente.
Queria que se ele ficar travado em algum loop infinito, que houve-se o reset espontâneo.
Mas está ocorrendo o seguinte problema.
Quando mando esse sketch para um ATMEGA328 com bootloader do lilypad ele trava
Code: [Select]

#include <LiquidCrystal.h>
#include <avr/wdt.h>

LiquidCrystal lcd(12, 11, 8, 7, 6, 5);
#define LCD_WIDTH 16
#define LCD_HEIGHT 2

void setup()
{
 lcd.begin(LCD_WIDTH, LCD_HEIGHT,1);
 lcd.setCursor(0,0);
 lcd.print("Inicializando");
 wdt_enable(WDTO_4S); //Função que ativa e altera o Watchdog
 delay(2000);
 lcd.setCursor(0,0);
 lcd.print("Ok           ");  
}

void loop()
{
}

Para conseguir mandar outro sketch, tenho que manter o ATMEGA com o VCC desconectado, e exatamente no momento que vai iniciar o upload (a  mensagem UPLOADING aparece) após terminar de compilar, que consigo mandar outro sketch para o ATMEGA328.
O reset que seria enviado pelo DTR ou colocando o PINO 1 para GND não funciona, só encontrei essa solução para "salvar" o ATMEGA328.
Será que é um problema com meu código, com a lib "wdt.h" ou com o bootloader?
Obrigado se alguem puder ajudar, pois não quero ter que usar um "watchdog" por hardware.
4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP

bubulindo

Acho que é problema do bootloader mesmo. Eu li em tempos que o bootloader não funciona com o wdt. :\ Já experimentaste o último?
This... is a hobby.

HugoPT

#2
Mar 14, 2013, 10:07 am Last Edit: Mar 14, 2013, 10:19 am by HugoPT Reason: 1
Daquilo que eu sei sobre o watchdog se o activas depois no teu codigo tens de o ir resetando.No teu skectch tens:
Code: [Select]
wdt_enable(WDTO_4S); //Função que ativa e altera o Watchdog
Que o activa e irá estoirar dentro de 4 segundos.Passado estes 4 segundos ele renicia.
Quote
delay(2000);

Logo aqui queimas 2 segundos e como na loop nao tens nada que depois possa resetar o watchdog ele vai estoirar e resetar nos proximos 2 segundos.
Para ires acalmando o "cao de guarda" antes de ele "morder" o reset tens de no teu codigo prever que teras de correr a funçao wdt_reset( ) antes do estoiro, caso contrario ira estar sempre a resetar reset apos reset que será o que te está a acontecer.
Do tipo se a funçao X  que nao completou a tarefa por erro de comunicaçao com o pc vou reniciar  o programa
Quote
#define wdt_reset    (       )       __asm__ __volatile__ ("wdr")

Reset the watchdog timer. When the watchdog timer is enabled, a call to this instruction is required before the timer expires, otherwise a watchdog-initiated device reset will occur.

Aqui a uns tempos tambem li sobre esse problema entre o bootoader e o watchdog mas tambem li que ja foi resolvido algures ...
Algo deste tipo devera funcionar:
Code: [Select]
#include <avr/wdt.h>

void setup() {  
 wdt_enable(WDTO_500MS); // have the wdt reset the chip
 // if 500ms passes without a reset
}

void loop() {  
 wdt_reset(); // reset the wdt
}
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

mmoscz


Quote
Logo aqui queimas 2 segundos e como na loop nao tens nada que depois possa resetar o watchdog ele vai estoirar e resetar nos proximos 2 segundos.
Para ires acalmando o "cao de guarda" antes de ele "morder" o reset tens de no teu codigo prever que teras de correr a funçao wdt_reset( ) antes do estoiro, caso contrario ira estar sempre a resetar reset apos reset que será o que te está a acontecer.
Do tipo se a funçao X  que nao completou a tarefa por erro de comunicaçao com o pc vou reniciar  o programa


Obrigado HUGO, mas eu fiz de propósito dessa forma, para ele resetar e rodar o que está no SETUP() novamente. Justamente é um teste de como watchdog funcionaria.
No sketch "real" em vários locais diferentes do código eu tenho o wdt_reset().


Acho que é problema do bootloader mesmo. Eu li em tempos que o bootloader não funciona com o wdt. :\ Já experimentaste o último?

Bom, vou tentar um novo bootloader, como estou usando um ATMEGA328P-PU tive que usar outro programador que não a IDE do Arduino para queimar o BOOTLOADER.
Obrigado
4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP

HugoPT

Se tens um programador externo porque não esquecer o bootloader?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

mmoscz


Se tens um programador externo porque não esquecer o bootloader?


Não tenho outro programador, pois uso um arduino como gravador ISP, esse ATMEGA na protoboard é um recurso que uso quando estou experimentando os projetos, pois já queimei placas arduino em outras situações.
A pergunta então é a seguinte, se eu mandar o sketch usando o "upload with programer", ele sobrepõe o bootloader?
4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP

HugoPT

#6
Mar 14, 2013, 04:16 pm Last Edit: Mar 14, 2013, 04:18 pm by HugoPT Reason: 1
Quote
A pergunta então é a seguinte, se eu mandar o sketch usando o "upload with programer", ele sobrepõe o bootloader?

Sim sobrepoe.
Quando eu termino um projecto normalmente gravo o no atmega com um programador externo removendo assim o bootloader, só uso mesmo o bootloader quando estou a desenvolver na IDE.
Numa placa final coloco sempre um ICSP header para poder programar o chip com programador externo, nao quero que o atmega ao ligar faça a verificaçao se esta a receber um skeetch, ou muito menos renicie se algo iniciar a comunicaçao serie na porta.

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Desculpa reanimar a thread...

Qual é mesmo o bootloader que estás a usar? Eu reparei agora que todos os meus Arduinos ficam bloqueados quando tento usar o watchdog. :(

Onde arranjaste o que estás a usar agora que permite o funcionamento do WDT?

Sinceramente, nunca utilizei um WDT em projectos meus (o que é estranho, tendo em conta que pelo menos um deles está no mercado). :\
This... is a hobby.

mmoscz

#8
Mar 28, 2013, 02:06 am Last Edit: Mar 28, 2013, 02:55 am by mmoscz Reason: 1

Desculpa reanimar a thread...

Qual é mesmo o bootloader que estás a usar? Eu reparei agora que todos os meus Arduinos ficam bloqueados quando tento usar o watchdog. :(

Onde arranjaste o que estás a usar agora que permite o funcionamento do WDT?

Sinceramente, nunca utilizei um WDT em projectos meus (o que é estranho, tendo em conta que pelo menos um deles está no mercado). :\

Estou usando o OPTIBOOT 4.4 https://optiboot.googlecode.com/files/optiboot_v4_4.zip no ATMEGA328 STANDALONE (8Mhz sem cristal), funciona muito bem com o WDT,
no meu ARDUINO DUEMILANOVE ocorre o erro do WDT, parece que em alguns UNO´s não dá esse problema.
4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP

bubulindo

This... is a hobby.

Go Up