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

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

Μεταγραφή από τη φωτογραφία Messenger_creation_449609D7-3344-4415-9F33-5991707F20F8.jpg (έξι θέματα).

Messenger_creation_449609D7-3344-4415-9F33-5991707F20F8.jpg

  1. Να σχεδιαστεί και να εξηγηθεί αναλυτικά ο κύκλος απαίτησης και αναγνώρισης για τη διακοπή NMI~.

  2. Θέλετε να προγραμματίσετε για το PIO του Z80, τη θύρα Α, στην κατάσταση λειτουργίας τρία (mode 3). Όπου οι περιττού αριθμού ακροδέκτες (\(2\nu+1\)) θα είναι είσοδοι και οι άρτιου αριθμού ακροδέκτες (\(2\nu\)) θα είναι έξοδοι. Θα επιτρέπονται διακοπές στη διεύθυνση ABCD (Hex), όταν δύο ακροδέκτες εισόδου (\(\kappa\), \(\kappa+2\)), θα βρίσκονται σε υψηλή στάθμη δυναμικού. α) Να γράψετε όλες τις απαιτούμενες λέξεις διανυσμάτων, β) να εξηγήσετε αναλυτικά την τιμή του κάθε ψηφίου που επιλέξατε για καθεμία λέξη.

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

  4. Να αναπτυχθεί ρουτίνα που να μετράει λάθη στο κανάλι 2, υπό μορφή παλμών, στη γραμμή CLK/TRG1, κατ' επιλογή με ή χωρίς διακοπές, για μέγιστο πλήθος 0A.

  5. Θεωρείστε ένα μικροϋπολογιστικό σύστημα με τέσσερεις περιφερειακές συσκευές: α) να γράψετε και να εξηγήσετε επαρκώς το διάγραμμα λειτουργίας του, σε συνδυασμό των τεχνικών interrupts και polling, β) πως θα ανταποκριθεί το σύστημα για μια παραπάνω επεξεργασία;

  6. Θεωρείστε ένα σύστημα ασφαλείας τράπεζας, που ενεργοποιείται και απενεργοποιείται με τη χρήση δύο μηχανισμών βιομετρικών αισθητήρων, έναν για κάθε λειτουργία. Να σχεδιαστεί το κατάλληλο σύστημα, να αναπτυχθεί και να εξηγηθεί ο κώδικας του προγραμματισμού του, με τη χρήση διάταξης τύπου Arduino.

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

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

Προσοχή

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

AI λύσεις — 2026-02

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

Θέμα 1

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

Κύκλος απαίτησης/αναγνώρισης της \(\overline{NMI}\) (Z80), 11 T = 5 + 3 + 3: - Απαίτηση: η \(\overline{NMI}\) είναι ευαίσθητη σε πτώση ακμής (1→0), δεν μπορεί να απενεργοποιηθεί και έχει προτεραιότητα έναντι της \(\overline{INT}\). Η ακμή κλειδώνεται σε εσωτερικό flip-flop· δειγματοληπτείται στο τέλος της τρέχουσας εντολής (ανοδική ακμή του τελευταίου T). Δεν χρειάζεται IFF1=1. - IFF1 ← 0 (απενεργοποιούνται οι \(\overline{INT}\))· IFF2 κρατά την παλιά τιμή του IFF1. - M1 (5 T): κανονικός κύκλος M1 αλλά το byte που διαβάζεται αγνοείται (NOP) και το PC δεν αυξάνεται. Δεν ενεργοποιείται το \(\overline{IORQ}\) (άρα δεν υπάρχει κύκλος ανάγνωσης διανύσματος). - M2 (3 T): εγγραφή του PCH στη στοίβα (SP←SP−1, \(\overline{MREQ}\), \(\overline{WR}\)). - M3 (3 T): εγγραφή του PCL (SP←SP−1). - Αναγνώριση: PC ← 0066H (σταθερό), εκτέλεση της ρουτίνας NMI και επιστροφή με RETN που επαναφέρει IFF1←IFF2.

Σχέδιο: CLK, A15–A0 (PC, SP−1, SP−2), \(\overline{M1}\) (μόνο στον M1), \(\overline{MREQ}\), \(\overline{RD}\) (στον M1), \(\overline{WR}\) (M2, M3), D7–D0 (PCH, PCL). Η ακριβής θέση των ακμών είναι από μνήμη.

