WDT
Χρησιμοποιείτε ο compiler της CCS και ο μικροελεγκτής 18F2550 που οι λειτουργίες του είναι παρόμοιες με τους 18F2455, 18F4455, 18F4550.
Και ξεκινάμε με τον watch dog timer, αυτός χρησιμοποιείτε για να ελέγχει αν ο μ/ε έχει κολλήσει (δεν τρέχει το πρόγραμμά) και αν διαπιστώση κάτι τέτοιο του κάνει reset.
Μέσα στον μ/ε υπάρχει ένας ταλαντωτής RC δικτυώματος (εκτός του βασικού κρυστάλου) στα 32Khz αυτός οδηγείτε σε έναν counter 7 bit και μετά σε έναν postscaler των 16 bit με 4 bit για το έλεγχό του, και έτσι μας δίνει έναν χρόνο από 4mS με τον postscaler :1 ((1/32000)*128=4mS) μέχρι και 2,18λεπτά (((1/3200)*128)*32768=2,18 λεπτά),
Οι επιλογές που έχουμε για την ρύθμιση του χρόνου γίνονται από τον διαιρέτη των 4 bit (WDTPS0….WDTPS3).
:1=4mS
:2=8mS
:4=16mS
:8= 32mS
:16=64mS
:32=128mS
:64=256mS
:128=512mS
:256=1024mS
:512=2048mS
:1024=4096mS
:2048=8192mS
:4096=16384mS
:8192=32768mS
:16384=65536mS
:32768=131072mS ή 2,18 λεπτά .
Λίγο ποιο συγκεκριμένα τώρα ο wdt από την στιγμή που θα ενεργοποιηθεί τρέχει συνέχεια και ανεξάρτητα από το βασικό ρολόι.
Αν τώρα εμείς τον έχουμε να ελέγχει ανά 1024mS και δεν τον μηδενίσουμε μέσα σε αυτό το διάστημα τότε ο pic θα κάνει reset.
#include <18F2550.h>
#FUSES NOWDT, WDT256, INTRC_IO //έλεγχος on/off από το software, :258
#use delay(clock=4M,restart_wdt)
void main (void)
{
setup_oscillator(OSC_4MHZ);
setup_wdt(WDT_ON); // τον ενεργοποιούμε
output_low(pin_a0); //κάνουμε 0 το πιν Α0
delay_ms(1000); //1sec delay
output_high(pin_a0); // κάνουμε 1 το pin A0 και περιμένουμε να κάνει reset
}
στο παραπάνω παράδειγμα ο postscaler από τον wdt είναι στο :256 και έτσι θα κάνει reset ανά ~1sec,
συν τα 1000mS από την delay θα μας δώσει στο πιν Α0 μια συχνότητα 0,5hz.
To tip με το παραπάνω είναι πως αν δεν ορίσουμε στον compiler να κάνει restart τον wdt κατά την διάρκεια της delay ρουτίνας και ξεπεράσουμε τον χρόνο (πχ. βάζαμε για delay 1025mS), τότε θα έκανε συνέχεια reset.
Για να το ξεπεράσουμε αυτό ορίζουμε στο compiler να κάνει αυτός restart τον wdt σε ρουτίνες όπως delay, rs232, i2c ….
στο παραπάνω παράδειγμα αυτό επιτυγχάνεται με την χρήση του restart_wdt στις παραμέτρους της use_delay()
Στα underline ο compiler κάνει reset τον wdt κατά την έξοδο από την delay ρουτίνα και χωρίς την χρήση των extra παραμέτρων (restart_wdt).