- Απαιτήσεις:
- Προγραμματισμός μικροελεγκτή PIC για επικοινωνία UART:
- Προσομοίωση του προγράμματός μας:
- Ρύθμιση υλικού και έλεγχος της εξόδου:
Σε αυτό το σεμινάριο μαθαίνουμε να Ενεργοποιούμε την επικοινωνία UART με τον Μικροελεγκτή PIC και τον τρόπο μεταφοράς δεδομένων από και προς τον υπολογιστή σας. Μέχρι στιγμής, έχουμε καλύψει όλες τις βασικές ενότητες όπως ADC, Timers, PWM και επίσης έχουμε μάθει πώς να διασυνδέουμε οθόνες LCD και 7-Segment. Τώρα, θα εξοπλίσουμε τον εαυτό μας με ένα νέο εργαλείο επικοινωνίας που ονομάζεται UART το οποίο χρησιμοποιείται ευρέως στα περισσότερα από τα έργα μικροελεγκτή. Δείτε εδώ τα πλήρη εκπαιδευτικά μαθήματα PIC Microcontroller χρησιμοποιώντας MPLAB και XC8.
Εδώ έχουμε χρησιμοποιήσει το PIC16F877A MCU, διαθέτει μια ενότητα που ονομάζεται «Διευθυνσιοδοτούμενος καθολικός ασύγχρονος δέκτης και πομπός» γνωστός ως USART. Το USART είναι ένα σύστημα επικοινωνίας δύο συρμάτων στο οποίο τα δεδομένα ρέουν σειριακά. Το USART είναι επίσης μια αμφίδρομη επικοινωνία, που σημαίνει ότι μπορείτε να στέλνετε και να λαμβάνετε δεδομένα ταυτόχρονα, τα οποία μπορούν να χρησιμοποιηθούν για επικοινωνία με περιφερειακές συσκευές, όπως τερματικά CRT και προσωπικούς υπολογιστές.
Το USART μπορεί να διαμορφωθεί με τους ακόλουθους τρόπους:
- Ασύγχρονη
- Σύγχρονη - Κύρια (ημι-διπλή)
- Σύγχρονος - Δούλος (μισό-διπλό)
Υπάρχουν επίσης δύο διαφορετικοί τρόποι, δηλαδή η λειτουργία 8-bit και 9-bit, σε αυτό το σεμινάριο θα ρυθμίσουμε τη μονάδα USART ώστε να λειτουργεί σε ασύγχρονη λειτουργία με σύστημα επικοινωνίας 8-bit, καθώς είναι ο πιο συχνά χρησιμοποιούμενος τύπος επικοινωνίας. Δεδομένου ότι είναι ασύγχρονο, δεν χρειάζεται να στέλνει σήμα ρολογιού μαζί με τα σήματα δεδομένων. Το UART χρησιμοποιεί δύο γραμμές δεδομένων για αποστολή (Tx) και λήψη (Rx) δεδομένων. Το έδαφος και των δύο συσκευών πρέπει επίσης να γίνει κοινό. Αυτός ο τύπος επικοινωνίας δεν μοιράζεται ένα κοινό ρολόι, επομένως ένα κοινό έδαφος είναι πολύ σημαντικό για το σύστημα να λειτουργεί.
Στο τέλος αυτού του σεμιναρίου θα μπορείτε να δημιουργήσετε μια επικοινωνία (UART) μεταξύ του υπολογιστή σας και του μικροελεγκτή PIC και να αλλάξετε ένα LED στην πλακέτα PIC από το φορητό υπολογιστή σας. Η κατάσταση της λυχνίας LED θα σταλεί στον φορητό υπολογιστή σας από το PIC MCU. Θα ελέγξουμε την έξοδο χρησιμοποιώντας το Hyper Terminal στον υπολογιστή. Λεπτομερές βίντεο δίνεται επίσης στο τέλος αυτού του σεμιναρίου.
Απαιτήσεις:
Σκεύη, εξαρτήματα:
- PIC16F877A Διοικητικό Συμβούλιο
- Ενότητα μετατροπέα RS232 σε USB
- Υπολογιστή
- Προγραμματιστής PICkit 3
Λογισμικό:
- MPLABX
- HyperTerminal
Απαιτείται μετατροπέας RS232 σε USB για τη μετατροπή των σειριακών δεδομένων σε μορφή αναγνώσιμη από υπολογιστή. Υπάρχουν τρόποι για να σχεδιάσετε το δικό σας κύκλωμα αντί να αγοράσετε τη δική σας μονάδα, αλλά δεν είναι αξιόπιστα καθώς υφίστανται θόρυβο. Αυτό που χρησιμοποιούμε φαίνεται παρακάτω
Σημείωση: Κάθε μετατροπέας RS232 σε USB απαιτεί την εγκατάσταση ενός ειδικού προγράμματος οδήγησης. τα περισσότερα από αυτά θα πρέπει να εγκατασταθούν αυτόματα μόλις συνδέσετε τη συσκευή. Αλλά, αν δεν χαλαρώσει !!! Χρησιμοποιήστε την ενότητα σχολίων και θα σας βοηθήσω.
Προγραμματισμός μικροελεγκτή PIC για επικοινωνία UART:
Όπως όλες οι λειτουργικές μονάδες (ADC, Timer, PWM), θα πρέπει επίσης να προετοιμάσουμε τη μονάδα USART του PIC16F877A MCU και να την καθοδηγήσουμε να λειτουργεί σε λειτουργία επικοινωνίας 8-bit UART Ας ορίσουμε τα bit διαμόρφωσης και ξεκινήστε με τη λειτουργία αρχικοποίησης UART
Αρχικοποίηση της μονάδας UART του μικροελεγκτή PIC:
Οι ακίδες Tx και Rx υπάρχουν φυσικά στις ακίδες RC6 και RC7. Σύμφωνα με το δελτίο δεδομένων, ας δηλώσουμε το TX ως έξοδο και το RX ως είσοδο.
// **** Ρύθμιση ακίδων I / O για UART **** // TRISC6 = 0; // TX Pin ορίστηκε ως έξοδος TRISC7 = 1; // RX Pin set as input // ________ I / O pin pin __________ //
Τώρα πρέπει να ρυθμιστεί ο ρυθμός baud. Ο ρυθμός baud είναι ο ρυθμός με τον οποίο οι πληροφορίες μεταφέρονται σε ένα κανάλι επικοινωνίας. Αυτό μπορεί να είναι μία από τις πολλές προεπιλεγμένες τιμές, αλλά σε αυτό το πρόγραμμα χρησιμοποιούμε 9600, δεδομένου ότι είναι το πιο χρησιμοποιημένο ποσοστό baud.
/ ** Αρχικοποιήστε τον καταχωρητή SPBRG για τον απαιτούμενο ρυθμό baud και ορίστε BRGH για γρήγορο ρυθμό baud_ / ** SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // για υψηλό baud_rate // _________ Τέλος ρύθμισης baud_rate _________ //
Η τιμή του ρυθμού baud πρέπει να οριστεί χρησιμοποιώντας το μητρώο SPBRG, η τιμή εξαρτάται από την τιμή της εξωτερικής συχνότητας κρυστάλλου, οι τύποι για τον υπολογισμό του ρυθμού baud παρουσιάζονται παρακάτω:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Το bit BRGH πρέπει να κατασκευαστεί υψηλό για να ενεργοποιηθεί ο ρυθμός bit υψηλής ταχύτητας. Σύμφωνα με το δελτίο δεδομένων (σελίδα 13) είναι πάντα χρήσιμο να το ενεργοποιήσετε, καθώς μπορεί να εξαλείψει τα σφάλματα κατά την επικοινωνία.
Όπως είπαμε νωρίτερα, θα εργαζόμαστε σε ασύγχρονη λειτουργία, επομένως το bit SYNC θα πρέπει να γίνει μηδέν και το bit SPEM πρέπει να είναι υψηλό για την ενεργοποίηση των σειριακών ακίδων (TRISC6 και TRICSC5)
// **** Ενεργοποίηση ασύγχρονης σειριακής θύρας ******* // SYNC = 0; // Ασύγχρονο SPEN = 1; // Ενεργοποίηση ακίδων σειριακής θύρας // _____ ενεργοποιημένη ασύγχρονη σειριακή θύρα _______ //
Σε αυτό το σεμινάριο θα στέλνουμε και θα λαμβάνουμε δεδομένα μεταξύ MCU και υπολογιστή και ως εκ τούτου πρέπει να ενεργοποιήσουμε και τα bit TXEN και CREN.
// ** Ας προετοιμαστούμε για μετάδοση και λήψη ** // TXEN = 1; // ενεργοποίηση μετάδοσης CREN = 1; // ενεργοποίηση λήψης // __ Η ενότητα UART είναι έτοιμη και έτοιμη για μετάδοση και λήψη __ //
Τα bit TX9 και RX9 πρέπει να γίνουν μηδέν για να λειτουργήσουμε σε λειτουργία 8-bit. Εάν πρέπει να υπάρξει υψηλή αξιοπιστία πρέπει να καθοριστεί τότε μπορεί να επιλεγεί η λειτουργία 9-bit.
// ** Επιλέξτε λειτουργία 8-bit ** // TX9 = 0; // Επιλεγμένη λήψη 8 bit RX9 = 0; // Επιλογή λειτουργίας λήψης 8-bit // __ επιλεγμένη λειτουργία 8-bit __ //
Με αυτό ολοκληρώνουμε τη ρύθμιση αρχικοποίησης. και είναι έτοιμο για λειτουργία.
Διαβίβαση δεδομένων χρησιμοποιώντας UART:
Η παρακάτω συνάρτηση μπορεί να χρησιμοποιηθεί για τη μετάδοση δεδομένων μέσω της μονάδας UART:
// ** Λειτουργία αποστολής ενός byte ημερομηνίας στο UART ** // άκυρο UART_send_char (char bt) {while (! TXIF); // κρατήστε πατημένο το πρόγραμμα έως ότου το TX buffer είναι δωρεάν TXREG = bt; // Φορτώστε το buffer πομπού με τη ληφθείσα τιμή} // _____________ Λήξη της λειτουργίας ________________ //
Μόλις η μονάδα αρχικοποιηθεί, οποιαδήποτε τιμή φορτώνεται στον καταχωρητή, το TXREG θα μεταδοθεί μέσω του UART, αλλά η μετάδοση ενδέχεται να επικαλύπτει. Ως εκ τούτου, πρέπει πάντα να ελέγξουμε τη σημαία TXIF της Διακοπής Διακοπής. Μόνο εάν αυτό το bit είναι χαμηλό, μπορούμε να προχωρήσουμε με το επόμενο bit για μετάδοση, αλλιώς θα πρέπει να περιμένουμε να πέσει αυτή η σημαία.
Ωστόσο, η παραπάνω συνάρτηση μπορεί να χρησιμοποιηθεί μόνο για την αποστολή μόνο ενός byte δεδομένων, για την αποστολή πλήρους συμβολοσειράς που πρέπει να χρησιμοποιηθεί η παρακάτω συνάρτηση
// ** Λειτουργία μετατροπής συμβολοσειράς σε byte ** // void UART_send_string (char * st_pt) {ενώ (* st_pt) // εάν υπάρχει char UART_send_char (* st_pt ++); // επεξεργαστείτε το ως δεδομένα byte} // ___________ Τέλος λειτουργίας ______________ //
Αυτή η λειτουργία μπορεί να είναι λίγο δύσκολη στην κατανόηση αφού έχει δείκτες, αλλά πιστέψτε με ότι οι δείκτες είναι υπέροχοι και κάνουν τον προγραμματισμό πιο εύκολο και αυτό είναι ένα καλό παράδειγμα του ίδιου.
Όπως μπορείτε να παρατηρήσετε, κάναμε ξανά το UART_send_char (), αλλά τώρα μέσα στο loop while. Έχουμε χωρίσει τη συμβολοσειρά σε μεμονωμένους χαρακτήρες, κάθε φορά που καλείται αυτή η λειτουργία, ένας χαρακτήρας θα σταλεί στο TXREG και θα μεταδοθεί.
Λήψη δεδομένων μέσω UART:
Η ακόλουθη λειτουργία μπορεί να χρησιμοποιηθεί για τη λήψη δεδομένων από τη μονάδα UART:
// ** Λειτουργία για λήψη ενός byte ημερομηνίας από UART ** // char UART_get_char () {if (OERR) // έλεγχος για σφάλμα {CREN = 0; // Εάν υπάρχει σφάλμα -> Επαναφορά CREN = 1; // Εάν υπάρχει σφάλμα -> Επαναφορά} ενώ (! RCIF); // κρατήστε το πρόγραμμα έως ότου το buffer RX είναι δωρεάν RCREG επιστροφής. // λάβετε την τιμή και στείλτε την στην κύρια λειτουργία} // _____________ Λήξη της λειτουργίας ________________ //
Όταν λαμβάνονται δεδομένα από τη μονάδα UART, τα λαμβάνουν και τα αποθηκεύουν στον καταχωρητή RCREG. Μπορούμε απλά να μεταφέρουμε την τιμή σε οποιαδήποτε μεταβλητή και να την χρησιμοποιήσουμε. Ωστόσο, ενδέχεται να υπάρχει σφάλμα επικάλυψης ή ο χρήστης ενδέχεται να στέλνει δεδομένα συνεχώς και δεν τα έχουμε μεταφέρει ακόμη σε μια μεταβλητή.
Σε αυτήν την περίπτωση, το RCIF bit bit λήψης έρχεται να σώσει. Αυτό το bit θα μειωθεί κάθε φορά που λαμβάνονται δεδομένα και δεν έχει ακόμη υποβληθεί σε επεξεργασία. Ως εκ τούτου το χρησιμοποιούμε στο while loop δημιουργώντας μια καθυστέρηση για να κρατήσουμε το πρόγραμμα μέχρι να αντιμετωπίσουμε αυτήν την τιμή.
Εναλλαγή LED χρησιμοποιώντας τη μονάδα UART του μικροελεγκτή PIC:
Τώρα ας έρθουμε στο τελευταίο μέρος του Προγράμματος, τη λειτουργία κενών κενών (κενό) , όπου θα εναλλάξουμε ένα LED μέσω του υπολογιστή χρησιμοποιώντας την επικοινωνία UART μεταξύ PIC και υπολογιστή.
Όταν στέλνουμε έναν χαρακτήρα "1" (από υπολογιστή), η λυχνία LED θα ανάψει και το μήνυμα κατάστασης "ΚΟΚΚΙΝΟ LED -> ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ" θα σταλεί πίσω (από το PIC MCU) στον υπολογιστή.
Παρομοίως, στέλνουμε έναν χαρακτήρα "0" (από υπολογιστή) το LED θα σβήσει και το μήνυμα κατάστασης "RED LED -> OFF" θα σταλεί πίσω (από το PIC MCU) στον υπολογιστή.
ενώ (1) // Άπειρος βρόχος {get_value = UART_get_char (); if (get_value == '1') // Εάν ο χρήστης στέλνει "1" {RB3 = 1; // Ενεργοποιήστε το LED UART_send_string ("RED LED -> ON"); // Στείλτε ειδοποίηση στον υπολογιστή UART_send_char (10); // Η τιμή ASCII 10 χρησιμοποιείται για επιστροφή μεταφοράς (για εκτύπωση σε νέα γραμμή)} if (get_value == '0') // Εάν ο χρήστης στέλνει "0" {RB3 = 0; // Απενεργοποιήστε το LED UART_send_string ("RED -> OFF"). // Στείλτε ειδοποίηση στον υπολογιστή UART_send_char (10); // Η τιμή 10 ASCII χρησιμοποιείται για την επιστροφή μεταφοράς (για εκτύπωση σε νέα γραμμή)}}
Προσομοίωση του προγράμματός μας:
Ως συνήθως, ας προσομοιώσουμε το πρόγραμμά μας χρησιμοποιώντας πρωτεΐνη και μάθετε αν λειτουργεί όπως αναμένεται.
Η παραπάνω εικόνα δείχνει ένα εικονικό τερματικό στο οποίο δείχνει ένα μήνυμα καλωσορίσματος και την κατάσταση του LED. Το κόκκινο χρώμα LED μπορεί να παρατηρηθεί ότι συνδέεται με τον πείρο RB3. Η λεπτομερής εργασία της προσομοίωσης βρίσκεται στο βίντεο στο τέλος.
Ρύθμιση υλικού και έλεγχος της εξόδου:
Η σύνδεση για αυτό το κύκλωμα είναι πραγματικά απλή, χρησιμοποιούμε την πλακέτα PIC Perf μας και απλώς συνδέουμε τα τρία καλώδια στο μετατροπέα RS232 σε USB και συνδέουμε τη μονάδα στον υπολογιστή μας χρησιμοποιώντας καλώδιο δεδομένων USB όπως φαίνεται παρακάτω.
Στη συνέχεια εγκαθιστούμε την εφαρμογή Hyper Terminal (κατεβάστε την από εδώ) και την ανοίγουμε. Θα πρέπει να δείχνει κάτι τέτοιο
Τώρα ανοίξτε τη Διαχείριση συσκευών στον υπολογιστή σας και ελέγξτε σε ποια θύρα είναι συνδεδεμένη η μονάδα σας, η δική μου είναι συνδεδεμένη στη θύρα COM 17 όπως φαίνεται παρακάτω
Σημείωση: Το όνομα της θύρας COM για τη λειτουργική σας μονάδα ενδέχεται να αλλάξει ανάλογα με τον προμηθευτή σας, δεν είναι πρόβλημα.
Τώρα επιστρέψτε στην εφαρμογή Hyper Terminal και πλοηγηθείτε στο Set Up -> Port Configuration ή πατήστε Alt + C, για να λάβετε το ακόλουθο αναδυόμενο πλαίσιο και επιλέξτε την επιθυμητή θύρα (COM17 στην περίπτωσή μου) στο αναδυόμενο παράθυρο και κάντε κλικ στο connect.
Μόλις δημιουργηθεί η σύνδεση, ενεργοποιήστε τον πίνακα PIC perf και θα δείτε κάτι τέτοιο παρακάτω
Κρατήστε τον κέρσορα στο παράθυρο εντολών και πληκτρολογήστε 1 και μετά πατήστε enter. Η λυχνία LED θα ανάψει και η κατάσταση θα εμφανιστεί όπως φαίνεται παρακάτω.
Με τον ίδιο τρόπο, κρατήστε τον κέρσορα στο παράθυρο εντολών και πληκτρολογήστε 0 και μετά πατήστε enter. Η λυχνία LED θα σβήσει και η κατάσταση θα εμφανιστεί όπως φαίνεται παρακάτω.
Παρακάτω δίνεται ο πλήρης κώδικας και το λεπτομερές βίντεο, το οποίο θα δείξει πώς ανταποκρίνεται το LED σε πραγματικό χρόνο για τα «1» και «0».
Αυτό είναι παιδιά, έχουμε διασυνδέσει το PIC UART με τον υπολογιστή μας και μεταφέρουμε τα δεδομένα για εναλλαγή του LED χρησιμοποιώντας το τερματικό Hyper. Ελπίζω να καταλάβετε, αν όχι, χρησιμοποιήστε την ενότητα σχολίων για να κάνετε το ερώτημά σας. Στο επόμενο σεμινάριό μας θα χρησιμοποιήσουμε ξανά το UART αλλά θα το κάνουμε πιο ενδιαφέρον χρησιμοποιώντας μια μονάδα Bluetooth και θα μεταδώσουμε τα δεδομένα μέσω αέρα.
Ελέγξτε επίσης την επικοινωνία UART μεταξύ δύο μικροελεγκτών ATmega8 και την επικοινωνία UART μεταξύ ATmega8 και Arduino Uno.