Go Down

Topic: Problema com watchdog (resolvido) (Read 1 time) 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?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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). :\
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up