ΑΣΚΗΣΗ 1 η 1. Να γραφεί πρόγραµµα σε µνηµονική γλώσσα assembly 8085, υπό µορφή υπορουτίνας, (µε τις απαραίτητες αρχικοποιήσεις), που να γεµίζει τις θέσεις µνήµης RAM από 3400-37FF Hex, µε περιεχόµενα αυξηµένα κάθε φορά κατά ένα, και αρχική τιµή το µηδέν (υποχρεωτικά τα σχόλια). 2. Εάν η κεντρική µονάδα επεξεργασίας εργάζεται µε ένα κρύσταλλο 4ΜΗz, σε πόσο χρόνο ολοκληρώνεται η παραπάνω διαδικασία; Υπόδειξη για τη Λύση 1. (α) Αρχικοποίηση START_ADDR EQU 3400H END_ADDR1_LOW EQU 00H ;Η διεύθυνση τέλους +1 (low byte) END_ADDR1_HIGH EQU 38H Η διεύθυνση τέλους +1 (high byte) (b) Γέµισµα θέσεων µνήµης RAM LXI H, START_ADDR MVI B,0 CALL FILL_MEMORY ;Ο καταχωρητής Β διατηρεί το περιεχόµενο που αυξάνεται FILL_MEMORY: PUSH PSW PUSH H PUSH B ;Αποθήκευση όλων των καταχωρητών που χρησιµοποιούµε στο σωρό. DO_FLMEM: MOV M,B INR B INX H ; Οι HL δείχνουν την επόµενη θέση µνήµης MVI A, 38H CMP H JNZ DO_FLMEM ; POP B ; Ανάκτηση καταχωρητών απο το σωρό. POP H POP PSW RET 2. Για να υπολογισθεί ο χρόνος ολοκλήρωσης της παραπάνω διαδικασίας πρέπει να γνωρίζουµε τον αριθµό των T states (T S ) της κάθε εντολής του παραπάνω προγράµµατος. Έτσι έχουµε : (a)για τις πρώτες 5 εντολές ( τµήµα FILL_MEMORY) εχουµε : T FILL_MEMORY = 12+12+12+7+10= 53 T S (b) Για τις ακόλουθες µέχρι το πρώτο JNZ (εσωτερικός βρόχος-intl) Τ DO =7+4+6+4+7= 28T S Ο βρόχος αυτός εκτελείται 400H φορές οπότε ο συνολικός χρόνος για την εκτέλεση του εσωτερικού βρόχου είναι: T intl =(400H)x28=28672T S.
(c) Το πρώτο JNZ δέν υλοποιείται (αληθεύει) τρείς φορές (στα 3500H, 3600H, 3700H) και υλοποιείται (δέν αληθεύει) (400H-3) φορές Έτσι : T JNZ1 = (3x7)+(400H-3)x10=10231T S. (d) Μετά το πρώτο JNZ και πρίν το τελικό τµήµα (µε τα POP) εκτελείται 3 φορές µε το JNZ να κάνει branch και µία χωρίς να κάνει branch. Αρα έχουµε : T JNZ2 =(4+7+10)x3+(4+7+7)x1=63+18=81T S. (e) Τέλος έχουµε το τελικό τµήµα (µε τα POP) που εχει χρόνο εκτέλεσης: T final =(10+10+10+10)xT S =40T S. Έτσι ο συνολικός χρόνος είναι: T=T FILL_MEMORY +T DO +T JNZ1 +T JNZ2 +T final =39077T S Ο κρύσταλλος των 4MHz έχει εσωτερική συχνότητα 2 MHz που δίνει T S =0,5 µs Ετσι παίρνουµε T=39077x0,5 µs= 19,538.5 µs ΑΣΚΗΣΗ 2 η Σε ένα µικροϋπολογιστικό σύστηµα, που η σχεδίασή του έχει γίνει µε την CPU 8085, (µε µνήµη EPROM 32Κ από 0-7FFF Hex, και µνήµη RAM 32K από 8000-FFFF Hex), υπάρχει σαν περιφερειακό και ένα ολοκληρωµένο 8155. Η θύρα Α του 8155 (που έχει διεύθυνση επιλογής την 81 Hex), τροφοδοτείται µε δεδοµένα από ένα παρόµοιο ολοκληρωµένο, που βρίσκεται σε ένα άλλο σύστηµα, κάνοντας χρήση των σηµάτων χειραψίας, όπως φαίνεται και στο παρακάτω σχήµα. Το σήµα εξόδου Α INTR, είναι συνδεδεµένο στην ακίδα RST6.5 της CPU, και ενεργοποιείται κάθε φορά που η θύρα Α λαµβάνει δεδοµένα από το εξωτερικό περιβάλλον. Η υπορουτίνα εξυπηρέτησης του interrupt RST6.5, µετά την εκτέλεσή της βγάζει στην ακίδα PC3 της θύρας C, το αποτέλεσµα της λογικής που φαίνεται στο σχήµα.
+ 5 VDC VCC 8155 PA0 PA1 PA2 PA3 PA4 PA5 SOFTWARE ΠΥΛΗ NAND 8 ΕΙΣΟ ΩΝ PA6 PA7 RST 6.5 PC0 PC1 PC2 PC3 A INTR A BF A STR GND Ζητούνται: 1. Να γραφεί σε γλώσσα assembly (µε σχόλια), το πρόγραµµα εκκίνησης µε τις απαραίτητες προφυλάξεις, και µε την λογική ότι ο κώδικας σας θα εκτελείται από την µνήµη EPROM του συστήµατος. 2. Το πρόγραµµα σε γλώσσα assembly (µε σχόλια), της υπορουτίνας που εξυπηρετεί το σήµα διακοπής RST6.5, µε την πρόσθετη λογική, ότι φυλάει τις 16 τελευταίες τιµές που διάβασε από την θύρα Α του 8155, στις θέσεις µνήµης 9000-900F Hex, µε κυκλικό τρόπο. Υπόδειξη για Λύση 1. Θα αρχικοποιήσουµε τον 8155 µε τη θύρα C σε ALT3 (χειραψία στη θύρα Α). Επίσης η Α είναι είσοδος, η Β είσοδος (δεν ενδιαφέρει) µε ενεργοποίηση της Α ΙNTR και απενεργοποίηση τη2 B INTR. Σταµατάµε επίσης τον timer. Λαµβάνοντας υπ όψιν τα παραπάνω η αρχικοποίηση έχει ώς εξής: MVI A, 01010100 b OUT 80H ; command register Σχετικά µε το ερώτηµα 2 παρακάτω, χρειάζονται να αρχικοποιηθούν δύο θέσεις µνήµης οπου θα διατηρείται δείκτης για τα δεδοµένα στον κυκλικό buffer. Εστω οι θέσεις 9010Η, 9011 Η. Έτσι το πρόγραµµα έχει τη µορφή: MAIN: LXI H, 9000H SHLD 9010H RIM ORI 00001000 ANI 11111101 SIM MVI A, 01010100 B OUT 80H EI JMP MAIN ; buffer start ; pointer storage ; set το MSE ; clear τη µάσκα RST6.5
Είναι πολύ βασικό να τοποθετήσουµε ενα JUMP στη θέση 0034H (που αντιστοιχεί στο RST6.5) Που να καταλήγει στο πρόγραµµα χειρισµού του Interrupt (INTR_RST65) Έχουµε δηλαδη : ORG JMP 0034H INTR_RST65 2. Το πρόγραµµα έχει ως εξής: INTR_RST65: PUSH PSW IN 81H CALL SAVE_A CPI FFH JZ PC3_1 CMA MVI A, 08H JMP EXODOS ;σώζει την τιµή του Α στον buffer ;υλοποίηση AND ;υλοποίηση NAND PC3_1 MVI A, 00H EXODOS OUT 83H ;έξοδος για το PC3 POP PSW EI RET SAVE_A: PUSH PSW LHLD 9010H ; βαλε τον pointer στον H-L MOV M,A ; σώσε τον Α INX H ;πήγαινε στην επόµενη θέση MOV A,L CPI 10H ; έλεγξε αν η επόµενη θέση είναι η 9010H JNZ COMPLETE MVI L,0 ;µηδενισµός του low byte ώστε (HL)=9000H COMPLETE SHLD 9010H ; αποθήκευση του δείκτη POP PSW RET
ΑΣΚΗΣΗ 3 η α) Να αναλύσετε τις διαφορές σύγχρονης και ασύγχρονης σειριακής µετάδοσης, όσον αφορά τον συγχρονισµό ποµπού-δέκτη. β) Εάν έχετε να µεταδώσετε K bytes σε κανάλι µε σφάλµατα ποια είναι η καλύτερη µέθοδος σειριακής µετάδοσης και µε ποια χαρακτηριστικά ; γ) Να προτείνετε µέθοδο υλοποίηση ασύγχρονης σειριακής µετάδοσης (1stop bit, B bits/sec) χρησιµοποιώντας το 8255. Πως καθορίζεται το µέγιστο Β (ταχύτητα µετάδοσης) ; Υπόδειξη για Λύση α) Στην ασύγχρονη µετάδοση, δεν έχουµε συνεχή µετάδοση δεδοµένων µε σταθερό ρυθµό. Γι αυτό και κάθε χαρακτήρας που αποστέλλεται, συνοδεύοντας και από κάποια bits στην αρχή και στο τέλος του, τα οποία ορίζουν για το δέκτη, την αρχή και το τέλος της µετάδοσης. Ετσι, στην αρχή ενός χαρακτήρα προστίθεται ένα start bit, το οποίο οριοθετεί την έναρξη της µετάδοσης και ουσιαστικά είναι σηµείο αναφοράς για τη θέση των υπόλοιπων bits. Σηµειώνεται δε, πως ο χαρακτήρας start-bit είναι ένα λογικό 0 γιατί η γραµµή πριν από την αποστολή βρίσκεται σε 1 (IDLE). Το τέλος του χαρακτήρα κατά την ασύγχρονη µετάδοση, οριοθετείται από stop bits (1, 1.5 ή 2 κατ επιλογήν). Για να έχουµε συγχρονισµό ποµπού-δέκτη επιπλέον, πρέπει να στοχεύουµε στο µέσο ενός bit πληροφορίας, ώστε να µην έχουµε απώλεια κάποιου δεδοµένου ή λήψη ίδιου δεδοµένου δύο φορές. Ετσι, αντιµετωπίζονται οι τυχόν µικροµετατοπίσεις της θέσης ενός bit, κατά τη µετάδοσή του. Στη σύγχρονη µετάδοση, τα data οµαδοποιούνται σε block και συνοδεύονται από ένα σήµα χρονισµού clock (ρολόϊ). Το ρολόϊ είναι τετράγωνη περιοδική κυµατοµορφή που έχει συχνότητα ίση µε το ρυθµό µετάδοσης, και αυτό συµβαίνει για να στοχεύουµε στη µέση των bits που έχουν µεταδοθεί για να ανιχνεύουν τις ανερχόµενες και κατερχόµενες παρυφές. Το ρολόϊ αυτό συνήθως παράγεται µε βρόχο κλειδώµατος PLL και κρυσταλλικούς ταλαντωτές. Επίσης, η αναγνώριση της αρχής ενός block γίνεται µε χρήση χαρακτήρων συγχρονισµού (SYN) και για το τέλος του block χρησιµοποιούνται αντίστοιχοι χαρακτήρες stop (ανάλογα µε την κωδικοποίηση που χρησιµοποιούµε). β) Για µετάδοση Kbytes σε κανάλι µε σφάλµατα θα προτιµούσαµε σύγχρονη µετάδοση, γιατί µας παρέχει αποδοτικότερους µηχανισµούς ελέγχου σφαλµάτων απ ότι ο έλεγχος ισοτιµίας που χρησιµοποιείται κατά την ασύγχρονη µετάδοση. Λόγω, όµως, της πολυπλοκότητας στη σχεδίαση, το κόστος και τον περιορισµό ενός µόνο φυσικού καναλιού, για µεταδόσεις σε µεγάλη απόσταση χρησιµοποιείται ο ασύγχρονος τρόπος µετάδοσης. γ) Κατ αρχήν θα πρέπει να προγραµµατίσουµε τη θύρα Α του 8255 ως έξοδο, από την οποία θα µεταδίδονται τα δεδοµένα. Αν επιθυµούµε να χρησιµοποιούµε handshaking σήµατα, τότε η θύρα Α θα προγραµµατιστεί σε mode 1 και η θύρα C UPPER, δηλαδή τα pins PC1-PC4 θα χρησιµοποιηθούν για τα σήµατα χειραψίας. Για να επιτύχουµε σειριακή µετάδοση, η εκποµπή των δεδοµένων θα γίνεται µόνο από µία γραµµή της πόρτας Α, έστω από τη γραµµή ΡΑ 0. Ετσι θα στέλνεται πρώτα το LSB και στη συνέχεια µε µία ολίσθηση θα στέλνεται το αµέσως επόµενο bit κ.τ.λ. Για να επιτύχουµε ταχύτητα µετάδοσης Β, τα bits θα αποστέλλονται ανά χρονικά διαστήµατα Τ=1/Β. Αναλυτικότερα, ο 8085 θα αποστέλλει (OUT) µέσω του Data Bus το δεδοµένο που θέλουµε να µεταδώσουµε, στην πόρτα Α του 8255, η οποία έχει οριστεί σαν έξοδος. Από εκεί θα µεταδίδεται το LSB του δεδοµένου από το ΡΑ 0 και µετά από χρόνο Τ=1/Β, ο µε 8085 θα κάνει µία ολίσθηση (δεξιά) του δεδοµένου κατά 1bit και θα το εξάγει πάλι στην πόρτα Α. Πρίν το LSΒ πρέπει να σταλεί ένα «0» στο PA0 (για χρόνο T=1/B) και στο τέλος του byte
8085 8255 ACC Data D0-D7 PA MSB LSB PA0 Serial Data (µετά το MSB) θα πρέπει να προσθέσουµε και 1 η 1 ½ η 2 stop bits (βλ. Σχήµα) Το µέγιστο Β καθορίζεται από τη συχνότητα ρολογιού του δέκτη, καθώς η συχνότητα πρέπει να είναι 1, 16 ή 64 φορές µεγαλύτερη του χρόνου µετάδοσης για να µην έχουµε σφάλµατα συγχρονισµού κατά τη λήψη.