I am now resetting using "asm volatile (" jmp 0"); and it works but I would like to leave the variables as is. I want to leave the LCD backlight off. I can supply the code if necessary.
Thanks, Bill
I am now resetting using "asm volatile (" jmp 0"); and it works but I would like to leave the variables as is. I want to leave the LCD backlight off. I can supply the code if necessary.
Thanks, Bill
So even though the actual software / hardware reset is not the best way to acheive what you want, here is the solution anyway just to cover it off
From the ATMEL AVR site
The canonical way to perform a software reset of non-XMega AVR's 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.
XMega parts have a specific bit RST_SWRST_bm
in the RST.CTRL
register, that generates a hardware reset. RST_SWRST_bm is protected by the XMega Configuration Change Protection system.
The reason why using the watchdog timer or RST_SWRST_bm
is preferable over jumping to the reset vector, is that when the watchdog or RST_SWRST_bm
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.
CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the AVR.
The rest can be found by following the link in the title above
or
WDTCR=0x18;
WDTCR=0x08;
#asm("wdr")
while(1);
Yes this might do it. I'm not clear about WDT though. Where does the program go after the WDT times out? If the code returns to void loop() then this would be perfect.
Please clarify this for me.
How do I write to the control register? RST_SWRST_bm
in the RST.CTRL
register. Will the reset occur immediately after I write to the control register?
I think I'm making this too complex but I would like to return to the main loop() after the reset.
Here is the code so you can see what I am doing. There are three places where I need a "reset".
Thanks Peter I really appreciate your help.
Bill
woops.. the code didn't stay attached. Would the complete code help? About 250 lines.
As an alternative.
Could you connect an Opto-coupler across the reset input.
You could then drive the output high and reset it.
Mark
As an alternative.
Could you connect an Opto-coupler across the reset input.
You could then drive the output high and reset it.
Mark