|
|
View previous topic :: View next topic |
Author |
Message |
RKnapp
Joined: 23 Feb 2004 Posts: 51
|
ex_wdt.c does not seem to work on PIC18F8720: why not? |
Posted: Tue Feb 24, 2004 2:22 pm |
|
|
Friends,
Has anyone tried to run watchdog example ex_wdt.c on an 8720 -- or on any target chip for that matter? I'm running CCS's "Minipicd8x20" 18F8720 demo board and compiler v3.185.
- It does appear to time out.
- But when it restarts, I don't get any reset_cause() return other than "normal power up." I would think it would cite "wdt timeout" as the reason.
2) What is the correspondence between the #fuses values like WDT128 and the millisecond values of earlier chips?
Thanks,
Robert |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Feb 24, 2004 6:29 pm |
|
|
Quote: | Has anyone tried to run watchdog example ex_wdt.c on an 8720
-- or on any target chip for that matter? I'm running CCS's "Minipicd8x20" 18F8720 demo board and compiler v3.185. |
Which CCS example file are you using ? There are two different ones,
depending upon which PIC you have: ex_wdt.c and ex_wdt18.c
Also, vs. 3.185 has at least one known problem with the bit_set()
function, in which a previously working function was broken.
So I would be cautious about trusting that version. It may have
other problems. http://www.ccsinfo.com/forum/viewtopic.php?t=18394
Regarding testing the ex_wdt18.c program:
I don't have an 18F8720. I only have an 18F458. I modified
the ex_wdt18.c file slightly to work with my demo board,
and it ran fine. This is with PCH vs. 3.178. Here are the
messages displayed on the terminal window.
Normal power up!
Hit any key to avoid a watchdog timeout.
Restarted processor because of watchdog timeout!
Code: | #ifndef __PCH__
#error This example is only for PIC18
#endif
#include <18F458.h>
#fuses XT,WDT128,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main() {
switch ( restart_cause() )
{
case WDT_TIMEOUT:
{
printf("\r\nRestarted processor because of watchdog timeout!\r\n");
break;
}
case NORMAL_POWER_UP:
{
printf("\r\nNormal power up!\r\n");
break;
}
}
setup_wdt(WDT_ON);
while(TRUE)
{
restart_wdt();
printf("Hit any key to avoid a watchdog timeout.\r\n");
getc();
}
} |
|
|
|
RKnapp
Joined: 23 Feb 2004 Posts: 51
|
|
Posted: Wed Feb 25, 2004 2:12 pm |
|
|
PCM Programmer,
Thanks for your reply, and for trying it on your board.
Mine still does not work! I tried the exact same code as yours except:
- my include file is the device file for 8720, "18F8720.h"
- #fuses XT is, in my code, #fuses HS. (I don't know what the different kind of clock arrangements are, and don't know how to find out what CCS means by these different options, but I think their protoboard can use only "HS", a 20MHz oscillator between pins 49 & 50, as a supplied timing source.)
- I'm not sure what our hardware differences would be; I'm using CCS v3.185 on their prototyping board "Minipicd8x20".
But it still does not work. I will submit a tech support request, but have not had great luck with these so far. If you have any other ideas, or anyone else tries this with an 8720, pls let me know.
Thanks anyway,
Robert |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Feb 25, 2004 3:25 pm |
|
|
Post the .LST file that you got when you compiled my test program.
(I mean, the program, after you changed it for the 18F8720).
I'll compare it to the code generated for vs. 3.178. |
|
|
RKnapp
Joined: 23 Feb 2004 Posts: 51
|
|
Posted: Wed Feb 25, 2004 3:57 pm |
|
|
PCM,
.LST is below. Alas, I don't know assembly so I don't see anything obvious. It must be some kind of "fuse?" (Whatever "fuses" are, they're not documented; CCS manual says "typical choices are" blah blah.. but I can't see any mention of what these would correspond to in the Microchip Data Sheet.)
Thanks!
Robert
Code: | CCS PCH C Compiler, Version 3.185
Filename: C:\KNAPP\NTEK_HDV100\RAK_8720\ExampleTests\ex_wdt.LST
ROM used: 368 (0%)
Largest free fragment is 0
RAM used: 6 (0%) at main() level
6 (0%) worst case
Stack: 1 locations
*
0000: GOTO 00B8
.................... #include <18F8720.h>
.................... //////// Standard Header file for the PIC18F8720 device ////////////////
.................... #device PIC18F8720
.................... #list
....................
.................... #use delay(clock=20000000)
.................... #fuses HS, WDT128, NOPROTECT, NOLVP
.................... #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
....................
....................
.................... void main()
.................... {
00B8: CLRF FF8
00BA: BCF FD0.7
00BC: CLRF FEA
00BE: CLRF FE9
00C0: MOVLW 0F
00C2: MOVWF FC1
00C4: MOVLW 07
00C6: MOVWF FB4
00C8: MOVLW 81
00CA: MOVWF FAF
00CC: MOVLW 26
00CE: MOVWF FAC
00D0: MOVLW 90
00D2: MOVWF FAB
....................
.................... switch ( restart_cause() )
.................... {
00D4: MOVF FD0,W
00D6: ANDLW 0E
00D8: BCF FD0.1
00DA: MOVWF 00
00DC: MOVLW 04
00DE: SUBWF 00,W
00E0: BTFSC FD8.2
00E2: GOTO 00F4
00E6: MOVLW 0C
00E8: SUBWF 00,W
00EA: BTFSC FD8.2
00EC: GOTO 0118
00F0: GOTO 013C
.................... case WDT_TIMEOUT:
.................... {
.................... printf("\r\nRestarted processor because of watchdog timeout!\r\n");
00F4: CLRF 06
00F6: MOVF 06,W
00F8: CALL 0004
00FC: INCF 06,F
00FE: MOVWF 00
0100: MOVF 00,W
0102: BTFSS F9E.4
0104: GOTO 0102
0108: MOVWF FAD
010A: MOVLW 34
010C: SUBWF 06,W
010E: BTFSS FD8.2
0110: GOTO 00F6
.................... break;
0114: GOTO 013C
.................... }
.................... case NORMAL_POWER_UP:
.................... {
.................... printf("\r\nNormal power up!\r\n");
0118: CLRF 06
011A: MOVF 06,W
011C: CALL 004E
0120: INCF 06,F
0122: MOVWF 00
0124: MOVF 00,W
0126: BTFSS F9E.4
0128: GOTO 0126
012C: MOVWF FAD
012E: MOVLW 14
0130: SUBWF 06,W
0132: BTFSS FD8.2
0134: GOTO 011A
.................... break;
0138: GOTO 013C
.................... }
.................... }
....................
.................... setup_wdt(WDT_ON);
013C: BSF FD1.0
....................
.................... while(TRUE)
.................... {
.................... restart_wdt();
013E: CLRWDT
.................... printf("Hit any key to avoid a watchdog timeout.\r\n");
0140: CLRF 06
0142: MOVF 06,W
0144: CALL 0078
0148: INCF 06,F
014A: MOVWF 00
014C: MOVF 00,W
014E: BTFSS F9E.4
0150: GOTO 014E
0154: MOVWF FAD
0156: MOVLW 2A
0158: SUBWF 06,W
015A: BTFSS FD8.2
015C: GOTO 0142
.................... getc();
0160: BTFSS F9E.5
0162: GOTO 0160
0166: MOVF FAE,W
.................... }
0168: GOTO 013E
.................... }
....................
016C: GOTO 016C
Configuration Fuses:
Word 1: 2200 HS NOOSCSEN
Word 2: 0E0C NOBROWNOUT WDT128 NOWDT BORV25 PUT
Word 3: 0183 NOWAIT MCU CCP2C1
Word 4: 0001 STVREN DEBUG NOLVP
Word 5: C0FF NOPROTECT NOCPD NOCPB
Word 6: E0FF NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 40FF NOEBTR NOEBTRB
|
|
|
|
rwyoung
Joined: 12 Nov 2003 Posts: 563 Location: Lawrence, KS USA
|
|
Posted: Wed Feb 25, 2004 4:20 pm |
|
|
RKnapp wrote: | PCM,
.LST is below. Alas, I don't know assembly so I don't see anything obvious. It must be some kind of "fuse?" (Whatever "fuses" are, they're not documented; CCS manual says "typical choices are" blah blah.. but I can't see any mention of what these would correspond to in the Microchip Data Sheet.)
Thanks!
Robert |
In general a microcontroller's fuses refer to bits in its configuration word or words. This is well documented in most PIC data sheets, usually in the "Special Features of the CPU" section. About page 240 of the PIC18Fxx20 data sheet (http://www.microchip.com/download/lit/pline/picmicro/families/18fxx20/39609b.pdf) _________________ Rob Young
The Screw-Up Fairy may just visit you but he has crashed on my couch for the last month! |
|
|
RKnapp
Joined: 23 Feb 2004 Posts: 51
|
|
Posted: Wed Feb 25, 2004 11:06 pm |
|
|
rwyoung,
Thank you very much for pointing me to this area. I hadn't understood the "#fuses" concept of these bits. I'll take a closer look at the datasheet and see what I can suss out.
Again, thanks,
Robert |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 26, 2004 1:37 am |
|
|
After studying the ASM, I'm not sure what the problem might be.
At this point, if this was my problem, I would put several printf
statements into the program, and display the value of the RCON
register at various points.
I also noticed that you have the DEBUG fuse set. I don't have it
set in my test program. I wonder, are you running your program
under ICD2 in Debug mode ? I don't know what effect that would
have, but it might be important. I did my test as a standalone
program, and programmed the 18F458 with my PicStart-Plus.
If you want to pursue this and use printfs to display RCON,
then you need to put the following line of code above main():
#byte RCON = 0xFD0
Then, within the program, you need to insert several statements
like these, at the appropriate points:
printf("initial RCON value = %x\n\r", RCON);
printf("RCON after setup_wdt() = %x\n\r", RCON);
printf("RCON after restart_wdt() = %x\n\r", RCON);
printf("RCON after getc() = %x\n\r", RCON);
Then run the program and let a Watchdog timeout occur,
(by not pressing a key), and see what values are displayed.
Then analyze them while referring to the data sheet. |
|
|
TSchultz
Joined: 08 Sep 2003 Posts: 66 Location: Toronto, Canada
|
|
Posted: Thu Feb 26, 2004 6:14 am |
|
|
Here are the fuse setting I normally use for PIC18 series parts with watchdog timer enabled, > 4MHz clock, and 5V supply.
#fuses HS, PUT, BROWNOUT, WRT, NOWRTD, WDT, WDT128, STVREN, BORV42, NOLVP
The biggest one is the WDT, this enables the watchdog timer. This is different than how the PIC16 series parts handle this. The WDT128 sets the watchdog prescaler to 128. |
|
|
RKnapp
Joined: 23 Feb 2004 Posts: 51
|
|
Posted: Thu Feb 26, 2004 4:10 pm |
|
|
Friends,
Thanks for your attempts to help! I still can't get this thing to work; it must be some dumb thing. I'm running CCS v3.185, connected to an ICD-U40 v1.20, on CCS's 18F8720 prototyping board called "Minipicd8x20".
0) First of all, I can't figure out how to get the board to run independently of the ICD-U40: I'd sometimes like it in "programming" mode but not in "debug" mode. How is this done? As PCM noted, this could be important.
1) The "DEBUG" bit per se, however, appears to only to dedicate B6 & B7 to the interface if the 8720's .pdf, "PIC18F8xx20", page 245 (document page 243) re bit 7 of Config4L Bit 7, is to be trusted.
However, in any case, I cannot get this bit "un-set." There is some kind of error which pops up saying that ICD=TRUE must be in the #devices statement. However, whether in or out, this bit stays set... (?)
2) Now, I did try the suggested fuses
#fuses HS, PUT, BROWNOUT, WRT, NOWRTD, WDT, WDT128, STVREN, BORV42, NOLVP
but it immediately whined, saying "need #use delay if RS232 is to be used." So I added to this set:
#use delay(clock=20000000, RESTART_WDT)
but this did not appear to help, either.
3) I noticed that fuse WDT somehow does NOT lead to bit 0 of Config2H being set. My .lst file says, for the #fuses above:
Configuration Fuses:
Word 1: 2200 HS NOOSCSEN
Word 2: 0E04 NOBROWNOUT WDT128 NOWDT BORV42 PUT
Word 3: 0183 NOWAIT MCU CCP2C1
Word 4: 0001 STVREN DEBUG NOLVP
Word 5: C0FF NOPROTECT NOCPD NOCPB
Word 6: E0FF NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 40FF NOEBTR NOEBTRB
Thus I conclude that WDTEN is not set, and that the WDT is under SWDTEN control. Is this material? Should this affect the call to tickle the watchdog, the example's restart_wdt (); call which turns into CLRWDT?
I.e., should I be directly trying to write the SDWTEN bit?
This must be simple.... maybe just detaching the ICD-U40 from the proto-board for standalone operations? I can't figure out if the plot is getting thicker or thinner here.
Robert |
|
|
RKnapp
Joined: 23 Feb 2004 Posts: 51
|
|
Posted: Thu Feb 26, 2004 6:34 pm |
|
|
AHA! A break in the case: I think I've figured out how to run the board in "standalone" mode, and when I was able to do this, for some reason the WDT works fine -- and timeouts lead to the WDT_TIMEOUT reason.
0) I'd tried to talk directly to the ICD-U40 before, but the "control" always came up in ICD-S, not ICD-U mode (showing a little screen with COM1 and COM3 as the only possible choices. This is not good since it's a USB-based device.) I was annoyed at this but didn't want to click on either COM1/COM3 in case this would somehow confuse the IDE's Debugger -- which hasn't been confused before -- into wrongly thinking that I have an ICD-S. (When in doubt, never tempt Windows into serving up new annoyances.)
1) But finally I did try to click on COM1 just for the heck of it -- and after it greyed out for a while it came back offered the right choice, an ICD-U40. I clicked on this and a fancy graphical screen showing a board, an ICD, and a PC popped up!
2) Well shucks, this "ICD Control" screen offers lots of nice choices that do NOT involve debugging. You can update the ICD's firmware to 1.23 (the latest version), download .COFF files to the target, start/stop. When just "run" as a program, somehow, the WDT works fine and cites the correct restart_cause() value.
Fuses are still mysteriously set to NOWDT (indicating SWDTEN is still in charge) and I would love to know how this all works, if anyone knows -- but I guess I can't argue with success.
I'm posting this to THANK everyone who has wondered what is going on: Standalone ops are required for the WDT and ex_wdt.c to work correctly.
Robert |
|
|
|
|
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
|