Τίτλος προγράμματος
;************************************************************************
; *
; Εφφέ με οκτώ Led *
; *
; Author : Seiichi Inoue Ελληνική απόδοση : Παναγιώτης Πανταζόπουλος *
;************************************************************************
Ψευδοεντολή LIST
list p=pic16f84a
Με την ψευδοεντολή
‘List’
ενημερώνεται
ο
Assembler
ότι
το πρόγραμμα που ακολουθεί αφορά το μικροεπεξεργαστή
16F84A
Ψευδοεντολή INCLUDE
include p16f84a.inc
Με την ψευδοεντολή
‘Include’
ενημερώνεται
ο
Assembler
ότι
τα ονόματα των προκαθορισμένων
καταχωρητών του μικροεπεξεργαστή βρίσκονται στο
path
c:\Program Files\Mplab\p16f84a.inc
στο δίσκο του Η/Υ έτσι ώστε
να τα φορτώσει και να τα μεταφράσει μαζί με το υπόλοιπο πρόγραμμα σε γλώσσα
μηχανής.
Διαμόρφωση μικροεπεξεργαστή
__config _hs_osc & _wdt_off & _pwrte_on & _cp_off
Με το
Configuration
Word
ενημερώνεται
ο
Assembler
για
τις ρυθμίσεις των ‘σημαιών’ του μικροεπεξεργαστή όπως, αν θα χρονίζει με
κρύσταλλο, αν θα ενεργοποιήσουμε το
Watchdog
timer,
αν
θα προστατεύσει το πρόγραμμα από αντιγραφή κ.λ.π
.
Ψευδοεντολή ERRORLEVEL
errorlevel -302 ;Suppress bank warning
Με την ψευδοεντολή
‘Errorlevel’
ενημερώνεται
ο
Assembler
ότι
δεν θέλουμε κατά την μεταγλώττιση του προγράμματος να μας εμφανίζει προειδοποιητικά
μηνύματα του τύπου
“Compatibility
problem using TRISA or TRISB”
Ορισμός ονομάτων (Ετικετών)
;**************** Label Definition ********************
Σε
αυτό το σημείο ‘βαφτίζουμε’ τους ελεύθερους προς χρήση καταχωρητές του μικροεπεξεργαστή
και ότι άλλο χρειαζόμαστε, με ονόματα που θα μπορούμε να θυμόμαστε κατά
την διάρκεια γραφής του προγράμματος
Για
να καταλάβετε ακριβώς την χρησιμότητα του, κοιτάξτε το
5
9
Ledflas.asm
Ορισμός κατάστασης των LED για την παραγωγή των εφφέ
;************* Pattern Data Definition ****************
; '1':OFF '0':ON
Επειδή
η οδήγηση ‘άναμμα’ των
led
θα γίνεται σε οκτάδες προκαθορίζουμε τον κάθε ένα σχηματισμό και του δίνουμε
και ένα όνομα για να μπορούμε να τον χρησιμοποιήσουμε μετέπειτα.
Έναρξη προγράμματος
;**************** Program Start ***********************
Μετά
το
Power on
ο μικροεπεξεργαστής
αρχίζει να εκτελεί τις εντολές που έχει αποθηκευμένες στην μνήμη του από
την διεύθυνση μηδέν
‘Address
0’.
Σε
περίπτωση που χρησιμοποιούμε
Interrupts
η εκτέλεση
των εντολών αρχίζει από την διεύθυνση τέσσερα.
Λειτουργία αρχικοποίησης
;**************** Initial Process *********************
Μετά
το
Power on
του
μικροεπεξεργαστή όλα τα ποδαράκια εισόδου-εξόδου (RA0-RA4
& RB0-RB7)
είναι
ρυθμισμένα σαν είσοδοι.
Σε
αυτό το σημείο καθορίζουμε ποια από αυτά θέλουμε σαν εισόδους και ποια σαν
εξόδους.
Λειτουργία σάρωσης των διακοπτών
;**************** Key Scan Process ********************
Η ρουτίνα
αυτή ελέγχει την κατάσταση στα ποδαράκια εισόδου (RA0-RA4),
εάν
κανένας διακόπτης δεν πατηθεί τότε οι είσοδοι βρίσκονται δε υψηλό δυναμικό
(Hi
+5V)
και
η σάρωση των διακοπτών επαναλαμβάνεται.
Αν
κάποιος διακόπτης πατηθεί, η αντίστοιχη είσοδος θα βρεθεί σε χαμηλό δυναμικό
(Lo
0V)
και
το εφφέ που έχουμε προγραμματίσει θα εμφανιστεί στα
led.
Αν
πατηθούν περισσότεροι του ενός διακόπτες τότε τα εφφέ τους θα εμφανιστούν
στα
led
με
σειρά προτεραιότητας.
Υπορουτίνα ελέγχου της οδήγησης των LED
;*********** Pattern 0 Output Subroutine ***************
Για
κάθε εφφέ υπάρχει και μία υπορουτίνα. Το εφφέ εμφανίζεται στις εξόδους
(RB0-RB7)
ανά
100
μιλισεκόντ (100mSec)
Θα
μπορούσαμε να τροποποιήσουμε το πρόγραμμα έτσι ώστε να καταλαμβάνει λιγότερο
χώρο στην μνήμη του μικροεπεξεργαστή με την δημιουργία υπορουτίνας χρόνου
100mSec
και
την χρήση της εντολής ‘Call’.
Σε
αυτή την περίπτωση θα έπρεπε απαραίτητα να λάβουμε υπόψη μας τον καταχωριτή
΄Σωρού’ (Stack
register)
ο οποίος
για τον
PIC
16F84A
μπορεί
να κρατήσει μέχρι και οκτώ (8)
διευθύνσεις επιστροφής του μετρητή προγράμματος
(Program
counter)
μετά
το τέλος κάθε υπορουτίνας.
Στο
πρόγραμμά μας ο καταχωριτής σωρού (Stack)
λειτουργεί
ως εξής:
| Σωρός |
Εντολή "Call" |
Διεύθυνση επιστροφής |
| 1 |
Call LED blink processing from
the key scan |
Key scan |
| 2 |
Call 1 sec timer from the LED blink
processing. |
LED blink processing |
| 3 |
Call 500 msec timer from the 1
sec timer. |
1 sec timer |
| 4 |
Call 100 msec timer from the 500
msec timer. |
500 msec timer |
| 5 |
Call 1 msec timer from the 100
msec timer. |
100 msec timer |
Υπορουτίνα δημιουργίας χρονικής καθυστέρησης
;********************************************************
; Timer Subroutine for 10MHz clock
;********************************************************
Πολλές
φορές χρειάζεται μέσα στη ροή του προγράμματος να υπάρξουν κάποιες καθυστερήσεις,
δηλαδή ο μικροεπεξεργαστής να μην κάνει τίποτα ουσιαστικό. Αυτό μπορεί να
γίνει είτε σταματώντας το χρονισμό του (Sleep
mode),
και
την χρήση των
interrupt,
είτε
με τον ενσωματωμένο
timer
ή πιο απλά εκτελώντας κάποιες εντολές όπως η
‘Nop’
που
θα μας δημιουργήσουν την ζητούμενη καθυστέρηση.
Σε
αυτό το πρόγραμμα δημιουργούμε την καθυστέρηση με την χρήση εντολών.
|
Υπέρ |
Κατά |
| Software timer |
Σχετικά απλή διαδικασία |
Κατά την διάρκεια της καθυστέρησης
είναι δύσκολο να εκτελεστούν άλλες υπορουτίνες. Κατάληψη περισσότερης
μνήμης. Δύσκολος & ανακριβείς υπολογισμός της καθυστέρησης.
|
| Hardware timer |
Ακρίβεια - παράλληλη εκτέλεση άλλων
εργασιών |
Πολύπλοκος προγραμματισμός
με χρήση ειδικών καταχωριτών (Special registers) |
Για
καθυστέρηση ενός μιλισεκόντ
(1mSec)
και
κρύσταλλο
10MHz,
η περίοδος είναι
0,1
μικροσεκόντ
(0.1μSec)
τέσσερα
(4)
δια
10
μας
δίνει ‘κύκλο μηχανής’ εκτέλεση κάθε εντολής σε χρόνο
0,4
μικροσεκόντ
(0,4μSec).
Άρα
σε χρόνο
1mSec
θα
γίνουν
2500
κύκλοι.
Αναλυτικότερα
[
1/10MHz=0.1μSec
4/10MHz=0.4μSec
1mSec=1000μSec
1000μSec/0.4μSec=2500
cycles ]
Για
καθυστέρηση
100
μιλισεκόντ
(100mSec)
επαναλαμβάνουμε
την υπορουτίνα του
1
μιλισεκόντ εκατό φορές
(1mSecΧ100=
100mSec)
Για
500
μιλισεκόντ
επαναλαμβάνουμε την υπορουτίνα των εκατό μιλισεκόντ πέντε φορές (100mSecX5=
500mSec)
Και
για το ένα δευτερόλεπτο επαναλαμβάνουμε την υπορουτίνα των πεντακοσίων μιλισεκόντ
δυο φορές (500mSecX2=
1000mSec=1Sec)
Διαμόρφωση μικροεπεξεργαστή
Το
Configuration Word
με
βάση το πρόγραμμά μας έχει πάρει από τον
Assembler
την
δεκαεξαδική
τιμή
'3FF2'
για τις παρακάτω επιλογές:
| Είδος |
Σημαία |
Συντομογραφία |
Bit(s) |
| Code Protection |
OFF |
CP |
1111111111 |
| Power-up Timer |
ON |
PWRTE(inv) |
0 |
| Watchdog Timer |
OFF |
WDTE |
0 |
| Oscillator Selection |
HS |
FOSC1 and FOSC0 |
10 |
 |