_files/blank_1.gif)
Specification of the timer (TMR0) - Το
εσωτερικό του χρονομετρητή (TMR0)
_files/pic2231e.gif)
Στην επάνω εικόνα φαίνεται το
διάγραμμα του χρονομετρητή (TMR0) και του επιτηρητή (WDT - watchdog
timer).
Ο προδιαιρέτης (prescaler)
χρησιμοποιείται για τον TMR0
και τον WDT. Στο επάνω σχέδιο φαίνεται ο προδιαιρέτης σε χρήση με τον
TMR0. Η επιλογή για το αν ο προδιαιρέτης (prescaler) θα χρησιμοποιηθεί για
τον χρονομετρητή (TMR0) ή τον επιτηρητή (WDT) γίνεται από το bit PSA
του καταχωρητή OPTION_REG.
Ο προδιαιρέτης είναι ένας προγραμματιζόμενος ειδικός καταχωρητής του
οποίου η τιμή καθορίζεται από τα bit PS0,
PS1, PS2 του OPTION_REG.
Ο χρονομετρητής TMR0 είναι ένας δυαδικός μετρητής των οκτώ bit (8 bit
binary counter) και μπορεί να μετρήσει 256 αριθμούς ( από 0 έως 255). Όταν
ο TMR0
υπερχειλίσει, δηλαδή από 255(FFh) γίνει 0(00h) δημιουργείται παλμός
διακοπής (Interrupt) και το T0IF
του καταχωρητή INTCON
γίνεται "1" . Όταν δημιουργηθεί ο παλμός διακοπής (Interrupt) ο μετρητής
προγράμματος ( PC - program counter) παίρνει την τιμή 0004h και το
πρόγραμμα συνεχίζει να εκτελείται από αυτή την διεύθυνση. Για να ισχύσει η
παραπάνω λειτουργία πρέπει τα bit GIE
και T0IE
του καταχωρητή INTCON
να έχουν την τιμή "1". Επειδή μερικές φορές οι 256 αριθμοί που μπορεί να μετρήσει ο χρονομετρητής TMR0 είναι λίγοι, τότε
χρησιμοποιείται ο προδιαιρέτης (prescaler). Δείτε το
παρακάτω παράδειγμα για να καταλάβετε. Έστω ότι συνδέετε στα
ποδαράκια OSC1 & OSC2 ένα κρύσταλλο 4MHz, από τον τύπο 4/Fosc, δηλαδή
4/4 δίνει κύκλο μηχανής 1μsec ή 1000nsec άρα σε 256 κύκλους που
υπερχειλίζει ο TMR0 θα έχει περάσει χρόνος ίσος με 256 μsec, που μπροστά
στο δευτερόλεπτο (1000000 μsec) είναι πολύ μικρός χρόνος. Αν λοιπόν
χρειαζόσαστε περισσότερο χρόνο τότε πρέπει να χρησιμοποιήσετε τον
προδιαιρέτη (prescaler).
_files/pic2232.gif) Η τιμές που μπορεί να πάρει ο
προδιαιρέτης (prescaler) είναι συγκεκριμένες (2, 4, 8, 16, 32, 64, 128,
256). Έστω πως η τιμή του προδιαιρέτη είναι 2 τότε ο TMR0 θα αυξήσει το
περιεχόμενο του ανά 2 κύκλους μηχανής ενώ Αν ο προδιαιρέτης έχει τιμή 256
τότε ο TMR0 θα αυξήσει το περιεχόμενο του ανά 256 κύκλους μηχανής. Όσον
αφορά το παραπάνω παράδειγμα, με τιμή προδιαιρέτη 256, ο TMR0 θα
υπερχειλίσει μετά από 256μsec X 256 = 65535μsec ή 65,5msec ή
0,06sec.
Εκτός από τον εσωτερικό στον
μικροεπεξεργαστή ταλαντωτή για την οδήγηση του χρονομετρητή (TMR0), μπορεί
να χρησιμοποιηθεί και εξωτερική πηγή όπως ταλαντωτής R/C κ.λ.π. Για να
ενεργοποιηθεί η εξωτερική πηγή χρονισμού στο ποδαράκι RA4/T0CKI πρέπει το
bit TOCS
του καταχωρητή OPTION_REG
και το bit TRISA4 του καταχωρητή TRISA να πάρουν την τιμή "1". Η τιμή που
έχει το bit T0SE
του καταχωρητή OPTION_REG
καθορίζει αν το σήμα σκανδαλισμού για το χρονομετρητή (TMR0) θα είναι το
ανερχόμενο ή το κατερχόμενο μέτωπο του παλμού (the rising or falling of
the clock pulse). Για σκανδαλισμό στο ανερχόμενο μέτωπο το bit T0SE
πρέπει να έχει τιμή "0" ενώ για σκανδαλισμό στο κατερχόμενο μέτωπο πρέπει
να έχει την τιμή "1".
Ο επιτηρητής (WDT - watchdog timer) έχει δικό του
ξεχωριστό ταλαντωτή, και υπερχειλίζει δίχως την χρήση προδιαιρέτη
(prescaler) κάθε 18msec.
_files/pic2233e.gif) Ο επιτηρητής (WDT) πρέπει να μηδενίζεται πριν υπερχειλίσει, μέσα
από το πρόγραμμα με την χρήση της εντολής "CLRWDT". Εάν περάσουν τα 18msec
και δεν μηδενιστεί τότε αναγκάζει τον μικροεπεξεργαστή να μηδενιστεί
(reset) και να ξεκινήσει την εκτέλεση του προγράμματος από την αρχή. Αν
χρειάζεται μεγαλύτερη διάρκεια πριν την υπερχείλιση
του επιτηρητή (WDT) μπορεί να χρησιμοποιηθεί ο προδιαιρέτης (prescaler).
Ο προδιαιρέτης (prescaler) που μεγαλώνει την διάρκεια του
επιτηρητή (WDT) μπορεί να πάρει τιμές (2, 4, 8, 16, 32, 64, 128). Προσέξτε ότι δεν μπορεί να πάρει την
τιμή 256. Με ανώτερη τιμή το 128
μπορεί να φτάσει χρόνο ίσο με 18msec x 128 = 2304msec ή 2,3sec. Η χρήση
του επιτηρητή είναι απαραίτητη όταν τυχόν δυσλειτουργίες του προγράμματος
μπορούν να προξενήσουν ζημιά ή καταστροφές. Για παράδειγμα αν ο
μικροεπεξεργαστής ελέγχει την λειτουργία ενός αερόθερμου και από λάθος
προγραμματισμό "κολλήσει", τότε μπορεί να υπάρξει σταμάτημα του
ανεμιστήρα, υπερθέρμανση στης αντίστασης, καταστροφή της ή και
πυρκαγιά.
Για να απενεργοποιηθεί ο επιτηρητής (WDT)
πρέπει το bit WDTE
της διαμόρφωσης
(configuration word)
(διεύθυνση μνήμης ram 2007h) του μικροεπεξεργαστή να δηλωθεί ως
"0".
Ο εσωτερικός κόσμος του
PIC16F84A(4)
|