Θέμα 2

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

α) Απαιτούμενες Λέξεις Ελέγχου και Διανύσματος (Control Words & Vector)

Για τον προγραμματισμό της Θύρας Α του Z80 PIO σε Κατάσταση 3 (Mode 3 - Control/Bit Mode): 1. Λέξη Επιλογής Κατάστασης (Mode Control Word): 0xFF (\(11111111_2\)) 2. Λέξη Κατεύθυνσης Ακροδεκτών (I/O Register Control Word): 0xAA (\(10101010_2\)) 3. Λέξη Ελέγχου Διακοπών (Interrupt Control Word): 0xF7 (\(11110111_2\)) 4. Λέξη Μάσκας Διακοπών (Interrupt Mask Word): 0xF5 (\(11110101_2\)) (θεωρώντας την επιλογή \(\kappa=1\), δηλαδή τους ακροδέκτες \(A_1\) και \(A_3\)) 5. Λέξη Διανύσματος Διακοπής (Interrupt Vector Word): 0xCC (\(11001100_2\)) [ή 0xCD, βλ. ανάλυση]


β) Αναλυτική Εξήγηση των Ψηφίων (Bits) κάθε Λέξης

1. Λέξη Επιλογής Κατάστασης (Mode Control Word): 0xFF (\(11111111_2\))

  • Μορφή: \(D_7 D_6 D_5 D_4 D_3 D_2 D_1 D_0 = M_1 M_0 \times \times 1 1 1 1\)
  • \(D_7 D_6 = 11\): Επιλογή Κατάστασης 3 (Mode 3: Bit-by-bit bidirectional control).
  • \(D_5 D_4 = 11\): Αδιάφορα bits (Don't care), είθισται να τίθενται σε \(1\).
  • \(D_3 D_2 D_1 D_0 = 1111\): Αναγνωριστικό (Identifier) ότι η λέξη είναι εντολή επιλογής κατάστασης (Mode Select Word).

2. Λέξη Κατεύθυνσης Ακροδεκτών (I/O Register Control Word): 0xAA (\(10101010_2\))

  • Ακολουθεί υποχρεωτικά τη λέξη Mode 3. Κάθε bit αντιστοιχεί σε έναν ακροδέκτη \(A_7 \dots A_0\): \(1\) για Είσοδο (Input), \(0\) για Έξοδο (Output).
  • Περιττοί ακροδέκτες (\(2\nu+1\)): \(A_1, A_3, A_5, A_7 \to \text{Είσοδοι} = 1\).
  • Άρτιοι ακροδέκτες (\(2\nu\)): \(A_0, A_2, A_4, A_6 \to \text{Έξοδοι} = 0\).
  • Διάταξη bits: $\(D_7(A_7)=1, \; D_6(A_6)=0, \; D_5(A_5)=1, \; D_4(A_4)=0, \; D_3(A_3)=1, \; D_2(A_2)=0, \; D_1(A_1)=1, \; D_0(A_0)=0\)$ Επομένως: \(10101010_2 = \text{AA}_{16}\).

3. Λέξη Ελέγχου Διακοπών (Interrupt Control Word): 0xF7 (\(11110111_2\))

  • Μορφή: \(D_7 D_6 D_5 D_4 0 1 1 1\)
  • \(D_7 = 1\): Enable Interrupt (Επιτρέπονται οι διακοπές).
  • \(D_6 = 1\): Συνθήκη AND (απαιτείται να ικανοποιούνται ταυτόχρονα και οι δύο ακροδέκτες \(\kappa\) και \(\kappa+2\)).
  • \(D_5 = 1\): High level active (ενεργή υψηλή στάθμη δυναμικού, όπως ζητείται).
  • \(D_4 = 1\): Mask follows (δηλώνει ότι η αμέσως επόμενη λέξη θα είναι η λέξη μάσκας ακροδεκτών).
  • \(D_3 D_2 D_1 D_0 = 0111\): Αναγνωριστικό για τη λέξη ελέγχου διακοπής.
  • Συνολικά: \(11110111_2 = \text{F7}_{16}\).

4. Λέξη Μάσκας (Interrupt Mask Word): 0xF5 (\(11110101_2\))

  • Στον Z80 PIO, ένα bit \(1\) σημαίνει ότι ο αντίστοιχος ακροδέκτης αγνοείται/καλύπτεται (masked), ενώ bit \(0\) σημαίνει ότι ο ακροδέκτης παρακολουθείται (monitored) για τη δημιουργία διακοπής.
  • Οι ακροδέκτες εισόδου είναι οι \(A_1, A_3, A_5, A_7\). Επιλέγουμε ένα ζεύγος \((\kappa, \kappa+2)\) εισόδων, π.χ. για \(\kappa=1\) έχουμε τους \(A_1\) και \(A_3\) (άλλες έγκυρες επιλογές: \(\kappa=3 \implies A_3, A_5\) ή \(\kappa=5 \implies A_5, A_7\)).
  • Για \(\kappa=1\): παρακολουθούνται οι \(A_1, A_3\) (\(D_1=0, D_3=0\)), ενώ όλοι οι υπόλοιποι ακροδέκτες τίθενται σε μάσκα (\(1\)).
  • Διάταξη: \(D_7=1, D_6=1, D_5=1, D_4=1, D_3=0, D_2=1, D_1=0, D_0=1 \implies 11110101_2 = \text{F5}_{16}\).

5. Λέξη Διανύσματος Διακοπής (Interrupt Vector): 0xCC (\(11001100_2\))

  • Στην Κατάσταση Διακοπών 2 (Interrupt Mode 2) του Z80, η 16-bit διεύθυνση του πίνακα δεικτών διακοπής σχηματίζεται από:
  • Υψηλό byte (\(A_{15} \dots A_8\)): Καταχωρητής \(\text{I} = \text{AB}_{16}\).
  • Χαμηλό byte (\(A_7 \dots A_0\)): Παρέχεται από το περιφερειακό (PIO).
  • Βάσει προδιαγραφών του Z80 PIO, το bit \(D_0\) της λέξης διανύσματος πρέπει υποχρεωτικά να είναι \(0\) (ώστε να αναγνωρίζεται ως διάνυσμα και να δείχνει σε άρτια διεύθυνση μνήμης 16-bit δείκτη): $\(D_7 \dots D_1 = V_7 \dots V_1, \quad D_0 = 0\)$
  • Για διεύθυνση πίνακα \(\text{ABCD}_{16}\), το χαμηλό byte έχει \(D_{16} = 1101_2\) (περιττό). Λόγω του περιορισμού \(D_0=0\), το PIO ευθυγραμμίζει το διάνυσμα στην προηγούμενη άρτια διεύθυνση \(\text{CC}_{16} = 11001100_2\) (όπου ο δείκτης 16-bit αποθηκεύεται στις θέσεις \(\text{ABCC}_{16}\) και \(\text{ABCD}_{16}\)). (Αν δοθεί απευθείας η τιμή \(\text{CD}_{16}\), το υλικό του PIO μηδενίζει αυτόματα το \(D_0\) παράγοντας \(\text{CC}_{16}\)).

Θέμα 3

Αξιοπιστία: λύθηκε με βάση τις φωτογραφίες του θέματος· μία λύση AI

Στην πρωτότυπη εικόνα Messenger_creation_449609D7-3344-4415-9F33-5991707F20F8.jpg η εκφώνηση διατυπώνεται ως εξής: «3. Να σχεδιαστεί και να εξηγηθεί αναλυτικά ο χρονισμός των σημάτων, για την εντολή STORE B2 (Hex), R2.»

Ανάλυση της εντολής και κανόνες χρονισμού

Η εντολή STORE B2 (Hex), R2 (ή STORE (B2H), R2) δηλώνει αποθήκευση του περιεχομένου του καταχωρητή R2 στη θέση μνήμης (ή σελίδα μηδέν/offset) με διεύθυνση B2H (άμεση/άμεση σελίδας διευθυνσιοδότηση μνήμης): $\((\text{B2H}) \leftarrow R2\)$ Στις σημειώσεις και τη διδασκαλία του μαθήματος (κανόνες υπολογισμού κύκλων μηχανής και ρολογιού), η εντολή αποτελείται από: - Μέγεθος εντολής: 2 bytes (1 byte για το opcode της εντολής STORE και 1 byte για τη δεκαεξαδική διεύθυνση B2H). - Κύκλοι μηχανής (3 MC): 1. M1 (Opcode Fetch — 4T): Προσκόμιση και αποκωδικοποίηση του κωδικού λειτουργίας (Opcode). 2. M2 (Memory Read — 3T): Ανάγνωση του byte της διεύθυνσης B2H από τη μνήμη προγράμματος. 3. M3 (Memory Write — 3T): Εγγραφή του περιεχομένου του καταχωρητή R2 στη θέση μνήμης B2H (ή 00B2H). - Συνολικός χρόνος: \(4\text{T} + 3\text{T} + 3\text{T} = 10\text{ T-states}\) (κύκλοι ρολογιού).


Αναλυτική περιγραφή σημάτων ανά κύκλο μηχανής

  1. Κύκλος Μηχανής M1 (Προσκόμιση εντολής — 4T: T1, T2, T3, T4):
  2. T1: Ο απαριθμητής προγράμματος (PC) τοποθετείται στον δίαυλο διευθύνσεων. Ενεργοποιείται το σήμα \(\overline{\text{M1}}\) (χαμηλή στάθμη).
  3. Σταθεροποιείται η διεύθυνση και ενεργοποιούνται τα σήματα ελέγχου μνήμης \(\overline{\text{MREQ}}\) και ανάγνωσης \(\overline{\text{RD}}\).
  4. T2: Η μνήμη τοποθετεί το opcode της εντολής STORE στον δίαυλο δεδομένων.
  5. T3: Στη θετική ακμή του T3, η CPU διαβάζει το opcode. Απενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\). Ο PC αυξάνεται (\(\text{PC} \leftarrow \text{PC} + 1\)).
  6. T3–T4: Εσωτερική αποκωδικοποίηση της εντολής και ανανέωση δυναμικών μνημών (σήμα \(\overline{\text{RFSH}}\) ενεργό σε συνδυασμό με \(\overline{\text{MREQ}}\)).

  7. Κύκλος Μηχανής M2 (Ανάγνωση διεύθυνσης B2H — 3T: T1, T2, T3):

  8. T1: Ο αυξημένος PC τοποθετείται στον δίαυλο διευθύνσεων. Το \(\overline{\text{M1}}\) παραμένει ανενεργό (υψηλή στάθμη). Ενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\).
  9. T2: Η μνήμη προγράμματος τοποθετεί το byte διεύθυνσης B2H στον δίαυλο δεδομένων.
  10. T3: Η CPU δειγματοληπτεί την τιμή B2H. Απενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\). Ο PC αυξάνεται (\(\text{PC} \leftarrow \text{PC} + 1\)).

  11. Κύκλος Μηχανής M3 (Εγγραφή δεδομένου στη μνήμη — 3T: T1, T2, T3):

  12. T1: Η διεύθυνση προορισμού B2H (ή 00B2H) τοποθετείται στον δίαυλο διευθύνσεων.
  13. Ενεργοποιείται το σήμα \(\overline{\text{MREQ}}\) (χαμηλή στάθμη), δηλώνοντας προσπέλαση μνήμης.
  14. Το σήμα ανάγνωσης \(\overline{\text{RD}}\) παραμένει ανενεργό (1).
  15. T2: Η CPU τοποθετεί τα δεδομένα του καταχωρητή R2 στον δίαυλο δεδομένων (Data Bus).
  16. Ενεργοποιείται το σήμα εγγραφής \(\overline{\text{WR}}\) (χαμηλή στάθμη).
  17. T3: Τα δεδομένα σταθεροποιούνται και εγγράφονται στη μνήμη. Στο τέλος του T3 απενεργοποιούνται τα σήματα \(\overline{\text{WR}}\) και \(\overline{\text{MREQ}}\), ολοκληρώνοντας τον κύκλο εγγραφής.

