Σαν
βάση χρόνου στο πρόγραμμα αυτό χρησιμοποιούμαι το 1
millisecond. Με
10
MHz χρονισμό
του μικροεπεξεργαστή,
κάθε
2500
κύκλους
μηχανής θα έχει περάσει χρόνος ίσος με
1 millisecond.
Χειροκίνητη
μετάβαση του program
counter σε
διεύθυνση.
Χρησιμοποιώντας
το
Set PC at Cursor μπορούμε
να τοποθετήσουμε χειροκίνητα τον program
counter στην
αρχή της υπορουτίνας Keyscan.
Για
χειροκίνητη τοποθέτηση κάντε δεξί κλικ στο σημείο που θέλετε να πάει ο
PC:
και κάντε κλικ στο Set PC at
Cursor

Δείξτε
με κλικ για
παράδειγμα την διεύθυνση,
(00Ch) (106) κάντε
δεξί κλικ και επιλέξτε με κλικ το
Set PC at
Cursor.
Δείτε
πως ο Program
counter έχει
μεταβεί σε αυτή την διεύθυνση και είναι έτοιμος να εκτελέσει την
εντολή που βρίσκεται εκεί.
Εξομοίωση
βήμα—βήμα
Κάνοντας
κλικ στο κουμπί
ο
εξομοιωτής εκτελεί την επόμενη εντολή.
| PC |
Λειτουργία εντολής |
| 00B5 |
: |
Φόρτώσε το W Register με την τιμή
2 |
| 00B6 |
: |
Φόρτωσε το περιεχόμενο του W Register στoν
καταχωρητή CNT1M |
| 00B7 |
: |
Φόρτώσε το W Register με την τιμή
249 |
| 00B8 |
: |
Φόρτωσε το περιεχόμενο του W Register στoν
καταχωρητή CNT500U |
00B9 00BA |
: |
Μην κάνεις τίποτα, σπατάλησε το χρόνο που
αντιστοιχεί σε ένα κύκλο μηχανής για κάθε εντολή
NOP |
| 00BB |
: |
Μείωσε το περιεχόμενο του καταχωρητή CNT500U
κατά 1, και αποθήκευσε το αποτέλεσμα στον ίδιο. Εάν το
αποτέλεσμα είναι θετικό εκτέλεσε την επόμενη εντολή, εάν είναι 0
εκτέλεσε την μεθεπόμενη |
| 00BC |
: |
Μετακίνησε τον μετρητή προγράμματος (Program
counter) στην διεύθυνση TM1LP2 PC=00B9h, και εκτέλεσε την
πρώτη εντολή |
Με
τις παραπάνω εντολές δημιουργείται ένας κύκλος (Loop) εντολών με σκοπό
την χρονική καθυστέρηση.
Εξομοίωση
με χρήση σημείων διακοπής ροής κώδικα (Breakpoints)
Τα breakpoint μπορούν να εισαχθούν στην εξομοίωση
με την ακόλουθη διαδικασία.
| (1) |
Θέλουμε να εισάγουμε διακοπή ροής (Breakpoint)
στη διεύθυνση 00BFh (301). Κάντε διπλό κλικ στην εντολή που
αντιστοιχεί η διεύθυνση στον εξομοιωτή. Αμέσως στο γκρίζο
περιθώριο θα εμφανιστεί το σήμα
Β . |
(2)
 |
κάντε δεξί κλικ.
 στο μενού που θα
εμφανιστεί κάντε κλικ στο Set Breakpoint με το αριστερό πλήκτρο
του mouse .
Η εντολή
που είχατε επιλέξει θα έχει τώρα στο γκρίζο περιθώριο το
σήμα Β . |
Η εισαγωγή
του σημείου διακοπής ολοκληρώθηκε.
κάντε
κλικ στο κουμπί
ή ακολουθήστε τις επιλογές :
Debugger > Run.
Μετά από σύντομο χρονικό διάστημα
ο εξομοιωτής θα φτάσει στην διεύθυνση 00BFh του Breakpoint και θα
σταματήσει εκεί.
Στο MPLAB κατά την εξομοίωση του
κώδικα το Status Bar στο κάτω μέρος της οθόνης του Η/Υ δείχνει
:

Η εξομοίωση κώδικα που
κάνει το MPLAB είναι κατά πολύ πιο αργή από την εκτέλεση κώδικα που
κάνει ο μικροεπεξεργαστής. Η εξομοίωση του 1-millisecond στον
υπολογιστή διαρκεί περίπου 1 δευτερόλεπτο.(Δηλαδή 1000 φορές
περισσότερο) φυσικά εξαρτάται και από τον τύπο του υπολογιστή που
χρησιμοποιείται για την εξομοίωση.
Έλεγχος των
κύκλων μηχανής και του χρόνου που έχει διανυθεί με τη χρήση του
Stopwatch
Για να λειτουργεί σωστά το Stopwatch είναι
απαραίτητο το Prossesor Frequency που εμφανίζει να είvαι
το ίδιο με αυτό που θα χρησιμοποιηθεί στην κατασκευή.
Η ρύθμιση του Prossesor
Frequency στο MPLAB (Ver6.13) γίνεται από τα:
Debugger >
Settings... .
Για την εμφάνιση του Stopwatch ακολουθήστε τις
επιλογές Debugger > Stopwatch
.
Παρακάτω αναλύεται η διαδικασία
επαλήθευσης της καθυστερήσεις του 1 milisecond
| (1) |
Μετακινήστε τον μετρητή προγράμματος
(Program counter) στην διεύθυνση T1M PC=00C2h
(307) |
| (2) |
Εισάγεται ένα breakpoint στη
διεύθυνση 00C3 (308). |
| (3) |
Εμφανίστε το παράθυρο stopwatch. Εάν
το Cycles και το Time δεν είναι 0, κάντε κλικ στο
κουμπί [Zero] |
| (4) |
Κάντε κλικ στο κουμπί
|
(5)
 |
Παρατηρείστε τα
ακόλουθα:
Μετά τη διακοπή της εξομοίωσης στο
Breakpoint, έχουν μετρηθεί 2503 κύκλοι μηχανής και ο χρόνος που
διανύθηκε είναι 1 milisecond.
Παρατηρείστε πως υπάρχει
απόκλιση τριών (3) κύκλων μηχανής, κανονικά θα έπρεπε να είναι
2500 και όχι 2503, διότι ένας κύκλος μηχανής =0,4μSEC επί
2500Cycles =
1mSEC
|
Η χρονική καθυστέρηση με την χρήση
εντολών και κύκλων μηχανής δεν είναι ακριβείς. Η υπορουτίνα του
1second τρέχει την υπορουτίνα του 1milisecond χίλιες φορές. Με
απόκλιση ενός κύκλου μηχανής στην υπορουτίνα του 1milisecond
παρουσιάζεται λάθος τάξης, 1000 κύκλοι μηχανής στο 1second. Επίσης η
χρήση των εντολών Call, Goto(εκτελείτε σε 2 κύκλους μηχανής) κ.λ.π θα
πρέπει να υπολογιστούν για το σύνολο του χρόνου.
Παρακάτω φαίνεται πως
χρειάστηκαν, 2.506.101 κύκλοι μηχανής για να διανυθεί ένα
δευτερόλεπτο. Σε ένα μέσο υπολογιστή ο εξομοιωτής για να παράγει το
1sec χρειάζεται περίπου 18 λεπτά.
(Με το δικό μου υπολογιστή MSI KT400 Ultra,
AMD 1800+, DDR Ram 1024Mb, HDD-80Gb, έκανε μόλις 3,82
Δευτερόλεπτα.)