1 2. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΤΩΝ ΘΥΡΩΝ ΕΙΣΟ ΟΥ/ΕΞΟ ΟΥ ΤΟΥ PIC16F877-ΑΡΙΘΜΗΤΙΚΕΣ ΕΝΤΟΛΕΣ Σκοπός της άσκησης: εξοικείωση µε τις θύρες εισόδου/εξόδου ενός µικροελεγκτή 2. Θεωρητικό Μέρος 2.1.1 Θύρες εισόδου / εξόδου Ο µικροελεγκτής έχει πέντε θύρες εισόδου/εξόδου, τις Α, Β, C, D, E, οι οποίες έχουν εύρος από 3 έως 8 δυαδικά ψηφία (bits). Αυτές µπορούν να χρησιµοποιηθούν είτε σαν απλές θύρες εισόδου/εξόδου, είτε σαν θύρες των υπόλοιπων περιφερειακών κυκλωµάτων του µικροελεγκτή. Οι ακροδέκτες των θυρών φαίνονται µε τα ονόµατά τους (π.χ. RB0 κλπ.) στο διάγραµµα του σχήµατος 2.1. Στην κάθε θύρα αντιστοιχεί ένας καταχωρητής ελέγχου, που αναφέρεται ως TRIS[ONOMA ΘΥΡΑΣ] (π.χ. TRISΑ, TRISB κλπ). Τα bits του καταχωρητή TRIS καθορίζουν ποιοί ακροδέκτες της θύρας προορίζονται για είσοδο και ποιοί για έξοδο. Επίσης, σε κάθε θύρα αντιστοιχεί και ένας καταχωρητής δεδοµένων, που αναφέρεται ως PORT[ONOMA ΘΥΡΑΣ]. Έτσι, για παράδειγµα, στη θύρα Β αντιστοιχούν οι καταχωρητές TRISB, PORTB. Τόσο ο καταχωρητής TRIS όσο και ο καταχωρητής δεδοµένων PORT της θύρας, εµφανίζονται ως τυπικοί καταχωρητές µέσα στο χώρο διευθύνσεων της µνήµης. Σχήµα 2.1 Εντοπίστε τους ακροδέκτες των θυρών ανάµεσα στο σύνολο των ακροδεκτών του PIC16F877
2 Η εγγραφή δεδοµένων στους ακροδέκτες µιας θύρας µπορεί να γίνει οποιαδήποτε στιγµή, αλλά πρώτα πρέπει να έχουµε ορίσει τους ακροδέκτες της θύρας ως εξόδους. Για να οριστεί ένας ακροδέκτης µιας θύρας (π.χ. της Β) ως έξοδος, το αντίστοιχο bit του καταχωρητή TRISB πρέπει να έχει γίνει '0'. Για να εισάγουµε µια λογική κατάσταση από έναν ακροδέκτη θύρας, π.χ. της Β, πρέπει να έχουµε καταστήσει τον αντίστοιχο ακροδέκτη είσοδο. Για το σκοπό αυτό εγγράφουµε στο αντίστοιχο bit του καταχωρητή TRISB λογικό '1'. Έτσι, για παράδειγµα, ο παρακάτω κώδικας movlw b'00011111' movwf TRISD καθιστά τα πέντε λιγότερο σηµαντικά bits της θύρας D εισόδους και τα τρία πιο σηµαντικά bits εξόδους. 2.2 ΕΡΓΑΣΤΗΡΙΑΚΟ ΜΕΡΟΣ 2.2.1Εφαρµογή ανάγνωσης και εγγραφής στις θύρες εισόδου/εξόδου To παρακάτω πρόγραµµα επιδεικνύει τον τρόπο προγραµµατισµού των θυρών Parallel I/O (PIO) του PIC για είσοδο και για έξοδο. Το διάγραµµα ροής του κώδικα είναι το εξής: Start Output pattern A to Port B Is Pin RD0=1? No Yes Output pattern B to Port B Is Pin RD1=1? No Yes Σχήµα 2.2 Το διάγραµµα ροής της εφαρµογής εισόδου/εξόδου
3 ηµιουργείστε σχέδιο εργασίας (project) µε όνοµα erg22.mcp Πληκτρολογήστε τον κώδικα και αποθηκεύστε τον µε όνοµα erg22.asm. Προσοµοιώστε την λειτουργία του. Για τη σωστή εκπόνηση της άσκησης, ο φοιτητής πρέπει να κατανοεί τη χρήση των εντολών mov, bcf/bsf, btfss/btfsc #include "p16f877.inc" ;Initialization Org 0 ;Start from program memory address 0 bsf STATUS, RP0 ;Change to bank1 movlw b'00000000' ;Make all pins of portb Outputs movwf TRISB movlw b'00000011' ;Make 2 pins of portd inputs movwf TRISD bcf STATUS, RP0 ;Return to bank0 main movlw b'01010101' ;Output to portb movwf PORTB btfss PORTD, 0 ;Wait until pin0 of portd receives 1 goto $-1 ;Loop to previous command movlw b'10101010' ;load new pattern to w movwf PORTB ;Change output combination on portb btfss PORTD, 1 ;Wait until pin1 of portd receives 1 goto $-1 goto main ;Loop to main end Αφού πληκτρολογήσετε το πρόγραµµα, εκτελέστε τη µεταγλώττιση, επιλέγοντας Project/Build all. Στο παράθυρο που θα ανοίξει, επιλέξτε Absolute διευθυνσιοδότηση για την εγγραφή στη µνήµη προγράµµατος (όχι relocatable). Αν ο builder παράγει λάθη (εµφανίζονται µε κόκκινο στην κονσόλα εξόδου), εντοπίστε τα λάθη σας µελετώντας το είδος του σφάλµατος και µεταβαίνοντας στην αντίστοιχη γραµµή του προγράµµατος. Κάνετε τις απαραίτητες διορθώσεις µέχρι να επιτύχει η διαδικασία του builder ( Build Succeeded ). Στη συνέχεια, επιλέξτε Debugger/Tool/MPLABSIM, για να ενεργοποιηθεί ο προσοµοιωτής. Θα εµφανιστούν τα εργαλεία προσοµοίωσης. Χρησιµοποιείστε την δυνατότητα Debugger/Stimulus/New workbook για να δώσετε εικονικά τιµές στους ακροδέκτες της διάταξης, όπως φαίνεται στο παρακάτω παράθυρο.
4 Με κλικ πάνω στις κενές στήλες αντιστοιχούµε ακροδέκτη θύρας και ορίζουµε την ενέργεια που επιτελείται (Action), όταν πατήσουµε στο πλήκτρο Fire. 2.2.2 Προγραµµατισµός της διάταξης ηµιουργείστε το δεκαεξαδικό αρχείο για τον προγραµµατισµό της διάταξης, µε την επιλογή Project-Build all. Συνδέστε τον υπολογιστή µε την αναπτυξιακή πλακέτα EasyPIC5. Η σύνδεση γίνεται µέσω θύρας USB. Ανοίξτε στην οθόνη τον προγραµµατιστή PICflash. Καλέστε το αρχείο.hex που µόλις δηµιουργήσατε. Αν ο µικροελεγκτής που φέρει η αναπτυξιακή πλακέτα είναι ο PIC16F887, κάνετε τις παρακάτω επιλογές των ψηφίων διαµόρφωσης (Configuration Bits), όπως φαίνεται στον πίνακα. Προγραµµατίστε την διάταξη επιλέγοντας Write. Αν η πλακέτα φέρει τον µικροελεγκτή PIC16F877A κάνετε τις ρυθµίσεις των bits διαµόρφωσης όπως παρακάτω:
Α. Παρατηρείστε την κατάσταση των LEDs της θύρας B. Β. Πιέστε τον διακόπτη εισόδου RD0. Τι παρατηρείτε; Γ. Πιέστε τον διακόπτη εισόδου RD1. Επιβεβαιώστε την καλή λειτουργία του προγράµµατος που γράψατε. 5
6 2.3 Χρήση αριθµητικών εντολών (addlw/addwf, sublw/subwf, incf, decf) Να µελετήσετε το παρακάτω διάγραµµα ροής. Το πρόγραµµα προσθέτει όλους τους ακεραίους που βρίσκονται στο διάστηµα 1 έως 10 και βρίσκει το άθροισµα (sum). START Initialize sum (with zero) Initialize element (with start value) Add element to sum Is element=max? Yes No Produce next element Endless wait Σχήµα 2.3 ιάγραµµα ροής του προγράµµατος που συσσωρεύει τους ακεραίους Στο πρόγραµµα που ακολουθεί γίνεται χρήση των παρακάτω νέων στοιχείων: α. Ψευδωνύµων (alias) για την ονοµασία θέσεων µνήµης. Αυτό γίνεται µε δηλώσεις του τύπου: [Ψευδώνυµο] equ [αριθµός θέσης µνήµης] Έτσι, µια θέση µνήµης µπορεί να αναφέρεται στο πρόγραµµα µε το συγκεκριµένο ψευδώνυµο και όχι µε τη σειρά της στον πίνακα της µνήµης. β. Ψευδωνύµων για την ονοµασία σταθερών. Έτσι ο προγραµµατιστής µπορεί να αναφέρεται µε το ίδιο ψευδώνυµο σε µία σταθερή, σε όλη την έκταση του προγράµµατος. γ. Αριθµητικών εντολών: addlw k, addwf f, d (d = 0 ή 1),
7 sublw k, subwf f, d (d = 0 ή 1). Ας σηµειωθεί ότι η πράξη της αφαίρεσης sublw k παράγει τη διαφορά k-[w], µε χρήση του συµπληρώµατος ως προς 2. Εδώ, k είναι µια τιµή, εύρους 8-bit. Αντίστοιχα, η εντολή subwf f, d παράγει τη διαφορά [f]-[w], δηλαδή, αφαιρεί από το περιεχόµενο του καταχωρητή f το περιεχόµενο του w και το τοποθετεί στον w (όταν d=0) ή στον καταχωρητή f όταν d=1. ΚΩ ΙΚΑΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΥΣΩΡΡΕΥΣΗΣ ΑΚΕΡΑΙΩΝ ;This program adds up all integers in interval [start, max] ;For example from 1 to 10 [1, 10] ;The sum is stored in memory location 21h ;8.10.2012 by my_name #include "p16f877.inc" element sum start max equ 20h ;define address to store current added element equ 21h ;define address for sum equ d'1' ;start int value (decimal) equ d'10' ;max int value (decimal) Org 00 ;Initialize memory movlw 00 movwf sum movlw start movwf element ;initialize sum ;load first element ;main code starts here main movf element,w ;Move current value of element to w addwf sum,1 ;add current element to sum movf element, w sublw max ;compare element with stop value (max-w) btfsc STATUS, Z ;if element exceeds max value, then stop loop goto loop ;endless loop - wait here incf element ;otherwise produce next element goto main ;continue loop end
8 ΥΠΟΧΡΕΩΤΙΚΗ ΕΡΓΑΣΙΑ α. Αφού κατανοήσετε τον κώδικα να τον προσοµοιώσετε στο MPLAB. β. Να µεταφέρετε τα παράθυρα προσοµοίωσης στην εργασία σας. γ. Στη συνέχεια να τροποποιήσετε τον κώδικα, ώστε στο τέλος της διαδικασίας το άθροισµα sum να εµφανίζεται στη θύρα Β.