Σε αυτό το έργο πρόκειται να σχεδιάσουμε ένα απλό ξυπνητήρι χρησιμοποιώντας χρονοδιακόπτες ATMEGA32. Ο μικροελεγκτής ATmega32A διαθέτει χρονοδιακόπτη 16 bit και θα χρησιμοποιήσουμε αυτό το χρονόμετρο για να μετρήσουμε τα δευτερόλεπτα και να αναπτύξουμε ένα ψηφιακό ρολόι.
Όλα τα ψηφιακά ρολόγια έχουν κρύσταλλο μέσα τους, που είναι η καρδιά του ρολογιού. Αυτός ο κρύσταλλος δεν υπάρχει μόνο σε ρολόι αλλά και σε όλα τα συστήματα υπολογιστών σε πραγματικό χρόνο. Αυτό το κρύσταλλο παράγει παλμούς ρολογιού, κάτι που απαιτείται για υπολογισμούς χρονισμού. Αν και υπάρχουν μερικοί άλλοι τρόποι λήψης παλμών ρολογιού, αλλά για ακρίβεια και υψηλότερη συχνότητα προτιμούν οι περισσότεροι κρυσταλλικό ρολόι. Πρόκειται να συνδέσουμε έναν κρύσταλλο στο ATMEGA32 για να έχουμε ακριβές ρολόι.
Απαιτούμενα στοιχεία
Υλικό: Μικροελεγκτής ATmega32, κρύσταλλο 11,0592MHz, Πυκνωτής 22pF (2 τεμάχια), Τροφοδοσία (5v), ΠΡΟΓΡΑΜΜΑΤΟΣ AVR-ISP, JHD_162ALCD (LCD 16x2), πυκνωτής 100uF (συνδεδεμένος σε τροφοδοτικό), κουμπιά (τέσσερα κομμάτια), αντίσταση 10KΩ (έξι τεμάχια), χωρητικότητα 100nF r (τέσσερα κομμάτια), διακόπτες τριών ακίδων (2 τεμάχια), τρανζίστορ 2N2222, βομβητής, αντίσταση 200Ω
Λογισμικό: Atmel studio 6.1, progisp ή flash magic.
Διάγραμμα κυκλώματος και εξήγηση εργασίας
Για ακριβή χρονισμό, έχουμε συνδέσει ένα κρύσταλλο 11.0592MHz για ρολόι. Τώρα για την απενεργοποίηση του εσωτερικού ρολογιού του ATMEGA πρέπει να αλλάξουμε τα LOW FUSE BITS. Θυμηθείτε ότι δεν αγγίζουμε τα bit υψηλής ασφάλειας, έτσι ώστε η επικοινωνία JTAG να είναι ακόμα ενεργοποιημένη.
Για να πούμε στο ATMEGA να απενεργοποιήσει το εσωτερικό ρολόι και να εργαστεί σε εξωτερικό πρέπει να ρυθμίσουμε:
ΧΑΜΗΛΗ ΧΡΗΣΗ BYTE = 0xFF ή 0b11111111.
Στο κύκλωμα, το PORTB του ATMEGA32 είναι συνδεδεμένο με LCD θύρα δεδομένων. Εδώ πρέπει να θυμόμαστε να απενεργοποιήσουμε την επικοινωνία JTAG στο PORTC του ATMEGA αλλάζοντας τα bytes υψηλής ασφάλειας, εάν κάποιος θέλει να χρησιμοποιήσει το PORTC ως κανονική θύρα επικοινωνίας. Σε LCD 16x2 υπάρχουν 16 ακίδες πάνω από όλα αν υπάρχει μαύρο φως, αν δεν υπάρχει πίσω φως θα υπάρχουν 14 ακίδες. Κάποιος μπορεί να τροφοδοτήσει ή να αφήσει τις πίσω ακίδες. Τώρα στις 14 ακίδες υπάρχουν 8 ακίδες δεδομένων (7-14 ή D0-D7), 2 ακροδέκτες τροφοδοσίας (1 & 2 ή VSS & VDD ή gnd & + 5v), 3ος ακροδέκτης για έλεγχο αντίθεσης (VEE-ελέγχει πόσο παχύς πρέπει να είναι οι χαρακτήρες φαίνεται) και 3 ακίδες ελέγχου (RS & RW & E)
Στο κύκλωμα, μπορείτε να παρατηρήσετε ότι έχω πάρει μόνο δύο ακίδες ελέγχου. Αυτό δίνει την ευελιξία της καλύτερης κατανόησης, το bit αντίθεσης και το READ / WRITE δεν χρησιμοποιούνται συχνά, ώστε να μπορούν να βραχυκυκλωθούν στη γείωση. Αυτό θέτει την οθόνη LCD σε υψηλότερη αντίθεση και λειτουργία ανάγνωσης. Πρέπει απλώς να ελέγξουμε ENABLE και RS καρφίτσες για να στείλουμε ανάλογα χαρακτήρες και δεδομένα.
Οι συνδέσεις που γίνονται για LCD δίνονται παρακάτω:
PIN1 ή VSS στη γείωση
PIN2 ή VDD ή VCC σε ισχύ + 5v
PIN3 ή VEE στη γείωση (δίνει τη μέγιστη αντίθεση καλύτερα για έναν αρχάριο)
PIN4 ή RS (Επιλογή καταχώρησης) στο PD6 του uC
Το PIN5 ή το RW (Ανάγνωση / Εγγραφή) στη γείωση (θέτει την οθόνη LCD σε λειτουργία ανάγνωσης διευκολύνει την επικοινωνία για τον χρήστη)
PIN6 ή E (Ενεργοποίηση) σε PD5 του uC
PIN7 ή D0 έως PB0 του uC
PIN8 ή D1 έως PB1 του uC
PIN9 ή D2 έως PB2 του uC
PIN10 ή D3 έως PB3 του uC
PIN11 ή D4 έως PB4 του uC
PIN12 ή D5 έως PB5 του uC
PIN13 ή D6 έως PB6 του uC
PIN14 ή D7 έως PB7 του uC
Στο κύκλωμα μπορείτε να δείτε ότι χρησιμοποιήσαμε την επικοινωνία 8bit (D0-D7), ωστόσο αυτό δεν είναι υποχρεωτικό, μπορούμε να χρησιμοποιήσουμε την επικοινωνία 4bit (D4-D7), αλλά με το πρόγραμμα επικοινωνίας 4 bit γίνεται λίγο περίπλοκο. Έτσι, όπως φαίνεται στον παραπάνω πίνακα, συνδέουμε 10 ακίδες LCD με ελεγκτή, όπου 8 ακίδες είναι καρφίτσες δεδομένων και 2 ακίδες για έλεγχο.
Ο διακόπτης ένας είναι για ενεργοποίηση της ρύθμισης λειτουργίας μεταξύ συναγερμού και ώρας. Εάν ο πείρος είναι χαμηλός, μπορούμε να προσαρμόσουμε τον χρόνο αφύπνισης πατώντας τα κουμπιά. Εάν τα υψηλά κουμπιά είναι για ρύθμιση μόνο TIME. Υπάρχουν τέσσερα κουμπιά εδώ, το πρώτο είναι για αύξηση MINUTES σε συναγερμό ή ώρα. Το δεύτερο είναι για μείωση των λεπτών σε συναγερμό ή ώρα. Το τρίτο είναι για αύξηση της ώρας σε συναγερμό ή ώρα. ΤΕΤΑΡΤΟ προορίζεται για μείωση ΩΡΕΣ σε συναγερμό ή ώρα.
Οι πυκνωτές που υπάρχουν εδώ είναι για την εξουδετέρωση των πλήκτρων που αναπηδούν. Εάν αφαιρεθούν, ο ελεγκτής μπορεί να μετρά περισσότερα από ένα κάθε φορά που πατάτε το κουμπί. Οι αντιστάσεις που συνδέονται για καρφίτσες προορίζονται για τον περιορισμό του ρεύματος, όταν πατηθεί το κουμπί για να τραβήξει προς τα κάτω τον πείρο στο έδαφος.
Κάθε φορά που πατάτε ένα κουμπί, ο αντίστοιχος πείρος του ελεγκτή τραβιέται προς τα κάτω και έτσι ο ελεγκτής αναγνωρίζει ότι έχει πατηθεί κάποιο κουμπί και λαμβάνεται αντίστοιχη ενέργεια.
Πρώτα απ 'όλα, το ρολόι που επιλέγουμε εδώ είναι 11059200 Hz, διαιρώντας το με 1024 δίνει 10800. Έτσι, για κάθε δευτερόλεπτο λαμβάνουμε 10800 παλμούς. Έτσι θα ξεκινήσουμε έναν μετρητή με 1024 prescaler για να πάρουμε το ρολόι μετρητή ως 10800 Hz. Δεύτερον, θα χρησιμοποιήσουμε τη λειτουργία CTC (Clear Timer Counter) του ATMEGA. Θα υπάρχει ένα μητρώο 16 bit όπου μπορούμε να αποθηκεύσουμε μια τιμή (σύγκριση τιμής), όταν ο μετρητής μετρά μέχρι την τιμή σύγκρισης που έχει ρυθμιστεί να δημιουργεί μια διακοπή.
Θα ορίσουμε την τιμή σύγκρισης σε 10800, οπότε βασικά θα έχουμε ένα ISR (Interrupt Service Routine σε κάθε σύγκριση) για κάθε δευτερόλεπτο. Έτσι θα χρησιμοποιήσουμε αυτήν την έγκαιρη ρουτίνα για να πάρουμε το ρολόι που χρειαζόμασταν.
ΚΑΦΕ (WGM10-WGM13): Αυτά τα bits προορίζονται για επιλογή τρόπου λειτουργίας για χρονοδιακόπτη.
Τώρα, επειδή θέλουμε τη λειτουργία CTC με τιμή σύγκρισης σε byte OCR1A, πρέπει απλώς να ρυθμίσουμε το WGM12 σε ένα, τα υπόλοιπα απομένουν καθώς είναι μηδενικά από προεπιλογή.
ΚΟΚΚΙΝΟ (CS10, CS11, CS12): Αυτά τα τρία bits είναι για την επιλογή του prescalar και, συνεπώς, για να λάβετε το κατάλληλο ρολόι.
Δεδομένου ότι θέλουμε ένα 1024 ως προεπιλογή, πρέπει να ρυθμίσουμε τόσο το CS12 όσο και το CS10.
Τώρα υπάρχει ένα άλλο μητρώο που πρέπει να εξετάσουμε:
ΠΡΑΣΙΝΟ (OCIE1A): Αυτό το bit πρέπει να ρυθμιστεί για να διακόψετε τη σύγκριση μεταξύ της τιμής μετρητή και της τιμής OCR1A (10800) που ορίζουμε.
Η τιμή OCR1A (τιμή σύγκρισης αντίθεσης), γράφεται στον παραπάνω καταχωρητή.
Επεξήγηση προγραμματισμού
Η λειτουργία του ξυπνητηριού εξηγείται βήμα προς βήμα στον παρακάτω κώδικα:
#include // header για να ενεργοποιήσετε τον έλεγχο ροής δεδομένων πάνω από τις καρφίτσες #define F_CPU 1000000 // λέγοντας συνημμένη συχνότητα κρυστάλλου ελεγκτή