Subversion Repositories MK-Marlin

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ron 1
/**
2
 * Marlin 3D Printer Firmware
3
 * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
 *
5
 * Based on Sprinter and grbl.
6
 * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
 *
21
 */
22
 
23
#include "Marlin.h"
24
 
25
#if ENABLED(USE_WATCHDOG)
26
 
27
#include "watchdog.h"
28
 
29
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
30
void watchdog_init() {
31
  #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
32
    #define WDTO_NS WDTO_8S
33
  #else
34
    #define WDTO_NS WDTO_4S
35
  #endif
36
  #if ENABLED(WATCHDOG_RESET_MANUAL)
37
    // We enable the watchdog timer, but only for the interrupt.
38
    // Take care, as this requires the correct order of operation, with interrupts disabled.
39
    // See the datasheet of any AVR chip for details.
40
    wdt_reset();
41
    cli();
42
    _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
43
    _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
44
                                                                              // So worked for up to WDTO_2S
45
    sei();
46
    wdt_reset();
47
  #else
48
    wdt_enable(WDTO_NS); // The function handles the upper bit correct.
49
  #endif
50
  //delay(10000); // test it!
51
}
52
 
53
//===========================================================================
54
//=================================== ISR ===================================
55
//===========================================================================
56
 
57
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
58
#if ENABLED(WATCHDOG_RESET_MANUAL)
59
  ISR(WDT_vect) {
60
    sei();  // With the interrupt driven serial we need to allow interrupts.
61
    SERIAL_ERROR_START();
62
    SERIAL_ERRORLNPGM("Watchdog barked, please turn off the printer.");
63
    kill(PSTR("ERR:Watchdog")); //kill blocks //up to 16 characters so it fits on a 16x2 display
64
    while (1); //wait for user or serial reset
65
  }
66
#endif // WATCHDOG_RESET_MANUAL
67
 
68
#endif // USE_WATCHDOG