TIMER 3
Έχει την ίδια λειτουργία με τον TIMER 1 (16bit με δυο tmr
register) αλλά για εξωτερικό clock ή oscillator χρησιμοποιεί τα πιν του timer 1
(T13CKI/T1OSO και T1OSI).
Για clock χρησιμοποιεί το T13CKI ενώ αν θέλουμε κρύσταλλο τα πιν T1OSI/T1OSO (που πρέπει να ενεργοποιήσουμε το εξωτερικό ρολόι από τον timer1).
Παράδειγμα 1:
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
#int_TIMER3
void TIMER3_isr(void)
{
output_toggle(PIN_A0);
}
void main()
{
setup_wdt(WDT_OFF);
setup_timer_3(T3_EXTERNAL_SYNC|T3_DIV_BY_1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);
while (1);
}
στο παραπάνω έχουμε ορίσει εξωτερικό clock με εσωτερικό συγχρονισμό στο πιν T13CKI (λόγω παλμών αν βάζαμε κρύσταλλο στα T1OSI/T1OSO θα γίνονταν T3_EXTERNAL),
αν λοιπόν δίναμε στο T13CKI 130khz σαν clock τότε ανά ένα δευτερόλεπτο θα είχαμε 130000 counts (δηλ. δυο overflow) άρα έναν παλμό στο πιν Α0 ενός hz.
Παράδειγμα 2:
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
#int_TIMER3
void TIMER3_isr(void)
{
output_toggle(PIN_A0);
set_timer3(60000);
}
void main()
{
setup_wdt(WDT_OFF);
setup_timer_3(T3_EXTERNAL_SYNC|T3_DIV_BY_1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);
output_high(pin_a0);
while (1);
}
το παραπάνω είναι ίδιο με το προηγούμενο αλλά κατά την πρώτη διακοπή βάζουμε τον timer να ξεκινάει το μέτρημα από τα 60000 counts,
και έτσι θα θέλει για να δημιουργηθεί η διακοπή 65535-60000=5535 counts (με τον prescaler ίσο με ένα).
Άρα με την συχνότητα των 130Khz σαν clock στο πιν Α0 θα βγεί,
στην αρχή ένα high για 500mS ενώ μετά θα ορίζεται αυτόματα (κατά την διακοπή) o tmr register και θα πάρουμε έναν παλμό περίπου στα 11Hz (130000/5535=23 overflow το δευτερόλεπτο). .
Για clock χρησιμοποιεί το T13CKI ενώ αν θέλουμε κρύσταλλο τα πιν T1OSI/T1OSO (που πρέπει να ενεργοποιήσουμε το εξωτερικό ρολόι από τον timer1).
Παράδειγμα 1:
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
#int_TIMER3
void TIMER3_isr(void)
{
output_toggle(PIN_A0);
}
void main()
{
setup_wdt(WDT_OFF);
setup_timer_3(T3_EXTERNAL_SYNC|T3_DIV_BY_1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);
while (1);
}
στο παραπάνω έχουμε ορίσει εξωτερικό clock με εσωτερικό συγχρονισμό στο πιν T13CKI (λόγω παλμών αν βάζαμε κρύσταλλο στα T1OSI/T1OSO θα γίνονταν T3_EXTERNAL),
αν λοιπόν δίναμε στο T13CKI 130khz σαν clock τότε ανά ένα δευτερόλεπτο θα είχαμε 130000 counts (δηλ. δυο overflow) άρα έναν παλμό στο πιν Α0 ενός hz.
Παράδειγμα 2:
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
#int_TIMER3
void TIMER3_isr(void)
{
output_toggle(PIN_A0);
set_timer3(60000);
}
void main()
{
setup_wdt(WDT_OFF);
setup_timer_3(T3_EXTERNAL_SYNC|T3_DIV_BY_1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);
output_high(pin_a0);
while (1);
}
το παραπάνω είναι ίδιο με το προηγούμενο αλλά κατά την πρώτη διακοπή βάζουμε τον timer να ξεκινάει το μέτρημα από τα 60000 counts,
και έτσι θα θέλει για να δημιουργηθεί η διακοπή 65535-60000=5535 counts (με τον prescaler ίσο με ένα).
Άρα με την συχνότητα των 130Khz σαν clock στο πιν Α0 θα βγεί,
στην αρχή ένα high για 500mS ενώ μετά θα ορίζεται αυτόματα (κατά την διακοπή) o tmr register και θα πάρουμε έναν παλμό περίπου στα 11Hz (130000/5535=23 overflow το δευτερόλεπτο). .