Μέχρι στιγμής όλα τα προγράμματα που αφορούν τις διακοπές, γράφτηκαν σε γλώσσα Assembly. Σε αυτή την ενότητα θα δείξουμε πώς να προγραμματίζουμε τις διακοπές του AVR στη γλώσσα C. Στη C δεν υπάρχει εντολή που να διαχειρίζεται τις διακοπές. Στο Atmel Studio, τα επόμενα έχουν προστεθεί για τη διαχείριση των διακοπών.1) Interrupt include file: θα […]
15. Διακοπές με αλλαγή κατάστασης πιν – προτεραιότητα
Στον ATmega328 σε κάθε πόρτα υπάρχει μια διακοπή αλλαγής κατάστασης των πινς. Όταν η διακοπή αλλαγής κατάστασης της πόρτας είναι ενεργοποιημένη, κάθε αλλαγή στις καταστάσεις των πινς οδηγούν στη δημιουργία μιας διακοπής. Δες την ακόλουθη εικόνα. Ο καταχωρητής PCICR περιέχει τα bits ενεργοποίησης για τις πόρτες. Για κάθε PCINT πιν της κάθε πόρτας ορίζεται και […]
14. Προγραμματίζοντας με τις εξωτερικές διακοπές
Ο αριθμός των εξωτερικών διακοπών μεταβάλλεται από τον ένα στον άλλο τύπο AVR. Ο ATmega328 έχει δυο εξωτερικές διακοπές: πιν PD2 (PORTD.2) και πιν PD3 (PORTD.3) που ονομάζονται σαν ΙΝΤ0 και ΙΝΤ1 αντίστοιχα. Όταν συμβεί μια διακοπή σε αυτά τα πινς ο AVR διακόπτεται ότι κι αν κάνει και μεταβαίνει στο vector table για να […]
13. Σημαία σύγκρισης OCF και διακοπές
Μερικές φορές χρειάζεται να εκτελεστεί μια εργασία περιοδικά, όπως στα παραδείγματα των προηγούμενων ενοτήτων. Αυτά τα προγράμματα μπορούν να γραφούν χρησιμοποιώντας CTC mode και με τη χρήση της αντίστοιχης διακοπής. Για να το κάνουμε, θα πρέπει να φορτώσουμε τον καταχωρητή OCF με την κατάλληλη τιμή και να διαμορφώνουμε τον timer στην CTC mode. Έτσι όταν […]
12. Προγραμματίζοντας με τις διακοπές των timers
Στην προηγούμενη ενότητα μάθαμε πώς να χρησιμοποιούμε τους Timers 0, 1 και 2 με την μέθοδο της δειγματοληψίας. Σε αυτή την ενότητα θα χρησιμοποιήσουμε τις διακοπές για να προγραμματίσουμε τους AVR timers. Σημαία υπερχείλισης και διακοπές Στην προηγούμενη ενότητα μάθαμε ότι η σημαία υπερχείλισης τίθεται σε 1 όταν ο Timer μεταβαίνει από την μέγιστη τιμή […]
11. Η έννοια της διακοπής στους AVR
Σε αυτή την ενότητα, πρώτα θα εξετάσουμε την διαφορά μεταξύ δειγματοληψιών και διακοπών και στη συνέχεια θα εξετάσουμε τις διακοπές του AVR. Διακοπές έναντι δειγματοληψιών Ένας μικροελεγκτής μπορεί να εξυπηρετήσει πολλαπλές συσκευές. Υπάρχουν δυο τρόποι που μπορεί να γίνει αυτό: με διακοπές και με δειγματοληψίες. Στη μέθοδο των διακοπών, όποτε μια συσκευή χρειάζεται εξυπηρέτηση, η […]
10. Προγραμματίζοντας τους timers σε C
Όπως έχουμε δει, οι γενικού σκοπού καταχωρητές του AVR είναι στον έλεγχο του C compiler και δεν έχουμε άμεση πρόσβασή σε αυτούς με τις εντολές της C. Μπορούμε όμως, να έχουμε πρόσβαση σε όλους τους SFRs (Special Function Registers) άμεσα χρησιμοποιώντας τις εντολές της C. Στη γλώσσα C μπορούμε να έχουμε πρόσβαση στους καταχωρητές του […]
9. Counter programming
Στην προηγούμενη ενότητα χρησιμοποιήσαμε τους timers του AVR για να παράγουμε χρονικές καθυστερήσεις. Ο AVR timer μπορεί να χρησιμοποιηθεί για να μετρήσει, να αναγνωρίσει και να απαριθμήσει τα γεγονότα που δημιουργούνται εξωτερικά του AVR. Η χρήση του timer σαν απαριθμητή γεγονότων παρουσιάζεται σε αυτή την ενότητα. Όταν ο timer χρησιμοποιείται σαν timer ο ταλαντωτής του […]
8. Πρόσβαση στους 16bit καταχωρητές
Ο AVR είναι ένας 8bit μικροελεγκτής που σημαίνει ότι μπορεί να χειρίζεται δεδομένα μεγέθους 8bit κάθε φορά. Όμως μερικοί καταχωρητές του Timer1 όπως οι TCNT1, OCR1A, ICR1 κ.τ.λ. είναι μεγέθους 16bit. Σε αυτή την περίπτωση οι καταχωρητές διαχωρίζονται σε δυο 8bit καταχωρητές και κάθε ένας προσπελαύνεται ανεξάρτητα. Αυτό είναι εντάξει στις περισσότερες περιπτώσεις. Για παράδειγμα […]
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. Η σημαία […]
6. Προγραμματίζοντας τον Timer2
Όπως φαίνεται στο ακόλουθο σχήμα ο Timer2 είναι ένας 8-bit timer. Επομένως δουλεύει όπως ο Timer0. Υπάρχουν τρεις διαφορές μεταξύ των Timer0 και Timer2: 1] O Timer2 μπορεί να χρησιμοποιηθεί σαν απαριθμητής πραγματικού χρόνου. Για να γίνει αυτό θα πρέπει να συνδέσουμε ένα κρύσταλλο συχνότητας 32,768kHz στους ακροδέκτες TOSC1 και TOSC2 του μικροελεγκτή AVR και […]
5. Compare match CTC mode programming
Σε αυτή την ενότητα θα μάθουμε για τον καταχωρητή OCR0A, ο οποίος συνοδεύει τον Timer0. Ο OCR0A καταχωρητής χρησιμοποιείται στην κατάσταση λειτουργίας CTC. Όπως στην κατάσταση λειτουργίας Normal έτσι και στην κατάσταση CTC o timer αυξάνει με τους κύκλους ρολογιού. Στη λειτουργία CTC ο timer απαριθμεί προς τα πάνω μέχρι η τιμή του TCNT0 να […]
4. Δημιουργώντας μεγάλες χρονικές καθυστερήσεις
Όπως έχουμε δει στα παραδείγματα των προηγούμενων ενοτήτων, το μέγεθος της χρονικής καθυστέρησης που παράγεται, εξαρτάται από δυο παράγοντες: την συχνότητα του εσωτερικού κρυσταλλικού ταλαντωτή και την τιμή του 8bit TCNT0 καταχωρητή. Μέγιστη χρονική καθυστέρηση έχουμε όταν ο καταχωρητής TCNT0 έχει τιμή μηδέν. Τι γίνεται όμως εάν αυτό δεν είναι αρκετό; Μπορούμε να κάνουμε την […]
3. Δημιουργία χρονικών καθυστερήσεων με timer
Μπορούμε να αναπτύξουμε μια μέθοδο για την δημιουργία και υπολογισμό χρονικών καθυστερήσεων με χρήση timer στην κατάσταση λειτουργίας Normal και χρησιμοποιώντας τον εσωτερικό κρυσταλλικό ταλαντωτή με συχνότητα XTAL=16MHz Σύμφωνα με τη μέθοδο φορτώνουμε τον TCNT0 με αρχική τιμή την (0xFF – XX + 1) στο δεκαεξαδικό, έτσι ώστε να είναι (0xFF – XX + 1) […]
2. Προγραμματισμός του χρονιστή Timer0
Ο Timer0 είναι ένας 8-bit χρονιστής στον ATmega328, επομένως και ο καταχωρητής TCNT0 είναι 8-bit όπως φαίνεται στο ακόλουθο σχήμα: TCCR0A και TCCR0B (Timer / Counter Control Register) Οι TCCR0A και TCCR0B είναι 8bit καταχωρητές που χρησιμοποιούνται για τον έλεγχο του Timer0. Τα bits για τους TCCR0A και TCCR0B φαίνονται στα ακόλουθα σχήματα. CS02:CS00 (Timer0 […]
1. Προγραμματίζοντας τους Timers των AVRs
Σε πολλές εφαρμογές θέλουμε να απαριθμούμε γεγονότα ή να παράγουμε χρονικές καθυστερήσεις. Ένας τρόπος που μπορούμε να το κάνουμε είναι με τη χρήση μικροελεγκτών. Όταν θέλουμε να απαριθμούμε παλμούς (γεγονότα), συνδέουμε την εξωτερική πηγή παλμών στον ακροδέκτη ρολογιού του counter καταχωρητή που υπάρχει μέσα στον μικροελεγκτή. Έτσι με κάθε παλμό αυξάνονται τα περιεχόμενα του counter […]