Πίνακας περιεχομένων:
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Στο παρελθόν, έχω γράψει έναν οδηγό για τον τρόπο κατασκευής ενός υπολογιστή που βασίζεται σε Z80 και σχεδίασα το κύκλωμα να είναι όσο το δυνατόν πιο απλοϊκό ώστε να μπορεί να κατασκευαστεί όσο το δυνατόν πιο εύκολα. Έγραψα επίσης ένα μικρό πρόγραμμα χρησιμοποιώντας την ίδια ιδέα της απλότητας. Αυτός ο σχεδιασμός λειτούργησε αρκετά καλά, αλλά δεν ήμουν απόλυτα ευχαριστημένος με αυτό. Ξεκίνησα με την επανεγγραφή ενός προγράμματος για αυτό που του επέτρεψε να προγραμματιστεί κατά τη διάρκεια του χρόνου εκτέλεσης. Αυτό μου επέτρεψε να δοκιμάσω κομμάτια κώδικα χωρίς να χρειαστεί να τον αφιερώσω στην EEPROM, η οποία με τη σειρά της θα απαιτούσε από μένα να επαναπρογραμματίσω το EEPROM. Δεν μου φάνηκε διασκεδαστική ιδέα. Μετά άρχισα να σκέφτομαι χώρους μνήμης. Αν ήθελα να διασυνδέσω ένα κομμάτι υλικού (κυρίως IO), ένα κομμάτι κώδικα θα μπορούσε δυνητικά να υπερβεί το διαθέσιμο χώρο του συστήματος στη μνήμη. Θυμηθείτε, ο σχεδιασμός χρησιμοποίησε μόνο το χαμηλότερο byte του διαύλου διευθύνσεων και στη συνέχεια το χαμηλότερο bit του υψηλού byte χρησιμοποιήθηκε για την επιλογή μεταξύ χώρων ROM και RAM. Αυτό σήμαινε ότι είχα μόνο 253 byte χώρου για χρήση. Mayσως ρωτάτε γιατί 253 αντί 256. Αυτό συμβαίνει επειδή ο νέος μου κώδικας εισάγει τρία byte δεδομένων στο τέλος ενός γραπτού προγράμματος (αυτό θα καλυφθεί αργότερα, καθώς το τροποποίησα για να δουλέψει στο νέο σχέδιο).
ν
Πήγα πίσω στα παλιά μου σχέδια για να δω τι άλλο συνέβαινε. Βρήκα ένα μικρό ελάττωμα με το κύκλωμα επιλογής μνήμης, το οποίο θα καλύψω όταν φτάσω εκεί. Η απλοποιημένη έκδοση: όλα τα αιτήματα εγγραφής θα περνούσαν στην πραγματικότητα, αν και πάντα τοποθετούνταν στη μνήμη RAM. Αυτό μάλλον δεν άξιζε να ανησυχεί, αλλά ήθελα να το κάνω σωστά αυτή τη φορά. Και με αυτό, άρχισα να σχεδιάζω ένα νέο σχηματικό. Οι δύο φωτογραφίες που επισυνάπτονται σε αυτήν τη σελίδα είναι πριν και μετά από το πραγματικό κύκλωμα. Καθάρισα τόσο πολύ την καλωδίωση των μακαρονιών, δεν είναι αστείο.
ν
Αν ακολουθήσατε την αρχική μου υποβολή και σκοπεύετε να ακολουθήσετε αυτήν, θα με μισήσετε. Εάν ξεκινάτε από την αρχή, τότε είστε τυχεροί. Απλώς πιάστε τα μέρη στη λίστα (ή το ισοδύναμό τους) και ακολουθήστε.
Προμήθειες:
LM7805 - Ρυθμιστής 5 VoltZ80 - η CPU. οι εγκέφαλοι του συστήματος AT28C64B - EEPROM. "Μόνιμη" αποθήκευση δεδομένων που χρησιμοποιείται για το υλικολογισμικό του υπολογιστή IDT6116SA - SRAM. χρησιμοποιείται για την αποθήκευση κωδικού χρήστη και /ή γενικής αποθήκευσης δεδομένωνNE555 - Σύστημα ρολογιού74HC374 - Octal D -Latch με /OE. χρησιμοποιείται ως τσιπ εισόδου74LS273 - Octal D -Latch με /MR. τσιπ εξόδουTLC59211 - τσιπ οδηγού LED (χρησιμοποιείται έτσι ώστε το 74LS273 να μπορεί να οδηγήσει LED, καθώς από μόνο του δεν είναι ικανό για την τρέχουσα έξοδο) MC14572 - Αυτό είναι ένα τσιπ "Line Driver", αλλά το βρήκα τέλειο για τη λογική του Memory Control. Διαθέτει 4 μετατροπείς και μια πύλη NAND και NOR ενσωματωμένη in74LS32 - Quad OR gateCD4001 - Quad NOR gateCD4040 - 12 Stage Ripple Counter. Σχεδιασμένο, αλλά μη εφαρμοσμένο διαχωριστικό ρολογιού (για λειτουργία του συστήματος σε χαμηλότερες ταχύτητες ρολογιού) 2 αντιστάσεις 10K Ohm - Το ένα χρησιμοποιείται στο κύκλωμα χρονοδιακόπτη 555, οπότε χρησιμοποιήστε όποια τιμή θέλετε για αυτό 4 αντιστάσεις 1K Ohm - το ένα χρησιμοποιείται για Κύκλωμα χρονοδιακόπτη 555, οπότε χρησιμοποιήστε ό, τι θέλετε για αυτό. Ένα άλλο χρησιμοποιείται για οδήγηση LED, οπότε διαφοροποιήστε το επίσης αν θέλετε 8x330 Ohm Resistor Bus8x10K Ohm Resistor Bus11 LEDs - Τα τρία χρησιμοποιούνται για την κατάσταση του συστήματος και τα άλλα οκτώ είναι έξοδοι. Για το 8, χρησιμοποίησα ένδειξη ράβδων (HDSP -4836) 4 Πυκνωτές - Δύο χρησιμοποιούνται το LM7805. 0.22uF και 0.1uF. Το ένα είναι για το χρονόμετρο 555, οπότε χρησιμοποιήστε αυτό που πιστεύετε ότι είναι σωστό. Το τελευταίο είναι για επαναφορά ενεργοποίησης. 100uF2 Ν. Ο. Πλήκτρα - Το ένα χρησιμοποιείται για είσοδο, το άλλο για επαναφορά8 SPST DIP Switches - Εισαγωγή δεδομένων. Χρησιμοποίησα το Piano Key styleWire. Πολλά και πολλά σύρματα
ν
ΣΗΜΕΙΩΣΗ: Η έκδοση MC14572 μέσω οπών είναι παρωχημένη, αλλά η έκδοση SMD είναι ακόμα ενεργή (ούτε καν "όχι για νέο σχεδιασμό"), οπότε ίσως χρειαστεί να αγοράσετε μια πλακέτα κυκλώματος για να σας επιτρέψει να τη χρησιμοποιήσετε. Ένα δεύτερο 74LS32 μπορεί να χρησιμοποιηθεί στη θέση του MC14572 (ανατρέξτε στο "σχηματικό κύκλωμα επιλογής μνήμης" του προηγούμενου ible)
Βήμα 1: Γρήγορη επισκόπηση αλλαγών + διαγράμματα
Πώς να διαβάσετε τα σχήματα: Ένα βέλος που δείχνει ένα τσιπ είναι μια είσοδος: Είσοδος> -Ένα βέλος που δείχνει το τσιπ είναι έξοδο: Έξοδος <-Τα λεωφορεία χρησιμοποιούν μια γραμμή αντί για ένα βέλος: Λεωφορείο |-
ν
Τα περισσότερα τσιπ έχουν σχεδιαστεί με τα ακριβή pinouts τους. Η μικρή βουτιά έχει σχεδιαστεί σε αυτά τα τσιπ. Οι περισσότερες μάρκες έχουν επίσης αριθμούς pin και ετικέτες. Μπορεί να είναι λίγο δύσκολο να διαβαστούν. Το μολύβι μου γινόταν θαμπό.
ν
Όσον αφορά τις συνδέσεις κυκλωμάτων, η διάταξη του νέου σχεδιασμού είναι ως επί το πλείστον αμετάβλητη από την αρχική. Συνδέσα το κάτω άκρο της διεύθυνσης υψηλό byte στις μνήμες και έπειτα χρησιμοποίησα το χαμηλό bit της επάνω μύτης (A12) για την επιλογή RAM/ROM. Αυτό σήμαινε ότι ο χώρος ROM πήγε από 0000-00FF έως 0000-0FFF. Ο χώρος Ram πήγε από 0100-01FF σε 1000-1FFF. Άλλαξα επίσης τη λογική Memory Control για καλύτερο σχεδιασμό και πρόσθεσα δύο νέες λυχνίες LED κατάστασης (και κάποια λογική κόλλας). Έχω επίσης σχεδιάσει (αλλά δεν έκανα σύρμα) ένα κύκλωμα διαίρεσης ρολογιού. Έπρεπε να εκτελέσει δύο λειτουργίες. Η προφανής λειτουργία είναι να διαιρέσετε τη συχνότητα του ρολογιού προς τα κάτω. Η άλλη λειτουργία είναι για σκοπούς PWM (Pulse Width Modulation), καθώς το 555 δεν δημιουργεί κύματα με 50% κύκλους λειτουργίας. Αυτό δεν έχει πραγματικά σημασία σε αυτό το κύκλωμα, αλλά αν θέλετε να χρησιμοποιήσετε το ρολόι για να οδηγήσετε μερικά LED, σίγουρα θα παρατηρήσετε τα εφέ (το ένα (σύνολο) LED (ων) θα είναι πιο αμυδρό από το άλλο). Ολόκληρο το υπόλοιπο κύκλωμα είναι ουσιαστικά αμετάβλητο.
Βήμα 2: CPU, μνήμη και έλεγχος μνήμης
Αυτό είναι το μέρος όπου οι αναγνώστες της προηγούμενης έκδοσής μου με μισούν. Στην αρχική κατασκευή, απλά έριξα εξαρτήματα στον πίνακα σε ένα μέρος που φαινόταν ότι θα επέβαλαν ένα μικρό πρόβλημα με την καλωδίωση. Το αποτέλεσμα έμοιαζε με κάποιον που είχε ρίξει ένα πιάτο μακαρόνια και ήταν σαν «σύρματα!» Wantedθελα να το καθαρίσω λίγο, οπότε ξεκίνησα σκίζοντας τα πάντα εκτός από την CPU, τη RAM και τη ROM. Τράβηξα σχεδόν ολόκληρο το κύκλωμα εισόδου, το κύκλωμα εξόδου και τη λογική κόλλας. Σχεδόν με πλήγωσε να το κάνω, αλλά ήταν απαραίτητο. Άφησα όλες τις συνδέσεις δεδομένων άθικτες και το χαμηλότερο byte του διαύλου διευθύνσεων. Στη συνέχεια, συνέδεσα τα επόμενα τέσσερα bit του διαύλου διευθύνσεων (A8-A11) στο τσιπ ROM. Φρόντισα να πάω γύρω από το τσιπ αυτή τη φορά για να διευκολύνω την προσέλκυση για επαναπρογραμματισμό. Πήρα επίσης τις συνδέσεις διευθύνσεων προς το τσιπ RAM.
ν
Με αυτό εκτός δρόμου, έπρεπε τώρα να συνδέσω τη λογική ελέγχου μνήμης. Στο αρχικό σχήμα, είχα συνδέσει τη γραμμή του επεξεργαστή /MREQ απευθείας στο /CE και στα δύο τσιπ μνήμης, έπειτα έκανα καλώδιο /WR στη μνήμη RAM /WE. Στη συνέχεια, είχα τους CPU /RD και /MREQ λογικά OR'd μαζί καθώς και το A9. Ουσιαστικά, ρυθμίστηκε έτσι ώστε όλα τα αιτήματα μνήμης να ενεργοποιούν τόσο τη μνήμη RAM όσο και τη μνήμη ROM, αλλά το A9 χρησιμοποιήθηκε για να επιλέξει ποια από τις μάρκες /ΟΕ επιλέχθηκε. Αυτό ήταν εντάξει και όλα επειδή τα τσιπ θα παραμείνουν ανενεργά μέχρι να γίνει ένα αίτημα μνήμης και στη συνέχεια μόνο ένα /ΟΕ θα ήταν ενεργό κατά τη διάρκεια ενός αιτήματος ανάγνωσης. Αυτό απέτρεψε τη διασταύρωση, αλλά εισήγαγε μια αμήχανη απόχρωση. Επειδή το A9 χρησιμοποιήθηκε μόνο για τον προσδιορισμό του τσιπ που έβγαζε δεδομένα και επειδή η CPU είχε άμεση πρόσβαση στον ακροδέκτη RAM /WE, θα πραγματοποιούνταν όλα τα αιτήματα εγγραφής. Αυτό ήταν εντάξει για τη ROM επειδή η λειτουργία εγγραφής της παρεμποδίζεται συνδέοντας /WE απευθείας στην παροχή 5V. Η μνήμη RAM, ωστόσο, θα εγγραφεί ανεξάρτητα από το A9. Αυτό σήμαινε ότι μια απόπειρα εγγραφής σε μια θέση χώρου ROM θα έγραφε στην ίδια θέση στο χώρο RAM.
ν
Μια λύση για αυτό θα ήταν η επανασύνδεση της λογικής ελέγχου έτσι ώστε η CPU να έχει άμεση πρόσβαση στις καρφίτσες των chips /OE και /WE και στη συνέχεια χρησιμοποιώντας MREQ και A12 για να επιλέξει ποια τσιπ /CE οδηγήθηκαν. Πήγα με αυτήν την ιδέα, αλλά αντί να χρησιμοποιήσω τέσσερις πύλες NOR και έναν μετατροπέα όπως το αρχικό σχέδιο, βρήκα ένα αμήχανο μικρό τσιπ που ήταν τέλειο για την εργασία. Έπρεπε να δημιουργήσω ένα κύκλωμα που χρησιμοποιούσε μόνο τις λογικές πύλες που ήταν διαθέσιμες στο τσιπ, αλλά αυτό ήταν αρκετά εύκολο. Το A12 τροφοδοτείται απευθείας σε μια πύλη NAND και μια πύλη NOR. /Η MREQ τροφοδοτείται στην πύλη NOR και η φιλοφρόνησή της τροφοδοτείται στην πύλη NAND. Η πύλη NAND χρησιμοποιείται για οδήγηση /CE για τη μνήμη RAM και η έξοδος NOR αντιστρέφεται και χρησιμοποιείται για την οδήγηση της ROM /CE. Αυτό καθιστά έτσι ώστε το /MREQ να είναι χαμηλό προτού επιλεγεί οποιοδήποτε τσιπ και στη συνέχεια το A12 να επιλέξει ποιο θα επιλεγεί. Με αυτήν τη ρύθμιση, τώρα τυχόν αιτήματα εγγραφής στη ROM δεν θα κάνουν τίποτα. Εξοικονομεί επίσης ενέργεια, επειδή μόνο ένα τσιπ είναι ενεργό αντί για τα δύο. Όσο για το ίδιο το τσιπ λογικής, έχουμε ακόμα δύο μετατροπείς που δεν χρησιμοποιούνται μέσα. Κάποιος θα συνηθίσει αργότερα, αλλά θα φτάσουμε εκεί όταν φτάσουμε εκεί.
Βήμα 3: LED κατάστασης συστήματος
Πριν ξεκινήσω αυτό το έργο, προσπαθούσα να συνδεθώ με ένα συγκεκριμένο IC, αλλά είχα πρόβλημα με αυτό. Αβέβαιος για το τι συνέβαινε, χρησιμοποίησα έναν πίνακα LED για ανίχνευση (ένα από αυτά τα συγκροτήματα που έχει ενσωματωμένη αντίσταση). Κάνοντας αυτό μου έδωσε μια ιδέα νοσταλγίας που χρησιμοποιείται ακόμα σήμερα: οι λυχνίες LED κατάστασης χρησιμοποιούνται για να δείξουν εάν η μνήμη διαβάζεται ή γράφεται σε. Έπρεπε να χρησιμοποιηθεί σε συνδυασμό με το LED εισόδου που είχα ήδη. Το LED εισόδου συνδέθηκε με τη γεννήτρια σήματος /WAIT για να μας υποδείξει ότι το σύστημα, εντάξει, περιμένει είσοδο (θα φτάσω εκεί, μην ανησυχείτε). Σκέφτηκα να προσθέσω ένα LED για ένδειξη εγγραφής IO, αλλά σκέφτηκα ότι τα LED εξόδου που αλλάζουν θα ήταν ήδη ένας εξαιρετικός δείκτης αυτού. Σκεπτόμενος το, μπορεί να το προσθέσω ακόμα. Παρ 'όλα αυτά, θεωρώ χρήσιμο να γνωρίζω εάν η μνήμη διαβάζεται ή γράφεται. Λοιπόν, είναι χρήσιμο για εντοπισμό σφαλμάτων προγράμματος, ούτως ή άλλως. Στην πραγματικότητα το χρησιμοποίησα βαριά ως τέτοιο όταν προσπαθούσα να λειτουργήσω το πρόγραμμά μου: «γιατί γράφει στη μνήμη; Δεν έπρεπε να το κάνει ακόμα! »
ν
Για τον έλεγχο αυτών των LED, χρησιμοποίησα την πύλη quad NOR. Χρησιμοποίησα όλες τις πύλες. Μόνο δύο χρησιμοποιήθηκαν για τη δημιουργία των σημάτων κατάστασης, αλλά το τσιπ δεν έχει τις δυνατότητες ισχύος για να οδηγήσει πραγματικά τα LED. Μπορούν να βυθίσουν τόση ισχύ, οπότε χρησιμοποίησα τις άλλες δύο πύλες NOR ως μετατροπείς και ένωσα τα LED ως τέτοια. Επειδή το ένα LED χρησιμοποιείται για την ένδειξη ανάγνωσης και το άλλο για εγγραφή, και δεν θα εμφανιστεί ταυτόχρονα αίτημα ανάγνωσης και εγγραφής, κατάφερα να ξεφύγω χρησιμοποιώντας μόνο μία αντίσταση και για τα δύο LED. Όσο για τα σήματα που χρειαζόμουν για αποκωδικοποίηση, ήταν επίσης αρκετά εύκολο. Wantedθελα να εμφανίζονται όλα τα αιτήματα ανάγνωσης μνήμης, οπότε η πρώτη πύλη NOR είχε /MREQ και /RD στις εισόδους της. Η κατάσταση γραφής ήταν λίγο πιο περίπλοκη, αλλά εξίσου εύκολη. Εξακολουθούσα να χρησιμοποιώ το /MREQ ως μία είσοδο, αλλά το /WR ως το άλλο θα προκαλούσε μια μικρή απόχρωση που ήθελα να αποφύγω. Θα είχε υποδείξει ΟΛΑ τα αιτήματα εγγραφής. Wantedθελα μόνο αυτά που πραγματικά πέρασαν. Πώς θα το έκανα λοιπόν; Λοιπόν, θυμάστε πώς έχω ρυθμίσει το σύστημα έτσι ώστε να μπορεί να γραφτεί μόνο η RAM; Χρησιμοποίησα τις RAM /CE ως την άλλη είσοδο στην πύλη NOR. Αυτό σημαίνει ότι η λυχνία LED θα ανάψει μόνο όταν έχει επιλεγεί RAM και υποβάλλεται αίτημα εγγραφής. Όσον αφορά το χρώμα LED, επέλεξα το πορτοκαλί ως ένδειξη ανάγνωσης (αλλά βρήκα μόνο τα κίτρινα) και το κόκκινο ως ένδειξη εγγραφής.
Βήμα 4: Είσοδος και έξοδος
Στο προηγούμενο βήμα, ίσως έχετε παρατηρήσει ότι πρόσθεσα μερικά από τα υπόλοιπα εξαρτήματα στον πίνακα ήδη. Έκανα κράτηση χώρου για να μην τοποθετήσω κατά λάθος καλώδια εκεί που ήθελα ένα εξάρτημα (έτσι θα έπρεπε να βρω μια νέα θέση για το εν λόγω στοιχείο). Μπορεί επίσης να έχετε παρατηρήσει ότι άφησα τους διακόπτες εισόδου στη θέση τους και συνδέθηκα με τη ράγα τροφοδοσίας. Αποφάσισα ότι η αρχική τοποθεσία ήταν το τέλειο σημείο και αποφάσισα να τοποθετήσω τα LED εξόδου κοντά (πάνω). Στα δεξιά της οθόνης της γραμμής είναι το μάνδαλο εισόδου. Πάνω από αυτό είναι το μάνδαλο εξόδου και στα αριστερά του είναι το πρόγραμμα οδήγησης LED. Ξεκίνησα συνδέοντας την οθόνη με το πρόγραμμα οδήγησης αφού αυτό ήταν το πιο εύκολο να γίνει. Στη συνέχεια, συνέδεσα τους διακόπτες στην πλευρά εισόδου του κλειδώματος εισόδου. Στη συνέχεια, συνέδεσα την πλευρά εξόδου του κλειδώματος εξόδου στο πρόγραμμα οδήγησης LED. Αυτό μπορεί να φαίνεται σαν μια αμήχανη εντολή για να τα συνδέσετε, αλλά ήταν για κάποιο λόγο. Η είσοδος του κλειδώματος εξόδου έπρεπε να συνδεθεί με το δίαυλο δεδομένων καθώς και η έξοδος του μάνδαλου εισόδου. Η ιδέα ήταν να συνδέσω τις εξόδους του κλειδώματος εισόδου με τις εισόδους του κλειδώματος εξόδου, πράγμα που έκανα. Τότε το μόνο που έπρεπε να κάνω ήταν να συνδέσω αυτό το χάος με το δίαυλο δεδομένων. Δεν είχε σημασία πού πήγαν αυτές οι συνδέσεις φυσικά γιατί όλες θα ήταν ηλεκτρικά συνδεδεμένες. Ο υπολογιστής έχει σχεδόν τελειώσει.
Βήμα 5: Επαναφορά και ολοκλήρωση εισόδου και εξόδου
Λυπούμαστε, δεν υπάρχουν φωτογραφίες για αυτό το βήμα. Ανατρέξτε στο προηγούμενο βήμα για τις φωτογραφίες.
ν
Mayσως έχετε παρατηρήσει στην τελευταία φωτογραφία του προηγούμενου βήματος, ότι είχα εγκαταστήσει ένα πράσινο κουμπί και ένα άλλο λογικό τσιπ. Το τσιπ είναι η πύλη OR. Δύο πύλες χρησιμοποιούνται για τη δημιουργία του σήματος /WAIT. Λοιπόν, κάποιος παράγει το σήμα μέσω OR-ing /IORQ και /RD από τον επεξεργαστή. Η έξοδος τροφοδοτείται στη δεύτερη πύλη, όπου παίρνει ξανά OR'd σε ένα κουμπί. Το κουμπί φέρνει την είσοδο της πύλης ψηλά, φέρνοντας έτσι την έξοδο υψηλή. Αυτή η έξοδος τροφοδοτείται στους επεξεργαστές /καρφίτσα ΑΝΑΜΟΝΗΣ. Ενώ δεν πιέζεται, μια αντίσταση διατηρεί την είσοδο χαμηλή. Αρχικά χρησιμοποίησα μια αντίσταση 10K, αλλά το LS32 έβγαζε τάση στην είσοδο. Η αντίσταση δεν την έριξε αρκετά χαμηλά και έπρεπε να την αντικαταστήσω με 1Κ. Ούτως ή άλλως, η ιδέα είναι ότι όταν γίνεται αίτηση ανάγνωσης IO, η πρώτη και η δεύτερη πύλη OR λέει στον επεξεργαστή να περιμένει. Μόλις ρυθμίσετε τους διακόπτες εισόδου σε ό, τι θέλετε, πατάτε το κουμπί και βγάζει την CPU από την κατάσταση αναμονής. Η πράσινη λυχνία LED «εισόδου», όπως την ονόμασα σε προηγούμενο βήμα, είναι συνδεδεμένη έτσι ώστε όταν ο πείρος /ΑΝΑΜΟΝΗ χαμηλώνει, ανάβει.
ν
Αλλά δεν έχουμε τελειώσει ακόμα. Το flip flop εισόδου χρειάζεται σήμα για να το ενημερώσει πότε η είσοδος δεδομένων είναι έγκυρη και πρέπει να αποσταλεί στην CPU. Αυτός ο πείρος ρολογιού είναι ενεργός σε υψηλό επίπεδο. Πριν, απλά το συνδέσαμε με το κουμπί. Αυτή είναι ακόμα μια έγκυρη επιλογή, αλλά αυτή τη φορά επέλεξα να την τοποθετήσω στην ίδια έξοδο με τη δεύτερη πύλη OR. Αυτό το IC έχει επίσης μια καρφίτσα /OE που πρέπει να οδηγηθεί. Αν ήταν να κρατηθεί ψηλά, δεν θα έβαζε ποτέ δεδομένα στο δίαυλο. Αν κρατηθεί χαμηλά, θα οδηγούσε πάντα το λεωφορείο. Για να το διορθώσω, απλώς χρησιμοποίησα μια τρίτη πύλη OR. Οι είσοδοι είναι /IORQ και /RD και η έξοδος πηγαίνει απευθείας στο μάνδαλο /OE.
ν
Το μάνδαλο εξόδου χρειάζεται επίσης τον πείρο του ρολογιού για να οδηγηθεί. Και πάλι, είναι ενεργό ψηλά. Στο σχηματικό μου σχέδιο, σχεδίασα την τέταρτη πύλη OR οδηγώντας κατευθείαν τον πείρο χρησιμοποιώντας /IORQ και /WR. Αυτό σήμαινε ότι ο πείρος του ρολογιού θα κρατηθεί ψηλά έως ότου υποβληθεί ένα αίτημα εγγραφής, στη συνέχεια θα πέσει χαμηλά και πάλι ψηλά. Αυτό πιθανότατα θα ήταν εντάξει επειδή ο δίαυλος δεδομένων θα είχε ακόμα έγκυρα δεδομένα πάνω του αμέσως μετά την απόπειρα εγγραφής, αλλά από μηχανικής πλευράς, ήταν σχεδιασμός απορριμμάτων. Δεν παρατήρησα αυτό το σφάλμα έως ότου έβγαλα τις τελευταίες φωτογραφίες, αλλά έσπασα αυτήν τη σύνδεση και έπειτα τροφοδότησα την έξοδο πύλης OR σε έναν από τους μετατροπείς που δεν χρησιμοποιήθηκαν από τη λογική ελέγχου μνήμης και έπειτα συνέδεσα την έξοδό της με την καρφίτσα ρολογιού Το Διορθώσα επίσης το σχηματικό και βρήκα ένα άλλο σφάλμα που είχα κάνει. Το διόρθωσα και εγώ.
ν
Με όλα αυτά που έγιναν τελικά, είχα μια πολύ μικρή δουλειά να κάνω: το κύκλωμα επαναφοράς. Πρόσθεσα ένα κουμπί στον πίνακα και χρησιμοποίησα μια αντίσταση 10K για να κρατήσω τη μία πλευρά ψηλά. Η άλλη πλευρά πηγαίνει απευθείας στο έδαφος. Η πλευρά που κρατά ψηλά είναι η έξοδος /RESET, η οποία πήγε σε κάθε τσιπ με πείρο /RESET (CPU και μάνδαλο εξόδου). Για να πραγματοποιήσω επαναφορά ενεργοποίησης, πρόσθεσα έναν πυκνωτή στην έξοδο /RESET. Η ιδέα είναι ότι η αντίσταση μεγάλης τιμής θα έκανε τον σχετικά μεγάλο πυκνωτή να φορτίσει αργά και να κρατήσει τους πείρους /RESET χαμηλά για ορισμένους κύκλους ρολογιού (η CPU χρειάζεται τέσσερις κύκλους ρολογιού). Μπορείτε πιθανώς να μαντέψετε ποια είναι η αρνητική πλευρά αυτού του κυκλώματος. Είναι το ίδιο αρνητικό με την προηγούμενη έκδοση επειδή είναι το ίδιο κύκλωμα. Όταν πατηθεί το κουμπί, ο πυκνωτής ουσιαστικά βραχυκυκλώνεται μέσω του κουμπιού. Αυτό είναι κακό τόσο για το καπάκι όσο και για το κουμπί, οπότε αν θέλετε να κάνετε την κατασκευή σας λίγο πιο μόνιμη, ίσως θελήσετε να την επανασχεδιάσετε. Σκεφτόμουν ένα άλλο χρονόμετρο 555 ρυθμισμένο σε μονοσταθερή λειτουργία. Αλλά με αυτό, το κύκλωμα του υπολογιστή έχει πλέον τελειώσει. Ναι. Τώρα χρειάζεται προγραμματισμός.
Βήμα 6: Προγραμματισμός
Ο προγραμματισμός αυτού του πράγματος ήταν ένας εφιάλτης. Δημιούργησα έναν προγραμματιστή Arduino EEPROM. Δεν λειτούργησε. Έφτιαξα ένα άλλο με βάση τον σχεδιασμό και την κωδικοποίηση κάποιου άλλου. Ακόμα δεν λειτούργησε. Επέστρεψα στη δοκιμασμένη μέθοδο χειροκίνητης ρύθμισης των διευθύνσεων και των byte δεδομένων με το χέρι. Κάπως έτσι το μπέρδεψα. Δοκίμασα ξανά και το πήρα λάθος. Επέστρεψα ξανά και ανακάλυψα ότι ήταν ένα byte, οπότε το διόρθωσα και τελικά λειτούργησε, δόξα τω Θεώ.
ν
Όσο για το πραγματικό πρόγραμμα, φαίνεται ότι είναι εξαιρετικά περίπλοκο και δύσκολο να ακολουθηθεί, αλλά δεν είναι. Είναι πολύ απλό, στην πραγματικότητα. Το μισό αντιγράφει αριθμούς τριγύρω. Το άλλο μισό μοιράζεται ανάμεσα στα μαθηματικά 16-bit, τα άλματα υπό όρους και ακόμα περισσότερα αντίγραφα αριθμών. Επιτρέψτε μου λοιπόν να το περάσω και να σας πω πώς λειτουργεί.
ν
Η αρχικοποίηση απλώς ορίζει ορισμένες τιμές καταχωρητή για χρήση από το πρόγραμμα. Ο βρόχος προγράμματος είναι λίγο πιο περίπλοκος, αλλά όχι πάρα πολύ. Πρώτον, δέχεται εισαγωγή στον καταχωρητή Α στη θύρα 00. Στη συνέχεια, ο καταχωρητής Ε γράφεται στη μνήμη. Στους δύο πρώτους βρόχους, ο καταχωρητής E περιέχει ανεπιθύμητα δεδομένα, οπότε προσπαθούμε να τα γράψουμε στα δύο τελευταία byte του χώρου ROM επειδή δεν θα γραφτούν στην πραγματικότητα. ο δείκτης διεύθυνσης (IY) στη συνέχεια αυξάνεται. Η τιμή που αποθηκεύεται στο D μεταφέρεται στη συνέχεια στο E για να γραφτεί στη συνέχεια. Στη συνέχεια, το Α φορτώνεται στο D και το L και το E αντιγράφεται στο H. Η πρώτη τιμή σε σύγκριση με αυτήν αποθηκεύεται στους καταχωρητές Β και Γ. Τα Β και Γ αντιμετωπίζονται ως ένας καταχωρητής 16 bit, BC. Εάν οι τιμές είναι ίδιες, τότε το πρόγραμμα πηδά κατευθείαν στον χώρο RAM, όπου θεωρείται ότι βρίσκεται ο κωδικός χρήστη. Εάν ο κώδικας στο BC δεν ταιριάζει, τότε το HL φορτώνεται ξανά με τις αρχικές τιμές από το D και το E και συγκρίνεται ξανά με την τιμή στο SP με τον ίδιο τρόπο που συγκρίθηκε με το BC. Αν είναι αντιστοιχία, έχει το ίδιο αποτέλεσμα, αλλά τρία επιπλέον byte γράφονται στη μνήμη. Τα byte είναι ένας κώδικας που προκαλεί την επαναφορά της CPU στην αρχή του προγράμματος (επαναφορά λογισμικού). Εάν η δεύτερη σύγκριση δεν ήταν αντιστοίχιση, ωστόσο, το πρόγραμμα επιστρέφει εκεί όπου παίρνει μια τιμή από τον χρήστη.
ν
LD SP, EDBFH; exe κώδικας (προσθέτει άλμα)
ν
LD IY, FFEH; αρχικός δείκτης μνήμης για αποθήκευση κώδικα
ν
LD BC, EDC3H; exe κώδικας (χωρίς βρόχο)
ν
βρόχος? οδηγία assembler, ώστε να μην χρειάζεται να γνωρίζουμε πού βρίσκεται στη μνήμη αυτό το τμήμα
ν
ΣΤΟ Α, (00Η); λάβετε δεδομένα προγράμματος
ν
LD (IY+00H), E; Το Ε περιέχει κωδικό προς αποθήκευση
ν
INC IY; μετακίνηση στην επόμενη θέση μνήμης
ν
LD E, D; ld D σε E
ν
LD D, A; ld A στο D
ν
LD H, E; ld E σε H
ν
LD L, D; ld D σε L
ν
OR Α? επαναφορά σημαίας μεταφοράς
ν
SBC HL, BC; επιστρέφει 0 αν είχε εισαχθεί ο κωδικός exe 2
ν
JP Z, 1000Η; αν ναι, μεταβείτε στο πρόγραμμα και εκτελέστε το
ν
LD H, E; Διαφορετικά, ανανεώστε τα στις κατάλληλες τιμές
ν
LD L, D
ν
OR Α? η πρώτη αφαίρεση μπορεί να έχει ορίσει σημαία μεταφοράς. Διαγράψτε το
ν
SBC HL, SP; επιστρέφει το 0 εάν είχε εισαχθεί ο κωδικός exe 1
ν
JP NZ, βρόχος; αν όχι, επαναλάβετε τη διαδικασία (ξεκινώντας με τη λήψη μιας τιμής)
ν
LD (IY+00H), C3H; Διαφορετικά, εισάγετε έναν κωδικό άλματος στο τέλος του προγράμματος χρήστη
ν
LD (IY+01H), 00H; Το jump βασικά λειτουργεί ως επαναφορά λογισμικού
ν
LD (IY+02H), 00H; είναι μια πλήρης επαναφορά σε περίπτωση που τροποποιηθούν οι καταχωρητές
ν
JP 1000H; μεταβείτε και εκτελέστε πρόγραμμα χρήστη