Home Pic in Greek Παραδείγματα χρήσης Pic Εφφέ με 8 Led   Ανάλυση προγράμματος


 

Εφφέ με 8 Led  - Ανάλυση προγράμματος


 
Τίτλος προγράμματος
;************************************************************************
;									*
;            Εφφέ με οκτώ 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