- Διάγραμμα κυκλώματος:
- PIC Μικροελεγκτής PIC16F877A LED Κωδικός ακολουθίας που αναβοσβήνει και Επεξήγηση εργασίας:
Στο προηγούμενο σεμινάριό μας, μάθαμε για την αναβοσβήνει ένα LED χρησιμοποιώντας μικροελεγκτή PIC και δημιουργήσαμε το ίδιο κύκλωμα στον πίνακα Perf. Στη συνέχεια χρησιμοποιήσαμε τα PICkit 3, ICSP και MPLAB IPE για την απόρριψη του προγράμματος στον πίνακα Perf. Τώρα, σε αυτό το σεμινάριο θα προωθήσουμε τον εαυτό μας στη χρήση περισσότερων καρφιτσών στον μικροελεγκτή PIC. Θα χρησιμοποιήσουμε 7 εξόδους (LED) και μία είσοδο. Για αυτό το σεμινάριο θα χρησιμοποιήσουμε την παλιά πλακέτα Perf (φαίνεται παρακάτω) και θα προσθέσουμε μπαστούνια berg για να βγάλουμε τις απαιτούμενες καρφίτσες στη δεύτερη πλακέτα LED. Στο τέλος αυτού του σεμιναρίου θα δημιουργήσουμε μια ακολουθία LED που αναβοσβήνει χρησιμοποιώντας τον μικροελεγκτή PIC PIC16F877A και θα μάθουμε πώς να χρησιμοποιούμε πολλαπλές εισόδους και εξόδους, ορισμένα βασικά στοιχεία για την κλήση βρόχου και λειτουργίας "για".
Η πλακέτα LED δεν είναι παρά μια άλλη πλακέτα perf, στην οποία θα συγκολλήσουμε τα LED με μια τρέχουσα περιοριστική αντίσταση (φαίνεται παρακάτω). Θα προσθέσουμε επίσης ένα μπουτόν για να ξεκινήσει να αναβοσβήνει η ακολουθία LED.
Διάγραμμα κυκλώματος:
PIC Μικροελεγκτής PIC16F877A LED Κωδικός ακολουθίας που αναβοσβήνει και Επεξήγηση εργασίας:
Ο πλήρης κώδικας έχει δοθεί παρακάτω (ελέγξτε στο τέλος), εδώ θα τον μεταφέρουμε μέσω γραμμής. Αυτός ο κωδικός θα αρχίσει να ανάβει LED με διαδοχικό τρόπο όταν πατηθεί το κουμπί. Για να κατανοήσετε τις ακολουθίες, παρακολουθήστε το βίντεο στο τέλος του σεμιναρίου. Θα σας συνιστούσα να συγκρίνετε την έξοδο που εμφανίζεται στο βίντεο με τον παρακάτω κώδικα και να προσπαθήσετε να κατανοήσετε το πρόγραμμα.
Ας δούμε τον κωδικό γραμμή προς γραμμή. Οι πρώτες λίγες γραμμές είναι για τη ρύθμιση bit διαμόρφωσης που εξηγήθηκαν στο προηγούμενο σεμινάριο, οπότε τα παραλείπω για τώρα. Ο καλύτερος τρόπος για να κατανοήσετε οποιοδήποτε πρόγραμμα είναι να ξεκινήσετε από τη λειτουργία main ( void main () ), οπότε ας το κάνουμε αυτό
TRISB0 = 1; // Διδάξτε στο MCU ότι ο ακροδέκτης PORTB 0 χρησιμοποιείται ως είσοδος για το κουμπί. TRISD = 0x00; // Διδάξτε στο MCU ότι όλες οι ακίδες είναι έξοδος PORTD = 0x00; // Αρχικοποιήστε όλες τις καρφίτσες στο 0
Η λέξη TRIS χρησιμοποιείται για να καθορίσει εάν ο πείρος χρησιμοποιείται ως είσοδος / έξοδος και η λέξη PORT χρησιμοποιείται για να φτιάξει έναν πινέλο High / Low. Η γραμμή TRISB0 = 1 θα κάνει τον 0ο πείρο του PORT B ως είσοδο. Αυτό θα είναι το μπουτόν μας. Οι γραμμές TRISD = 0x00; PORTD = 0x00; θα κάνει όλες τις ακίδες της θύρας D ως έξοδο και θα εκχωρήσει μια αρχική τιμή LOW σε αυτές τις ακίδες.
Δεδομένου ότι είπαμε ότι το B0 χρησιμοποιείται ως είσοδος, θα συνδέσουμε το ένα άκρο του μπουτόν με τον ακροδέκτη B0 και το άλλο άκρο στο έδαφος. Μέχρι τότε κάθε φορά που πατάμε το κουμπί, ο πείρος θα κρατηθεί στη γείωση όπως φαίνεται στο παραπάνω διάγραμμα σύνδεσης. Αλλά για να συμβεί αυτό, πρέπει να χρησιμοποιήσουμε μια αντίσταση προς τα επάνω, έτσι ώστε ο πείρος να διατηρείται ψηλά όταν δεν πατηθεί το κουμπί. Μια αντίσταση τραβήγματος είναι κάτι σαν αυτό.
Αλλά το PIC MCU μας έχει μια εσωτερική αδύναμη αντίσταση προς τα πάνω, η οποία μπορεί να ενεργοποιηθεί από λογισμικό εξοικονομώντας πολύ ταλαιπωρία (όταν πρόκειται να συνδεθούν περισσότερα κουμπιά).
Τι είναι μια αδύναμη αντίσταση προς τα πάνω;
Υπάρχουν δύο τύποι αντίστασης έλξης προς τα πάνω, ο ένας είναι το Weak Pull Up και το άλλο είναι το Strong Pull Up. Οι αδύναμες αντιστάσεις έλξης είναι υψηλής αξίας και έτσι επιτρέπουν τη ροή ενός αδύναμου ρεύματος και οι ισχυρές αντιστάσεις έλξης έχουν χαμηλή τιμή επιτρέποντας έτσι σε ισχυρό ρεύμα να ρέει. Όλα τα MCU χρησιμοποιούν ως επί το πλείστον αδύναμες αντιστάσεις έλξης. Για να το ενεργοποιήσουμε στο PIC MCU, πρέπει να εξετάσουμε το δελτίο δεδομένων μας για το OPTION_REG (επιλογή καταχωρητή), όπως φαίνεται στο στιγμιότυπο παρακάτω.
Όπως φαίνεται, το bit 7 ασχολείται με την αδύναμη αντίσταση προς τα πάνω. Θα πρέπει να γίνει μηδέν για να το ενεργοποιήσετε. Αυτό γίνεται από το OPTION_REG <7> = 0 . Αυτό ασχολείται ειδικά με το bit 7 αφήνοντας τα άλλα bits στις προεπιλεγμένες τιμές του. Με αυτό μπαίνουμε στον βρόχο μας, όπου ελέγχει εάν το κουμπί πατηθεί χρησιμοποιώντας το (RB0 == 0). Εάν ικανοποιηθεί η συνθήκη, καλούμε τη λειτουργία μας με τις παραμέτρους 1, 3, 7 και 15.
sblink (1); // ΛΕΙΤΟΥΡΓΙΑ ΚΛΗΣΗ 1 με παράμετρο 1 sblink (3). // ΛΕΙΤΟΥΡΓΙΑ ΚΛΗΣΗ 3 με παράμετρο 3 sblink (7). // ΛΕΙΤΟΥΡΓΙΑ ΚΛΗΣΗ 7 με παράμετρο 7 sblink (15). // ΛΕΙΤΟΥΡΓΙΑ ΚΛΗΣΗ 4 με παράμετρο 15
Γιατί χρησιμοποιούμε συναρτήσεις;
Οι λειτουργίες χρησιμοποιούνται για τη μείωση του αριθμού των γραμμών στον κώδικα μας. Αυτό θα γνωρίζαμε οι περισσότεροι από εμάς. Αλλά γιατί πρέπει να μειώσουμε τον αριθμό των γραμμών, ειδικά όταν πρόκειται για προγραμματισμό MCU. Ο λόγος είναι ο περιορισμένος χώρος στη μνήμη του Προγράμματος. Εάν δεν βελτιστοποιήσουμε σωστά τον κώδικα, ενδέχεται να εξαντληθεί ο χώρος μνήμης. Αυτό θα είναι χρήσιμο όταν γράφουμε μεγάλες σελίδες κωδικών.
Οποιαδήποτε συνάρτηση θα έχει συνάρτηση Definition ( sblink (int get) στην περίπτωσή μας) και συνάρτηση Call ( sblink (1) στην περίπτωσή μας). Είναι προαιρετικό να έχουμε μια δήλωση συνάρτησης, για να το αποφύγω έχω θέσει τον ορισμό της λειτουργίας μου πριν καλέσω τη συνάρτηση στην κύρια λειτουργία μου.
Οι παράμετροι συνάρτησης είναι η τιμή που θα περάσει από την κλήση συνάρτησης στον ορισμό της συνάρτησης. Στην περίπτωσή μας οι ακέραιες τιμές (1, 3, 7, 15) είναι οι παράμετροι που περνούν από την κλήση συνάρτησης και η μεταβλητή "get" παίρνει την τιμή των παραμέτρων στον ορισμό της συνάρτησης για την επεξεργασία τους. Μια συνάρτηση μπορεί να έχει περισσότερες από μία παραμέτρους.
Μόλις κληθεί η συνάρτηση, θα εκτελεστούν οι παρακάτω γραμμές στον ορισμό της συνάρτησης.
για (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = λήψη << i; // LED κίνηση Left Sequence __delay_ms (50); } για (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = λήψη << i; // LED κίνηση Left Sequence __delay_ms (50); }
Τώρα αυτή η γραμμή φαίνεται περίεργη: PORTD = get << i . Θα εξηγήσω τι πραγματικά συμβαίνει εδώ.
Το "<<" είναι ένας χειριστής αριστεράς αλλαγής που μετατοπίζει όλα τα bit στην αριστερή του θέση. Τώρα, όταν καλούμε τη συνάρτηση sblink (int get) με την παράμετρο '1' ως sblink (1), θα κάνει την τιμή του 'get' ως 1, η οποία στο δυαδικό είναι 0b00000001. Ως εκ τούτου, αυτή η γραμμή θα είναι όπως PORTD = 0b00000001 << i .
Η τιμή του "i" θα κυμαίνεται από 0 έως 7, καθώς έχουμε χρησιμοποιήσει ένα 'για βρόχο' για (int i = 0; i <= 7 && RB0 == 0; i ++). Η τιμή του "i" από 0 σε 7 θα αλλάξει το αποτέλεσμα ως εξής:
Όπως μπορείτε να δείτε, ανάβουμε ένα LED κάθε φορά (από αριστερά προς τα δεξιά) κρατώντας το υπόλοιπο απενεργοποιημένο. Το επόμενο «για βρόχο» για (int i = 7; i> = 0 && RB0 == 0; i--) , θα κάνει επίσης το ίδιο, αλλά αυτή τη φορά το LED θα ανάψει από δεξιά προς τα αριστερά σε μια σειρά, καθώς ξεκινήσαμε από το 7 και κατεβαίνουμε στο 0. Έχουμε χρησιμοποιήσει καθυστέρηση 200ms, ώστε να μπορούμε να απεικονίσουμε το LED να ανάβει και να σβήνει.
Τώρα, όταν περάσουμε την τιμή 3 στη συνάρτηση sblink (int get) , θα εκτελεστεί η συνάρτηση sblink (3) η οποία καθιστά την τιμή του «get» ως 0b00000011, εξ ου και το αποτέλεσμα στο PORTD θα είναι:
Τώρα λοιπόν αυτή τη φορά δύο LED θα ανάβουν ανά πάσα στιγμή χρησιμοποιώντας το sblink (3). Ομοίως για το sblink (7) και το sblink (15), τρία και τέσσερα LED θα είναι αναμμένα σε σειρά. Μόλις ολοκληρωθεί αυτό, θα ενεργοποιήσουμε όλες τις λυχνίες LED χρησιμοποιώντας τη γραμμή PORTD = 0xFF . Ελέγξτε το παρακάτω βίντεο για πλήρη επίδειξη.
Ελπίζω να έχετε καταλάβει τον κώδικα και έτσι να μάθετε πώς να χρησιμοποιείτε τις λειτουργίες, «για» και «ενώ» βρόχο για να λάβετε τις επιθυμητές εξόδους. Τώρα μπορείτε να τροποποιήσετε τον κώδικα για να αναβοσβήνει η διαφορετική ακολουθία LED. Προχωρήστε καταρτίστε τον κωδικό σας και πετάξτε τον στο MCU σας και απολαύστε την έξοδο. Μπορείτε να χρησιμοποιήσετε την ενότητα σχολίων εάν κολλήσετε κάπου. Έχω επισυνάψει επίσης τα αρχεία προσομοίωσης και προγράμματος.
Αυτό είναι τώρα στο επόμενο σεμινάριό μας, θα μάθουμε πώς να χρησιμοποιούμε χρονοδιακόπτες PIC16F877A αντί να χρησιμοποιούμε συναρτήσεις καθυστέρησης. Μπορείτε να δείτε όλα τα μαθήματα μικροελεγκτή PIC εδώ.