| Home Pic in Greek Παραδείγματα χρήσης Pic Πινακίδα Ι Εξομοίωση |
Πινακίδα Ι - Εξομοίωση
Προετοιμασία Η ανίχνευση σφαλμάτων στο παράδειγμα αυτό γίνεται με την χρήση του εξομοιωτή (Simulator) του MPLAB της Microchip . Αφού έχετε ετοιμάσει ένα project με το όνομα Signboard1.mcp, έχετε εισάγει το PIC16F84A.inc και το Signboard1.asm, μην ξεχάσετε να ανοίξετε το αρχείο Signboard1.lst κάνοντας κλικ στο File > Open >Αρχεία τύπου: All files > Signboard1.lst και τέλος μεταγλωττίστε κάνοντας κλικ στο Project >Make ή κάντε κλικ στο κουμπί Προσθήκη παραθύρων Κάντε κλικ στο View και επιλέξτε τα : File registers , Special function registers, και EEPROM. SFR ( Ειδικοί καταχωρητές ) Καταχωρητές (όλοι) Περιεχόμενα EEPROM Τα δεδομένα που γράφονται από την συσκευή προγραμματισμού στην μνήμη EEPROM, κατά την μεταφορά του κώδικα στον μικροεπεξεργαστή φαίνονται στο παράθυρο EEPROM. Θυμηθείτε πως για να γράψει ο μεταγλωττιστής τα δεδομένα που θέλετε στην EEPROM πρέπει να χρησιμοποιήσετε την εντολή org '2100'h. Στην παρακάτω επεξήγηση οι διευθύνσεις της μνήμης χρησιμοποιούνται για να βλέπετε σε πιο σημείο της λίστας κώδικα βρίσκεται η εντολή που εκτελείται εκείνη την στιγμή. Εκκίνηση (Εξομοίωση αρχικοποίησης) Μηδενισμός μικροεπεξεργαστή (Reset) Κάντε κλικ στο κουμπί , το πρόγραμμα εξομοίωσης (Simulator) του PIC θα κάνει Reset και ο μετρητής προγράμματος (Program counter) θα δείξει PC=0000. Εξομοίωση βήμα—βήμα Κάνοντας κλικ στο κουμπί ο εξομοιωτής εκτελεί την επόμενη εντολή
PC | Λειτουργία εντολής
0000 | : | Μετακίνησε τον μετρητή προγράμματος (Program counter) στην διεύθυνση πέντε PC=00005.
0005 | : | Κάνε στον Status Register το RP0 1. (Αλλαγή κατάστασης από 0 σε 1) με αυτή την εντολή αλλάζει το bank από 0 σε 1.
0006 | : | Μηδένίσε τον καταχωρητή TRISA (TRISA= b'00000'). Όλα τα ποδαράκια της PORTA δηλώνονται σαν έξοδοι
0007 | : | Μηδένίσε τον καταχωρητή TRISB (TRISB= b'00000000'). Όλα τα ποδαράκια της PORTB δηλώνονται σαν έξοδοι
0008 | : | Κάνε τα ψηφία TOCS=0,PSA=0,PS2/1/0=111.
0009 | : | Ρύθμισε τον καταχωρητή OPTION_REG (Γίνεται 07h από FFh).
000A | : | Άλλαξε το bank από 1 σε 0 Ο καταχωρητής Status γίνεται 1Ch από 3Ch.
000B 000C | : | Βάλε σαν τιμή εκκίνησης του TMR0 το μηδέν (00h).
000D 000E | : | Βάλε σαν τιμή μέτρησης για τα interrupt το 12.
000F 0010 0011 | : | Μηδένισε τον καταχωρητή e_adr Ρύθμισε το μέγεθος των δεδομένων της EEPROM να είναι 32 e_adr(21h) = 00h e_check(22h) = 20h
0012 0013 | : | Ενεργοποίησε το interrupt. Κάνε '1' τα ψηφία GIE και T0IE του καταχωρητή INTCON.
Εξομοίωση λειτουργίας οθόνης Μετά το τέλος των αρχικών ρυθμίσεων ακολουθεί η λειτουργία οδήγησης της οθόνης. Εξομοίωση βήμα—βήμα Κάνοντας κλικ στο κουμπί ο εξομοιωτής εκτελεί την επόμενη εντολή
PC | Λειτουργία εντολής
0014 | : | Ενεργοποίησε το interrupt. Το ψηφίο GIE του καταχωρητή INTCON γίνεται '1'.
0015 0016 0017 0018 | : | Βάλε τις τιμές στους καταχωρητές lpcnt και scrnidx (lpcnt=μετρητής για 16 κολώνες Led, scrnidx=κατάσταση Led κολώνας 1 ή 0). lpcnt = 16 scrnidx = 15
0019 | : | Απενεργοποίησε το interrupt. Το ψηφίο GIE του INTCON γίνεται '0'.
001A 001B | : | Βάλε '1' σε όλα τα ποδαράκια της PORTB για να σβήσουν τα Led (με '1' σβήνουν, με '0' ανάβουν).
001C 001D | : | Εμφάνισε στα ποδαράκια της PORTA το σήμα για την οδήγηση του 74HC145. πρώτος δυαδικός αριθμός στην έξοδο της PORTA είναι ο b'1111'.
001E | : | Βάλε στον W την τιμή 16 (10h) σαν πρώτη για τον πίνακα δεδομένων της οθόνης.
001F | : | Πρόσθεσε τις τιμές των scrnidx και scrnhd. το αποτέλεσμα τους είναι η διεύθυνση της μνήμης δεδομένων.
0020 | : | Φόρτωσε την διεύθυνση της μνήμης δεδομένων στον FSR.
0021 | : | Όταν φορτώνεται μία διεύθυνση στον FSR, το περιεχόμενο της μνήμης δεδομένων φορτώνεται στον INDF.
0022 | : | Το περιεχόμενο της μνήμης μεταφέρεται στα ποδαράκια της PORTB για να οδηγήσει την στήλη των Led. Σε αυτό το σημείο δεν υπάρχει αλλαγή στην κατάσταση της PORTB γιατί είναι είδη μηδέν (00h). Μπορείτε να χρησιμοποιήσετε την λειτουργία τροποποίησης (Fill Memory) του εξομοιωτή για να αλλάξετε το περιεχόμενο της EEPROM. Λειτουργία τροποποίησης περιεχομένων μνήμης (Fill memory function) Με αυτή την λειτουργία του εξομοιωτή μπορείτε να αλλάξετε τα περιεχόμενα της μνήμης. Κάντε διπλό κλικ επάνω στο πεδίο που θέλετε να αλλάξετε και πληκτρολογήστε την νέα τιμή.
0023 | : | Αφαίρεσε 1 από την τιμή του scrnidx.
0024 0025 | : | Έλεγξε εάν ολοκληρώθηκε η απεικόνιση του μηνύματος. Όταν το αποτέλεσμα γίνει 0, έχει ολοκληρωθεί το μήνυμα. Εάν το αποτέλεσμα δεν είναι 0, το πρόγραμμα πηγαίνει και εκτελεί ξανά τον κώδικα της ετικέτας scrnlp (001Ah). Ο κύκλος αυτός συνεχίζεται έως ότου το αποτέλεσμα γίνει 0.
0026 | : | Μόλις ολοκληρωθεί η απεικόνιση του μηνύματος πήγαινε στην ετικέτα screen.
Εξομοίωση λειτουργίας διακοπής από υπερχείλιση του TMR0 Εξομοίωση με χρήση σημείων διακοπής ροής κώδικα (Breakpoints) Εισαγωγή σημείων διακοπής ροής κώδικα (Breakpoints) Τα breakpoint μπορούν να εισαχθούν στην εξομοίωση με την ακόλουθη διαδικασία.
(1) | Θέλουμε να εισάγουμε διακοπή ροής (Breakpoint) στη διεύθυνση 0027h (119). Κάντε διπλό κλικ στην εντολή που αντιστοιχεί η διεύθυνση στον εξομοιωτή. Αμέσως στο γκρίζο περιθώριο θα εμφανιστεί το σήμα Β .
(2) |
κάντε δεξί κλικ. στο μενού που θα εμφανιστεί κάντε κλικ στο Set Breakpoint με το αριστερό πλήκτρο του mouse. Η εντολή που είχατε επιλέξει θα έχει τώρα στο γκρίζο περιθώριο το σήμα Β .
Η εισαγωγή του σημείου διακοπής ολοκληρώθηκε.
κάντε κλικ στο κουμπί ή ακολουθήστε τις επιλογές : Debugger > Run. Μετά από σύντομο χρονικό διάστημα ο εξομοιωτής θα φτάσει στην διεύθυνση 0027h του Breakpoint και θα σταματήσει εκεί. Στο MPLAB κατά την εξομοίωση του κώδικα το Status Bar στο κάτω μέρος της οθόνης του Η/Υ δείχνει : Εξομοίωση αποθήκευσης διεύθυνσης στον καταχωρητή σωρού (Stack) που είχε ο PC αμέσως πριν συμβεί η διακοπή. Για να εμφανιστεί το παράθυρο του Stack κάντε κλικ στα: View > Hardware Stack. Εξομοίωση βήμα - βήμα Κάνοντας κλικ στο κουμπί ο εξομοιωτής εκτελεί την επόμενη εντολή.
PC | Λειτουργία εντολής
0027 | : | Αποθήκευσε το περιεχόμενο του W στο w_save.
0028 0029 | : | Αποθήκευσε το περιεχόμενο του STATUS στο s_save.
002A 002B 002C | : | Έλεγξε εάν υπάρχει διακοπή (interrupt), από υπερχείλιση του TMR0
0032 | : | Μηδένισε το ψηφίο TOIF του καταχωρητή INTCON για να μπορέσει να ανιχνευτεί επόμενη διακοπή (interrupt) Παρατηρήστε πώς το ψηφίο T0IF του INTCON γίνεται '0'.
0033 0034 | : | Βάλε την τιμή 0 (00h) στον TMR0
0035 | : | Έλεγξε εάν ολοκληρώθηκαν οι απαιτούμενες (12) υπερχειλίσεις του TMR0 .
Εξομοίωση τερματισμού ρουτίνας διακοπής (interruption ending)
002D | : | Διάβασε το περιεχόμενο του s_save και μετέφερε το στον W.
002E | : | Διάβασε το περιεχόμενο του W και αποθήκευσε το στον STATUS.
002F | : | Μετάθεσε τα δύο μισά του w_save και αποθήκευσε τα στο ίδιο (Με χρήση της εντολής SWAPF) Παρατηρήστε πως τα 4 λιγότερο σημαντικά ψηφία του w_save με τα 4 περισσότερο σημαντικά μετατίθενται. Π.Χ το 11110000 γίνεται 00001111 = Περισσότερο σημαντικά | Λιγότερο σημαντικά.
0030 | : | Μετάθεσε ξανά τα δύο μισά του w_save και αποθήκευσε τα στο W.
0031 | : | Επέστρεψε στο σημείο που σταμάτησε η ροή του προγράμματος όταν συνέβη η διακοπή (interrupt). Παρατηρήστε πως το ψηφίο GIE του καταχωρητή INTCON γίνεται '1', και ότι ο μετρητής προγράμματος (Program Counter) δείχνει την διεύθυνση 21 (015h).
Εξομοίωση λειτουργίας οθόνης Βάλτε ένα σημείο διακοπής (breakpoint), στην εντολή movlw tm_adj (0037h), (140) της υπορουτίνας timer_int. Εξομοίωση βήμα - βήμα Κάνοντας κλικ στο κουμπί ο εξομοιωτής εκτελεί την επόμενη εντολή.
PC | Λειτουργία εντολής
0037 0038 | : | Βάλε την τιμή 12 (0ch) στο tm-cnt
0039 003A | : | Βάλε την τιμή 15 (0fh) στο s_loop
003B 003C | : | Βάλε στο s_index την τιμή 16 (10h)
003D | : | Αύξησε την τιμή του s_index κατά 1 και αποθήκευσε το αποτέλεσμα στον W
003E 003F | : | Φόρτωσε στον FSR την προς ανάγνωση διεύθυνση της EEPROM Παρατηρήστε ότι ο FSR φορτώνεται με την διεύθυνση 11h.
0040 0041 | : | Αποθήκευσε το περιεχόμενο του INDF στον s_work
0042 0043 | : | Φόρτωσε την διεύθυνση αποθήκευσης στον FSR.
0044 | : | Διάβασε το περιεχόμενο του S_WORK και αποθήκευσε το στον INDF.
0045 | : | Αύξησε την τιμή του s_index κατά 1 και αποθήκευσε το αποτέλεσμα στον ίδιο
0046 | : | Μείωσε την τιμή του s_loop κατά 1, και αποθήκευσε το αποτέλεσμα στο ίδιο.
Εάν το αποτέλεσμα δεν είναι 0 πήγαινε στην ετικέτα loop, εάν είναι 0 πήγαινε στην επόμενη υπορουτίνα.
Εξομοίωση με χρήση σημείων διακοπής (breakpoint) Διαγράψτε όλα τα σημεία διακοπής που τυχόν έχετε βάλει, και βάλτε ένα στη διεύθυνση 0048h (161). κάντε κλικ στο κουμπί ή ακολουθήστε τις επιλογές : Debugger > Run. Εξομοίωση βήμα - βήμα Κάνοντας κλικ στο κουμπί ο εξομοιωτής εκτελεί την επόμενη εντολή.
PC | Λειτουργία εντολής
0048 0049 | : | Μετέφερε το περιεχόμενο του s_index στον FSR.
004A 004B | : | Βάλε την διεύθυνση της EEPROM που πρόκειτε να διαβαστεί στον EEADR.
004C | : | Γύρισε στην σελίδα Bank 1. Παρατηρήστε πως το ψηφίο RP0 του καταχωρητη STATUS γίνεται '1'.
004D | : | Ξεκίνησε την ανάγνωση της EEPROM, το ψηφίο RD του καταχωρητή EECON1 '1'
004E | : | Γύρισε στην σελίδα Bank 0. Παρατηρήστε πώς το ψηφίο RP0 του καταχωρητή STATUS γίνεται '0'.
004F 0050 | : | Τα δεδομένα που διαβάστηκαν από την EEPROM αποθηκεύονται στον καταχωρητή EEDATA. Αντέγραψε τα δεδομένα του EEDATA στο W και μετά στον INDF. Παρατηρήστε πώς η κατάσταση των Led αλλάζει σύμφωνα με τα δεδομένα που διαβάστηκαν από την EEPROM.
0051 | : | Πήγαινε στην επόμενη προς ανάγνωση διεύθυνση της EEPROM. Παρατηρήστε πως η τιμή του E_ADR αυξήθηκε κατά 1.
0052 0053 | : | Έλεγξε άν τελείωσαν οι προς ανάγνωση διευθύνσεις της EEPROM. Εάν δεν τελείωσαν πήγαινε στην ετικέτα int_end.
Με την παραπάνω εξομοίωση μπορείτε να δείτε τις αλλαγές που γίνονται στην κατάσταση των Led (αναμένο - σβηστό) για κάθε περίοδο διακοπής (interruption). Στην παρακάτω εικόνα φαίνεται ο τρόπος με τον οποίο κινείται το μήνυμα από δεξιά προς αριστερά.
> > > >     10 11 12 13 14 15 16 17  18 19 1A 1B 1C 1D 1E 1F
> > > >     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
> > > >     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 FF
> > > >     00 00 00 00 00 00 00 00  00 00 00 00 00 00 FF FF
> > > >     00 00 00 00 00 00 00 00  00 00 00 00 00 FF FF E7
> > > >     00 00 00 00 00 00 00 00  00 00 00 00 FF FF E7 C3
> > > >     00 00 00 00 00 00 00 00  00 00 00 FF FF E7 C3 81
> > > >     00 00 00 00 00 00 00 00  00 00 FF FF E7 C3 81 81
> > > >     00 00 00 00 00 00 00 00  00 FF FF E7 C3 81 81 C3
> > > >     00 00 00 00 00 00 00 00  FF FF E7 C3 81 81 C3 E7
> > > >     00 00 00 00 00 00 00 FF  FF E7 C3 81 81 C3 E7 FF
> > > >     00 00 00 00 00 00 FF FF  E7 C3 81 81 C3 E7 FF FF
> > > >     00 00 00 00 00 FF FF E7  C3 81 81 C3 E7 FF FF 7E
> > > >     00 00 00 00 FF FF E7 C3  81 81 C3 E7 FF FF 7E 00
> > > >     00 00 00 FF FF E7 C3 81  81 C3 E7 FF FF 7E 00 7E
> > > >     00 00 FF FF E7 C3 81 81  C3 E7 FF FF 7E 00 7E FF
> > > >     00 FF FF E7 C3 81 81 C3  E7 FF FF 7E 00 7E FF F7
> > > >     FF FF E7 C3 81 81 C3 E7  FF FF 7E 00 7E FF F7 07
> > > >     FF E7 C3 81 81 C3 E7 FF  FF 7E 00 7E FF F7 07 F7
Εξομοίωση λειτουργίας μετά το τέλος της ανάγνωσης της EEPROM. Εξομοίωση με χρήση σημείων διακοπής ( breakpoint) Διαγράψτε όλα τα σημεία διακοπής που τυχόν έχετε βάλει, και βάλτε ένα στη διεύθυνση 0054h (173). κάντε κλικ στο κουμπί ή ακολουθήστε τις επιλογές : Debugger > Run. Εξομοίωση βήμα - βήμα Κάνοντας κλικ στο κουμπί ο εξομοιωτής εκτελεί την επόμενη εντολή.
PC | Λειτουργία εντολής
0054 | : | Μηδένισε το καταχωρητή e_adr
0055 0056 | : | Όρισε το μέγεθος διευθύνσεων της EEPROM με την τιμή 32. αποθήκευσε την τιμή 32 στο E_CHECK.
0057 | : | Πήγαινε στην ετικέτα int_end.