Χρονοδιάγραμμα Σημάτων (Timing Diagram)

Σήμα         | T1   T2   T3   T4   | T1   T2   T3   | T1   T2   T3   |
-----------------------------------------------------------------------
CLK          | _/¯\_/¯\_/¯\_/¯\_/¯\ | _/¯\_/¯\_/¯\_/¯\ | _/¯\_/¯\_/¯\_/¯\ |
             | <---- Κύκλος M1 ----> | <-- Κύκλος M2 --> | <-- Κύκλος M3 --> |
             |    (Opcode Fetch)     |   (Read B2H)     |   (Write R2)     |
             |                      |                  |                  |
Address Bus  |===== PC =====|== R ==|==== PC+1 ====|   |===== B2H =======|
/M1          |¯\___________/¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
/MREQ        |¯¯¯\_______/¯¯\____/¯¯|¯¯¯\_______/¯¯¯¯¯¯|¯¯¯\_______/¯¯¯¯¯¯|
/RD          |¯¯¯\_______/¯¯¯¯¯¯¯¯¯¯|¯¯¯\_______/¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
/WR          |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯\_____/¯¯¯¯¯¯|
/RFSH        |¯¯¯¯¯¯¯¯¯¯¯\_______/¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
Data Bus     |------|=== Opcode ===||------|=== B2H ===|------|=== (R2) ===|
             |      (Είσοδος)       |      (Είσοδος)   |      (Έξοδος)    |

