RESET CPU

Boas,

Gostava de saber se existe alguma forma de resetar o arduino sem ser através do watchdog

if (ligacao_net_OK == true)
     {
      wdt_reset();
     }

Estou a usar esse codigo para resetar o arduino mas não sei se é o mais eficiente para o que eu quero fazer.

Cpts

Zé tretas

Gostava de saber se existe alguma forma de resetar o arduino sem ser através do watchdog

Sim apontando o programa para o vector de reset.No entanto a quem diga que nao se deve usar pois nao é garantido que de tempo a toda a RAM ser limpa correctamente(nunca testei)

if (ligacao_net_OK == true)
{
wdt_reset();
}

E ele reseta com esse codigo.
O objectivo do watchdog nao e fazer resetar o arduino quando queres, mas sim caso algo nao aconteca em determindo tempo, o contador do watchdog enche porque algo no codigo demorou demais ou algo nao foi satisfeito que zera-se esse contador.
Digamos que o cao de guarda fica alerta pronto a morder o reset se algo anomalo acontecer que cause o overflow do contador do watchdog.Logo ele tem de ser acalmado de x em x tempo para nao morder o reset :grin:
É isto que queres?

tretas:
Boas,

Gostava de saber se existe alguma forma de resetar o arduino sem ser através do watchdog

if (ligacao_net_OK == true)

{
      wdt_reset();
    }




Estou a usar esse codigo para resetar o arduino mas não sei se é o mais eficiente para o que eu quero fazer.

Cpts

Zé tretas

E o bootloader já aceita o watchdog? Há uns tempos atrás isso nem era possível.
Essa instrucão faz reset do wdt, não do chip. aliás, da forma que está o chip nunca fará reset. O que podes fazer é se houver um erro, crias o WDT com um valor pequeno, e colocas uma instrucão de delay logo a seguir superior ao tempo que tens.

Algo assim:

if (ligacao_net_OK == FALSE) 
     {
      wdt_enable(WDTO_15MS);
      delay(1000);
     }

Isto deve fazer o reset do chip.

HugoPT:

Gostava de saber se existe alguma forma de resetar o arduino sem ser através do watchdog

Sim apontando o programa para o vector de reset.No entanto a quem diga que nao se deve usar pois nao é garantido(nunca testei)

Isso faz reset ou apenas reinicia o programa deixando os estados como estavam?

Vi alguns posts à pressa acerca disso e não existem grandes solucões para isto:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=96822
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=65123
http://nongnu.org/avr-libc/user-manual/group__avr__watchdog.html

Também existem chips que fazem essa funcão... caso queiras algo profissional para isso. :slight_smile:

Tens razão renicia o programa deixando os estados dos registos como estavao
Acabei agora de ler isto

How do I perform a software reset of the AVR?
The canonical way to perform a software reset of the AVR is to use the watchdog timer. Enable the watchdog timer to the shortest timeout setting, then go into an infinite, do-nothing loop. The watchdog will then reset the processor.
The reason why this is preferable over jumping to the reset vector, is that when the watchdog resets the AVR, the registers will be reset to their known, default settings. Whereas jumping to the reset vector will leave the registers in their previous state, which is generally not a good idea.

Já usaste algum chip supervisor de Reset que fizesse esta funcão e não desse cabo do reset para gravacão de programas?

Eu lembro-me de utilizar um Brown-Out detector externo (isto há quase 10 anos atrás) que tornava impossível utilizar o ICSP com ele. Mas é um chip interessante de adicionar principalmente para evitar problemas quando se liga o sistema.

Se você usar um RTC que possua um pino de interrupção, pode programar o RTC para resetar o Arduino. eu fiz isto com um DS1337+ e funcionou perfeitamente bem.

Basta ligar o DS1337+ no RST do Arduino, e, quando desejar, programar o DS1337+ para resetá-lo. Se desejar, isto pode acontecer de forma pré-programada (por exemplo, todos os dias à meia-noite), ou dali a alguns segundos, millisegundos, etc. Como o DS1337+ pode trabalhar com alimentação externa, independente do Arduino, o arduino resetando não irá atrapalhar seu funcionamento.

Eu fiz isto de forma apenas experimental, em uma proboboard, e funcionou.

Outros ICs de RTC podem funcionar igualmente bem.

Boas

if (ligacao_net_OK == FALSE) 

{
      wdt_enable(WDTO_15MS);
      delay(1000);
    }

Bubulindo o que eu quero é mesmo é que ele resete, e quanto ao teu codigo eu tenho algo parecido no setup(), e o meu objectivo é que ele não resete o wdt e provoque um reset ao arduino, mas pelos vistos o meu problema esta na Ethernet Shield W5100 pois ela passado um tempo deixa de me enviar os dados para um servidor Web ... sem saber porque só que eu pensava que era o arduino que ficava marado mas pelos vistos é ela

void setup(void)
{
  wdt_enable(WDTO_8S);
  Serial.begin(19200);
  pinMode(etx, OUTPUT);    
  Serial.println("\n\rMicroRegul  ...\n\r");
  Ethernet.begin(mac, ip);  
  delay(5000);	// tempo INIT LAN
  //  pinMode(LED, OUTPUT);

  // t.oscillate(LED, 1000, LOW);
  t.every(950, tx_rx);                         // 1 seg
  t.every(5000, Conv_Input_Sat);           // 5 seg 
  t.every(60000,  send_to_bd_mysql);     //60 seg
  
}

Ups...

o W5100 não tem um reset físico, pois não?

Tem fica no pino 59 do W5100.
Na board tem um botao tambem mas estive agora a confirmar no esquema da ethernet shield e o pino 59 esta conectado ao pino de reset do arduino, ou seja para resetares o w5100 por consequencia vai reniciar o arduino.Podes é remover o IC CAT811TTBI para assim isolares o reset da ethernet e depois podes dedicar um pino no arduino para a resetar.
Espreita no esquema e vê se te pode ajudar.
Terias é de modificar a board.

Boas,

O que eu queria mesmo era resetar a w5100, nem que para isso tenha que resetar o arduino também ... para a aplicação que tenho não é um problema

Ja agora qual é o codfigo para resetar a w5100

PS : quando carrego no botão da shield o arduino não reseta ... porque será ?

Cpts

Zé tretas

Se o problema é o W5100, então o WDT não te vai ajudar.

Poderá o problema estar no teu software?

Podes também implementar um reset do chip por software.
Estive a ver aqui e se fizeres um reset do Arduino, ele ao iniciar faz o reset do shield por software (na instrucão Ethernet.begin) e fica-se no problema apontado na thread que coloquei em cima.

Experimenta fazer o que eles falam na thread e vê se resulta melhor. :slight_smile:

Boas,

Obrigado bubulindo ... mas eu já tinha visto esse post só que já o li e reli e fico a perceber o mesmo :frowning:

Cpts

Zé tretas

Ok. Qual é a parte que não entendes?

Boas,

Que parte da livraria modificar ...

cpts

Zé tretas

no ficheiro w5100.cpp ... se procurares por aquele texto dentro desse ficheiro, vais encontrar aquele pedaco de código...

Boas,

Sou velho mas ... isso já tinha percebido eu ... só não sei é o que alterar, será este codigo deste post ?

I've given up on these patches, instead I 'pulled' the central repository off github and a am applying the patches to my own copy, but only after testing each one, then merging in my own patches.

There is another 'stupid' bug in w5100.cpp:
Code:
initSS();
writeMR(1<<RST);
writeTMSR(0x55);
writeRMSR(0x55);

for (int i=0; i<MAX_SOCK_NUM; i++) {
SBASE = TXBUF_BASE + SSIZE * i;
RBASE = RXBUF_BASE + RSIZE * i;
* }*
If people READ the chips data sheet they would see that it takes 10ms for the chip to 'software' reset (W5100 V1.2.4 P.64), as such the code should be:
Code:
initSS();
* // Issue a software reset to the W5100 chip.*
* writeMR(1<<RST);*
* //wait 100ms for the chip to physically reset(it takes 10ms but manufacturer request 100ms).*
* delay(100);*
* // Continue with the setup of the internal registers.*
* writeTMSR(0x55);*
* writeRMSR(0x55);*
fortunately the W5100 chip has some default values, so as the reset is stamping on them, they are being reinitialized to the default,
There may be a chance this bug is stamping on the setting up of the sockets.....
I'm still trying to get an answer back off the manufacturer as to *if the RST bit is 'testable' because if it was, then I would drop in a subroutine, both BEFORE & after the reset, (which would negate the need for the stupid delay(300)
With a TESTABLE state that could be returned up the stack. Currently when initializing a library on the arduino they mostly return 'void'.
[/quote]

Onde encontrares isto:

nitSS();
  writeMR(1<<RST);
  writeTMSR(0x55);
  writeRMSR(0x55);

Trocas por isto:

initSS();
  // Issue a software reset to the W5100 chip.
  writeMR(1<<RST);
  //wait 100ms for the chip to physically reset(it takes 10ms but manufacturer request 100ms). 
  delay(100);
  // Continue with the setup of the internal registers.
  writeTMSR(0x55);
  writeRMSR(0x55);

Boas

Obrigada foi mesmo isso que tinha feito, como confirma o meu post acima

Cpts

Zé tretas