7. Προγραμματίζοντας τον Timer1

O Timer1 είναι ένας 16-bit χρονιστής ο οποίος έχει πολλές δυνατότητες. Επειδή ο Timer1 είναι 16bit o καταχωρητής TCNT1 μεγέθους 16bit αποτελείται από δυο bytes. Αυτά αναφέρονται σαν TCNT1L (Timer low byte) και TCNT1H (Timer high byte). Ο Timer1 έχει τρεις καταχωρητές ελέγχου που ονομάζονται TCCR1A (Timer/counter 1 control register), TCCR1B και TCCR1C. Η σημαία TOV1 (timer overflow) τίθεται σε 1 όταν συμβεί υπερχείλιση. Ο Timer1 έχει δυνατότητα διαίρεσης του σήματος ρολογιού (prescaler) κατά 1:1, 1:8, 1:64, 1:256 και 1:1024. Σε αυτόν τον timer υπάρχουν δυο OCR καταχωρητές οι OCR1A και OCR1B. Επίσης, υπάρχουν δυο ξεχωριστές σημαίες (οι OCF1A και OCF1B) για κάθε ένα OCR καταχωρητή οι οποίες είναι ανεξάρτητες μεταξύ τους.

Όταν ο TCNT1 γίνει ίσος με τον OCR1A η σημαία OCF1A θα τεθεί σε 1 στον επόμενο κύκλο ρολογιού. Παρόμοια όταν ο TCNT1 γίνει ίσος με τον OCR1B η σημαία OCF1B θα τεθεί σε 1 στον επόμενο κύκλο ρολογιού. Επειδή ο Timer1 είναι 16bit οι καταχωρητές OCR1Α και OCR1B είναι μεγέθους 16bit και γι’ αυτό το λόγο αποτελούνται από δυο 8bit καταχωρητές ο καθένας. Για παράδειγμα ο OCR1A αποτελείται από τον OCR1AH (OCR1A high byte) και OCR1AL (OCR1A low byte). Ο καταχωρητής TIFR1 περιέχει τις σημαίες: TOV1, OCF1A και OCF1B

Υπάρχει επίσης ένας βοηθητικός καταχωρητής ο ICR1, ο οποίος είναι μεγέθους 16bit και αποτελείται από τους ICR1H και ICR1L

WGM13:10

Τα bits WGM13, WGM12, WGM11 και WGM10 ορίζουν την κατάσταση λειτουργίας του Timer1 όπως φαίνεται στο σχήμα. Ο Timer1 έχει 16 διαφορετικούς τρόπους λειτουργίας. Σε αυτή την ενότητα θα καλύψουμε την mode 0 (Normal mode) και την mode 4 (CTC mode). Οι υπόλοιπες καταστάσεις θα αναφερθούν σε άλλα κεφάλαια.

Καταστάσεις λειτουργίας του Timer1

Normal mode (WGM13:10=0000)

Σε αυτή τη λειτουργία ο timer απαριθμεί προς τα πάνω μέχρι να φτάσει στην τιμή $FFFF (η οποία είναι η μέγιστη δυνατή) και μετά κυλίεται από $FFFF στο 0000. Καθώς ο timer μεταβαίνει από την τιμή $FFFF στη 0000 η σημαία TOV1 γίνεται 1.

CTC mode (WGM13:10=0100)

Στη λειτουργία mode 4 o timer απαριθμεί προς τα πάνω μέχρι η τιμή του TCNT1 καταχωρητή γίνει ίση με την τιμή του OCR1A (compare match occurs), στη συνέχεια ο timer μηδενίζεται με τον επόμενο κύκλο ρολογιού και η σημαία OCF1A τίθεται σε 1.

Παράδειγμα: Βρες τις τιμές για τους TCCR1A και TCCR1B εάν θέλουμε να προγραμματίσουμε τον Timer1 σε mode 0 (Normal) χωρίς διαίρεση (no prescaler). Χρησιμοποίησε τον κρυσταλλικό ταλαντωτή σαν σήμα ρολογιού.

Απάντηση: TCCR1A = 0000 0000 που ορίζεται από WGM11=0, WGM10=0,
TCCR1B=0000 0001 που ορίζεται από WGM13=0 , WGM12=0 με CS12 = CS11 = 0 και CS10 = 1
με σήμα του εσωτερικού ταλαντωτή σαν κύκλους ρολογιού και no prescaler.

Παράδειγμα: Βρες τη συχνότητα του τετραγωνικού σήματος που παράγεται από το ακόλουθο πρόγραμμα εάν XTAL=16MHz. Στους υπολογισμούς σας μην λάβετε τις καθυστερήσεις των συνοδευτικών εντολών.

        INITSTACK
        LDI R16, 0x20
        SBI DDRB, 5  ;  PB5 as an output
        LDI R17, 0
        OUT PORTB, R17 ; PB5 = 0
BEGIN:  RCALL DELAY
        EOR R17, R16   ; toggle D5 of R17
        OUT PORTB, R17 ; toggle PB5
        RJMP BEGIN
