Εργαστήριο Δομής και Λειτουργίας Μικροϋπολογιστών Βοήθημα για την εργαστηριακή άσκηση 8: Διακοπές του 8051 οφειλόμενες στους απαριθμητές του Βήμα προετοιμασίας: Προσθέστε την εντολή LJMP 0100H στη διεύθυνση 0000h της ROM. Άσκηση 1 (LOAD -> AVOCET -> 8_1) 2. Μην πειράξεις την περίοδο του Τ0 (δηλ. χρησιμοποίησε την εξ ορισμού (default) τιμή) 3. Κάνε κάτι κάθε φορά που ο Τ0 υπερχειλίζει Τι συμβαίνει κατά την υπερχείλιση στην παρούσα άσκηση; Μέτρηση των υπερχειλίσεων 1. (010Εh) SETB ET0, ενεργοποίηση των διακοπών του Τ0 (0110h) SETB EA, ενεργοποίηση του γενικού διακόπτη επίτρεψης των διακοπών 2. (0300h) ROUT: INC P0, αρχή της ρουτίνας καταμέτρησης (0302h), τέλος της ρουτίνας καταμέτρησης 3. (000Β h) LJMP ROUT, είναι η θέση του ανύσματος διακοπών που αφορά στις διακοπές του T0 Άσκηση 2α (LOAD -> AVOCET -> 8_2a) 2. Μην πειράξεις την περίοδο του Τ0 (δηλ. χρησιμοποίησε την εξ ορισμού (default) τιμή) 3. Κάνε κάτι κάθε φορά που ο Τ0 υπερχειλίζει Τι συμβαίνει κατά την υπερχείλιση στην παρούσα άσκηση; Δειγματοληψία της P1 και αποθήκευση σε λίστα 1. (0103h) SETB ET0, ενεργοποίηση των διακοπών του Τ0 (0105h) SETB EA, ενεργοποίηση του γενικού διακόπτη επίτρεψης των διακοπών 2. (0110h) MOV R0, #40h, η αρχή της λίστας 3. (0300h) ROUT: MOV @R0, P1, αποθήκευση της δειγματοληπτούμενης τιμής στη λίστα (0302h), μετάβαση στην επόμενη θέση της λίστας (0303h) Άσκηση 2β (LOAD -> AVOCET -> 8_2b) 2. Η νέα περίοδος του Τ0 να ισούται με α φορές την εξ ορισμού (default) τιμή υπερχείλισης (65536 στην περίπτωση του mode 1) Τι συμβαίνει κατά την ολοκλήρωση της νέας περιόδου στην παρούσα άσκηση; 1
1. (0300h) ROUT: INC R4, o R4 μετρά τις υπερχειλίσεις του Τ0 (0301h) CJNE R4, #05h, TELOS, αν δεν έχει ολοκληρωθεί η νέα περίοδος μην κάνεις τίποτα (δηλαδή στη συγκεκριμένη άσκηση a=5 ). (0304h) MOV @R0, P1, αν έχει ολοκληρωθεί η νέα περίοδος δειγματολήπτησε την P1 (0306h), μετακίνηση του δείκτη της λίστας στην επόμενη θέση (0307h) MOV R4, #00h, μηδενισμός του μετρητή υπερχειλίσεων (0309h) TELOS: ή εναλλακτικά ROUT: DJNZ R4, TELOS MOV @R0, P1 MOV R4, #05h TELOS: σε συνδυασμό με τοποθέτηση της MOV R4, #05h στο τμήμα αρχικοποιήσεων του κυρίως προγράμματος. Άσκηση 2γ (LOAD -> AVOCET -> 8_2c) 2. Η νέα περίοδος του Τ0 να είναι μικρότερη της εξ ορισμού (default) τιμής υπερχείλισης (65536 στην περίπτωση του mode 1) Τι συμβαίνει κατά την ολοκλήρωση της νέας περιόδου στην παρούσα άσκηση; Ποια είναι η νέα περίοδος στο συγκεκριμένο πρόγραμμα; 20000 Πώς θα βρώ την τιμή επαναφόρτωσης προσεγγιστικά; 65536 20000 = 45536 = B1E0H. Τι μορφή θα πάρει τώρα η ρουτίνα ROUT; Πρώτα φροντίζουμε για τη διαδικασία της επαναφόρτωσης και μετά για οτιδήποτε άλλο. (0300h) ROUT: CLR TR0, «πάγωμα» του Τ0 (διάρκεια: 1 κύκλος μηχανής) (0302h) MOV TH0, #B1h, επαναφόρτωση του Τ0 (διάρκεια: 2 κύκλοι μηχανής) (0305h) MOV TL0, #E0h, επαναφόρτωση του Τ0 (διάρκεια: 2 κύκλοι μηχανής) (0308h) SETB TR0, επανενεργοποίηση του Τ0 (030Αh) MOV @R0, P1, πραγματοποίηση της δειγματοληψίας (030Ch) (030Dh) Είναι προσεγγιστική η τιμή της επαναφόρτωσης; Ναι είναι! Ποιο είναι το πραγματικό πλήθος κύκλων μηχανής που μεσολαβεί μεταξύ δύο διαδοχικών κλήσεων της ROUT; Το πραγματικό πλήθος των κύκλων μηχανής είναι 20009! Οι 9 επιπλέον κύκλοι μηχανής αναλύονται ως εξής: 1. 2 κύκλοι μηχανής για μετάβαση στο άνυσμα διακοπών 2. 2 κύκλοι μηχανής για μετάβαση στη ROUT 3. 5 κύκλοι μηχανής για το χρόνο που περνά όσο ο Τ0 είναι «παγωμένος» 2
Ποια η ακριβής τιμή επαναφόρτωσης; 45536 + 9 = Β1Ε0h + 09h = B1E9h Άσκηση 2δ (LOAD -> AVOCET -> 8_2d) 2. Η νέα περίοδος του Τ0 να είναι μεγαλύτερη της εξ ορισμού (default) τιμής υπερχείλισης, όχι όμως πολλαπλάσιο αυτής (διότι τότε μεταπίπτουμε στην περίπτωση της άσκησης 2β) Τι συμβαίνει κατά την ολοκλήρωση της νέας περιόδου στην παρούσα άσκηση; Ποια είναι η νέα περίοδος στο συγκεκριμένο πρόγραμμα; 400000 1. Γράψε τη νέα περίοδο ως γινόμενο δύο παραγόντων εκ των οποίων ο ένας να είναι μικρότερος από την εξ ορισμού (default) τιμή υπερχείλισης (65536 στην περίπτωση του mode 1). Για παράδειγμα 400000 = 40000 x 10 2. Συνδύασε τις μεθοδολογίες των ασκήσεων 2β, 2γ. Δηλαδή προσδιορισμός κατάλληλου α (εδώ α = 10) και προσδιορισμός κατάλληλης σταθεράς επαναφόρτωσης για τον Τ0 (εδώ 65536 40000 = 25536 = 63C0h). Τι μορφή θα πάρει τώρα η ρουτίνα ROUT; Πρώτα φροντίζουμε για τη διαδικασία της επαναφόρτωσης και μετά για οτιδήποτε άλλο. (0300h) ROUT: CLR TR0, «πάγωμα» του Τ0 (διάρκεια: 1 κύκλος μηχανής) (0302h) MOV TH0, #63h, επαναφόρτωση του Τ0 (διάρκεια: 2 κύκλοι μηχανής) (0305h) MOV TL0, #C0h, επαναφόρτωση του Τ0 (διάρκεια: 2 κύκλοι μηχανής) (0308h) SETB TR0, επανενεργοποίηση του Τ0 (030Ah) INC R4 (030Bh) CJNE R4,#0Ah, TELOS, έχει επιτευχθεί η τιμή «α»; (030Εh) MOV @R0, P1, αν ναι, τότε πραγματοποίηση της δειγματοληψίας (0310h) (0311h) MOV R4, #00h (0313h) TELOS: Είναι προσεγγιστική η τιμή της επαναφόρτωσης; Ναι είναι! Ποιο είναι το πραγματικό πλήθος κύκλων μηχανής που μεσολαβεί μεταξύ δύο διαδοχικών κλήσεων της ROUT; Το πραγματικό πλήθος των κύκλων μηχανής είναι 40009! (Δες την ανάλυση παραπάνω στην άσκηση 2β) Ποια η ακριβής τιμή επαναφόρτωσης; 25536 + 9 = 63C0h + 09h = 63C9h Άσκηση 3 (LOAD -> AVOCET -> 8_3a) Τι κάνει; Η διακοπή ΙΝΤ0 προκαλεί αποθήκευση της τιμής του T1 στον DPTR Τι να προσέξω; Ο Τ1 πρέπει να «παγώσει» πριν από την καταγραφή της τιμής του. Τι μορφή θα πάρει τώρα η ρουτίνα ROUT; (0300h) CLR TR1, «πάγωμα» του Τ1 (διάρκεια: 1 κύκλος μηχανής) MOV DPL, TL1, καταγραφή του Τ1 (διάρκεια: 2 κύκλοι μηχανής) MOV DPH, TH1, καταγραφή του Τ1 (διάρκεια: 2 κύκλοι μηχανής) 3
MOV TL1, #00h, μηδενισμός του Τ1 (διάρκεια: 2 κύκλοι μηχανής) MOV TH1, #00h, μηδενισμός του Τ1 (διάρκεια: 2 κύκλοι μηχανής) SETB TR1, επανενεργοποίηση του Τ1 Υπάρχει υστέρηση χρόνου κατά την καταγραφή της τιμής του T1 στον DPTR; Ναι! Δηλαδή αν Τ 1 είναι η τιμή του Τ1 κατά την άφιξη της ΙΝΤ0, τότε στον DPTR καταγράφεται η τιμή DPTR = Τ 1 + Δt Πόση είναι η υστέρηση; Δt = +4 κύκλοι μηχανής. Και που οφείλεται αυτό; Στο χρόνο που μεσολαβεί έως και την εντολή CLR TR1, που «παγώνει» τον Τ1 για να γίνει η καταγραφή. Ο χρόνος αυτός αναλύεται ως: 1. 2 κύκλοι μηχανής για μετάβαση στο άνυσμα διακοπών 2. 2 κύκλοι μηχανής για μετάβαση στη ROUT Σημείωση: Kατά την εντολή CLR TR1 o T1 δεν μετράει, «παγώνει» άμεσα. Πόσος χρόνος μεσολαβεί πραγματικά μεταξύ δύο διαδοχικών αρνητικών ακμών ; ΙΝΤ0 1. Όσος χρόνος έχει καταγραφεί στον Τ1 συν 2. όσος χρόνος πέρασε από: την έλευση της πρώτης από τις δύο διακοπές έως: τη στιγμή της επανενεργοποίησης του Τ1, 3. Ο χρόνος του σημείου 2 παραπάνω ισούται με 13 κύκλους μηχανής ( = 4 κύκλοι μηχανής έως την αρχή της ROUT + 9 κύκλοι μηχανής έως την επανενεργοποίηση του Τ1) 3. Συμβολικά, ο χρόνος μεταξύ δύο διαδοχικών αρνητικών ακμών ΙΝΤ0 ισούται με t ΔInt = T 1 + 13 = T 1 + 4 + 9. Τι υπολογισμοί χρειάζονται για τη βελτίωση της ακρίβειας του αποτελέσματος; Όπως είπαμε παραπάνω: t ΔInt = T 1 + 13 = T 1 + 4 + 9 και DPTR = T 1 + 4. συνεπώς t ΔInt = DPTR + 9. Δηλαδή η τιμή του DPTR πρέπει να ενημερωθεί κατά 9 μονάδες για μέγιστη ακρίβεια. Άσκηση 3γ (για το σπίτι) Τι πρέπει να κάνει; Να τροποποιεί την άσκηση 3 ώστε να καταγράφεται σε λίστα στη μνήμη, το πλήθος των τυχόντων υπερχειλίσεων του Τ1 μεταξύ δύο διαδοχικών αφίξεων της διακοπής ΙΝΤ0 μαζί με την τιμή του DPTR της άσκησης 3. Τι αλλαγές πρέπει να γίνουν; 1. Ενεργοποίηση των διακοπών του Τ1. Η σχετική ρουτίνα εξυπηρέτησης διακοπής θα είναι η πολύ απλή: ROUT1: INC R4 η οποία πραγματοποιεί καταμέτρηση των υπερχειλίσεων του Τ1. Το τρέχον πλήθος υπερχειλίσεων φυλάσσεται στον R4. 2. Χρησιμοποίηση κάποιου καταχωρητή, έστω του R0, ως δείκτη στη μνήμη για τις ανάγκες τις λίστας. 3. Αρχικοποίηση των R0, R4 στο τμήμα αρχικοποιήσεων του προγράμματος ως εξής: MOV R0, #40h, η λίστα ξεκινά στη διεύθυνση 40h της μνήμης MOV R4, #00h 4. Ενημέρωση της ρουτίνας ROUT που εξυπηρετεί τη διακοπή INT0 ώστε να πραγματοποιεί την καταγραφή στη λίστα. Ο κώδικα γι αυτή τη διαδικασία θα μπορούσε να είναι ο εξής: 4
ROUT:. MOV @R0, DPL MOV @R0, DPH MOV @R0, R4 MOV R4, #00h, Μηδενισμός του πλήθους των υπερχειλίσεων 5