Go Down

Topic: Problema com watchdog (resolvido) (Read 3284 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy