Re: Watchdog Kategorie: CC2-Unit & Appl.Board / CC2-Station (von Josef Z. - 20.05.2006 19:34) | |
Als Antwort auf Re: Watchdog von Cris - 23.05.2002 12:11
| |
> Hallo Dirk, > > so habe ich das Manual auch verstanden. Das mit dem Entfernen von DISWDT aus dem OS müsste ohne dem Neucompilieren des OS funktionieren. > > Ich stelle mir das so vor: > Der Sprungbefehl auf Adresse 0000H des OS müsste zu einer selbst geschriebenen Initialisierungsroutine im Segment 3 verweisen. Dort wird alles Initialisiert wie im Original-OS auch, nur der Watchdog wird nicht verboten. Danach erfolgt der Rücksprung ins normale OS. > > Vielleicht kann man die ISR des 1ms Timers auch noch türken. Die ISR könnte (wenn kein Watchdog eingeschaltet werden soll) den Watchdog-Service bedienen. Wenn Watchdog gewünscht, dann wird dieser Service vom Anwenderprogramm ausgeführt. > > Habe leider keine Zeit um das zu programmieren, wäre aber interessant. > > Beste Grü�e > > Cris Hallo, die Beiträge hier sind schon etwas älter - vielleicht das Problem nicht mehr aktuell. Weitere Einschränkung: Ich benutze orginal OS und orginal Downloadtools wie auf der Conrad CD. Ich hatte mit der Station ähnliche Schwierigkeiten in Photovoltaikanwendungen (Nachführungen, Wechselrichterüberwachung) - vermute EMV Probleme wegen Wechselrichter und Schütze in unmittelbarer Umgebung. Obiges Rezept habe ich versucht umzusetzen - Danke an (Eric Hospel) 1. DISWDT entfernen - statt dessen Sprung auf eigene Initialisierung: Disasembled operation system CC2: 11.08.2001 original Startcode: 0x2226: DISWDT Entry point 0x222a: BFLDL SYSCON,#0xdf,#0x1c 0x222e: BFLDH SYSCON,#0xff,#0x0 0x2232: EXTR #3 0x2234: BFLDL SYSCON2,#0xf0,#0x0 0x2238: BFLDH SYSCON2,#0x7f,#0x7c 0x223c: MOV SYSCON3,#0x0 0x2240: BFLDL BUSCON0,#0x3f,#0xe 0x2244: BFLDH BUSCON0,#0xdf,#0x4 0x2248: MOV STKOV,#0xfa0c 0x224c: MOV STKUN,#0xfc00 0x2250: MOV SP,#0xfc00 Init stack pointer 0x2254: MOV CP,#0xf6c0 Register bank 0x2258: NOP 0x225a: MOV R0,#0xf886 Start of user stack 0x225e: EINIT End of Initialisation 0x2262: CALLS 0x20a6 0x2266: MOV R12,#0x0 0x2268: MOV R13,#0x0 0x226a: MOV R14,#0x0 0x226c: CALLS 0x127e Begin of code new Startcode: $case $segmented $model(medium) $extend $nomod166 $stdnames(reg164ci.def) regdef R0, R1, R2, R3, R4, R5, R6, R7, R12, R13, R14, R15 initWdog equ 0d000h userseg SECTION CODE word at 2226h assume dpp3:userseg public intRAM intRAM proc far ; Entry point ;DISWDT ; disable old WDog handling BFLDL SYSCON,#0dfh,#01ch BFLDH SYSCON,#0ffh,#00h EXTR #3 BFLDL SYSCON2,#0f0h,#00h BFLDH SYSCON2,#07fh,#07ch MOV SYSCON3,#00 BFLDL BUSCON0,#03fh,#0eh BFLDH BUSCON0,#0dfh,#04h MOV STKOV,#0fa0ch MOV STKUN,#0fc00h MOV SP,#0fc00h ;Init stack pointer MOV CP,#0f6c0h ;Register bank NOP MOV R0,#0f886h ;Start of user stack calls initWdog ; new: init Wdog and T14 interrupt for service EINIT ;End of Initialisation CALLS 020a6h MOV R12,#0 MOV R13,#0 MOV R14,#0 CALLS 0127eh ;Begin of code intRAM endp userseg ENDS END Im hex-file sieht das dann so aus: :020000040000FA :202226000A89DF1C1A8900FFD1A00AE8F0001AE87C7FE6EA00000A863F0E1A8604DFE60AF8 :202246000CFAE60B00FCE60900FCE608C0F6CC00E6F086F8DA0000D0B54AB5B5DA00A62023 :10226600E00CE00DE00EDA007E12877887870DFD20 :020000040000FA 2. Initialisierung von Watchdog und Service mit max. Timeout (ca. 400msec): ; Additional Code for operation system CC2: ; Placed after original code at 0xd000 ; 13.05.2006 $case $segmented $model(medium) $extend $nomod166 $stdnames(reg164ci.def) regdef R0, R1, R2, R3, R4, R5, R6, R7, R8, R12, R13, R14, R15 T14_HOOK EQU 0f896h userseg SECTION CODE word at 0d000h ;there seems to be space at 0xd000 assume dpp3:userseg public intRAM intRAM proc far initWdog: mov R8,#0 bmovn R8.0,T3EUD ; check for HOST-Mode CMP R8,#0 jmpr cc_NZ, hostmode no_hostmode: exts #0,#1 ; WDog fo regular mode mov WDTCON, #01h ; max reload min prescaler SRVWDT calls 01b34h ; init T14 BSET PSW.11 ; and enable interrupts RETS hostmode: DISWDT ; no Wdog for Host-Mode RETS ; keep location: 0xd024 for wdogservice servWdog: ; isr branches to this location ; check whether application does service ; T14_HOOK stores 0x00 or 0xfa (jmps instr) ; 0x00 means no hook: os has to service wdog ; any hook (i.e. dummy isr-hook) signalizes ; that application does maintenance of wdog ; and os has to stop wdog-service: EXTS #0, #1 MOVB RL1, T14_HOOK ; get code for possible hook JMPR cc_NZ, nowdog ; serve Wdog only if nothing hooked mov WDTCON, #01h ; max reload min prescaler SRVWDT nowdog: jmps 0cd76h ; continue with standard isr intRAM endp userseg ENDS END das ergiebt im hex-file zusätzliche Zeilen: :020000040000FA :20D00000E0083AE2F84048803D0AD7000000E6D70100A758A7A7DA00341BBF88DB00A55A99 :1AD02000A5A5DB00D7000000F3F296F83D04E6D70100A758A7A7FA0076CDFE :020000040000FA 3. in die T14 Interruptroutine wird ein Sprung zur obigem Code eingebaut, so dass der Watchdog regelmä�ig zurückgesetzt wird: Disasembled operation system CC2: 11.08.2001 ISR for T14 0x1eaa: MOV 0xf680,R0 0x1eae: SCXT CP,#0xf680 0x1eb2: SCXT MDC,#0x10 0x1eb6: PUSH DPP0 0x1eb8: MOV DPP0,#0x0 0x1ebc: PUSH DPP2 0x1ebe: MOV DPP2,#0x2 0x1ec2: PUSH MDH 0x1ec4: PUSH MDL ; here WDog service is implemented: ; was before: ; 0x1ec6: CALLS 0xcd76 ; now branch to WDogServiceRoutine at 0xd024 ; Routine jumps back to 0xcd76 0x1ec6: CALLS 0xd024 0x1eca: MOVB RL1,0xf896 0x1ece: JMPA cc_Z,0x1ef0 Test hook present 0x1ed2: MOVB RL2,0xf788 hook mode 0x1ed6: CMPB RL2,#0x2 after 0x1ed8: JMPR cc_NZ,0x1ede 0x1eda: CALLS 0x1916 Handle timer 0x1ede: CALLS 0xf896 Call hook 0x1ee2: MOVB RL1,0xf788 hook mode 0x1ee6: CMPB RL1,#0x1 before 0x1ee8: JMPR cc_NZ,0x1ef4 0x1eea: CALLS 0x1916 0x1eee: JMPR cc_UC,0x1ef4 0x1ef0: CALLS 0x1916 0x1ef4: CALLS 0xcda8 0x1ef8: POP MDL 0x1efa: POP MDH 0x1efc: POP DPP2 0x1efe: POP DPP0 0x1f00: POP MDC 0x1f02: POP CP 0x1f04: RETI die relevante hex Zeile: :201EB600EC00E6000000EC02E6020200EC06EC07DA0024D0F3F296F8EA20F01EF3F488F7BC 4. damit läuft der Watchdog bei Start der Applikation und wird von Timer 14 (1msec) regelmä�ig bedient. Timer 14 beendet Watchdogservice sobald eine Interruptroutine mit der system.hook() Funktion angehängt wird: D.h. die Applikaton startet effektiv den Watchdog mit dieser Funktion und mu� ab diesem Zeitpunkt selbst den Watchdog bedienen. Das kann z.B. so aussehen: a) Assemblerroutinen (Dummy für ISR und Service für Watchdog - hier mit max. Timeout): $case $segmented $model(medium) $extend $nomod166 $stdnames(reg164ci.def) regdef R0, R1, R2, R3, R4, R5, R6, R7, R15 C2_DSEG EQU 8 ; Data Segment for C2 OFS_DUMMY_ISR EQU 0 ; Offset for asm-routine start adress OFS_WDOG EQU 2 userseg SECTION CODE word at 30000h assume dpp3:userseg public intRAM intRAM proc far MOV R3, #POF RTN002 ; dummy isr MOV R5, #POF RTN003 ; watchdogservice EXTS #C2_DSEG, #2 ; all C2 data in Segment 8 MOV [R1+#OFS_DUMMY_ISR], R3 MOV [R1+#OFS_WDOG], R5 POP R2 ; don't pop R0 - because 0xf600 is used by OS POP R2 RETS RTN002: nop ; Dummy ISR RETS RTN003: ; Watchdog service routine WDOG: EXTS #0, #1 MOV WDTCON, #0001 ; WDTREL = 00 (max. time by min. preload) ; and WTIN = 1 (1/128 prescaler) SRVWDT RETS intRAM endp userseg ENDS END b) Korrespondierender C2-Code: type VECTOR { int dummy_isr; // nop int WDogService; // serving WDog } VECTOR asm_vec; function AsmCall(VECTOR vec) { inline vmcodes.VM_LOAD_LOCAL_INT; inline -6; inline vmcodes.VM_STORE_ABSOLUTE_INT; inline 0xf602; system.call(3, 0); } thread WDOG_SERVICE { run 8; system.call (3,asm_vec.WDogService); sleep(200); } c) und Anwendung in der Applikation: { // get ISR-Startadresses asm.AsmCall(asm.asm_vec); // start Watchdog and WdogService run asm.WDOG_SERVICE; // and stop WDog-Service of OS: system.hook(0, 3, asm.asm_vec.dummy_isr, 2); } d) kleine Testroutine: // Test routine for watchdog-Test: if (station_io.getkey() == 12) // key F3 { station_io.LEDtoggle(8); // F3 - LED halt asm.WDOG_SERVICE; // stop service of WDog // should reset controler // within half a second } e) theoretisch mü�te sich der Watchdog mit der system.unhook() Funktion auch wieder "deaktivieren" lassen - das habe ich aber nicht versucht Obiges funktioniert bei mir in Steuerungsanwendungen (ich benutze DCF77, ADC, Relais, digitale Ports, Tastatur, Display, LEDs - aber keine Bussysteme in der Applikation). Was sich damit nicht verarzten lies: Ausfälle des Displays - vermute EMV-Einflu� auf Displaycontroller oder die Datenverbindung zwischen C164 und Displaycontroller. falls sich das jemand zutraut: viel Spa�! Josef Z. | |
Antwort schreiben Antworten: |