Θέμα 4

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

1. Θεωρητική Προσέγγιση (Προγραμματισμός Z80 CTC)

Για την καταμέτρηση παλμών (λαθών) στη γραμμή CLK/TRG χρησιμοποιείται ο προγραμματιζόμενος χρονομετρητής/μετρητής Z80 CTC σε Κατάσταση Μετρητή (Counter Mode). (Σημείωση: Στο Z80 CTC κάθε κανάλι \(i\) συνδέεται με τη γραμμή CLK/TRG\(_i\). Εδώ αναφέρεται η παρακολούθηση της εισόδου CLK/TRG1, δηλαδή του Καναλιού 1 του CTC, με στόχο μέγιστο πλήθος λαθών \(0\text{A}_{16} = 10_{10}\)).

Η λέξη ελέγχου καναλιού (Channel Control Word) διαμορφώνεται ως εξής: * Bit 7: Interrupt Enable (\(1=\) Με διακοπή, \(0=\) Χωρίς διακοπή / Polling) * Bit 6: Mode (\(1=\) Counter Mode) * Bit 5: Prescaler (\(0\), αγνοείται σε counter mode) * Bit 4: CLK/TRG Edge (\(1=\) Ενεργή ανερχόμενη ακμή) * Bit 3: Trigger (\(0\), αγνοείται σε counter mode) * Bit 2: Time Constant Follows (\(1=\) Ακολουθεί σταθερά χρόνου) * Bit 1: Software Reset (\(1=\) Reset καναλιού) * Bit 0: Control Word Flag (\(1=\) Αναγνωριστικό λέξης ελέγχου)

