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.