Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Für alle die den eingebauten Watchdog nutzen möchten. Kategorie: Programmierung Assembler (von Ernst H. - 1.01.2011 2:45)
Als Antwort auf Für alle die den eingebauten Watchdog nutzen möchten. von Jo - 31.12.2010 14:56
Ich nutze:
CC-Pro 128 Application Board, Pro-Bot128

   ' Fertiges Program   -  einfach kopieren und Starten:
   ' interner Watchdog von Jo nun in Basic verwenden:
   ' die $Asm.... am Anfang definieren
   ' dann im Programm ....WatchDog_Reset( )... einfügen    
   ' im unteren Programm wird nur bis 800ms angezeigt, dann erfolgt Reset
   ' (USB Kabel abstecken sonst kein Neustart)

'//  Valid values for WatchDog_On
$Asm("tag_WDT_on") WatchDog_On(prescalar As Byte)

'// Needs to be called before time which is defined
'by WatchDog_On( prescalar) has run off.
'void WatchDog_Reset
$Asm("tag_WDT_reset")WatchDog_Reset()

'// Turn Watch Dog off
'void WatchDog_Off
$Asm("tag_WDT_off")WatchDog_Off()

Dim Laufvari As Integer
Dim Text(20) As Char

Sub main()
LCD_Init()
LCD_Locate(1,1 )
LCD_WriteText("Reset Start  ")
AbsDelay(2000)

WatchDog_On(6)                            'Aktivieren ...
'Prescalar     Typical Timeout Value
'                 0    15 ms
'                 1    30 ms
'                 2    60 ms
'                 3   120 ms
'                 4   240 ms
'                 5   0.5 sec
'                 6   1.0 sec
'                 7   2.0 sec
WatchDog_Reset( )

Do While (1)                    'EndlosSchleife Start
WatchDog_Reset( )
AbsDelay(400)
LCD_Locate(1,1 )
LCD_WriteText("Vz 400ms   ")


WatchDog_Reset( )
AbsDelay(800)
LCD_Locate(1,1 )
LCD_WriteText("Vz 800ms   ")


WatchDog_Reset( )
AbsDelay(1800)
LCD_Locate(1,1 )
LCD_WriteText("Vz 1,8s    " )

WatchDog_Reset( )
AbsDelay(2200)
LCD_Locate(1,1 )
LCD_WriteText("Vz 2,2s    " )

End While   'Rücksprung zur Hauptprogrammschleife
End Sub

/*        unteres File als Watchdog.asm speichern und im Projekt hinzufügen
;  Achtung  das Hochkomma bei   "<<"  entfernen  (8x)
;*******************************************************************************
;* File: Watchdog.asm
;* Author  : M. Benninger
;* Ident   : Rev 1 30-DEC-2008
;* Function: Watchdog Timer Functions
;*           This module implements three functions:
;*           WDT_on (prescalar), WDT_off () and WDT_reset ()
;*           The parameter prescalar determine the Watchdog Timer prescaling
;*           when the Watchdog Timer is enabled. The different prescaling values
;*           and their corresponding Timeout Periods are shown below:
;*              Prescalar        Typical Timeout Value
;*                  0                   15 ms
;*                  1                   30 ms
;*                  2                   60 ms
;*                  3                  120 ms
;*                  4                  240 ms
;*                  5                  0.5 sec
;*                  6                  1.0 sec
;*                  7                  2.0 sec
;*
;* Library:  none
;*
;* History : Rev 1 30-DEC-2008 M. Benninger
;*                 - first implementation
;*         Rev.1.1 29.12.2010 Joachim Kühnapfel (Jo)
;*              - WTD_off: rettrn und wiederherstellen von R16 und R17 wie im
;*                 wie im Forum diskutiert / beschrieben
;*              - .ifdef tag_xxx / .endif hinzugefügt gemäÃ? Vorgaben aus
;*                   Beispiel der C-Control Hilfe
;*              - rename
;*                     WDT_on       -> WatchDog_On
;*                     WDT_off      -> WatchDog_Off
;*                     WDT_reset    -> WatchDog_Reset
;*          Rev.1.2 1-1-2011  Ernst H.  bei ldi ... "<<" sonst falsche Darstellung.." entfernen!
;*
;************************************************************************

;**** Watchdog Timer Definitions ****

.equ WDTCR = $21               ; Watchdog Timer Control Register
.equ WDCE  = 4                 ; WDT Change Enable bit
.equ WDE   = 3                 ; WDT Enable bit
.equ WDPM  = 7                 ; WDT Prescalar mask

.ifdef tag_WDT_reset
WatchDog_Reset:                          ; Reset Watchdog Timer
    wdr
    ret
.endif


.ifdef tag_WDT_on
WatchDog_On:                        ; Enable Watchdog Timer
    movw    r26, r6                 ; r7:r6 points to ret_addr
    adiw    r26, 4                  ; X now points to prescalar parameter
    ld      r16, x                  ; get prescalar parameter
    andi    r16, WDPM               ; and mask lower 3 bits
    ori     r16, (1"<<"WDE)           ; turn on WDE bit ... das Hochkomma entfernen!
    ldi     r17, (1"<<"WDCE)|(1"<<"WDE) ; Write logical one to WDCE and WDE
    out     WDTCR, r17              ; enable write to WDT control register
    out     WDTCR, r16              ; write WDT control register
    ret
.endif


.ifdef tag_WDT_off
WatchDog_Off:
    push    R16
    push    R17
                                    ; Disable Watchdog Timer
    in      r16, WDTCR              ; get WDT control register
    ori     r16, (1"<<"WDCE)|(1"<<"WDE) ; enable write to WDT control register
    out WDTCR, r16                  ; write WDT control register
    ldi     r16, (0"<<"WDE)           ; turn off WDE bit
    out WDTCR, r16                  ; write WDT control register
    pop     R17
    pop     R16
    ret
.endif

;* End of Watchdog.asm -- Watchdog Timer Functions für ATmega128
;**************************************************************************
*/  'Ende Basic


    Antwort schreiben


Antworten:

Re: Für alle die den eingebauten Watchdog nutzen möchten. (von Christian - 1.01.2011 17:08)
    Re: Für alle die den eingebauten Watchdog nutzen möchten. (von Joerg - 1.01.2011 19:38)
        Re: Für alle die den eingebauten Watchdog nutzen möchten. (von Ernst H. - 2.01.2011 16:59)