Συνεπώς: - Με Διακοπές: \(11010111_2 = \text{D7}_{16}\) - Χωρίς Διακοπές: \(01010111_2 = \text{57}_{16}\) - Σταθερά Χρόνου (Time Constant): \(0\text{A}_{16}\)


2. Ρουτίνα σε Συμβολική Γλώσσα Z80

; ==============================================================================
; ΔΙΕΥΘΥΝΣΕΙΣ ΘΥΡΩΝ Z80 CTC
; ==============================================================================
CTC_CH1     EQU  11H         ; Διεύθυνση θύρας Καναλιού 1 CTC
MAX_ERRORS  EQU  0AH         ; Μέγιστο πλήθος λαθών = 0A (Hex) = 10 (Dec)

; ==============================================================================
; ΕΠΙΛΟΓΗ 1: ΑΡΧΙΚΟΠΟΙΗΣΗ ΚΑΙ ΜΕΤΡΗΣΗ ΧΩΡΙΣ ΔΙΑΚΟΠΕΣ (POLLING)
; ==============================================================================
INIT_POLLING:
    LD   A, 57H              ; Mode: Counter, No Interrupts, TC follows
    OUT  (CTC_CH1), A        ; Αποστολή λέξης ελέγχου στο Κανάλι 1
    LD   A, MAX_ERRORS       ; Φόρτωση ορίου λαθών (0AH)
    OUT  (CTC_CH1), A        ; Αποστολή σταθεράς χρόνου

