Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > > 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) > > <b> > 1. DISWDT entfernen - statt dessen Sprung auf eigene Initialisierung: > </b> > > 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 > > <b> > 2. Initialisierung von Watchdog und Service mit max. Timeout (ca. 400msec): > </b> > <asm> > ; 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 > </asm> > > das ergiebt im hex-file zusätzliche Zeilen: > > :020000040000FA > :20D00000E0083AE2F84048803D0AD7000000E6D70100A758A7A7DA00341BBF88DB00A55A99 > :1AD02000A5A5DB00D7000000F3F296F83D04E6D70100A758A7A7FA0076CDFE > :020000040000FA > <b> > 3. in die T14 Interruptroutine wird ein Sprung zur obigem Code eingebaut, so dass der Watchdog > regelmäßig zurückgesetzt wird: > </b><asm> > 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 > </asm> > die relevante hex Zeile: > > :201EB600EC00E6000000EC02E6020200EC06EC07DA0024D0F3F296F8EA20F01EF3F488F7BC > > <b> > 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): > </b><asm> > $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 > </asm> > <b> > b) Korrespondierender C2-Code: > </b> <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); > } > </code> <b> > c) und Anwendung in der Applikation: > </b><code> > { > // 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); > } > </code> <b> > d) kleine Testroutine: > </b> <code> > // 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 > } > </code> <b> > e) theoretisch müßte sich der Watchdog mit der system.unhook() Funktion auch wieder "deaktivieren" > lassen - das habe ich aber nicht versucht > </b> > > 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.