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
Hi Bill,
That may be tricky, depending on the scope some variables are set to zero automatically, and others will have different content (i.e. non-zero).
However, one option is to write your data to EEPROM, which of course is persistent even after power loss.
Is there a reason you wish to reset? Ordinarily you'd never do that (unless a software failure was detected, e.g. using a watchdog timer)
or some rare scenario like a software upgrade. (normal practice is to never allow have the microcontroller to reset or exit).
Why not set the LCD backlight off and go into a do while loop forever?
The display sets idle for a long time (hours) then when a keypress happens, the backlight comes on until the current function completes.
Thanks for the thought.
Good suggestion. Let me think about how to implement that. Actually I wanted to reset everything, like the reset button does, but leave the backlight off till a button is pressed.
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);
Maybe I/O pin controlling the backlight of LCD using transistor? On click of the button(which the I/O pin connected to base of the transistor) the transistor switch on the LCD backlight with timer and goes off after a minute or so...and waiting for user keypress... exactly like how mobile/tablet screen works...I am not sure what type of LCD you use but I can use this method with 16x2 LCD.
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.
essentially it would be as if you hit the reset button. Remember the Arduino code is at a very high level, abstracting much of the hardware and even code from the developer, the typical developer using "Wiring" to code the arduino is not even close to the machine. The watchDog Timer will trigger a reset by entering into a defined address and executing the code found there, this is all explained in the linked article I provided. It is not quite the same as powering off then on, but it is as close to hitting the reset button as you can get.
As an alternative.
Could you connect an Opto-coupler across the reset input.
You could then drive the output high and reset it.
Mark
I realize how correct you are re: It's not wise, normal to reset, re power a microprocessor. But I am concerned that an error could occur that would lock up the system. By starting from the beginning would clear any thing like overflowing the stack due to incorrect input or electronic noise or my bad programming. I don't have debugging programs that would allow me to se the state of all the variables , stack etc. I also don't have the time or expertise to check every possible scenario. I tried setup() ; ..there is where I realized that I can't leave the variables as they are ( what a mess this creates). I appreciate all the helpful advice and I am still working on all the suggestions. At present, I am still using the asm volatile (" jmp 0") and although it causes blinks in the display, it seems to be safe regarding the above. The training is worthwhile even if I am not able th fully understand all the ramifications of the suggestions.
Bill