POLL_LOOP:
    ; Σε Counter Mode, η ανάγνωση της θύρας επιστρέφει την τρέχουσα τιμή του μετρητή
    IN   A, (CTC_CH1)        ; Ανάγνωση υπολειπόμενου αριθμού παλμών
    OR   A                   ; Έλεγχος αν ο μετρητής έφτασε στο 0
    JR   NZ, POLL_LOOP       ; Αν A != 0, συνέχισε τον έλεγχο

    ; Αν φτάσει στο 0, συμπληρώθηκαν τα 0A λάθη
    CALL HANDLE_MAX_ERRORS   ; Κλήση ρουτίνας διαχείρισης σφάλματος
    RET

; ==============================================================================
; ΕΠΙΛΟΓΗ 2: ΑΡΧΙΚΟΠΟΙΗΣΗ ΚΑΙ ΜΕΤΡΗΣΗ ΜΕ ΔΙΑΚΟΠΕΣ (INTERRUPTS - MODE 2)
; ==============================================================================
INIT_INTERRUPT:
    IM   2                   ; Θέσε τον Z80 σε Interrupt Mode 2

    LD   A, D7H              ; Mode: Counter, INTERRUPTS ENABLED, TC follows
    OUT  (CTC_CH1), A        ; Αποστολή λέξης ελέγχου στο Κανάλι 1
    LD   A, MAX_ERRORS       ; Φόρτωση ορίου 0AH
    OUT  (CTC_CH1), A        ; Αποστολή σταθεράς χρόνου
    EI                       ; Επιτροπή διακοπών επεξεργαστή
    RET

; ==============================================================================
; ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΕΤΗΣΗΣ ΔΙΑΚΟΠΗΣ (INTERRUPT SERVICE ROUTINE - ISR)
; Εκτελείται αυτόματα μόλις καταμετρηθούν 0A παλμοί στο CLK/TRG1
; ==============================================================================
CTC_CH1_ISR:
    DI                       ; Απενεργοποίηση διακοπών
    PUSH AF                  ; Αποθήκευση καταχωρητών
    PUSH BC
    PUSH HL

    CALL HANDLE_MAX_ERRORS   ; Επεξεργασία συμβάντος μέγιστου αριθμού λαθών

    POP  HL                  ; Επαναφορά καταχωρητών
    POP  BC
    POP  AF
    EI                       ; Επανενεργοποίηση διακοπών
    RETI                     ; Επιστροφή από διακοπή (ενημερώνει το CTC daisy-chain)

HANDLE_MAX_ERRORS:
    ; Ρουτίνα ένδειξης/χειρισμού υπέρβασης ορίου λαθών
    RET

Θέμα 5

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

(α) Τέσσερις περιφερειακές D1–D4 με συνδυασμό διακοπών και polling: όλες οδηγούν μέσω wired-OR την κοινή \(\overline{INT}\) και έχουν σημαία κατάστασης.

Ροή: 1. Αρχικοποίηση (SP, IM, μάσκες συσκευών, EI) → κύριο πρόγραμμα. 2. \(\overline{INT}\)=0 → ο CPU τελειώνει την εντολή, σώζει το PC, εισέρχεται στην ISR. 3. ISR: σώζει καταχωρητές· polling σημαιών D1→D4 με σειρά προτεραιότητας: αν η σημαία της Di=1 → εξυπηρέτηση, καθαρισμός σημαίας. 4. Επανέλεγχος μέχρι να μην εκκρεμεί καμία· επαναφορά καταχωρητών, EI, RETI.

Το πλεονέκτημα: ένα μόνο pin διακοπής για όλες και καμία σπατάλη χρόνου στο κύριο πρόγραμμα.

(β) Για «μια παραπάνω επεξεργασία» (π.χ. 5η συσκευή/επιπλέον εργασία): απλή προσθήκη ενός ακόμη ελέγχου σημαίας στην ISR και στην ίδια γραμμή INT· η καθυστέρηση απόκρισης για τις χαμηλότερης προτεραιότητας αυξάνεται. Αν δεν επαρκεί, IM 2 με διάνυσμα ανά συσκευή (daisy chain) ή ελεγκτής διακοπών. Η ερμηνεία του (β) είναι εικασία.

Θέμα 6

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

1. Αρχιτεκτονική και Σχεδίαση Συστήματος

