Μετάβαση στο περιεχόμενο

Συστήματα Μικροϋπολογιστών — Φεβρουάριος 2026 (παραλλαγή Β)

Μεταγραφή από τη φωτογραφία sklabos.png (πέντε θέματα).

sklabos.png

Ερωτήματα

  1. Σε μια παράλληλη θύρα εισόδου/εξόδου ο καταχωρητής κατάστασης έχει την τιμή «31» (Hexadecimal) και οδηγεί μια συστοιχία από οκτώ leds, με τιμή διαύλου εξόδου «BC» (Hexadecimal). Να γράψετε τις αντίστοιχες εντολές του προγράμματος, για να διατηρήσετε μόνο την κατάσταση λειτουργίας όλων των leds, στις θέσεις με περιττό αριθμό. Να εξηγήσετε τον τρόπο εργασίας σας.

  2. Θέλετε να προγραμματίσετε το PIO του Z80, στην κατάσταση λειτουργίας ένα (mode 1). α) Να γράψετε όλες τις απαιτούμενες λέξεις διανυσμάτων (10%), β) να εξηγήσετε αναλυτικά την τιμή του κάθε ψηφίου που επιλέξατε για καθεμία λέξη (10%).

  3. Να σχεδιαστεί (10%) και να εξηγηθεί αναλυτικά (10%) ο χρονισμός των σημάτων, της εντολής HALT.

  4. Θεωρείστε ένα Ultrasonic Sensor Module, που υπολογίζει την απόσταση από αντικείμενα μπροστά του, στέλνοντας έναν υπέρηχο και μέσω του χρόνου που κάνει το σήμα για να επιστρέψει στον αισθητήρα υπολογίζει την απόσταση. Να γραφεί και να εξηγηθεί ο κώδικας του προγραμματισμού του, για διάταξη Arduino Uno.

  5. Υπολογίστε το μέγεθος αρχείου bitmap (10%) και εξηγήστε τη διαδικασία (10%). Θεωρήστε εικόνα 640x480 pixels, με 24-bit βάθος χρώματος (RGB).

Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, gemini-3.7-flash, sonnet), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο

Προσοχή

Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.

AI λύσεις — 2026-02-b

Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.

Θέμα 1

Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή

Αιτιολόγηση & Τρόπος Εργασίας:

  • Η αρχική τιμή του διαύλου εξόδου προς τα LEDs είναι \(\text{BC}_{16} = 10111100_2\).
  • Θέλουμε να διατηρήσουμε μόνο την κατάσταση λειτουργίας των LEDs στις θέσεις με περιττό αριθμό και να απενεργοποιήσουμε (να μηδενίσουμε) τα υπόλοιπα. Αυτό επιτυγχάνεται μέσω της πράξης λογικού πολλαπλασιασμού (AND) με μία κατάλληλη μάσκα (bitmask).
  • Σύμβαση αρίθμησης θέσεων:
  • Αν θεωρήσουμε αρίθμηση θέσεων από \(1\) έως \(8\) (\(1\) ως \(8\) από LSB προς MSB, δηλ. LED 1 στο bit 0, LED 3 στο bit 2, LED 5 στο bit 4, LED 7 στο bit 6), οι περιττές θέσεις \(1, 3, 5, 7\) αντιστοιχούν στα bits \(D_0, D_2, D_4, D_6\). Η μάσκα απομόνωσης είναι: $\(\text{Mask}_1 = 01010101_2 = 55_{16}\)$ Εφαρμόζοντας: \(\text{BC}_{16} \text{ AND } 55_{16} = 10111100_2 \text{ AND } 01010101_2 = 00010100_2 = 14_{16}\).
  • Αν θεωρήσουμε αρίθμηση δεικτών \(0\) έως \(7\) (\(D_0\) έως \(D_7\)), οι περιττές θέσεις είναι τα bits \(D_1, D_3, D_5, D_7\). Η μάσκα απομόνωσης είναι: $\(\text{Mask}_2 = 10101010_2 = \text{AA}_{16}\)$ Εφαρμόζοντας: \(\text{BC}_{16} \text{ AND } \text{AA}_{16} = 10111100_2 \text{ AND } 10101010_2 = 10101000_2 = \text{A8}_{16}\). (Υποθέτουμε τη σύμβαση δεικτών bits \(D_1, D_3, D_5, D_7\) με μάσκα \(\text{AA}_{16}\), αναφέροντας ωστόσο και τη σύμβαση θέσεων \(1\text{-}8\) με μάσκα \(55_{16}\)).

Κώδικας (Συμβολομεταφραστής Z80):

Έστω ότι η θύρα δεδομένων (Data Port) έχει διεύθυνση PORT_DATA και ο καταχωρητής ελέγχου/κατάστασης PORT_CTRL.

; Ανάγνωση/Φόρτωση της τρέχουσας τιμής εξόδου BC (Hex)
LD A, 0BCh          ; Φόρτωση της τιμής BC στον συσσωρευτή (A)

