Συστήματα Μικροϋπολογιστών — Σεπτέμβριος 2025¶
Μεταγραφή από τη φωτογραφία
remix-9fc649f7-9f9d-4f3c-b5fe-1cf29a62d64a.png(πέντε θέματα).
remix-9fc649f7-9f9d-4f3c-b5fe-1cf29a62d64a.png¶
Ερωτήματα
-
Σε μια παράλληλη θύρα εισόδου/εξόδου ο καταχωρητής κατάστασης έχει την τιμή «31» (Hexadecimal) και οδηγεί μια συστοιχία από οκτώ leds, με τιμή διαύλου εξόδου «BC» (Hexadecimal). Να γράψετε τις αντίστοιχες εντολές του προγράμματος, για να διατηρήσετε μόνο την κατάσταση λειτουργίας όλων των leds, στις θέσεις με περιττό αριθμό. Να εξηγήσετε τον τρόπο εργασίας σας.
-
Θέλετε να προγραμματίσετε το PIO του Z80, στην κατάσταση λειτουργίας ένα (mode 1). α) Να γράψετε όλες τις απαιτούμενες λέξεις διανυσμάτων (10%), β) να εξηγήσετε αναλυτικά την τιμή του κάθε ψηφίου που επιλέξατε για καθεμία λέξη (10%).
-
Να σχεδιαστεί (10%) και να εξηγηθεί αναλυτικά (10%) ο χρονισμός των σημάτων, της εντολής HALT.
-
Θεωρείστε ένα Ultrasonic Sensor Module, που υπολογίζει την απόσταση από αντικείμενα μπροστά του, στέλνοντας έναν υπέρηχο και μέσω του χρόνου που κάνει το σήμα για να επιστρέψει στον αισθητήρα υπολογίζει την απόσταση. Να γραφεί και να εξηγηθεί ο κώδικας του προγραμματισμού του, για διάταξη Arduino Uno.
-
Να σχεδιαστεί (10%) και να εξηγηθεί αναλυτικά (10%) ο χρονισμός των σημάτων, για την εντολή LD D, BCHex.
Λύσεις (⚪ AI, μη επαληθευμένο)
Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, gemini-3.7-flash, sonnet), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο
Προσοχή
Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.
AI λύσεις — 2025-09¶
Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.
Θέμα 1¶
Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή
Ανάλυση και αιτιολόγηση: Η συστοιχία των 8 LED ελέγχεται από μία 8-bit θύρα εξόδου (data bus), όπου κάθε bit αντιστοιχεί σε ένα LED. Η τρέχουσα τιμή εξόδου είναι \(\text{BC}_{16} = 1011\,1100_2\). Τα bits αριθμούνται συμβατικά από \(D_0\) έως \(D_7\): $\(D_7 = 1,\; D_6 = 0,\; D_5 = 1,\; D_4 = 1,\; D_3 = 1,\; D_2 = 1,\; D_1 = 0,\; D_0 = 0\)$
Ζητείται να διατηρηθεί η κατάσταση των LED μόνο στις θέσεις με περιττό αριθμό και να σβήσουν/μηδενιστούν τα υπόλοιπα (ή να απομονωθούν). Ανάλογα με τη σύμβαση αρίθμησης: 1. Σύμβαση δεικτών bit (\(D_0\) έως \(D_7\)): - Περιττές θέσεις είναι τα bits \(D_1, D_3, D_5, D_7\). - Μάσκα επιλογής: \(\text{AA}_{16} = 1010\,1010_2\). - Αποτέλεσμα: \(\text{BC}_{16} \text{ AND } \text{AA}_{16} = 1011\,1100_2 \text{ AND } 1010\,1010_2 = 1010\,1000_2 = \text{A8}_{16}\). 2. Σύμβαση φυσικής θέσης 1 έως 8 (1ο, 3ο, 5ο, 7ο LED ξεκινώντας από το LSB \(D_0\)): - Περιττές θέσεις είναι τα bits \(D_0, D_2, D_4, D_6\). - Μάσκα επιλογής: \(55_{16} = 0101\,0101_2\). - Αποτέλεσμα: \(\text{BC}_{16} \text{ AND } 55_{16} = 1011\,1100_2 \text{ AND } 0101\,0101_2 = 0001\,0100_2 = 14_{16}\).
Θεωρώντας τη συνηθέστερη σύμβαση δεικτών bit (\(D_1, D_3, D_5, D_7\) με μάσκα \(\text{AA}_{16}\)), εκτελούμε λογικό AND μεταξύ της τρέχουσας τιμής και της μάσκας \(\text{AA}_{16}\) και αποστέλλουμε το αποτέλεσμα πίσω στη θύρα δεδομένων.
Εντολές σε συμβολική γλώσσα Z80:
Έστω ότι η θύρα δεδομένων έχει διεύθυνση PORT_DATA και ο καταχωρητής κατάστασης βρίσκεται στη διεύθυνση PORT_STATUS (η τιμή \(31_{16}\) επιβεβαιώνει την ετοιμότητα/λειτουργία της θύρας).
; Ανάγνωση ή απευθείας φόρτωση της τρέχουσας τιμής εξόδου
LD A, 0BCh ; Φόρτωση του συσσωρευτή με την τρέχουσα τιμή εξόδου (BCh)
AND 0AAh ; Λογικό AND με τη μάσκα AAh (διατήρηση περιττών bits D7, D5, D3, D1)
; (ή AND 55h αν ορίζονται ως περιττά τα D0, D2, D4, D6)
OUT (PORT_DATA), A ; Εγγραφή της νέας τιμής στη θύρα εξόδου των LEDs
Θέμα 2¶
Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή
Το Z80 PIO διαθέτει 4 καταστάσεις λειτουργίας (Modes): - Mode 0: Byte Output - Mode 1: Byte Input - Mode 2: Bidirectional Bus (μόνο Port A) - Mode 3: Bit Control (Bit-by-bit I/O)
Για τον προγραμματισμό μιας θύρας του PIO σε Mode 1 (Byte Input) απαιτούνται: 1. Λέξη Επιλογής Κατάστασης (Mode Word): Υποχρεωτική. 2. Λέξη Διανύσματος Διακοπής (Interrupt Vector Word): Απαιτείται αν χρησιμοποιούνται διακοπές (Interrupt Mode 2 του Z80). 3. Λέξη Ελέγχου Διακοπών (Interrupt Control Word): Απαιτείται αν ενεργοποιούνται/απενεργοποιούνται οι διακοπές της θύρας.
α) Λέξεις ελέγχου / διανυσμάτων¶
- Λέξη Επιλογής Mode 1: \(4F_{16}\) (\(0100\,1111_2\)).
- Λέξη Διανύσματος Διακοπής: Έστω \(80_{16}\) (\(1000\,0000_2\)) για δείκτη πίνακα διανυσμάτων διακοπής.
- Λέξη Ελέγχου Διακοπής: \(87_{16}\) (\(1000\,0111_2\)) για ενεργοποίηση διακοπών (ή \(07_{16}\) για απενεργοποίηση).
β) Αναλυτική εξήγηση των ψηφίων (bits)¶
- Λέξη Mode 1 (\(4F_{16} = 0100\,1111_2\)):
- \(D_7 D_6 = 01_2\): Επιλογή κατάστασης λειτουργίας Mode 1 (Byte Input). (Οι πιθανές τιμές είναι \(00 = \text{Mode 0}\), \(01 = \text{Mode 1}\), \(10 = \text{Mode 2}\), \(11 = \text{Mode 3}\)).
- \(D_5 D_4 = 00_2\): Δεν χρησιμοποιούνται στο Mode 1 (τίθενται 0).
-
\(D_3 D_2 D_1 D_0 = 1111_2\): Αναγνωριστικό (opcode) ότι η λέξη αυτή είναι εντολή ορισμού Mode ("Mode Select Control Word").
-
Λέξη Διανύσματος Διακοπής (\(80_{16} = 1000\,0000_2\)):
- \(D_7 - D_1 = 1000\,000_2\): Τα 7 ανώτερα bits περιέχουν τα 7 MSB της διεύθυνσης διανύσματος διακοπής (Interrupt Vector Address) που θα τοποθετηθεί στον δίαυλο δεδομένων κατά τον κύκλο αναγνώρισης διακοπής (\(\overline{\text{M1}}\) και \(\overline{\text{IORQ}}\) ενεργά).
-
\(D_0 = 0\): Καθορίζει ότι η λέξη είναι διάνυσμα διακοπής (πάντα 0 για διάκριση από εντολές ελέγχου).
-
Λέξη Ελέγχου Διακοπής (\(87_{16} = 1000\,0111_2\)):
- \(D_7 = 1\): Interrupt Enable (1 = ενεργοποίηση διακοπών για τη θύρα, 0 = απενεργοποίηση).
- \(D_6, D_5, D_4\): Δεν χρησιμοποιούνται στο Mode 1 (τίθενται 0, χρησιμοποιούνται μόνο στο Mode 3 για λογικές συνθήκες AND/OR και Mask).
- \(D_3 D_2 D_1 D_0 = 0111_2\): Αναγνωριστικό ότι η λέξη είναι εντολή ελέγχου διακοπών (Interrupt Control Word).
Θέμα 3¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια
Εντολή HALT (opcode 76H): ένας κύκλος M1 των 4 T.
- T1: PC στον A15–A0, \(\overline{M1}=0\), \(\overline{MREQ}\) και \(\overline{RD}\) ενεργά στο κατιόν μισό.
- T2: η μνήμη δίνει το 76H, έλεγχος \(\overline{WAIT}\).
- T3: ανάγνωση του opcode (ανοδική ακμή), \(\overline{RFSH}=0\) με διεύθυνση refresh στον A bus και \(\overline{MREQ}=0\).
- T4: αποκωδικοποίηση· ο CPU μπαίνει σε halt και η έξοδος \(\overline{HALT}\) πέφτει στο 0.
Μετά: ο CPU εκτελεί επαναλαμβανόμενους κύκλους NOP των 4 T (το PC δεν αυξάνεται, το byte που διαβάζεται αγνοείται, συνεχίζεται το refresh) μέχρι να έρθει \(\overline{NMI}\), \(\overline{INT}\) (αν IFF1=1) ή \(\overline{RESET}\). Στη διακοπή η διεύθυνση επιστροφής είναι της εντολής μετά το HALT. Η σχεδίαση: CLK, A15–A0, \(\overline{M1}\), \(\overline{MREQ}\), \(\overline{RD}\), \(\overline{RFSH}\), D7–D0, \(\overline{HALT}\) για 4 T και η επανάληψη. Οι ακριβείς ακμές είναι από μνήμη.
Θέμα 4¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια
Αισθητήρας τύπου HC-SR04 σε Arduino Uno: πείρος TRIG (9) έξοδος, ECHO (10) είσοδος. Αρχή: 10 μs παλμός στο TRIG → ο αισθητήρας στέλνει 8 παλμούς 40 kHz → το ECHO παραμένει HIGH όσο ο χρόνος πήγαινε-έλα \(t\). Απόσταση \(d = v\,t/2\) με \(v \approx 343\) m/s \(=0{,}0343\) cm/μs, άρα \(d \approx t/58{,}3\) cm (επαλήθευση με υπολογισμό: 1/(0,0343/2)=58,3).
const int TRIG = 9, ECHO = 10;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10); // παλμός 10 μs
digitalWrite(TRIG, LOW);
long t = pulseIn(ECHO, HIGH); // διάρκεια ECHO σε μs
float d = t * 0.0343 / 2.0; // cm
Serial.print("Distance: "); Serial.print(d); Serial.println(" cm");
delay(200);
}
pulseIn μετρά τον χρόνο HIGH του ECHO· ο παράγοντας 2 υπάρχει διότι ο ήχος διανύει την απόσταση δύο φορές. Εύρος του αισθητήρα περίπου 2–400 cm.
Θέμα 5¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια
Εντολή LD D, BCH = 2 byte (16H, BCH), 7 T συνολικά: M1 (4 T) + M2 (3 T).
M1 (4 T) — προσκόμιση opcode 16H:
- T1: PC στον A15–A0, \(\overline{M1}=0\), \(\overline{MREQ}\), \(\overline{RD}\) ενεργά (κατιόν μισό).
- T2: η μνήμη δίνει 16H στον D7–D0, έλεγχος \(\overline{WAIT}\).
- T3: ο CPU διαβάζει το 16H (IR)· ξεκινά refresh (\(\overline{RFSH}=0\)).
- T4: αποκωδικοποίηση, PC←PC+1.
M2 (3 T) — ανάγνωση σταθεράς από μνήμη (memory read):
- T1: PC+1 στον A bus· \(\overline{MREQ}\), \(\overline{RD}\)=0 (κατιόν μισό).
- T2: η μνήμη δίνει BCH, έλεγχος \(\overline{WAIT}\) (\(\overline{M1}\) = 1).
- T3: ο CPU διαβάζει BCH και το αποθηκεύει στον D· PC←PC+2.
Σύνολο 4+3 = 7 T. Σχέδιο: CLK, A15–A0 (PC, PC+1), \(\overline{M1}\) (μόνο στον M1), \(\overline{MREQ}\), \(\overline{RD}\), \(\overline{RFSH}\) (T3–T4 του M1), D7–D0 (16H, BCH).