Το σύστημα υλοποιείται με μικροελεγκτή τύπου Arduino (π.χ. Arduino Uno): * Μηχανισμός Αισθητήρα 1 (Ενεργοποίηση - Activation Sensor): Βιομετρικός αισθητήρας (π.χ. δακτυλικό αποτύπωμα / αναγνώριση προσώπου με ψηφιακή έξοδο αναγνώρισης έγκυρου χρήστη MATCH_OK), συνδεδεμένος στην ψηφιακή είσοδο Pin 2 (με δυνατότητα εξωτερικής διακοπής INT0). * Μηχανισμός Αισθητήρα 2 (Απενεργοποίηση - Deactivation Sensor): Δεύτερος ανεξάρτητος βιομετρικός αισθητήρας, συνδεδεμένος στην ψηφιακή είσοδο Pin 3 (εξωτερική διακοπή INT1). * Μονάδες Εξόδου: - Ηλεκτρομαγνητική κλειδαριά / Ρελέ ασφαλείας (Relay) στο Pin 8. - Σειρήνα / Συναγερμός (Siren/Buzzer) στο Pin 9. - Ενδεικτικά LED κατάστασης: Κόκκινο LED (Οπλισμένο/Armed) στο Pin 11, Πράσινο LED (Αφοπλισμένο/Disarmed) στο Pin 12.

  +--------------------------------------------------------------+
  |                        ARDUINO UNO                           |
  |                                                              |
  |   [Pin 2 (INT0)] <--- Βιομετρικός Αισθητήρας Ενεργοποίησης   |
  |   [Pin 3 (INT1)] <--- Βιομετρικός Αισθητήρας Απενεργοποίησης |
  |                                                              |
  |   [Pin 8]        ---> Ρελέ Κλειδώματος Τράπεζας (Relay)     |
  |   [Pin 9]        ---> Σειρήνα Συναγερμού (Siren)             |
  |   [Pin 11]       ---> LED Οπλισμένο (Κόκκινο)                |
  |   [Pin 12]       ---> LED Αφοπλισμένο (Πράσινο)              |
  +--------------------------------------------------------------+

2. Κώδικας Προγραμματισμού (Arduino C++)

// ==============================================================================
// ΣΥΣΤΗΜΑ ΑΣΦΑΛΕΙΑΣ ΤΡΑΠΕΖΑΣ ΜΕ ΔΥΟ ΒΙΟΜΕΤΡΙΚΟΥΣ ΑΙΣΘΗΤΗΡΕΣ
// ==============================================================================

const int PIN_SENSOR_ACTIVATE   = 2;  // Αισθητήρας 1: Ενεργοποίηση (INT0)
const int PIN_SENSOR_DEACTIVATE = 3;  // Αισθητήρας 2: Απενεργοποίηση (INT1)

const int PIN_RELAY_LOCK  = 8;        // Ρελέ ηλεκτρομαγνητικής ασφάλισης
const int PIN_ALARM       = 9;        // Σειρήνα / Συναγερμός
const int PIN_LED_ARMED   = 11;       // Κόκκινο LED: Σύστημα ενεργό (οπλισμένο)
const int PIN_LED_DISARM  = 12;       // Πράσινο LED: Σύστημα ανενεργό

// Μεταβλητή κατάστασης (volatile λόγω χρήσης σε Interrupts)
volatile bool isArmed = false;
volatile bool stateChanged = false;

// ------------------------------------------------------------------------------
// ΡΟΥΤΙΝΑ ΔΙΑΚΟΠΗΣ 1: Ενεργοποίηση Συστήματος
// ------------------------------------------------------------------------------
void activateISR() {
  if (!isArmed) {
    isArmed = true;
    stateChanged = true;
  }
}

// ------------------------------------------------------------------------------
// ΡΟΥΤΙΝΑ ΔΙΑΚΟΠΗΣ 2: Απενεργοποίηση Συστήματος
// ------------------------------------------------------------------------------
void deactivateISR() {
  if (isArmed) {
    isArmed = false;
    stateChanged = true;
  }
}

// ------------------------------------------------------------------------------
// ΑΡΧΙΚΟΠΟΙΗΣΗ ΣΥΣΤΗΜΑΤΟΣ (Setup)
// ------------------------------------------------------------------------------
void setup() {
  pinMode(PIN_SENSOR_ACTIVATE, INPUT_PULLUP);
  pinMode(PIN_SENSOR_DEACTIVATE, INPUT_PULLUP);

  pinMode(PIN_RELAY_LOCK, OUTPUT);
  pinMode(PIN_ALARM, OUTPUT);
  pinMode(PIN_LED_ARMED, OUTPUT);
  pinMode(PIN_LED_DISARM, OUTPUT);

  // Αρχική κατάσταση: Αφοπλισμένο
  digitalWrite(PIN_RELAY_LOCK, LOW);
  digitalWrite(PIN_ALARM, LOW);
  digitalWrite(PIN_LED_ARMED, LOW);
  digitalWrite(PIN_LED_DISARM, HIGH);

  Serial.begin(9600);
  Serial.println("Bank Security System Initialized: DISARMED");

  // Σύνδεση εξωτερικών διακοπών στην ανερχόμενη ακμή (σήμα επιτυχούς ταυτοποίησης)
  attachInterrupt(digitalPinToInterrupt(PIN_SENSOR_ACTIVATE), activateISR, RISING);
  attachInterrupt(digitalPinToInterrupt(PIN_SENSOR_DEACTIVATE), deactivateISR, RISING);
}

// ------------------------------------------------------------------------------
// ΚΥΡΙΟΣ ΒΡΟΧΟΣ ΕΛΕΓΧΟΥ (Main Loop)
// ------------------------------------------------------------------------------
void loop() {
  if (stateChanged) {
    stateChanged = false; // Εκκαθάριση σημαίας αλλαγής κατάστασης

    if (isArmed) {
      // Ενέργειες κατά την Ενεργοποίηση / Όπλιση
      digitalWrite(PIN_RELAY_LOCK, HIGH); // Κλείδωμα θυρών θησαυροφυλακίου
      digitalWrite(PIN_LED_ARMED, HIGH);  // Άναμμα κόκκινου LED
      digitalWrite(PIN_LED_DISARM, LOW);  // Σβήσιμο πράσινου LED
      Serial.println("[ALERT] System ARMED via Sensor 1!");
    } else {
      // Ενέργειες κατά την Απενεργοποίηση / Αφόπλιση
      digitalWrite(PIN_RELAY_LOCK, LOW);  // Ξεκλείδωμα θυρών
      digitalWrite(PIN_ALARM, LOW);       // Απενεργοποίηση συναγερμού αν ηχούσε
      digitalWrite(PIN_LED_ARMED, LOW);   // Σβήσιμο κόκκινου LED
      digitalWrite(PIN_LED_DISARM, HIGH); // Άναμμα πράσινου LED
      Serial.println("[INFO] System DISARMED via Sensor 2.");
    }
  }

  // Πρόσθετες περιοδικές διεργασίες επιτήρησης
  delay(50);
}

3. Επεξήγηση Λειτουργίας του Κώδικα

  1. Ασύγχρονη Απόκριση μέσω Διακοπών: Η χρήση των διακοπών attachInterrupt() στα pins 2 και 3 επιτρέπει την άμεση και αξιόπιστη απόκριση στα βιομετρικά σήματα χωρίς καθυστέρηση και χωρίς να χάνονται παλμοί από καθυστερήσεις του κυρίως βρόχου (loop).
  2. Μεταβλητές volatile: Οι μεταβλητές isArmed και stateChanged δηλώνονται ως volatile ώστε ο μεταγλωττιστής να μην εφαρμόζει βελτιστοποιήσεις αποθήκευσης σε καταχωρητές, διασφαλίζοντας ότι διαβάζονται πάντα άμεσα από τη μνήμη RAM.
  3. Αποσύνδεση Λογικής ISR και Εξόδων: Μέσα στις ρουτίνες διακοπής (activateISR, deactivateISR) εκτελείται αποκλειστικά η αλλαγή της κατάστασης (flag setting). Ο έλεγχος των ηλεκτρονόμων (ρελέ), των LED και των μηνυμάτων σειριακής θύρας εκτελείται με ασφάλεια εντός της loop(), αποτρέποντας καθυστερήσεις εντός του διακοπτικού πλαισίου.

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


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