#define RELEASE 1 void InitWatchdog(void) { BYTE bPCLK; // Watchdog in Abhaengigkeit des Peripherietaktes iniitialisieren bPCLK = PRJ_PCLK; if(bPCLK == PRJ_VPBDIV_4) { // pclk = 15Mhz WDTC = 0x8000000; // 30 Sekunden } if(bPCLK == PRJ_VPBDIV_2) { // pclk = 30Mhz // WDTC = 0x10000000; // 30 Sekunden WDTC = 0x8000000; // 18 Sekunden } if(bPCLK == PRJ_VPBDIV_1) { // pclk = 60Mhz WDTC = 0x20000000; // 30 Sekunden } // Moderegister setzen Release/Debug Version #ifdef RELEASE WDMOD = 0x03; // Watchdot Interrupt + Watchdog Reset #endif // Interruptcontroller VICIntSelect = 0; // IRQ select // Interruptservicefunktion ist implementiert Watchdog-Interrupt disabled // VICIntEnable = VICIntEnable | 0x01; // Enable Watchdog Interrupt VICVectCntl4 = 0x20; // use it for Watchdog Interrupt VICVectAddr4 = (unsigned long)IsrWatchdog; // set interrupt vector } /** Funktion StartWatchdog - Start Watchdog, Watchdog sollte nur in der Release Version * aktiviert werden (Debug sonst nicht moeglich -> permanentes Ausloesen * Wtchdog) * * \param - keine * * \return - Fehlercode */ void StartWatchdog(void) { WDFEED = 0xAA; WDFEED = 0x55; } /** Funktion FeedWatchdog - Funktion muss periodisch aufgerufen werden um den Watchdog * rueckzusetzen * * \param - keine * * \return - keine */ void FeedWatchdog(void) { LONG lI; LONG lCount; lCount = 0; // Mit Verzoegerung wird ein "ungewollter" Watchdog Reset in wesentlich groesseren // Abstaenden ausgeloest for (lI = 0; lI < 0x3FFFF; lI++) { lCount++; } VICIntEnClr = 0x000002B0; // disable I2c/Timer0/1/UART1 Interrupt WDFEED = 0xAA; WDFEED = 0x55; VICIntEnable = 0x000002B0; // enable I2C/Timer0/1/UART1 Interrupt } void main(void) { Initialisierungsteil InitWatchdog(); StartWatchdog(); // Es folgen Initialisierungsfunktionen fuer Timer, I2C, UART // ... // Hauptschleife while(1) { // Projektfunktionen laufen hier // ... // ... // am Ende wird der Watchdog rueckgesetzt FeedWatchdog(); }