Συστήματα Μικροϋπολογιστών — Φεβρουάριος 2026¶
Μεταγραφή από τη φωτογραφία
Messenger_creation_449609D7-3344-4415-9F33-5991707F20F8.jpg(έξι θέματα).
Messenger_creation_449609D7-3344-4415-9F33-5991707F20F8.jpg¶
-
Να σχεδιαστεί και να εξηγηθεί αναλυτικά ο κύκλος απαίτησης και αναγνώρισης για τη διακοπή NMI~.
-
Θέλετε να προγραμματίσετε για το PIO του Z80, τη θύρα Α, στην κατάσταση λειτουργίας τρία (mode 3). Όπου οι περιττού αριθμού ακροδέκτες (\(2\nu+1\)) θα είναι είσοδοι και οι άρτιου αριθμού ακροδέκτες (\(2\nu\)) θα είναι έξοδοι. Θα επιτρέπονται διακοπές στη διεύθυνση ABCD (Hex), όταν δύο ακροδέκτες εισόδου (\(\kappa\), \(\kappa+2\)), θα βρίσκονται σε υψηλή στάθμη δυναμικού. α) Να γράψετε όλες τις απαιτούμενες λέξεις διανυσμάτων, β) να εξηγήσετε αναλυτικά την τιμή του κάθε ψηφίου που επιλέξατε για καθεμία λέξη.
-
Να σχεδιαστεί και να εξηγηθεί αναλυτικά ο χρονισμός των σημάτων, για την εντολή STORE B2 (Hex), R2.
-
Να αναπτυχθεί ρουτίνα που να μετράει λάθη στο κανάλι 2, υπό μορφή παλμών, στη γραμμή CLK/TRG1, κατ' επιλογή με ή χωρίς διακοπές, για μέγιστο πλήθος 0A.
-
Θεωρείστε ένα μικροϋπολογιστικό σύστημα με τέσσερεις περιφερειακές συσκευές: α) να γράψετε και να εξηγήσετε επαρκώς το διάγραμμα λειτουργίας του, σε συνδυασμό των τεχνικών interrupts και polling, β) πως θα ανταποκριθεί το σύστημα για μια παραπάνω επεξεργασία;
-
Θεωρείστε ένα σύστημα ασφαλείας τράπεζας, που ενεργοποιείται και απενεργοποιείται με τη χρήση δύο μηχανισμών βιομετρικών αισθητήρων, έναν για κάθε λειτουργία. Να σχεδιαστεί το κατάλληλο σύστημα, να αναπτυχθεί και να εξηγηθεί ο κώδικας του προγραμματισμού του, με τη χρήση διάταξης τύπου 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}\) (κύκλοι ρολογιού).
Αναλυτική περιγραφή σημάτων ανά κύκλο μηχανής¶
- Κύκλος Μηχανής M1 (Προσκόμιση εντολής — 4T: T1, T2, T3, T4):
- T1: Ο απαριθμητής προγράμματος (PC) τοποθετείται στον δίαυλο διευθύνσεων. Ενεργοποιείται το σήμα \(\overline{\text{M1}}\) (χαμηλή στάθμη).
- Σταθεροποιείται η διεύθυνση και ενεργοποιούνται τα σήματα ελέγχου μνήμης \(\overline{\text{MREQ}}\) και ανάγνωσης \(\overline{\text{RD}}\).
- T2: Η μνήμη τοποθετεί το opcode της εντολής STORE στον δίαυλο δεδομένων.
- T3: Στη θετική ακμή του T3, η CPU διαβάζει το opcode. Απενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\). Ο PC αυξάνεται (\(\text{PC} \leftarrow \text{PC} + 1\)).
-
T3–T4: Εσωτερική αποκωδικοποίηση της εντολής και ανανέωση δυναμικών μνημών (σήμα \(\overline{\text{RFSH}}\) ενεργό σε συνδυασμό με \(\overline{\text{MREQ}}\)).
-
Κύκλος Μηχανής M2 (Ανάγνωση διεύθυνσης B2H — 3T: T1, T2, T3):
- T1: Ο αυξημένος PC τοποθετείται στον δίαυλο διευθύνσεων. Το \(\overline{\text{M1}}\) παραμένει ανενεργό (υψηλή στάθμη). Ενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\).
- T2: Η μνήμη προγράμματος τοποθετεί το byte διεύθυνσης
B2Hστον δίαυλο δεδομένων. -
T3: Η CPU δειγματοληπτεί την τιμή
B2H. Απενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\). Ο PC αυξάνεται (\(\text{PC} \leftarrow \text{PC} + 1\)). -
Κύκλος Μηχανής M3 (Εγγραφή δεδομένου στη μνήμη — 3T: T1, T2, T3):
- T1: Η διεύθυνση προορισμού
B2H(ή00B2H) τοποθετείται στον δίαυλο διευθύνσεων. - Ενεργοποιείται το σήμα \(\overline{\text{MREQ}}\) (χαμηλή στάθμη), δηλώνοντας προσπέλαση μνήμης.
- Το σήμα ανάγνωσης \(\overline{\text{RD}}\) παραμένει ανενεργό (1).
- T2: Η CPU τοποθετεί τα δεδομένα του καταχωρητή
R2στον δίαυλο δεδομένων (Data Bus). - Ενεργοποιείται το σήμα εγγραφής \(\overline{\text{WR}}\) (χαμηλή στάθμη).
- 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. Επεξήγηση Λειτουργίας του Κώδικα¶
- Ασύγχρονη Απόκριση μέσω Διακοπών: Η χρήση των διακοπών
attachInterrupt()στα pins 2 και 3 επιτρέπει την άμεση και αξιόπιστη απόκριση στα βιομετρικά σήματα χωρίς καθυστέρηση και χωρίς να χάνονται παλμοί από καθυστερήσεις του κυρίως βρόχου (loop). - Μεταβλητές
volatile: Οι μεταβλητέςisArmedκαιstateChangedδηλώνονται ωςvolatileώστε ο μεταγλωττιστής να μην εφαρμόζει βελτιστοποιήσεις αποθήκευσης σε καταχωρητές, διασφαλίζοντας ότι διαβάζονται πάντα άμεσα από τη μνήμη RAM. - Αποσύνδεση Λογικής ISR και Εξόδων: Μέσα στις ρουτίνες διακοπής (
activateISR,deactivateISR) εκτελείται αποκλειστικά η αλλαγή της κατάστασης (flag setting). Ο έλεγχος των ηλεκτρονόμων (ρελέ), των LED και των μηνυμάτων σειριακής θύρας εκτελείται με ασφάλεια εντός τηςloop(), αποτρέποντας καθυστερήσεις εντός του διακοπτικού πλαισίου.