Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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: