|
|
View previous topic :: View next topic |
Author |
Message |
camleot23
Joined: 16 Aug 2019 Posts: 52
|
[SOLVED] Very Simple Question ! Watchdog |
Posted: Wed Nov 13, 2019 12:49 am |
|
|
Hello,
It will be a very basic question I know but when you don't know the answer it is hard for you. I want to use watchdog and I set it to 1ms. I wanted to simulate in a very basic way. I used my main while loop and I wanted to see my restart. But it doesn't restart itself acordingly to the time. It is restarting itself maybe 5 mins or 10 mins later. I don't know why. I searched everywhere including this forum but I couldn't find any solution. Maybe I couldn't understand solutions because of my english. Here is my code:
Code: | #include <./33EP64MC204.h>
#DEVICE NESTED_INTERRUPTS=TRUE
#device PASS_STRINGS=IN_RAM
#FUSES WDT
#FUSES NOJTAG //JTAG disabled
#FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES FRC //internal oscillator icin gerekli
#FUSES OSCIO //OSC2 is general purpose output
#use delay(internal=80MHz)
#use i2c(master,I2C1,FAST)
#use spi(MASTER, SPI1, MODE=0, BITS=16,CLOCK_HIGH=3,CLOCK_LOW=3,FORCE_HW,STREAM=SSP1)
#pin_select U1TX=PIN_B9
#pin_select U1RX=PIN_C6
#use rs232(UART1, baud=115200,parity=N,stop=1, ERRORS, stream=GSM)
#pin_select U2TX=PIN_B11 //UART RFID PINS
#pin_select U2RX=PIN_B5
#use rs232(UART2, baud=9600,parity=N,stop=1, ERRORS, stream=RFID)
#use rs232(baud=9600,parity=N,stop=1,xmit=PIN_B6 ,rcv=PIN_B7,enable =PIN_B8, stream = RS485) //SOFTWARE RS485
void main() {
setup_oscillator(OSC_INTERNAL, 80000000);
fprintf(RS485, "starting");
setup_wdt(WDT_1MS);
while (1) {
output_toggle(PIN_A2);
delay_ms(10000);
}
} |
Last edited by camleot23 on Thu Nov 14, 2019 12:21 am; edited 2 times in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Nov 13, 2019 1:00 am |
|
|
WHAT CHIP?.
You carefully leave the chip line out of the posted code..... |
|
|
camleot23
Joined: 16 Aug 2019 Posts: 52
|
|
Posted: Wed Nov 13, 2019 1:03 am |
|
|
My bad, I'm sorry. dsPIC33EP64MC204, MPLAB v5.25 CCS C compiler v5.016 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Nov 13, 2019 4:01 am |
|
|
Quote: | setup_wdt(WDT_1MS); |
Why use 1 ms for your test ? I would have picked a longer time, such
as 4 seconds. Make it long enough to fit human ability to notice the delay
time. |
|
|
camleot23
Joined: 16 Aug 2019 Posts: 52
|
|
Posted: Wed Nov 13, 2019 4:40 am |
|
|
In anyway, am I not supposed to see this line on my terminal?
fprintf(RS485, "starting"); |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Nov 13, 2019 5:49 am |
|
|
A couple of things wrong with what you post, but then a question:
You should use:
Code: |
#include <./33EP64MC204.h>
#DEVICE NESTED_INTERRUPTS=TRUE
#device PASS_STRINGS=IN_RAM
#FUSES WINDIS
#FUSES NOWDT
#FUSES NOJTAG //JTAG disabled
#FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES FRC //internal oscillator icin gerekli
#FUSES OSCIO //OSC2 is general purpose output
#use delay(internal=80MHz)
#use i2c(master,I2C1,FAST)
#use spi(MASTER, SPI1, MODE=0, BITS=16,CLOCK_HIGH=3,CLOCK_LOW=3,FORCE_HW,STREAM=SSP1)
#pin_select U1TX=PIN_B9
#pin_select U1RX=PIN_C6
#use rs232(UART1, baud=115200,parity=N,stop=1, ERRORS, stream=GSM)
#pin_select U2TX=PIN_B11 //UART RFID PINS
#pin_select U2RX=PIN_B5
#use rs232(UART2, baud=9600,parity=N,stop=1, ERRORS, stream=RFID)
#use rs232(baud=9600,parity=N,stop=1,xmit=PIN_B6 ,rcv=PIN_B7,enable =PIN_B8, stream = RS485) //SOFTWARE RS485
void main() {
setup_oscillator(OSC_INTERNAL, 80000000);
fprintf(RS485, "starting");
setup_wdt(WDT_ON|WDT_1MS); //enable the watchdog
while (1) {
output_toggle(PIN_A2);
delay_ms(10000);
}
}
|
Two big differences. The watchdog is off in the fuses. Otherwise it is on
at the start of the code. WINDIS needs to be set or when you use the
watchdog, it can only be reset in an precise 'window' of it's cycle.
Now the question. You use the word 'simulate'. You do realise that the
simulator in MPLAB-X will not simulate a watchdog?. If you are trying
this in the simulator, then this is why it is not working....
It's 'odd' in this. They say that the WDT is one of the simulated
peripherals, but when you build in any DEBUG mode (including the
simulator), they disable the watchdog (this since most hardware
debuggers don't support the watchdog).
So debugging or simulation, the watchdog won't normally work.
Then on your compiler version, I am not seeing the setup_wdt
actually writing the bits to the configuration register in RAM. So you will
probably have to set these in the fuses to work. Or write the word
yourself. Without this it'll default to the maximum that is possible.
128 seconds. Sounds suspiciously like what you are seeing.... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Wed Nov 13, 2019 6:20 am |
|
|
I don't use that PIC, but historically WDT are NOT accurate. They usually are driven from an internal RC oscillator,so maybe +-1-5% clock, then there's temperature affects and perhaps VDD.
It's super important to read the 400-700 pages of your PIC's dataheet and see what the WDT specs really are.
My 'gut' says you won't get 1.00000ms from the WDT.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Nov 13, 2019 6:55 am |
|
|
No, the WDT on this is specified to give between 0.8, and 1.2mSec for the
'nominal' 1mSec setting. |
|
|
camleot23
Joined: 16 Aug 2019 Posts: 52
|
|
Posted: Wed Nov 13, 2019 7:33 am |
|
|
First thank you for your replies. Second, again I'm sorry for the 'simulate' word. Because I wanted to mean 'try' by simulate on my hardware. I was uploading the code into my hardware and running it and observing it. Third, I added these;
#FUSES WINDIS
#FUSES NOWDT
setup_wdt(WDT_ON|WDT_1MS);
but again, no work.
Quote: | I am not seeing the setup_wdt
actually writing the bits to the configuration register in RAM. So you will
probably have to set these in the fuses to work. |
Can I find how to set these bits on this forum or in datasheet ? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Wed Nov 13, 2019 9:24 am |
|
|
The PIC processor 'header' file( the first line of code...) will have a list of available registers and bit settings.
The datasheet will explain them all BUT be in Microchip words not necessarily what CCS calls them. MOst are very similar if not the same words though. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Nov 13, 2019 1:48 pm |
|
|
For your 1mSec,
#FUSES WPOSTS1
#FUSES WPRES32
Be aware that a watchdog running at this sort of rate is 'silly', and almost
certainly pointless.
The correct way to use a watchdog, is to decide the time criteria
that is needed for reliable operation, and set the watchdog at just under
this. Then have the code verify that everything is working before resetting
the watchdog, preferably in just one location. The watchdog on the flight
control computer on the shuttle used just under 0.5seconds, and this was
considered to be as fast as it was possible to go and still be properly
testing that all systems were functioning correctly. |
|
|
camleot23
Joined: 16 Aug 2019 Posts: 52
|
|
Posted: Thu Nov 14, 2019 12:21 am |
|
|
I understand. That solved my problem. Thank you both.
Have a nice day |
|
|
|
|
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
|