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


 

Εφφέ με 8 Led  - θεωρητικό κύκλωμα


Προετοιμασία

Η ανίχνευση σφαλμάτων στο παράδειγμα αυτό γίνεται με την χρήση του εξομοιωτή (Simulator) του MPLAB της Microchip


    Αφού έχετε ετοιμάσει ένα project με το όνομα Ledflash.mcp, έχετε εισάγει το PIC16F84A.inc και το Ledflash.asm,

     μην ξεχάσετε να ανοίξετε το αρχείο Ledflash.lst κάνοντας κλικ στο File > Open >Αρχεία τύπου: All files > Ledflash.lst 

     και  τέλος μεταγλωττίστε κάνοντας κλικ στο 

      Project >Make  ή κάντε κλικ στο κουμπί





Στην παρακάτω επεξήγηση οι διευθύνσεις της μνήμης χρησιμοποιούνται για να βλέπετε σε πιο σημείο της λίστας κώδικα βρίσκεται η εντολή που εκτελείται  εκείνη την στιγμή.


Εκκίνηση (Εξομοίωση αρχικοποίησης)

      Το 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 : Φόρτώσε το W Register με την τιμή b11111111.
      0007 : Φόρτωσε το περιεχόμενο του W Register στον TRISA Register. Μόνο τα 5 λιγότερο σημαντικά (Least significant Bits) τον ρυθμίζουν διότι η PORTA έχει 5 ποδαράκια. Σε αυτό το σημείο τα ποδαράκια της PORTA ρυθμίζονται σαν Είσοδοι
      0008 : Μηδένισε τον TRISB Register. Σε αυτό το σημείο τα ποδαράκια της PORTA ρυθμίζονται σαν Έξοδοι
      0009 : Κάνε στον Status Register το RP0 0. (Αλλαγή κατάστασης από 1 σε 0)
      με αυτή την εντολή αλλάζει το bank από 1 σε 0.
      000A : Φόρτώσε το W Register με την τιμή b11111111.
      000B : Φόρτωσε το περιεχόμενο του W Register στην PORTB.




Εξομοίωση σάρωσης διακοπτών και των εφφέ στις εξόδους της PORTB

    Στο επόμενο βήμα ο Program counter παίρνει την τιμή 000Ch. Γίνεται έλεγχος της PORTA για να εξακριβωθεί αν πατήθηκε κάποιος από τους τέσσερις διακόπτες.

    Εξομοίωση βήμα—βήμα

       

      Κάνοντας κλικ στο κουμπί     ο εξομοιωτής εκτελεί την επόμενη εντολή.

      PC  Λειτουργία εντολής
      000C : Εάν το RA0 είναι 0 (πιεσμένος διακόπτης) εκτέλεσε την επόμενη εντολή (address 000Dh ). Εάν είναι 1 εκτέλεσε την μεθεπόμενη.
      000D : Μετακίνησε τον μετρητή προγράμματος (Program counter) στην διεύθυνση PC=0017h, υπορουτίνα PTN0 και εκτέλεσε την πρώτη της εντολή. Επειδή εκτελέστηκε η εντολή call η διεύθυνση (000D + 1 “Return address”)  αποθηκεύτηκε στον καταχωρητή σωρού (STACK). Ελέγξτε τα περιεχόμενα του STACK.

      Το παράθυρο του STACK εμφανίζεται αν κάνετε κλικ στα: 
                                                                                       View > Hardware Stack.

      Η διεύθυνση (000Eh) είναι αυτή που θα τοποθετηθεί ο Program counter μετά την εκτέλεση της εντολής return στο τέλος της υπορουτίνας PTN0

      0017 : Φόρτώσε το W Register με την τιμή b11111110.
      0018 : Φόρτωσε το περιεχόμενο του W Register στην PORTB.
      0019 : Μετακίνησε τον μετρητή προγράμματος (Program counter) στην διεύθυνση PC=00c0h, υπορουτίνα T100M (καθυστέρηση 100-millisecond ) και εκτέλεσε την πρώτη της εντολή. Ελέγξτε τα περιεχόμενα του STACK για να επιβεβαιώσετε ότι η διεύθυνση 001Ah γράφτηκε σαν διεύθυνση επιστροφής από την υπορουτίνα  T100M. 




Εξομοίωση χρονικής καθυστέρησης

    Σαν βάση χρόνου στο πρόγραμμα αυτό χρησιμοποιούμαι το 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 Δευτερόλεπτα.)


       

Το λάθος των 6101 κύκλων μηχανής αντιστοιχεί σε   2.44 milliseconds. Για το παράδειγμα μας δεν υπάρχει πρόβλημα εφόσον δεν απαιτείται ακρίβεια στο χρόνο.