; Εφαρμογή μάσκας για διατήρηση μόνο των περιττών θέσεων (bits 1, 3, 5, 7)
AND 0AAh            ; A = A AND AAh (ή AND 55h αν οι περιττές θέσεις ορίζονται ως 1,3,5,7 -> bits 0,2,4,6)

; Εγγραφή της νέας τιμής στη θύρα εξόδου των LEDs
OUT (PORT_DATA), A  ; Αποστολή της νέας κατάστασης στη θύρα των LEDs

Θέμα 2

Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή

α) Απαιτούμενες λέξεις διανυσμάτων / ελέγχου για Mode 1 (Byte Input)

Για τη διαμόρφωση μιας θύρας του Z80-PIO σε Κατάσταση Λειτουργίας 1 (Mode 1 - Είσοδος Byte) απαιτούνται: 1. Λέξη Επιλογής Κατάστασης Λειτουργίας (Mode Control Word): $\(\text{CW}_1 = 4F_{16} = 01001111_2\)$ 2. Λέξη Διανύσματος Διακοπής (Interrupt Vector Word) (απαιτείται αν χρησιμοποιούνται διακοπές): $\(\text{CW}_2 = 20_{16} = 00100000_2 \quad (\text{ή οποιαδήποτε άρτια διεύθυνση πίνακα διακοπών})\)$ 3. Λέξη Ελέγχου Διακοπών (Interrupt Control Word): $\(\text{CW}_3 = 87_{16} = 10000111_2 \quad (\text{για ενεργοποίηση διακοπών})\)$ ή \(03_{16} = 00000011_2\) (αν οι διακοπές παραμένουν απενεργοποιημένες).


β) Αναλυτική εξήγηση κάθε ψηφίου (bit)

  1. Λέξη Επιλογής Mode (\(4F_{16} = 01001111_2\)):
  2. \(D_7, D_6 = 0, 1\): Καθορίζουν την κατάσταση λειτουργίας (Mode). Ο συνδυασμός 01 επιλέγει το Mode 1 (Είσοδος Byte / Byte Input). (Σημείωση: 00 = Mode 0 / Output, 01 = Mode 1 / Input, 10 = Mode 2 / Bidirectional, 11 = Mode 3 / Bit control).
  3. \(D_5, D_4 = 0, 0\): Δεν χρησιμοποιούνται στο Mode 1 (Don't care, τίθενται 0).
  4. \(D_3, D_2, D_1, D_0 = 1, 1, 1, 1\): Αναγνωριστικό (Identifier) ότι η λέξη αυτή είναι λέξη επιλογής Mode (xxxx1111).

  5. Λέξη Διανύσματος Διακοπής (\(20_{16} = 00100000_2\)):

  6. \(D_7 - D_1 = 0010000_2\) (\(10_{16}\)): Τα 7 σημαντικότερα bits περιέχουν τη σχετική διεύθυνση (offset) στον πίνακα διανυσμάτων διακοπών (Interrupt Vector Table) της σελίδας που ορίζει ο καταχωρητής I του Z80.
  7. \(D_0 = 0\): Καθορίζει ότι η λέξη που αποστέλλεται είναι διάνυσμα διακοπής (αν \(D_0 = 0\), το PIO την αναγνωρίζει ως Interrupt Vector).

  8. Λέξη Ελέγχου Διακοπών (\(87_{16} = 10000111_2\)):

  9. \(D_7 = 1\): Interrupt Enable (1 = Ενεργοποίηση διακοπών της θύρας, 0 = Απενεργοποίηση).
  10. \(D_6, D_5, D_4 = 0, 0, 0\): Χρησιμοποιούνται μόνο στο Mode 3 για λογικές συνθήκες (AND/OR, High/Low). Στο Mode 1 τίθενται 0.
  11. \(D_3, D_2, D_1, D_0 = 0, 1, 1, 1\): Αναγνωριστικό ότι η λέξη είναι εντολή ελέγχου διακοπών (xxx00111 ή xxxx0111).

Θέμα 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

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Μέγεθος bitmap 640×480, 24 bit/pixel (RGB) = 3 byte/pixel.

  1. Pixel: \(640\cdot480 = 307200\).
  2. Δεδομένα εικόνας: \(307200 \cdot 3 = 921600\) byte \(= 921600/1024 = 900\) KB (KiB).
  3. Σε αρχείο BMP κάθε γραμμή στοιχίζεται σε πολλαπλάσιο των 4 byte: \(640\cdot3=1920\) byte, \(1920 \bmod 4 = 0\) → δεν χρειάζεται padding.
  4. Αν προστεθούν οι επικεφαλίδες BMP (14 byte file header + 40 byte DIB header = 54 byte): \(921600+54 = 921654\) byte.

Απάντηση: 921600 byte (≈900 KB) για τα δεδομένα, 921654 byte συνολικό αρχείο BMP.

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή