|
|
View previous topic :: View next topic |
Author |
Message |
IDK
Joined: 29 Jan 2019 Posts: 6 Location: Pakistan
|
Problem in delay functions |
Posted: Sun Feb 07, 2021 11:04 am |
|
|
Hello everyone,
I want to print few simple strings on serial monitor with a specified time delay in between and for that I write the code using delay function Delay_ms(). But the code was not running properly as on serial monitor strings after delay function were not being printed. I am sharing the code. Please guide me what was the possible issue.
Code: |
#include <18F46K22.h>
#device ADC=16
#FUSES WDT //Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:1 Postscale
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(crystal=16000000)
#use rs232(baud=9600,parity=N,xmit=PIN_E0,bits=8,stream=PORT1,restart_wdt)
void main()
{
while(1)
{
delay_ms(2000);
fprintf(PORT1,"AT+TCPCLIENT Step1");
fprintf(PORT1, "\r\n");
fprintf(PORT1,"AT+TCPCLIENT Step2");
fprintf(PORT1, "\r\n");
delay_us(2000);
fprintf(PORT1,"AT+TCPCLIENT Step3");
fprintf(PORT1, "\r\n");
}
} |
|
|
|
dluu13
Joined: 28 Sep 2018 Posts: 395 Location: Toronto, ON
|
|
Posted: Sun Feb 07, 2021 11:37 am |
|
|
You're using the watchdog timer, but you never reset it. That will reset your micro every time the watchdog timer runs over.
Change the WDT to NOWDT for starters... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Sun Feb 07, 2021 11:44 am |
|
|
Better yet stop using the WDT !
WDT should never be enabled until 100% of the code is working.
After that, you can determine how long the WDT should be set for.
Say you 'do the math' and 1.5 deconds seems to be reasonable, then make WDT timeout to be say 2 seconds. You have to read the datasheet as most WDT are NOT accurate, some vary +-30% or more. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Mon Feb 08, 2021 2:57 am |
|
|
People have the habit of thinking that enabling a watchdog is some form
of 'magical fix', but in fact using a watchdog to actually be useful is a complex
thing to do. Having the watchdog enabled, without a proper strategy may
actually make code less likely to work, rather than more likely to work.
For the simplest watchdog, the 'interval' needs to be selected to be longer
than the interval at which you 'test' that the code is running correctly,
and reset the timer. The watchdog should only be reset if things look sensible.
Ideally the reset itself should only be reachable if all the code is doing all the
things it is meant to be doing.
A good discussion of how to structure the watchdog code is here:
https://barrgroup.com/embedded-systems/how-to/advanced-watchdog-timer-tips
Another thing important to understand is that on most PIC's the default
watchdog, is very fast indeed. Only a few mSec. Almost no code could ever
use the watchdog at this setting. Some later PIC's slow this down, because
the manufacturers have realised that this time is just too short. Even the
space shuttle main engine used a watchdog that was over 100* slower
than the default PIC value!.
So first comment is as the two previous posters have said. Don't enable
the watchdog for basic testing. Then if you do want to use the watchdog,
you actually need to design your code to actually do this. Have a watchdog
reset routine, that is called slightly faster than the watchdog interval (be
very careful of the tolerance - as Jay has said, some of the PIC watchdogs
have awful tolerances). Have this routine test values and events that should
be occurring, and only actually reset the watchdog if these are doing what
they should be doing. Then your code needs to be written so that it can
start tidily if a watchdog does trigger. So initialise variables only on a
power on restart, but have the values tested for being in a sensible range.
With this all done, you then have code that can properly use the watchdog.
Simply enabling the watchdog, and 'scattering' watchdog resets, does
nothing to improve the code... |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|