;----------Timer1 delay
DELAY:  LDI R20, 0xD8
        STS TCNT1H, R20  ; TCNT1H = 0xD8
        LDI R20, 0xF0
        STS TCNT1L, R20  ; TCNT1L = 0xF0
        LDI R20, 0x00
        STS TCCR1A, R20  ; WGM11:10 = 00
        LDI R20, 0x01
        STS TCCR1B, R20  ; WGM13:12 = 00, Normal mode, Prescaler = 1
AGAIN:  SBIS TIFR1, TOV1 ; if TOV1 is set skip next instruction
        RJMP AGAIN
        LDI R20, 0x00
        STS TCCR1B, R20  ;  stop Timer1
        LDI R20, 0x04
        OUT TIFR1, R20   ; clear TOV1 flag
        RET

Απάντηση: WGM13:00 = 0000 = 0x00 έτσι ο Timer1 λειτουργεί στη κατάσταση mode 0 (Normal) και η κορυφή είναι 0xFFFF
FFFF+1-D8F0=0x2710=10.000 κύκλοι που σημαίνει ότι παίρνει χρόνο ίσο με 10.000 κύκλους ρολογιού. Επειδή XTAL = 16ΜΗz κάθε κύκλος ρολογιού διαρκεί 1/16ΜHz=0,0625μs και καθυστέρηση 10.000 x 0,0625μs = 625μs = 0,625ms και συχνότητα 1/(0,625ms X 2) = 800Hz Σε αυτό τον υπολογισμό οι καθυστερήσεις των συνοδευτικών εντολών του βρόγχου δεν λαμβάνονται υπόψη.

Σημείωση: αντί να χρησιμοποιούμε δεκαεξαδικούς αριθμούς μπορούμε να χρησιμοποιήσουμε τις directives HIGH και LOW, όπως δείχνεται παρακάτω:

    LDI  R20, HIGH (65536-10000)  ;  load Timer1 high byte
    STS  TCNT1H, R20              ;  TCNT1H = 0xD8
    LDI  R20, LOW (65536-10000)   ;  load Timer1 low byte
    STS  TCNT1L, R20              ;  TCNT1L = 0xF0

Ή μπορούμε να γράψουμε πιο απλά ως εξής

    LDI  R20, HIGH (-10000)             ; load Timer1 high byte
    STS  TCNT1H, R20                    ; TCNT1H = 0xD8  
    LDI  R20, LOW (-10000)              ; load Timer1 low byte 
    STS  TCNT1L, R20                    ; TCNT1L = 0xF0 

Παράδειγμα: Βρες τις τιμές για τους TCCR1A και TCCR1B εάν θέλουμε να προγραμματίσουμε τον Timer1 στη λειτουργία mode 4 (CTC, Top=OCR1A) no prescaler. Χρησιμοποίησε το σήμα του κρυσταλλικού ταλαντωτή σαν ρολόι.

Απάντηση: TCCR1A=0000 0000  που ορίζεται από WGM11=0, WGM10=0
TCCR1B=00001001 που ορίζεται από WGM13=0 , WGM12=1, με CS12 = CS11 = 0 και CS10 = 1
με σήμα του εσωτερικού ταλαντωτή σαν ρολόι, no prescaler.

Παράδειγμα: Βρες τη συχνότητα του τετραγωνικού σήματος που παράγεται με το ακόλουθο πρόγραμμα, εάν XTAL=16MHz. Στους υπολογισμούς σας μην λάβετε υπόψη τις καθυστερήσεις των συνοδευτικών εντολών του βρόγχου.

            SBI  DDRB, 5    ; PB5 as an output
BEGIN:      SBI  PORTB, 5   ; PB5 = 1
            RCALL DELAY
            CBI  PORTB, 5   ; PB5 = 0
            RCALL DELAY
            RJMP BEGIN
;---------- Timer1 delay
DELAY:      LDI  R20, 0x00
            STS  TCNT1H, R20
            STS  TCNT1L, R20  ; TCNT1 = 0
            LDI  R20, 0
            STS  OCR1AH, R20
            LDI  R20, 159
            STS  OCR1AL, R20   ; OCR1A = 159 = 0x9F
            LDI  R20, 0x00
            STS  TCCR1A, R20   ; WGM11:10 = 00
            LDI  R20, 0x09
            STS  TCCR1B, R20    ; WGM13:12 = 01, CTC mode, prescaler = 1
AGAIN:      SBIS  TIFR1, OCF1A  ; if OCF1a is set skip next instruction
            RJMP  AGAIN
            LDI  R20, 1<<OCF1A
            OUT  TIFR1, R20     ; clear OCF1A flag
            LDI  R19, 0
            STS  TCCR1B, R19    ;  stop timer
            STS  TCCR1A, R19
            RET    

Απάντηση: WGM13:00=0100=0x04. Δηλαδή ο Timer είναι σε λειτουργία mode 4 δηλαδή CTC με μέγιστη τιμή του Timer αυτή που ορίζεται από τον OCR1A δηλαδή 159+1=160 κύκλους ρολογιού
XTAL=16MHz που σημαίνει ότι κάθε κύκλος ρολογιού διαρκεί 1/16ΜΗz=0,0625μs
Delay = 160 X 0,0625μs=10μs και συχνότητα ίση με 1/(10μs X 2)=50kHz. Σε αυτούς τους υπολογισμούς οι καθυστερήσεις των συνοδευτικών εντολών μέσα στο βρόγχο δεν λαμβάνονται υπόψη.