Post on 26-Dec-2015
description
Εθνικό Μετσόβιο Πολυτεχνείο
Συστήματα Μικρουπολογιστών
Σημειώσεις Εξέτασης
Εθνικό Μετσόβιο Πολυτεχνείο
Συστήματα Μικρουπολογιστών
8085
Contents
1 Routines 21.1 Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 Divide 8bit/8bit . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Bin to Dec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Hex to Dec . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.5 Bin to Hex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.6 For Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.7 Take Bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.8 Count 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.9 Fibonacci Numbers . . . . . . . . . . . . . . . . . . . . . . . . 61.10 Break A to Bits . . . . . . . . . . . . . . . . . . . . . . . . . . 71.11 Delay 1 Second . . . . . . . . . . . . . . . . . . . . . . . . . . 91.12 Input-Output . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.13 Print 7-seg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.14 Find The Max . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.15 Divide 16bit/8bit . . . . . . . . . . . . . . . . . . . . . . . . . 111.16 Sort Ascending order . . . . . . . . . . . . . . . . . . . . . . . 121.17 Enable Interupts . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 1st Series 2011 142.1 1.2 — Led Rotating . . . . . . . . . . . . . . . . . . . . . . . . 142.2 1.4 — Logical . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 2nd Series 2011 173.1 2.1 — Save 0-255 Serially - Count 1 - Compare . . . . . . . . . 203.2 2.2 — Controlling Led . . . . . . . . . . . . . . . . . . . . . . 223.3 2.3-5 — Memories . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 3rd Series 2011 334.1 3.1 — Leds 1st On,1011 0100 =¿ XXXX XXOO . . . . . . . 364.2 3.2 — Read From keyboard show on Leds . . . . . . . . . . . 374.3 3.3 — Straight Read keyboard - Print 7-Segments . . . . . . . 394.4 3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.5 3.7-9 — Memories + Macros (Swap,Fill Addr,Rhll) . . . . . . 53
5 Exam Exercises 595.1 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595.2 2004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625.3 2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
1
1 Routines
1.1 Multiplication
Πολλαπλασιασμός C ∗B και αποθήκευση αποτελέσματος στον Β.
1 MOV A , C ; Move c to accumulator
2
3 MUL :4 ADD C
5 DCR B
6 JNZ MUL
7 SUB C
8 MOV B , A ; Keep result on B
1.2 Divide 8bit/8bit
Εκτελεί την διαίρεση C = A / B,το πηλίκο (αποτέλεσμα)αποθηκεύετε στο F,Cκαι το υπόλοιπο στο Ε.
1 MVI C , 00 H ; Initialize C
2
3 LABEL : SUB B
4 INR C
5 JNC LABEL ; While no Carry ( CY=0)6 DCR C ; If CY 1 jump and dcr
7 ADD B ; Get Remainder
8 MOV E , A ; E = Remainder
9 MOV F , C ; F = C = Quotient
10
11 HLT
1.3 Bin to Dec
Σπάει το δυαδικό καταχωρητή Α σε 10-δικούς
Α → Μονάδες, Β → Δεκάδες, C→ Εκατοντάδες
1 MOV C , A2 ANI 80H ; If I want to show minus − keep MSB
3 CPI 80H
2
4 JZ MINUS
5 MOV A , C6 JMP CON1
7
8 MINUS :9 MVI A , 1 CH ; A = Minus Symbol
10 STA 0B03H11 MOV A , C12 CMA ; Inverse A and Add 113 ADI 01H14
15 ; Else Start Here
16 CON1 :17 MVI B , 00 H ; Initialize Tens
18 MVI C , 00 H ; Initialize Hundreds
19
20 LO :21 SUI 64H22 JC LO1 ; If I subbed an ”extra” hundred
23 INR C ; hundreds++24 JMP LO
25
26 LO1 :27 ADI 64H28
29 LO2 :30 SUI 0AH31 JC LO3
32 INR B
33 JMP LO2
34
35 LO3 :36 ADI 0AH
1.4 Hex to Dec
Χωρισμός δεκαεξαδικού καταχωρητή Α σε 10-δικούς
Α → Μονάδες, Β → Δεκάδες, C→ Εκατοντάδες
1 MVI B , 00 H2 MVI C , 00 H3 XD_HUNDRED :
3
4 CPI 64H5 JC XD_DEC
6 INR C
7 SUI 64H8 JMP XD_HUNDRED
9
10 XD_DEC :11 CPI 0AH12 JC XD_CONT
13 INR B
14 SUI 0AH15 JMP XD_DEC
16
17 XD_CONT :
1.5 Bin to Hex
Σπάει το δυαδικό καταχωρητή Α σε 2 δεκαεξαδικούς Α → 4MSB, B → 4LSB
1 MOV C , A2 ANI 0FH3 MOV B , A ; 4LSB−>B4 MOV A , C5 ANI F0H
6 RRC
7 RRC
8 RRC
9 RRC ; 4 MSB−>A
1.6 For Loop
Εκτέλεση For Loop από Μ = 1 μέχρι Α
1 MVI A , 01 H ; gia 1 epanalipsi
2 FOR_LOOP_START :3 PUSH H
4 LXI H , 0 B00H5 MVI M , 01 H6 POP H
7 FOR_LOOP2_START :8 PUSH H
4
9 LXI H , 0 B00H10 PUSH PSW
11 CMP M
12 JZ FOR_LOOP2_END
13 JC FOR_LOOP2_END
14 INR M
15 POP PSW
16 POP H
17
18 ;−−−−−−−−−−−−−−−19 ; ENTER CODE HERE
20 ;−−−−−−−−−−−−−−−21
22 JMP FOR_LOOP2_START
23
24 FOR_LOOP2_END :25 POP PSW
26 POP H
1.7 Take Bit
Απομονώνουμε όποιο bit του Α θέλουμε. Βάζουμε στον Β τον αριθμό του bit1-8 και παίρνουμε ως έξοδο στον Α το bit που επιλέξαμε απομονωμένο στην
θέση LSB.
1 ; take bit i (B :1−8) from A
2 TB_FOR_LOOP_START :3 PUSH H
4 LXI H , 0 B00H5 MVI M , 01 H6 POP H
7 TB_FOR_LOOP2_START :8 PUSH H
9 LXI H , 0 B00H10 PUSH PSW
11 MOV A , B ; gia B epanalipseis
12 CMP M
13 JZ TB_FOR_LOOP2_END
14 JC TB_FOR_LOOP2_END
15 INR M
16 POP PSW
17 POP H
5
18
19 ;−−−−−−−−−−−−−−−20 RRC
21 ;−−−−−−−−−−−−−−−22
23 JMP TB_FOR_LOOP2_START
24
25 TB_FOR_LOOP2_END :26 POP PSW
27 POP H
28 ANI A , 01 H
1.8 Count 1
Μετράει το πλήθος των άσσων του καταχωρητή Α και αποθηκεύει το αποτέλεσμα
στον καταχωρητή Β.
1 MVI B , 00H ; Initialize B as counter of 12 MVI C , 08H ; Initialize C as loop counter
3
4 BACK :5 RAR ; Shift Right and CY = A0
6 JNC SKIP ; if no carry CY = A0 = 0 then SKIP
7 INR B ; If CY = A0 = 1 increase count of 18
9 SKIP :10 DCR C ; Decrease loop counter and continue loop
11 JNZ BACK
12 HLT
1.9 Fibonacci Numbers
Αρχικώς φορτώνω στο ζευγάρι HL την διεύθυνση στην οποία θα ξεκινήσω να
αποθηκεύω σειριακά την ακολουθία Fibonacci . Χρησιμοποιώ τον καταχωρητή
D ως μετρητής για το πόσους αριθμούς της ακολουθίας θέλω. Στον Β έχω τον
¨προηγούμενο αριθμό’ ενώ στον C τον ¨επόμενο¨.
1 MVI B , 00H ; Initialize B as counter of 12 MVI C , 08H ; Initialize C as loop counter
3
4 BACK :
6
5 RAR ; Shift Right and CY = A0
6 JNC SKIP ; if no carry CY = A0 = 0 then SKIP
7 INR B ; If CY = A0 = 1 increase count of 18
9 SKIP :10 DCR C ; Decrease loop counter and continue loop
11 JNZ BACK
12 HLT
1.10 Break A to Bits
Σπάει το Α σε bits.Στο συγκεκριμένο παράδειγμα μετράει το πλήθος των άσσων
και το πλήθος των μηδενικών του Α.
1 LDA 2000H2 MOV B , A3 BIT0 : ; D = BIT0
4 ANI 01H5 MOV D , A6 MOV A , B7 RRC
8
9 BIT1 : ; E = BIT1
10 ANI 01H11 MOV E , A12 MOV A , B13 RRC
14 RRC
15
16 BIT2 : ; H = BIT2
17 ANI 01H18 MOV H , A19 MOV A , B20 RRC
21 RRC
22 RRC
23
24 BIT3 : ; L = BIT3
25 ANI 01H26 MOV L , A27
28 COUNTING1 :
7
29 MVI A , 00 H30 ADD D
31 ADD E
32 ADD H
33 ADD L
34 MOV C , A35
36 BIT4−7: ; BITS 4−737 MOV A , B38 RRC
39 RRC
40 RRC
41 RRC
42
43 BIT4 : ; D = BIT4
44 ANI 01H45 MOV D , A46 MOV A , B47 RRC
48 RRC
49 RRC
50 RRC
51 RRC
52
53 BIT5 : ; E = BIT5
54 ANI 01H55 MOV E , A56 MOV A , B57 RRC
58 RRC
59 RRC
60 RRC
61 RRC
62 RRC
63
64 BIT6 : ; H = BIT6
65 ANI 01H66 MOV H , A67 MOV A , B68 RRC
69 RRC
70 RRC
71 RRC
8
72 RRC
73 RRC
74 RRC
75
76 BIT7 : ; L = BIT7
77 ANI 01H78 MOV L , A79
80 COUNTING2 :81 MVI A , 00 H82 ADD D
83 ADD E
84 ADD H
85 ADD L
86 ADD C ; A −> Count of 187 MOV C , A ; for zeros here
88 MVI A , 08 H89 SUB C
1.11 Delay 1 Second
1 DELAY1 :2 LXI B , 03 E8H ; 03 E8H = 1000D , 1000∗0.001=1sec3 DI ; disable interrupts if used
4 CALL DELB ; No registers are changed .5 EI ; re−enable interrupts if used
1.12 Input-Output
Αν η έξοδος είναι αρνητικής λογικής συνδέεις εκεί την κάθοδο και την άνοδο
στην τροφοδοσία. Ενώ αν είναι θετικής λογικής συνδέεις εκεί την άνοδο και την
κάθοδο στη γείωση. Στην συγκεκριμένη περίπτωση έχουμε υποθέσει αρνητικής
λογικής.
1 ; output to LED to A
2 CMA ; antistrofis logikis
3 STA 3000H ; output to leds
4
5 ; input sto A dip switches
6 LDA 2000H
9
1.13 Print 7-seg
Κάνω store στις θέσεις 0B00H-0B05H ότι θέλω να εμφανίσω.
1 PRINT :2 CALL INIT
3 STA 0B05H4 MOV A , B5 STA 0B04H6 CALL PRINT−7SEG7
8 PRINT−7SEG :9 PUSH PSW
10 PUSH B
11 PUSH D
12 PUSH H
13 LXI D , 0 B00H14 CALL STDM
15 CALL DCD
16 POP H
17 POP D
18 POP B
19 POP PSW
20 RET
21
22 INIT :23 PUSH PSW
24 MVI A , 10 H25 STA 0B00H26 STA 0B01H27 STA 0B02H28 STA 0B03H29 STA 0B04H30 STA 0B05H31 POP PSW
32 CALL PRINT−7SEG33 RET
10
1.14 Find The Max
Ξεκινάει από την διεύθυνση 3080 και ελέγχει σειριακά τους αριθμούς που είναι
αποθηκευμένοι για να βρει τον μέγιστο. Στον καταχωηρητή C βάζουμε το
πλήθος τον αριθμών που θα ψάξουμε για να βρούμε τον μέγιστο. Στο τέλος ο
μέγιστος βρίσκεται στον Α.
1 LXI H , 3080H ; Numbers are stored in 3080H2 MVI C , 0 AH ; Count of numbers to check (10)3 MOV A , M ; Load 1st number
4
5 LOOP2 : INX H ; Next Memory location
6 CMP M ; If A < M : CY = 1 else CY = 07 JNC LOOP ; If A > M Load Next number
8 MOV A , M ; Else A = M = Max
9
10 LOOP : DCR C ; Decrease Counter
11 JNZ LOOP2 ; If not zero Continue
12 STA 3090H ; Store Final Result Here
13 HLT
1.15 Divide 16bit/8bit
Ο διαιρετέος βρίσκεται στις θέσεις 2200-2201, και φορτώνετε στον HL . Ο
διαιρέτης στην θέση 2202 και φορτώνεται στον Α. Αποθηκεύουμε το υπόλοιπο
στην 2302 και το υπόλοιπο στην 2300.
1 LHLD 2200H ; Get the dividend
2 LDA 2202H ; Get the divisor
3 MOV C , A
4 LXI D , 0000H ; Quotient = 05
6 BACK ; MOV A , L
7 SUB C ; Subtract divisor
8 MOV L , A ; Save partial result
9 JNC SKIP ; if CY 1 jump
10 DCR H ; Subtract borrow of previous subtraction
11 SKIP ; INX D ; Increment quotient
12 MOV A , H
13 CPI , 00 ; Check if dividend < divisor
14 JNZ BACK ; if no repeat
11
15 MOV A , L
16 CMP C
17 JNC BACK
18 SHLD 2302H ; Store the remainder
19 XCHG
20 SHLD 2300H ; Store the quotient
21 HLT ; Terminate program execution
1.16 Sort Ascending order
Ταξινομεί 10 αριθμούς, ξεκινώντας από την θέση 2200 σε αύξουσα σειρά.
1 MVI B , 09 ; Initialize counter
2
3 START : LXI H , 2200H ; Initialize memory pointer
4 MVI C , 09H ; Initialize counter 25
6 BACK : MOV A , M ; Get the number
7 INX H ; Increment memory pointer
8 CMP M ; Compare number with next number
9 JC SKIP ; If less , don ' t interchange
10 JZ SKIP ; If equal , don ' t interchange
11 MOV D , M
12 MOV M , A
13 DCX H
14 MOV M , D
15 INX H ; Interchange two numbers
16
17 SKIP : DCR C ; Decrement counter 218 JNZ BACK ; If not zero , repeat
19 DCR B ; Decrement counter 120 JNZ START
21 HLT ; Terminate program execution
1.17 Enable Interupts
Ενεργοποίηση της RST5.5 . Εν γένει για να ενεργοποιήσουμε κάποια εκ των
RST 5.5 - 7.5 πρέπει να βάλουμε 0 στο bit της και 1 στο bit της MSE δηλαδή
στο bit 3 .
1 MVI A , 0 EH ; A = 00001110
12
2 SIM
3 EI
13
2 1st Series 2011
2.1 1.2 — Led Rotating
1 MVI B , 01 H ; B STORES THE TIME DELAY AND
2 MVI C , F4H ; C STORES THE TIME DELAY
3 ; BC = 01F4H = 500 −> 0 .5 SEC DELAY
4 START : LDA 2000H ; READ INPUT
5 CPI 01H ; IS MOVING LED ENABLED?6 JNZ START ; NO , CHECK AGAIN
7
8 LEFT : ; MOVE LED FROM RIGHT TO LEFT
9 CMA
10 STA 3000H11 CALL DELB ; DELB −> TIME DELAY ACCORDING TO B ' S VALUE
12 CMA
13 MOV D , A14 LDA 2000H ; CHECK INPUT , MAY IT HAS CHANGED
15 CPI 00H16 JZ ON_FROM_LEFT ; IF INPUT = 0 THEN FREEZE LED
17 RET_TO_LEFT : ; ELSE CONTINUE MOVING
18 MOV A , D19 RLC
20 JNC LEFT
21 STA 3000H22 MVI A , 40 H23 RIGHT : ; MOVE FROM LEFT TO RIGHT THEN SAME AS LEFT
24 CMA
25 STA 3000H26 CALL DELB
27 CMA
28 MOV D , A29 LDA 2000H30 CPI 00H31 JZ ON_FROM_RIGHT
32 RET_TO_RIGHT :33 MOV A , D34 RRC
35 JNC RIGHT
36 MVI A , 01 H37 JMP LEFT
38
14
39 ON_FROM_RIGHT : ; FREEZE LED WHEN MOVING FROM LEFT TO ←RIGHT
40 MOV A , D41 CMA
42 STA 3000H43 LDA 2000H ; CHECK INPUT , MAY IT HAS CHANGED
44 CPI 01H45 JZ RET_TO_RIGHT
46 JMP ON_FROM_RIGHT
47
48 ON_FROM_LEFT : ; FREEZE LED WHEN MOVING FROM RIGHT TO ←LEFT
49 MOV A , D50 CMA
51 STA 3000H52 LDA 2000H ; CHECK INPUT , MAY IT HAS CHANGED
53 CPI 01H54 JZ RET_TO_LEFT
55 JMP ON_FROM_LEFT
56 END
2.2 1.4 — Logical
1 START :2 LDA 2000H3 MOV H , A4
5 ; X | Y | AND | OR | NAND | NOR
6 ; 0 | 0 | 0 | 0 | 1 | 17 ; 0 | 1 | 0 | 1 | 1 | 08 ; 1 | 0 | 0 | 1 | 1 | 09 ; 1 | 1 | 1 | 1 | 0 | 010
11 GATE1_NAND :12 ANI 03H13 CPI 03H ; COMPARE WITH 0000 001114 JZ ZERO_NAND_1 ; BOTH BITS = 1 THEN 015 MVI B , 01 H ; ELSE 116 JMP GATE2_NAND
17
18 ZERO_nAND_1 :
15
19 MVI B , 00 H20
21 GATE2_NAND :22 MOV A , H23 ANI 0CH24 CPI 0CH ; COMPARE WITH 0000 110025 JZ ZERO_nAND_2 ; BOTH BITS = 1 THEN 026 MVI C , 02 H ; ELSE 1 −> IN THE RIGHT POSITION 1 −> 227 JMP GATE3_NOR
28
29 ZERO_NAND_2 :30 MVI C , 00 H31
32 GATE3_NOR :33 MOV A , H34 ANI 30H35 CPI 00H ; COMPARE WITH 0000 000036 JNZ ZERO_NOR_1 ; BOTH BITS != 0 THEN 037 MVI D , 04 H ; ELSE 1 −> IN THE RIGHT POSITION 1 −> 438 JMP GATE4_NOR
39
40 ZERO_NOR_1 :41 MVI D , 00 H42
43 GATE4_NOR :44 MOV A , H45 ANI C0H
46 CPI 00H ; COMPARE WITH 0000 000047 JNZ ZERO_NOR_2 ; BOTH BITS != 0 THEN 048 MVI E , 08 H ; ELSE 1 −> IN THE RIGHT POSITION 1 −> 849 JMP FINALLY
50
51 ZERO_NOR_2 :52 MVI E , 00 H53
54 FINALLY :55 SUB A ; SET A = 056 ADD B
57 ADD C
58 ADD D
59 ADD E
60 ANI 0FH61 CMA
16
62 STA 3000H63 JMP START
64
65 END
3 2nd Series 2011
17
ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝΑΚΑΔ. ΕΤΟΣ 2010-2011
ΑΘΗΝΑ 14 - 4 - 20112η ΟΜΑΔΑ ΑΣΚΗΣΕΩΝ
ΓΙΑ ΤΟ ΜΑΘΗΜΑ "Συστήματα Μικροϋπολογιστών"
Παράδοση 8/5/2011
Ασκήσεις προσομοίωσης (να υλοποιηθούν και να δοκιμαστούν στο πρόγραμμα προσομοίωσης του εκπαιδευτικού συστήματος μLAB)
1η ΑΣΚΗΣΗ: Σε ένα μΥ-Σ 8085 να γραφεί σε assembly που να επιτελεί τις παρακάτω λειτουργίες:(α) Να αποθηκευθούν οι αριθμοί 0-255 με αύξουσα σειρά στις διαδοχικές θέσεις της μνήμης με αρχή τη διεύθυνση 0900 Η (να απενεργοποιηθεί η προστασία μνήμης).(β) Υπολογίστε τον αριθμό των μονάδων (δυαδικών ψηφίων 1) των παραπάνω δεδομένων. Το αποτέλεσμα να καταχωρηθεί στον διπλό καταχωρητή BC.(γ) Υπολογίστε το πλήθος από τους παραπάνω αριθμούς που είναι μεταξύ των αριθμών 10H και 70H
περιλαμβανομένων (10H ≤ xn ≤ 70H) και φυλάξτε το αποτέλεσμα στον καταχωρητή D.(δ) Όταν γίνεται ΟΝ το LSB της θύρας εισόδου dip switch (θέση μνήμης 2000 Hex) να εμφανίζεται στη θύρα εξόδου των LED (που αντιστοιχεί στη θέση μνήμης 3000 Hex) η τιμή του καταχωρητή B, αν γίνει ΟΝ το επόμενο από το LSB των dip switches o καταχωρητής C και με τον αμέσως επόμενο διακόπτη o καταχωρητής D. Στον έλεγχο των διακοπτών, προτεραιότητα να έχει κάθε φορά το υψηλότερης αξίας bit (π.χ. αν είναι ενεργοποιημένοι ταυτόχρονα ο 1ος και ο 3ος διακόπτης στα LED να εμφανίζεται o καταχωρητής D).
2η ΑΣΚΗΣΗ: Δίνεται ένα μΥ-Σ 8085 που ελέγχει μέσω του MSB της πόρτας εξόδου των LED (3000 Hex) τα φώτα ενός χώρου. Να γραφεί πρόγραμμα Assembly, που όταν το MSB της θύρας εισόδου dip switch (θέση μνήμης 2000 Hex) από OFF γίνει ON και ξανά OFF τότε να ανάβει το αντίστοιχο MSB της πόρτας εξόδου των LED. Αυτό να παραμένει ανοιχτό για περίπου ένα (1) λεπτό της ώρας και μετά να σβήνει. Αν όμως ενδιάμεσα ξαναενεργοποιηθεί το push-button (OFF - ON - OFF) να ανανεώνεται ο χρόνος του ενός λεπτού. Να γίνει χρήση των ρουτινών χρονοκαθυστέρησης του εκπαιδευτικού συστήματος μLAB.
Παρατήρηση: Τα προγράμματα να συνοδεύονται υποχρεωτικά στα κυριότερα σημεία τους από πολύ σύντομα σχόλια.
Θεωρητικές Ασκήσεις
3η ΑΣΚΗΣΗ: Να δοθεί η εσωτερική οργάνωση μια μνήμη SRAM 256×8 bit αντίστοιχης με αυτήν που φαίνεται στο σχ. 3.2. Να εξηγηθεί μέσω ενός παραδείγματος με ποιο τρόπο γίνεται η ανάγνωση και εγγραφή στη μνήμη αυτή (ποια σήματα ενεργοποιούνται, ποιοι διακόπτες και πύλες ανοίγουν ή κλείνουν κλπ.).Αντίστοιχα να δοθούν τα ίδια στοιχεία για μια μνήμη DRAM 512K×1. Επιλέξτε ένα σχήμα που να συνδυάζει την οργάνωση κατά bit και την ανάγκη για διευθυνσιοδότηση με το σχήμα Διεύθυνση- Γραμμής και μετά Διεύθυνση-Στήλης του πίνακα μνήμης.
4η ΑΣΚΗΣΗ: Να σχεδιασθεί ένα σύστημα μνήμης που να περιλαμβάνει χώρο μνήμης 8ΚBytes EPROM ακολουθούμενη από 4ΚBytes RΑM. H EPROM ξεκινά από τη διεύθυνση 0000Η και υλοποιείται
χρησιμοποιώντας 4Κ×8 bit ολοκληρωμένα (2 ICs). Να κατασκευαστεί ο χάρτης μνήμης. Οι 4K×8 bit EPROMs έχουν δύο εισόδους ελέγχου CE (chip enable) και OE (output enable). H RΑM να υλοποιηθεί με
χρήση 1Κ×4 SRAMs (4 ICs). Τα ολοκληρωμένα αυτά έχουν συνηθισμένο Ι/Ο και γραμμές ελέγχου CE, OE και WE. Η αποκωδικοποίηση να γίνει χρησιμοποιώντας ένα ή περισσότερα κυκλώματα από τα παρακάτω: αποκωδικοποιητή 74LS138 και λογικές πύλες. Να σχεδιασθεί το λογικό διάγραμμα της μνήμης και η συνδεσμολογία με τα απαιτούμενα σήματα από το system bus του 8085.
5η ΑΣΚΗΣΗ: Να μελετηθεί από τεχνικο-οικονομική άποψη η κατασκευή μιας φορητής ηλεκτρονικής συσκευής με τη χρήση 3 διαφορετικών τεχνολογιών:
1. Χρήση διακριτών στοιχείων και I.C. όπως μικροελεγκτών, περιφερειακών, μνημών κλπ. Τοποθετημένα σε μια σε μια σχετικά μεγάλη πλακέτα. To αρχικό κόστος σχεδίασης υποθέτουμε ότι είναι 20.000€. Το κόστος των I.C. ανά τεμάχιο υποθέτουμε ότι είναι 20€ και η κατασκευή της πλακέτας με την συναρμολόγησή της επίσης 20€.
2. Χρήση FPGAs και μικρού αριθμού περιφερειακών τοποθετημένα σε μια σε μια μικρή πλακέτα. Αρχικό κόστος σχεδίασης: 10.000€, κόστος ανά τεμάχιο των I.C.: 40€, κόστος πλακέτας ανά τεμάχιο και συναρμολόγησης: 10€.
3. Σχεδίαση ειδικού SoC με μια πολύ μικρή πλακέτα. Αρχικό κόστος σχεδίασης: 200.000€, κόστος ανά τεμάχιο των I.C.: 2€, κόστος ανά τεμάχιο πλακέτας και συναρμολόγησης: 2€.
Να σχεδιαστούν οι αντίστοιχες καμπύλες κόστους ανά τεμάχιο για τις 3 τεχνολογίες. Να υποδειχθούν οι τρεις περιοχές αριθμού τεμαχίων που είναι συμφερότερες (χαμηλότερο κόστος) για την κάθε μία τεχνολογία. Διερευνήστε για ποια τιμή των I.C. στην τεχνολογία των FPGAs θα μπορούσε να εξαφανιστεί η επιλογή της 1ης
τεχνολογίας;
Επίσης να ξαναγίνουν οι παραπάνω υπολογισμοί με βάση την τεχνολογική υπεροχή (μικρότερη μπαταρία, μικρότερο μέγεθος και συνεπώς καλύτερη τιμή πώλησης) που με τη χρήση ενός συντελεστή αναγωγής να μειώνει το κόστος κατά 1, 0.9, 0.8 για τις 3 τεχνολογίες (μPs, FPGAs και SoC) αντίστοιχα.
Σχολιάστε όλα τα αποτελέσματα.
Παράδοση 8/5/2011
3.1 2.1 — Save 0-255 Serially - Count 1 - Compare
1 PART_A :2 IN 10H ; DISABLE MEMORY PROTECTION
3 LXI H , 0900 H ; START OF MEMORY STORAGE
4 MVI B , 00 H ; SET INITIAL VALUES TO B
5 MVI A , 00 H ; AND A
6
7 NUMS_IN_MEM :8 MOV M , B ; B HAS THE APPROPRIATE NUMBER TO BE
9 ; STORED10 INR A ; IF A == 0 , THEN 256 HAVE BEEN
11 CPI 00H ; ASSIGNED TO MEMORY AND PART_A IS
12 JZ PART_B ; FINISHED , PART_B STARTS
13 INX H ; ELSE ”POINT” TO THE NEXT MEMORY
14 ; STORAGE POSITION
15 INR B ; B += 1 , NEXT APPROPRIATE NUMBER
16 JMP NUMS_IN_MEM
17
18 PART_B :19 LXI H , 0900 H20 MVI B , 00 H21 MVI C , 00 H22 MVI D , 08 H ; D TELLS HOW MANY BITS HAVE BEEN
23 ; CHECKED UNTIL NOW
24 COUNT_ONES :25 MOV A , M ; READ NUMBER FROM MEMORY
26 CHECK_BIT :27 MOV E , A ; E IS USED AS A TEMPORARY VARIABLE
28 MOV A , D ; IF ALL BITS OF CURRENT NUMBER
29 CPI 00H ; HAVE BEEN CHECKED THEN
30 JZ CHECK_NEXT ; CHECK NEXT NUMBER
31 MOV A , E ; ELSE32 RAL ; CHECK NEXT BIT THROUGH CARRY
33 DCR D ; ONE LESS BIT TO CHECK
34 JNC CHECK_BIT ; IF CURRENT BIT != 1 CHECK NEXT
35 INX B ; ELSE , BC += 1 , INCREASE NUMBER OF
36 ; ONES37 JMP CHECK_BIT
38 CHECK_NEXT :39 INX H ; ” POINT” TO THE NEXT MEM POSITION
40 MOV A , H ; CHECK IF ALL NUMBERS HAVE BEEN
20
41 CPI 0AH ; READ42 JZ PART_C ; IF THEY HAVE , PART_C STARTS
43 MVI D , 08 H ; ELSE CHECK NEXT NUMBER
44 JMP COUNT_ONES
45
46 PART_C :47 ; RST 148 LXI H , 0900 H49 MVI D , 00 H50
51 IN_RANGE :52 MOV A , M ; READ NUMBER FROM MEMORY
53 CPI 10H ; IS LESS THAN 10H?54 JC LOOK_NEXT ; YES , CHECK NEXT NUMBER
55 CPI 70H ; IS GREATER THAN 70H?56 JNC LOOK_NEXT ; YES , CHECK NEXT NUMBER
57 INR D ; NO , D += 1 , INCREASE NUMBER OF
58 ; DESIRED NUMBERS
59 LOOK_NEXT :60 INX H ; ” POINT” TO THE NEXT NUMBER TO LOOK
61 MOV A , H ; CHECK IF ALL NUMBERS HAVE BEEN
62 CPI 0AH ; READ63 JZ PART_D ; IF THEY HAVE , PART_D STARTS
64 JMP IN_RANGE
65
66 PART_D :67 ; RST 168 LDA 2000H ; READ INPUT
69 RLC ; FLUSH THE 5 MSBS
70 RLC
71 RLC
72 RLC
73 RLC
74 RAL ; CHECK FIRST BIT , IS IT 1?75 JC ON_D ; YES , ”PRINT” D
76 RAL ; NO , CHECK NEXT BIT
77 JC ON_C ; YES , ”PRINT” C
78 RAL ; NO , CHECK NEXT BIT
79 JC ON_B ; YES , ”PRINT” B
80 MVI A , 00 H ;81 STA 3000H82 JMP END_PROGRAM ; NO , EXIT FROM PROGRAM
83
21
84 ON_D :85 MOV A , D86 CMA
87 STA 3000H88 JMP END_PROGRAM
89 ON_C :90 MOV A , C91 CMA
92 STA 3000H93 JMP END_PROGRAM
94
95 ON_B :96 MOV A , B97 CMA
98 STA 3000H99 JMP END_PROGRAM
100
101 END_PROGRAM :102 JMP PART_D
103 END
3.2 2.2 — Controlling Led
1 MVI B , 03 H ; BC = 03E8H = 1000 => 1 SEC TIME DELAY
2 MVI C , E8H3
4 START :5
6 LDA 2000H ; READ INPUT TO SEE IF THE SWITCH IS DOWN
7 RAL ;<=> CHECK MSB
8 JC START ; IF MSB != 0 READ INPUT AGAIN , THE SWITCH
9 ; IS UP
10 OFF_TO_ON : ; ELSE , SWITCH IS DOWN
11
12 LDA 2000H ; READ INPUT TO SEE
13 RAL ; IF SWITCH IS UP <=> MSB = 114 JNC OFF_TO_ON ; READ INPUT UNTIL SWITCH IS UP
15
16 ON_TO_OFF :17
18 LDA 2000H ; READ INPUT TO SEE
22
19 RAL ; IF SWITCH IS DOWN AGAIN <=> MSB = 020 JC ON_TO_OFF ; READ INPUT UNTIL SWITCH IS DOWN
21
22 LED_ON : ; THE LED IS ON AFTER THE SWITCH WENT FROM
23 ; DOWN TO UP AND FROM UP TO DOWN
24 MVI D , 00 H25 MVI E , 3 CH ; E = 60 IN DECIMAL , IS USED AS A COUNTER
26 MVI A , 7 FH27 STA 3000H28
29 DELAY :30 CALL DELB ; DELB DELAYS 1 SEC
31 DCR E ; AT MOST 60 TIMES => AT MOST 60 SECS
32 MOV A , E ; CHECK IF 60 SECS HAVE PAST
33 CPI 00H34 JZ LED_OFF ; YES , TURN LED OFF
35 MOV A , D ; NO , DURING THE 60 SECS DELAY
36 CPI 00H ; WAS THE SWITCH UP?37 JZ LED_IS_ON ; YES , CHECK WHERE IT IS NOW
38 CPI 01H ; WAS THE SWITCH DOWN?39 JZ DOWN_STATE ; YES , CHECK WHERE IT IS NOW
40 CPI 02H ; WAS THE SWITCH UP AFTER BEING DOWN?41 JZ DOWN_UP_STATE ; YES , CHECK WHERE IT IS NOW
42
43 LED_OFF :44
45 MVI A , FFH46 STA 3000H47 JMP START
48
49 LED_IS_ON :50
51 LDA 2000H52 RAL
53 JC DELAY ; DETERMINE OFF STATE
54 INR D ; STORE THE OFF − DOWN STATE = 155
56 DOWN_STATE : ; D = 157
58 LDA 2000H59 RAL
60 JNC DELAY ; DETERMINE OFF − ON STATE
61 INR D ; STORE THE OFF − ON STATE = 2
23
62
63 DOWN_UP_STATE : ; D = 264
65 LDA 2000H66 RAL
67 JC DELAY ; DETERMINE OFF − ON − OFF STATE
68
69 UP_DOWN_STATE :70 JMP LED_ON ; REFRESH TIME LIMIT
71 END
3.3 2.3-5 — Memories
24
ΘεωρίαΆσκηση 3η
SRAMΗ μνήμη είναι 256 x 8 bits. Ο δεύτερος αριθμός, το 8, δηλώνει σε πόσα ίσα μέρη θα είναι χωρισμένη η μνήμη κι ο
πρώτος αριθμός, το 256, δηλώνει πόση χωρητικότητα μνήμης έχει το κάθε μέρος. Άρα η μνήμη θα κατακερματίζεται σε8 μέρη, ισοδύναμα τράπεζες, των 256 bits το καθένα. Κάθε τράπεζα από την μεριά της είναι ένας διδιάστατος πίνακαςμε γραμμές και στήλες. Προφανώς το μέγεθος του πίνακα αυτού, πρέπει να ισούται σταθερά με 256 ανεξάρτητα απότην κατανομή των γραμμών και των στηλών. Ο λόγος είναι οτι το 256 συνιστά προδιαγραφή. Γίνεται φανερό πωςοι γραμμές κι οι στήλες μπορούν να κατανεμηθούν με πολλούς τρόπους. Επιλέχθηκε τετραγωνική διάταξη για τηνκάθε τράπεζα. Το πλήθος των γραμμών ισούται με αυτό των στηλών, δηλαδή, 16. Η επιλογή αυτή επέφερε την χρήσηπολυπλεκτών 16 - σε - 1. Επίσης επέφερε την χρήση 4 bits τόσο για τον προσδιορισμό της διεύθυνσης των γραμμώνόσο και των στηλών. Τέλος, το γεγονός των 8 τραπεζών επιβάλλει την ύπαρξη και 8 σημάτων Ι/Ο για κάθε μία απόαυτές.
Για να γίνει ανάγνωση από την μνήμη αρχικά εφαρμόζεται στις εισόδους διεύθυνσης A0 - A7 η διεύθυνση. Έπειταεπιλέγεται το κατάλληλο ολοκληρωμένο κύκλωμα SRAM μέσω του ακροδέκτη επιλογής CS. Στην συνέχεια, μετάαπό πάροδο χρόνου όσος κι ο χρόνος προσπέλασης εμφανίζονται τα δεδομένα στις εξόδους δεδομένων I/O.
Αντίστοιχα για να γίνει εγγραφή πάλι στις εισόδους διεύθυνσης εφαρμόζεται η διεύθυνση κι επιλέγεται το κατάλληλοολοκληρωμένο κύκλωμα SRAM. Μετά τα δεδομένα προς εγγραφή εφαρμόζονται στις εισόδους δεδομένων I/O καιστον ακροδέκτη WE στέλνεται αρνητικός παλμός ώστε να επιτραπεί και να εκτελεστεί η λειτουργία της εγγραφήςτων δεδομένων.
5
DRAMΗ μνήμη έχει μέγεθος 512Κ = 219bits. Άρα, το μήκος μιας διεύθυνσης είναι 19 bits. Από αυτά τα 19 bits, τα 10,
από A9 - A18 χρειάζονται για τον προσδιορισμό της διεύθυνσης της στήλης( CAS - Column Address). Τα υπόλοιπα 9bits, από A0 - A8 χρειάζονται για τον προσδιορισμό της διεύθυνσης της γραμμής( RAS - Row Address) της μνήμης.Πιο συγκεκριμένα το bit A8 στέλνεται στον αποκωδικοποιητή στήλης για την επιτέλεση της προφανούς λειτουργίας.Συνεπώς η διεύθυνση στήλης έχει μήκος 10 + 1( A8) = 11 bits κι η διεύθυνση γραμμής έχει μήκος 8 bits. Κατ’επέκταση,υπάρχουν 211 = 2048 στήλες και 28 = 256 γραμμές.
Ως γνωστόν τόσο η ανάγνωση από μία μνήμη όσο κι η εγγραφή σε μια μνήμη προϋποθέτουν την μεταφορά τηςδιεύθυνσης στις εισόδους της διεύθυνσης. Αρχικά λοιπόν μεταφέρονται τα 9 λιγότερο σημαντικά ψηφία Α0 - Α8 καικρατούνται στην μνήμη με το σήμαRAS. Έπειτα μεταφέρονται τα υπόλοιπα ψηφία Α9 - Α18 τα οποία συγκρατούνταιστο ολοκληρωμένο κύκλωμα με τον παλμό CAS. Η εγγραφή της μνήμης γίνεται στο αρνητικό μέτωπο του παλμούW κι ενώ το σήμα G ισούται με 1. Η ανάγνωση γίνεται στο αρνητικό μέτωπο του G κι ενώ το σήμαW ισούται με 1.
Άσκηση 4η
Στην εκφώνηση δίνεται ως προδιαγραφή η χρήση 4 ολοκληρωμένων κυκλωμάτων μνήμης RAM μεγέθους 1Κ x 4το καθένα ώστε να επιτευχθεί συνολική μνήμη 4ΚΒ. Όπως εύκολα μπορεί να επαληθευθεί το μέγεθος του 1Κ x 4 δενεπαρκεί για την εκπλήρωση της προδιαγραφής των 4ΚΒ. Συμπερασματικά η σχεδίαση του συστήματος έγινε με τηνπαραδοχή οτι τα επιμέρους ολοκληρωμένα κυκλώματα της RAM έχουν μέγεθος 2Κ x 4 το καθένα.
Δεδομένου οτι στο μΥ σύστημα συμμετέχει ο μΕ 8085 για την αναπαράσταση των δεδομένων απαιτούνται 8 bits.Για την αναπαράσταση των διευθύνσεων απαιτούνται το πολύ 16 bits. Η EPROM έχει μέγεθος 8ΚΒ = 8Κ x 8 bits =213 x 8 bits. Άρα για τις διευθύνσεις της εν λόγω μνήμης γίνεται χρήση 13 bits, από A0 - A12. Αντίστοιχα, για τηνμνήμη RAM γίνεται χρήση 12 bits, από A0 - A11 αφού το μέγεθος της ανέρχεται στα 4ΚΒ = 4Κ x 8 bits = 212 x 8 bits.Προφανώς και για τις δύο μνήμες το πλήθος των bits για την αναπαράσταση των δεδομένων είναι. Παρατηρείται οτι3( A13 - A15) από τα 16 bits( A0 - A15) μένουν αχρείαστα. Αυτά τα bits λοιπόν χρειάζονται στον αποκωδικοποιητή γιατην επιλογή του κατάλληλου ολοκληρωμένου.
Ο αποκωδικοποιητής όχι μόνο επιλέγει κάθε φορά ανάμεσα στα δύο είδη μνήμης του συστήματος( EPROM -RAM) αλλά επιλέγει κι ανάμεσα στα ολοκληρωμένα που αφορούν στο ίδιο είδος μνήμης. Αυτό συμβαίνει, γιατί απότις προδιαγραφές της εκφώνησης η μνήμη EPROM συγκροτείται από δύο ολοκληρωμένα κυκλώματα ενώ η RAMσυγκροτείται από 4 ολοκληρωμένα κυκλώματα.
6
EPROM Χάρτης Μνήμης RAM
Αρχή Διευθύνσεων0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BIN 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 BIN0 0 0 0 HEX 2 0 0 0 HEX
Τέλος Διευθύνσεων0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 BIN 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 BIN1 F F F HEX 2 F F F HEX
Παρακάτω φαίνεται ο χάρτης μνήμης των δύο ολοκληρωμένων κυκλωμάτων της EPROM.
EPROM1 Χάρτης Μνήμης EPROM2
Αρχή Διευθύνσεων0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BIN 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 BIN0 0 0 0 HEX 1 0 0 0 HEX
Τέλος Διευθύνσεων0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 BIN 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 BIN0 F F F HEX 1 F F F HEX
Παρακάτω παρουσιάζεται ο χάρτης μνήμης των δύο επιμέρους μερών της μνήμης RAM. Η μνήμη RAM αποτελείταιαπό 4 συνολικά ολοκληρωμένα κυκλώματα που ανά δύο συνδέονται παράλληλα για να σχηματίσουν μία μνήμη μεμήκος λέξης 8 bits.
SRAM1 Χάρτης Μνήμης SRAM2
Αρχή Διευθύνσεων0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 BIN 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 BIN0 0 0 0 HEX 1 0 0 0 HEX
Τέλος Διευθύνσεων0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 BIN 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 BIN2 7 F F HEX 2 F F F HEX
Στους παραπάνω χάρτες μνήμης κάποια ψηφία έχουν χρωματιστεί για να αναδειχθεί ο ιδιαίτερος ρόλος τους στηναποκωδικοποίηση. Ειδικότερα, τα μπλε ψηφία A15, A14 χρησιμεύουν ως είσοδοι επίτρεψης του αποκωδικοποιητή. Τακόκκινα ψηφία, από A11 - A13 χρειάζονται για την επιλογή της κατάλληλης μνήμης. Ας παρατηρηθεί οτι κάθε μνήμηπροσδιορίζεται μοναδικά από έναν ή δύο συνδυασμούς των ψηφίων αυτών. Για παράδειγμα, οι συνδυσμοί A13A12A11= 000, A13A12A11 = 001 καθορίζουν μοναδικά την EPROM1 ενώ ο συνδυασμός A13A12A11 = 100 ορίζει την μνήμηSRAM1. Βέβαια, τα ψηφία αυτά πρέπει με κάποιο τρόπο να αντιστοιχιστούν στις εισόδους του αποκωδικοποιητή.Αυτό σημαίνει οτι οι είσοδοι του αποκωδικοποιητή αποτελούν συναρτήσεις των κόκκινων ψηφίων. Απόρροια τωνπαραπάνω συνιστά ο πίνακας αληθείας των συναρτήσεων αυτών.
Τα Χ στον πίνακα αληθείας αναφέρονται σε αδιάφορους όρους,Πίνακας Αντιστοίχησης - Αληθείαςα/α A13 A12 A11 A B C0 0 0 0 0 0 01 0 0 1 0 0 02 0 1 0 0 0 13 0 1 1 0 0 14 1 0 0 0 1 05 1 0 1 0 1 16 1 1 0 X X X7 1 1 1 X X X
αφού ο συνδυασμός στον οποίο αντιστοιχούν δεν έχει κάποια πρακτικήσημασία. Χρειάζεται όμως προσοχή στο τι τελικά θα επιλεχθεί για τα Χ.Δύνανται άσχετοι συνδυασμοί των A11A12A13 με κατάλληλη τιμή του Χνα οδηγούν σε ανεπιθύμητη πρόσβαση στην μνήμη. Τελικά, οι αδιάφοροιαυτοί όροι λαμβάνονται είτε ως 1 είτε ως 0 κατά πως εξυπηρετεί. Η στήλητου Α περιέχει είτε μηδενικά είτε αδιάφορους όρους. Θα μπορούσε γιαεξοικονόμηση χώρου στην πλακέτα, καλύτερη εικόνα της πλακέτας καιγια οικονομία υλικών τα Χ = 0, δηλαδή, το Α = 0 σταθερά. Όμως σεαυτήν την περίπτωση αν ταΧ του Β επιλεχθούν ίσα με 1 τότε ανεξάρτητααπό την τιμή τωνΧ του C θα συμβαίνει παράνομη πρόσβαση στην μνήμη
είτε στην SRAM1 είτε στην SRAM2.
7
Προφανώς τέτοια λειτουργία του μΥ - Σ κρίνεται απαράδεκτη. Επόμένως τα Χ του Α λαμβάνονται ίσα με 1 καιτο Α = A12A13. Για τις άλλες δύο εισόδους, Β, C μετά από πράξεις και μεθόδους της σχεδίασης λογικών κυκλωμάτωνπροκύπτουν,
Β = A13 και C = A12 + A11A13. Όλα τα παραπάνω τελικά οδηγούν στην ακόλουθη σχεδίαση.
8
Άσκηση 5η
Οι τεχνολογίες θεωρούνται ισάξιεςΤο κόστος κάθε τεχνολογίας εξαρτάται από το πλήθος των τεμαχίων που παράγονται. Από τα δεδομένα λοιπόν της
άσκησης η συνάρτηση κόστους Κ = Κ( x) για κάθε μία τεχνολογία είναι,
Διακριτά στοιχεία( ΔΣ) : KΔΣ( x) = 20000 + ( 20 + 20) * x = 20000 + 40x, x ≥ 0FPGA : KF( x) = 10000 + ( 40 + 10) * x = 10000 + 50x, x ≥ 0SoC : KSoC( x) = 200000 + ( 2 + 2) * x = 200000 + 4x, x ≥ 0
Οι αντίστοιχες συναρτήσεις κόστους ανά τεμάχιο είναι,
Διακριτά στοιχεία( ΔΣ) : KΔΣ( x) = 20000x + 40, x > 0
FPGA : KF( x) = 10000x + 50, x > 0
SoC : KSoC( x) = 200000x + 4, x > 0
Όπως φαίνεται καθώς το x → ∞
500 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 130000.0
50.0
100.0
150.0
200.0
Κόστος Τεχνολογίας ανά Τεμάχιο
Διακριτά Στοιχεία FPGA'S SoC
Τεμάχια
Κόσ
τος
Τεχν
ολογ
ίας(
ευρ
ώ)
το κόστος για κάθε τεχνολογία φθίνεισε μια σταθερά που ισούται με τοκόστος παραγωγής ενός τεμαχίου.Επίσης, από το διπλανό διάγραμμα,από τα 1 - 1000 κομμάτια υπερέχουντα FPGA’s ενώ από τα 1000 μέχρι τα5000 περίπου τεμάχια η τεχνολογίατων ΔΣ υπερτερεί έναντι των άλλωνδύο τεχνολογιών. Από τα 5000τεμάχια κι έπειτα η τεχνολογία SoCσυμφέρει περισσότερο με συνεχώς αυξανόμενη διαφορά. Οι δύο άλλες τεχνολογίες σχετικά γρήγορα φτάνουν στοασυμπτωτικό τους όριο.
Στην γενική περίπτωση αν το κόστος του IC της τεχνολογίας FPGA είναι μια μεταβλητή ποσότητα k τότε ηαντίστοιχη συνάρτηση κόστους μπορεί να γραφεί στην μορφή,
KF( x) = 10000 + ( k + 10)x.
Η τεχνολογία FPGA συμφέρει για κάθε ποσότητα τεμαχίων x ή ανά τεμάχιο αν και μόνο αν για κάθε x η αντίστοιχησυνάρτηση κόστους της τεχνολογίας FPGAυπολείπεται της συνάρτησης κόστους της τεχνολογίας τωνΔΣ.Μαθηματικάθα πρέπει, η διαφορά,
KΔ( x) = KΔΣ( x) - KF( x) > 0⇔ KΔ( x) = 10000 + ( 30 - k)x > 0.
Ισοδύναμα, θα πρέπει ανά τεμάχιο να ισχύει,
KΔx( x) =KΔ(x)x = 10000
x + 30− k > 0.
Η τελευταία σχέση έχει δύο όρους. Ο πρώτος όρος τείνει ασυμπτωτικά στο 0 καθώς το x→ ∞. Ο δεύτερος όροςείναι σταθερός κι εξαρτάται από το k. Οπότε μέχρι κάποιο x ο πρώτος όρος κυριαρχεί και τότε αρκεί
k < 10000x + 30.
9
Ξεκάθαρα το ασυμπτωτικό όριο της τιμής του ΙC της x = 1000 ⇒ k ≤ 40.00€x = 2000 ⇒ k ≤ 35.00€x = 4000 ⇒ k ≤ 31.25€x = 8000 ⇒ k ≤ 35.00€x = 16000 ⇒ k ≤ 30.06€
τεχνολογίας FPGA, k είναι τα 30€. Επίσης, διαπιστώνεται πωςανάλογα με την τιμή του x, το k μπορεί να μεταβάλλεται,όπως φαίνεται στα δεξιά. Συνεπώς, για ένα εύρος τεμαχίων από1000 - 16000 θα πρέπει το κάθε ολοκληρωμένο να στοιχίζει30€.
Πράγματι, το εξ αριστερών
500 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 160000.0
10.0
20.0
30.0
40.0
50.0
60.0
20.0
10.05.0 3.3 2.5 2.0 1.7 1.4 1.3 1.1 1.0 0.9 0.8 0.8 0.7 0.7 0.6
Κόστος Τεχνολογίας ανά ΤεμάχιοΚόστος FPGA IC = 30 ευρώ
Διακριτά Στοιχεία FPGA'S Διαφορά ΚόστουςΤεμάχια
Κόσ
τος
Τεχν
ολογ
ίας(
ευρ
ώ)
διάγραμμα επαληθεύει τονπροηγούμενο συλλογισμό.Όμως το ίδιο διάγραμμαδείχνει οτι η διαφορά στοκόστος των δύο τεχνολογιώνμικραίνει αρκετά γρήγορακαι μικραίνει ασυμπτωτικάσυνεχώς. Μάλιστα από ένασημείο και μετά η διαφοράκόστους των δύο τεχνολογιών,
μάλλον χαρακτηρίζεται ασήμαντη ή αμελητέα. Χαρακτηριστικά ήδη από τα 5000 τεμάχια η διαφορά κόστουςμειώνεται κατά 80% σε σχέση με την αρχική για 1000 τεμάχια. Αυτό οφείλεται στο οτι ο σταθερός όρος πουαναφέρθηκε παραπάνω κυριαρχεί τελικά στην σχέση κι επιδρά καθοριστικά.
Aκριβέστερα ο σταθερός όρος
500 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 160000.0
10.0
20.0
30.0
40.0
50.0
60.0
30.00
20.0015.00 13.33 12.50 12.00 11.67 11.43 11.25 11.11 11.00 10.91 10.83 10.77 10.71 10.67 10.63
Κόστος Τεχνολογίας ανά ΤεμάχιοΚόστος FPGA IC = 20 ευρώ
Διακριτά Στοιχεία FPGA'S Διαφορά Κόστους
Τεμάχια
Κόσ
τος
Τεχν
ολογ
ίας(
ευρ
ώ)
30 - k καθορίζει την ασυμπτωτικήδιαφορά. Για k = 30€ η διαφορά αυτήισούται με το 0 ενώ π.χ. για k = 20€η ασυμπτωτική διαφορά είναι 10€.Άρα για μια μεγαλύτερη κι αξιόλογημείωση στο κόστος επιβάλλεται μιαμείωση του k όσο το δυνατόν κάτωαπό τα 30€. Όντως, για k = 20€εξάγεται το γειτονικό διάγραμμα, απόόπου γίνεται σαφές οτι για τιμές του kγύρω στα 20€ η διαφορά στο κόστοςκαθίσταται αξιόλογη, 10€. Τονίζεταικλείνοντας, πως όσο αυξάνεται το πλήθος των παραγόμενων τεμαχίων τόσο το κόστος προσεγγίζει την τιμή τουσταθερού όρου.
10
Οι τεχνολογίες υπερέχουν η μία της άλλης - Συντελεστής υπεροχήςΤο κόστος κάθε τεχνολογίας εξαρτάται πλέον κι από έναν συντελεστή, τον συντελεστή υπεροχής( ΣΥ). Από τα
δεδομένα λοιπόν της άσκησης η συνάρτηση κόστους Κ = Κ( x) για κάθε μία τεχνολογία είναι,
Διακριτά στοιχεία( ΔΣ) : KΔΣ( x) = 20000 + 40,0x, ΣΥ = 1,0 x ≥ 0FPGA : KF( x) = 9000 + 45,0x, ΣΥ = 0,9, x ≥ 0SoC : KSoC( x) = 160000 + 3,2x, ΣΥ = 0,8, x ≥ 0
Οι αντίστοιχες συναρτήσεις κόστους ανά τεμάχιο είναι,
Διακριτά στοιχεία( ΔΣ) : KΔΣ( x) = 20000x + 40,0, ΣΥ = 1,0, x > 0
FPGA : KF( x) = 9000x + 45,0, ΣΥ = 0,9, x > 0
SoC : KSoC( x) = 160000x + 3,2, ΣΥ = 0,8, x > 0
Εκ του διπλανού διαγράμματος,
500 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 130000.0
20.040.060.080.0
100.0120.0140.0160.0180.0
Κόστος Τεχνολογίας ανά Τεμάχιο με ΣΥ
Διακριτά Στοιχεία FPGA'S SoC
Τεμάχια
Κόσ
τος
Τεχν
ολογ
ίας(
ευρ
ώ)
μέχρι τα 2000 περίπου τεμάχια ητεχνολογία FPGA υπερτερεί. Από2000 - 4000 τεμάχια οι τεχνολογίεςτων ΔΣ και FPGΑ ισοβαθμούνμεταξύ τους και υπερτερούν έναντιτης τεχνολογίας SoC. Από τα 4000τεμάχια κι έπειτα η τεχνολογία SoCσυμφέρει περισσότερο με συνεχώςαυξανόμενη διαφορά. Υπενθυμίζεταιπως με παράλειψη της τεχνολογικήςυπεροχής, η τεχνολογία SoC συμφέρειπερισσότερο μετά από τα 5000 τεμάχια. Η διαφορά αυτή εκφράζει το γεγονός οτι η πρόοδος της τεχνολογίας συμβάλλεισε φθηνότερα και καλύτερα προϊόντα.
Αντίστοιχα με προηγουμένως,KF( x) = 9000 + 0,9( k + 10)x
και θα πρέπει,
KΔ( x) = KΔΣ( x) - KF( x) > 0⇔ KΔ( x) = 11000 + ( 31 - 0,9k)x > 0.
Ισοδύναμα, θα πρέπει ανά τεμάχιο να ισχύει,
KΔx( x) =KΔ(x)x = 11000
x + 31− 0, 9k > 0.
Μέχρι κάποιο x ο πρώτος όρος κυριαρχεί και τότε αρκεί
k < 1100009x + 34, 4
Ανάλογα με την τιμή του x, οι επιτρεπόμενες τιμές του k x = 1000 ⇒ k ≤ 46.62€x = 2000 ⇒ k ≤ 40.51€x = 4000 ⇒ k ≤ 37.46€x = 8000 ⇒ k ≤ 35.93€x = 16000 ⇒ k ≤ 35.16€
διαμορφώνονται ανάλογα, όπως φαίνεται και στα δεξιά. Συνεπώς,για ένα εύρος τεμαχίων από 1000 - 16000 θα πρέπει το κάθεολοκληρωμένο να στοιχίζει το πολύ, περίπου 35,2€. Τονίζεται οτι ησυμπεριφορά του κόστους παραμένει αναλλοίωτη, ανεξάρτητη απότον ΣΥ. Αλλάζει μόνο η ανοχή ως προς το κόστος. Ενώ χωρίς ΣΥ θαπρέπει το κόστος k να είναι το πολύ 30€, τώρα, με τον ΣΥ μπορεί να είναι ακριβότερο μέχρι και 17,3% της τιμής των30€.
11
500 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 160000.0
10.0
20.0
30.0
40.0
50.0
60.0
Κόστος Τεχνολογίας ανά Τεμάχιο με ΣΥΚόστος FPGA IC = 34.4 ευρώ
Διακριτά Στοιχεία FPGA'S Διαφορά Κόστους
Τεμάχια
Κόσ
τος
Τεχν
ολογ
ίας(
ευρ
ώ)
Ο σταθερός όρος καθορίζει και τώρα την ασυμπτωτική διαφορά π.χ. για k = 30€ ⇒ 31 - 0.9k = 4€. Για k = 20€ ⇒31 - 0.9k = 13€ ενώ για την αντίστοιχη περίπτωση, χωρίς ΣΥ η διαφορά ήταν 10€.Με άλλα λόγια λαμβάνοντας υπ’όψιντον ΣΥ το κόστος μειώνεται μέχρι και 33%.
500 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 160000.0
10.0
20.0
30.0
40.0
50.0
60.0
Κόστος Τεχνολογίας ανά Τεμάχιο με ΣΥΚόστος FPGA IC = 30 ευρώ
Διακριτά Στοιχεία FPGA'S Διαφορά Κόστους
Τεμάχια
Κόσ
τος
Τεχν
ολογ
ίας(
ευρ
ώ)
12
4 3rd Series 2011
33
ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΑΚΑΔ. ΕΤΟΣ 2010-2011
ΑΘΗΝΑ 5 - 5 - 2011 3η ΟΜΑΔΑ ΑΣΚΗΣΕΩΝ
ΓΙΑ ΤΟ ΜΑΘΗΜΑ "Συστήματα Μικροϋπολογιστών" Παράδοση 22/5/2011
Ασκήσεις προσομοίωσης (να υλοποιηθούν και να δοκιμαστούν στο πρόγραμμα προσομοίωσης του
εκπαιδευτικού συστήματος μLAB)
1η - 4η ΑΣΚΗΣΗ: Να γραφούν σε assembly 8085 και να εκτελεστούν στο μLAB, 4 προγράμματα με τις εξής λειτουργίες: i. Διαβάζει την πόρτα εισόδου των dip switches και με βάση το 1ο δεξιότερο ΟΝ, ανάβει το αντίστοιχης
τάξης led και όλα τα υψηλότερης τάξης led μετά από αυτό (π.χ. για 1011 0100 => XXXX XXOO). Το πρόγραμμα να είναι συνεχούς λειτουργίας.
ii. Να αναμένει το πάτημα του δεκαεξαδικού πληκτρολογίου και μόνο των αριθμών 1 έως 8. Κάθε φορά να ανάβει το led της αντίστοιχης θέσης (1=>LSB, 8=>MSB). Να γίνει χρήση της ρουτίνας KIND που υπάρχει στο παράρτημα 1 των σημειώσεων του μLAB. Το πρόγραμμα να είναι συνεχούς λειτουργίας.
iii. Με βάση την ύλη των σελ. 76 – 79 (των σημειώσεων του μLAB) να γίνει απευθείας ανάγνωση του πληκτρολογίου χωρίς τη χρήση της ρουτίνας KIND. Το αποτέλεσμα του κωδικού (βάσει του πίνακα 1 της σελ. 74) να εμφανίζεται στα 2 δεξιότερα 7-segment display με βάση τις ρουτίνες DCD (Display Character Decoder) και STDM (Store Display Message), σελ. 80-82.
iv. (*) Να γίνεται η απεικόνιση των κωδικών της προηγούμενης άσκησης με την χρήση της τεχνικής απευθείας απεικόνισης χωρίς τη χρήση των ρουτινών DCD και STDM όπως περιγράφεται στις σελ. 83 – 87 (των σημειώσεων του μLAB)
Να σημειωθεί ότι χρειάζεται να δίνεται στην αρχή ενός προγράμματος η εντολή IN 10 που αίρει την προστασία της μνήμης του εκπαιδευτικού συστήματος μLAB επιτρέποντας έτσι πρόσβαση για αποθήκευση μεταβλητών και δεδομένων οπουδήποτε στην διαθέσιμη μνήμη RAM του συστήματος (0800 – 0BFF Hex) βλ. χάρτη μνήμης μLAB - σελ. 7 των σημειώσεων - Εισαγωγή στο Εκπαιδευτικό Σύστημα mLAB.. (*) 5η ΑΣΚΗΣΗ: Να υλοποιηθεί και να εκτελεστεί στο μLAB πρόγραμμα σε assembly που όταν προκαλείται διακοπή τύπου RST 6.5 (πάτημα πλήκτρου INTR) να διαβάζει τα 2 διαδοχικά δεκαεξαδικά ψηφία ενός αριθμού (0-255) που δίνονται στη συνέχεια από το πληκτρολόγιο (ρουτίνα KIND) και να τα απεικονίζει στα 2 δεξιότερα 7-segment display (βάσει των ρουτινών DCD και STDM). Να συγκρίνει την τιμή αυτή με δυο κατώφλια Κ1 και Κ2 με Κ1<Κ2, που οι τιμές τους βρίσκονται στους καταχωρητές Β και C αντίστοιχα. Στην συνέχεια να ανάβει ένα από τα τρία LED εξόδου (τα πρώτα LSB) που αντιστοιχούν στις περιοχές τιμών [0..Κ1], (Κ1..Κ2] και (Κ2..FFH]. 6η ΑΣΚΗΣΗ: Στο μLAB να γραφεί πρόγραμμα Assembly, που να ελέγχει μέσω του MSB της πόρτας εξόδου των LED (3000 Hex) τα φώτα ενός χώρου. Όταν προκαλείται διακοπή τύπου RST 6.5 (πάτημα πλήκτρου INTR) να ανάβει το αντίστοιχο MSB της πόρτας εξόδου των LED. Αυτό να παραμένει ανοιχτό για περίπου ένα (1) λεπτό της ώρας και μετά να σβήνει. Αν όμως ενδιάμεσα ξαναενεργοποιηθεί η διακοπή να ανανεώνεται ο χρόνος του ενός λεπτού. Να γίνει χρήση των ρουτινών χρονοκαθυστέρησης του εκπαιδευτικού συστήματος μLAB.
Θεωρητικές Ασκήσεις 7η ΑΣΚΗΣΗ: Σχεδιάστε ένα μΥ-Σ 8085 που να έχει τον εξής χάρτη μνήμης:
0000-1FFF Hex : EPROM 2000-3FFF Hex : RAM 4000-5FFF Hex : EPROM
6000 Hex : θύρα εξόδου (Memory map I/O) 60 Hex : θύρα εισόδου (Standard I/O) 80 Hex : θύρα εισόδου-εξόδου (Standard I/O) Παρέχονται ολοκληρωμένα κυκλώματα: EPROMs των 16KBytes, RAMs 2KBytes, μΕ 8085, καταχωρητές και απομονωτές (απλής και διπλής κατεύθυνσης) των 8 bits, κωδικοποιητές 3 σε 8 και οι βασικές λογικές πύλες. Χρησιμοποιείστε μόνο όσα σας χρειάζονται και στην ποσότητα που θέλετε. Σχεδιάστε τα κυκλώματα
διασύνδεσης. Τα βασικά σήματα ελέγχου του 8085 είναι RD , WR , IO M/ και ALE.
8η ΑΣΚΗΣΗ: α) Τη μακροεντολή SWAP Q, R, που εναλλάσσει τα περιεχόμενα οποιονδήποτε δύο καταχωρητών γενικού σκοπού B, C, D, E, H και L. Η εκτέλεση της μακροεντολής δεν πρέπει να επηρεάζει τα περιεχόμενα των υπολοίπων καταχωρητών που δεν μετέχουν στην εναλλαγή.
β) Τη μακροεντολή FILL ADDR, L, K, η οποία γεμίζει ένα τμήμα μνήμης με μια σταθερά. Το μέγεθος του τμήματος μπορεί να είναι μέχρι 256. Η αρχική διεύθυνση ADDR, το μήκος L και η σταθερά K καθορίζονται από τις παραμέτρους της μακροεντολής.
(*) γ) Επίσης δώστε τη μακροεντολή RHLL n, που περιστρέφει τα περιεχόμενα του κρατουμένου CY, των καταχωρητών H και L κατά n ψηφία αριστερά. Έτσι η μακροεντολή συμπεριφέρεται στα CY, H και L σαν να είναι ένας 17-bit καταχωρητής με το CY σαν το πιο σημαντικό ψηφίο.
9η ΑΣΚΗΣΗ: Στο μΕ 8085 εκτελoύνται διαδοχικά οι 2 εντολές STA 1000H και JMP 2000H. Ο μετρητής προγράμματος είναι (PC)=1000H και ο δείκτης σωρού (SP)=4000H. Στο μέσον της εκτέλεσης της εντολής συμβαίνει διακοπή RST 6.5. Δώστε τις νέες τιμές των PC, SP, το περιεχόμενο του σωρού καθώς και τις λειτουργίες που συμβαίνουν.
(*) 10η ΑΣΚΗΣΗ: α) Σχεδιάστε ένα σύστημα που υλοποιεί μεταφορά δεδομένων από ένα μΥ-Σ 8085 σε ένα άλλο επίσης μΥ-Σ 8085 με τη χρήση διακοπής RST 5.5. Το μΥ-Σ1 από την πόρτα εξόδου DATA1 στέλνει δεδομένα στην πόρτα εισόδου DATA2 του άλλου (μΥ-Σ2). Για κάθε δεδομένο το μΥ-Σ1 μέσω της γραμμής
σειριακής εξόδου SOD προκαλεί διακοπή στο άλλο (μΥ-Σ2). Υποθέτουμε ότι η γραμμή INTA (του μΥ-Σ2) οδηγείται στην σειριακή είσοδο SID (για την επιβεβαίωση της αναγνώρισης της διακοπής και συνεπώς της δυνατότητας λήψης του δεδομένου). Να δοθούν τα προγράμματα Assembly και στους δυο μΕ που επιτρέπουν την μεταφορά 256 δεδομένων που βρίσκονται στη μνήμη του μΥ-Σ1 με αρχή τη θέση που δείχνει ο καταχωρητής H-L. Αποθηκεύονται στη μνήμη του μΥ-Σ2 με βάση το δικό του καταχωρητή H-L.
(*) 4 Προαιρετικές
Παρατήρηση: Όλα τα προγράμματα να συνοδεύονται υποχρεωτικά στα κυριότερα σημεία τους από πολύ σύντομα σχόλια.
4.1 3.1 — Leds 1st On,1011 0100 =¿ XXXX XXOO
1 EXERCISE_1 :2
3 START :4 LDA 2000H ; READ INPUT
5 RAL ; CHECK BIT7
6 JC TURN_1 ; IF BIT7 = 1 THEN TURN ON 1 LED
7 RAL ; CHECK BIT6
8 JC TURN_2 ; IF BIT6 = 1 THEN TURN ON 2 LEDS
9 RAL ; CHECK BIT5
10 JC TURN_3 ; IF BIT5 = 1 THEN TURN ON 3 LEDS
11 RAL ; CHECK BIT4
12 JC TURN_4 ; IF BIT4 = 1 THEN TURN ON 4 LEDS
13 RAL ; CHECK BIT3
14 JC TURN_5 ; IF BIT3 = 1 THEN TURN ON 5 LEDS
15 RAL ; CHECK BIT2
16 JC TURN_6 ; IF BIT2 = 1 THEN TURN ON 6 LEDS
17 RAL ; CHECK BIT1
18 JC TURN_7 ; IF BIT1 = 1 THEN TURN ON 7 LEDS
19 RAL ; CHECK BIT0
20 JC TURN_8 ; IF BIT0 = 1 THEN TURN ON 8 LEDS
21 MVI A , FFH22 STA 3000H23 JMP START
24
25 TURN_8 :26 MVI A , 00 H27 STA 3000H28 JMP START
29
30 TURN_7 :31 MVI A , 01 H32 STA 3000H33 JMP START
34 TURN_6 :35 MVI A , 03 H36 STA 3000H37 JMP START
38 TURN_5 :39 MVI A , 07 H40 STA 3000H
36
41 JMP START
42 TURN_4 :43 MVI A , 0 FH44 STA 3000H45 JMP START
46 TURN_3 :47 MVI A , 1 FH48 STA 3000H49 JMP START
50 TURN_2 :51 MVI A , 3 FH52 STA 3000H53 JMP START
54 TURN_1 :55 MVI A , 7 FH56 STA 3000H57 JMP START
58
59 END
4.2 3.2 — Read From keyboard show on Leds
1 EXERCISE_2 :2
3 START :4
5 CALL KIND ; READ KEYBOARD
6 CPI 01H ;7 JZ TURN_1 ; TURN ON LED 18 CPI 02H ;9 JZ TURN_2 ; TURN ON LED 210 CPI 03H ;11 JZ TURN_3 ; TURN ON LED 312 CPI 04H ;13 JZ TURN_4 ; TURN ON LED 414 CPI 05H ;15 JZ TURN_5 ; TURN ON LED 516 CPI 06H ;17 JZ TURN_6 ; TURN ON LED 618 CPI 07H ;19 JZ TURN_7 ; TURN ON LED 7
37
20 CPI 08H ;21 JZ TURN_8 ; TURN ON LED 822 MVI A , FFH23 STA 3000H24 JMP START
25
26 TURN_1 :27 MVI A , FEH28 STA 3000H29 JMP START
30
31 TURN_2 :32 MVI A , FDH33 STA 3000H34 JMP START
35 TURN_3 :36 MVI A , FBH37 STA 3000H38 JMP START
39 TURN_4 :40 MVI A , F7H41 STA 3000H42 JMP START
43 TURN_5 :44 MVI A , EFH45 STA 3000H46 JMP START
47 TURN_6 :48 MVI A , DFH49 STA 3000H50 JMP START
51 TURN_7 :52 MVI A , BFH53 STA 3000H54 JMP START
55 TURN_8 :56 MVI A , 7 FH57 STA 3000H58 JMP START
59
60 END
38
4.3 3.3 — Straight Read keyboard - Print 7-Segments
1 EXECISE_3 :2
3 IN 10H ; DISABLE MEMORY PROTECTION
4
5 LXI H , 0 A02H ; ” POINT” TO MEMORY 0A02H6
7 MVI M , 10 H ; STORE NOTHING TO ”PRINT”8 INX H ; POINT TO THE NEXT MEMORY CELL 0A03H9 MVI M , 10 H ; STORE NOTHING TO ”PRINT”10 INX H ; POINT TO THE NEXT MEMORY CELL 0A04H11 MVI M , 10 H ; STORE NOTHING TO ”PRINT”12 INX H ; POINT TO THE NEXT MEMORY CELL 0A05H13 MVI M , 10 H ; STORE NOTHING TO ”PRINT”14 START :15
16 LINE_0 : ; LINE INSTR STEP , FETCH PC , HRDWR STEP
17 MVI A , FEH18 STA 2800H ; READ LINE
19 LDA 1800H ; READ COLUMNS
20 ANI 07H ; SET THE 5 MSB ' S = 021 MVI C , 86 H22 CPI 06H ; INSTR STEP
23 JZ DISPLAY
24 MVI C , 85 H25 CPI 05H ; FETCH PC
26 JZ DISPLAY
27 MVI C , F7H28 CPI 03H ; HRDWR STEP
29 JZ DISPLAY
30
31 LINE_1 : ; LINE RUN , FETCH REG , FETCH ADRS
32 MVI A , FDH33 STA 2800H ; READ LINE
34 LDA 1800H ; READ COLUMNS
35 ANI 07H ; SET THE 5 MSB ' S = 036 MVI C , 84 H37 CPI 06H ; RUN38 JZ DISPLAY
39 MVI C , 80 H40 CPI 05H ; FETCH REG
39
41 JZ DISPLAY
42 MVI C , 82 H43 CPI 03H ; FETCH ADRS
44 JZ DISPLAY
45
46 LINE_2 : ; LINE 0 , STORE/INCR , DECR
47 MVI A , FBH48 STA 2800H ; READ LINE
49 LDA 1800H ; READ COLUMNS
50 ANI 07H ; SET THE 5 MSB ' S = 051 MVI C , 00 H52 CPI 06H ; 053 JZ DISPLAY
54 MVI C , 83 H55 CPI 05H ; STORE/INCR56 JZ DISPLAY
57 MVI C , 81 H58 CPI 03H ; DECR59 JZ DISPLAY
60
61 LINE_3 : ; LINE 1 , 2 , 362 MVI A , F7H63 STA 2800H ; READ LINE
64 LDA 1800H ; READ COLUMNS
65 ANI 07H ; SET THE 5 MSB ' S = 066 MVI C , 01 H67 CPI 06H ; 168 JZ DISPLAY
69 MVI C , 02 H70 CPI 05H ; 271 JZ DISPLAY
72 MVI C , 03 H73 CPI 03H ; 374 JZ DISPLAY
75
76 LINE_4 : ; LINE 4 , 5 , 677 MVI A , EFH78 STA 2800H ; READ LINE
79 LDA 1800H ; READ COLUMNS
80 ANI 07H ; SET THE 5 MSB ' S = 081 MVI C , 04 H82 CPI 06H ; 483 JZ DISPLAY
40
84 MVI C , 05 H85 CPI 05H ; 586 JZ DISPLAY
87 MVI C , 06 H88 CPI 03H ; 689 JZ DISPLAY
90
91 LINE_5 : ; LINE 7 , 8 , 992 MVI A , DFH93 STA 2800H ; READ LINE
94 LDA 1800H ; READ COLUMNS
95 ANI 07H ; SET THE 5 MSB ' S = 096 MVI C , 07 H97 CPI 06H ; 798 JZ DISPLAY
99 MVI C , 08 H100 CPI 05H ; 8101 JZ DISPLAY
102 MVI C , 09 H103 CPI 03H ; 9104 JZ DISPLAY
105
106 LINE_6 : ; LINE A , B , C
107 MVI A , BFH108 STA 2800H ; READ LINE
109 LDA 1800H ; READ COLUMNS
110 ANI 07H ; SET THE 5 MSB ' S = 0111 MVI C , 0 AH112 CPI 06H ; A113 JZ DISPLAY
114 MVI C , 0 BH115 CPI 05H ; B116 JZ DISPLAY
117 MVI C , 0 CH118 CPI 03H ; C119 JZ DISPLAY
120
121 LINE_7 : ; LINE D , E , F
122 MVI A , 7 FH123 STA 2800H ; READ LINE
124 LDA 1800H ; READ COLUMNS
125 ANI 07H ; SET THE 5 MSB ' S = 0126 MVI C , 0 DH
41
127 CPI 06H ; D128 JZ DISPLAY
129 MVI C , 0 EH130 CPI 05H ; E131 JZ DISPLAY
132 MVI C , 0 FH133 CPI 03H ; F134 JZ DISPLAY
135
136 JMP START ; IF NO BUTTON IS PRESSED , CHECK AGAIN
137
138 DISPLAY :139
140 LXI H , 0 A00H141
142 MOV A , C ; ( C ) := BUTTON ' S CODE
143 ANI 0FH ; ISOLATE THE 4 LSB ' S144 MOV M , A ; STORE THEM TO MEMORY
145 INX H ; POINT TO THE NEXT MEMORY CELL 0A01H146 MOV A , C ; ( C ) := BUTTON ' S CODE
147 ANI F0H ; ISOLATE THE 4 MSB ' S148 RRC ; SHIFT THEM TO THE 4 LSB ' S149 RRC
150 RRC
151 RRC
152 MOV M , A ; STORE THEM TO MEMORY
153
154 LXI D , 0 A00H ; MEMORY ADDRESS WHERE THE MESSAGE IS
155 CALL STDM
156 CALL DCD
157
158 JMP START
159
160 END
4.4 3.4
1 EXECISE_4 :2
3 START :4
42
5 LINE_0 : ; LINE INSTR STEP , FETCH PC , HRDWR STEP
6 MVI A , FEH7 STA 2800H ; READ LINE
8 LDA 1800H ; READ COLUMNS
9 ANI 07H ; SET THE 5 MSB ' S = 010 CPI 06H ; INSTR STEP
11 JZ DISPLAY_INSTR
12 CPI 05H ; FETCH PC
13 JZ DISPLAY_PC
14 CPI 03H ; HRDWR STEP
15 JZ DISPLAY_HRDWR
16
17 LINE_1 : ; LINE RUN , FETCH REG , FETCH ADRS
18 MVI A , FDH19 STA 2800H ; READ LINE
20 LDA 1800H ; READ COLUMNS
21 ANI 07H ; SET THE 5 MSB ' S = 022 CPI 06H ; RUN23 JZ DISPLAY_RUN
24 CPI 05H ; FETCH REG
25 JZ DISPLAY_REG
26 CPI 03H ; FETCH ADRS
27 JZ DISPLAY_ADRS
28
29 LINE_2 : ; LINE 0 , STORE/INCR , DECR
30 MVI A , FBH31 STA 2800H ; READ LINE
32 LDA 1800H ; READ COLUMNS
33 ANI 07H ; SET THE 5 MSB ' S = 034 CPI 06H ; 035 JZ DISPLAY_0
36 CPI 05H ; STORE/INCR37 JZ DISPLAY_INCR
38 CPI 03H ; DECR39 JZ DISPLAY_DECR
40
41 LINE_3 : ; LINE 1 , 2 , 342 MVI A , F7H43 STA 2800H ; READ LINE
44 LDA 1800H ; READ COLUMNS
45 ANI 07H ; SET THE 5 MSB ' S = 046 CPI 06H ; 147 JZ DISPLAY_1
43
48 CPI 05H ; 249 JZ DISPLAY_2
50 CPI 03H ; 351 JZ DISPLAY_3
52
53 LINE_4 : ; LINE 4 , 5 , 654 MVI A , EFH55 STA 2800H ; READ LINE
56 LDA 1800H ; READ COLUMNS
57 ANI 07H ; SET THE 5 MSB ' S = 058 CPI 06H ; 459 JZ DISPLAY_4
60 CPI 05H ; 561 JZ DISPLAY_5
62 CPI 03H ; 663 JZ DISPLAY_6
64
65 LINE_5 : ; LINE 7 , 8 , 966 MVI A , DFH67 STA 2800H ; READ LINE
68 LDA 1800H ; READ COLUMNS
69 ANI 07H ; SET THE 5 MSB ' S = 070 CPI 06H ; 771 JZ DISPLAY_7
72 CPI 05H ; 873 JZ DISPLAY_8
74 CPI 03H ; 975 JZ DISPLAY_9
76
77 LINE_6 : ; LINE A , B , C
78 MVI A , BFH79 STA 2800H ; READ LINE
80 LDA 1800H ; READ COLUMNS
81 ANI 07H ; SET THE 5 MSB ' S = 082 CPI 06H ; A83 JZ DISPLAY_A
84 CPI 05H ; B85 JZ DISPLAY_B
86 CPI 03H ; C87 JZ DISPLAY_C
88
89 LINE_7 : ; LINE D , E , F
90 MVI A , 7 FH
44
91 STA 2800H ; READ LINE
92 LDA 1800H ; READ COLUMNS
93 ANI 07H ; SET THE 5 MSB ' S = 094 CPI 06H ; D95 JZ DISPLAY_D
96 CPI 05H ; E97 JZ DISPLAY_E
98 CPI 03H ; F99 JZ DISPLAY_F
100
101 JMP START ; IF NO BUTTON IS PRESSED , CHECK AGAIN
102
103 DISPLAY_INSTR :104 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
105 STA 2800H106
107 MVI A , 80 H ; ” PRINT” 8108 STA 3800H109
110 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
111 STA 2800H112
113 MVI A , 82 H ; ” PRINT” 6114 STA 3800H115
116 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
117
118 DISPLAY_PC :119 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
120 STA 2800H121
122 MVI A , 80 H ; ” PRINT” 8123 STA 3800H124
125 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
126 STA 2800H127
128 MVI A , 92 H ; ” PRINT” 5129 STA 3800H130
131 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
132
133 DISPLAY_HRDWR :
45
134 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
135 STA 2800H136
137 MVI A , 8 EH ; ” PRINT” F
138 STA 3800H139
140 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
141 STA 2800H142
143 MVI A , F8H ; ” PRINT” 7144 STA 3800H145
146 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
147
148 DISPLAY_RUN :149 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
150 STA 2800H151
152 MVI A , 80 H ; ” PRINT” 8153 STA 3800H154
155 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
156 STA 2800H157
158 MVI A , 99 H ; ” PRINT” 4159 STA 3800H160
161 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
162
163 DISPLAY_REG :164 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
165 STA 2800H166
167 MVI A , 80 H ; ” PRINT” 8168 STA 3800H169
170 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
171 STA 2800H172
173 MVI A , C0H ; ” PRINT” 0174 STA 3800H175
176 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
46
177
178 DISPLAY_ADRS :179 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
180 STA 2800H181
182 MVI A , 80 H ; ” PRINT” 8183 STA 3800H184
185 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
186 STA 2800H187
188 MVI A , A4H ; ” PRINT” 2189 STA 3800H190
191 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
192
193 DISPLAY_0 :194 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
195 STA 2800H196
197 MVI A , C0H ; ” PRINT” 0198 STA 3800H199
200 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
201 STA 2800H202
203 MVI A , C0H ; ” PRINT” 0204 STA 3800H205
206 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
207
208 DISPLAY_INCR :209 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
210 STA 2800H211
212 MVI A , 80 H ; ” PRINT” 8213 STA 3800H214
215 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
216 STA 2800H217
218 MVI A , B0H ; ” PRINT” 3219 STA 3800H
47
220
221 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
222
223 DISPLAY_DECR :224 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
225 STA 2800H226
227 MVI A , 80 H ; ” PRINT” 8228 STA 3800H229
230 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
231 STA 2800H232
233 MVI A , F9H ; ” PRINT” 1234 STA 3800H235
236 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
237
238 DISPLAY_1 :239 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
240 STA 2800H241
242 MVI A , C0H ; ” PRINT” 0243 STA 3800H244
245 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
246 STA 2800H247
248 MVI A , F9H ; ” PRINT” 1249 STA 3800H250
251 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
252
253 DISPLAY_2 :254 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
255 STA 2800H256
257 MVI A , C0H ; ” PRINT” 0258 STA 3800H259
260 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
261 STA 2800H262
48
263 MVI A , A4H ; ” PRINT” 2264 STA 3800H265
266 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
267
268 DISPLAY_3 :269 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
270 STA 2800H271
272 MVI A , C0H ; ” PRINT” 0273 STA 3800H274
275 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
276 STA 2800H277
278 MVI A , B0H ; ” PRINT” 3279 STA 3800H280
281 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
282
283 DISPLAY_4 :284 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
285 STA 2800H286
287 MVI A , C0H ; ” PRINT” 0288 STA 3800H289
290 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
291 STA 2800H292
293 MVI A , 99 H ; ” PRINT” 4294 STA 3800H295
296 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
297
298 DISPLAY_5 :299 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
300 STA 2800H301
302 MVI A , C0H ; ” PRINT” 0303 STA 3800H304
305 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
49
306 STA 2800H307
308 MVI A , 92 H ; ” PRINT” 5309 STA 3800H310
311 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
312
313 DISPLAY_6 :314 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
315 STA 2800H316
317 MVI A , C0H ; ” PRINT” 0318 STA 3800H319
320 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
321 STA 2800H322
323 MVI A , 82 H ; ” PRINT” 6324 STA 3800H325
326 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
327
328 DISPLAY_7 :329 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
330 STA 2800H331
332 MVI A , C0H ; ” PRINT” 0333 STA 3800H334
335 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
336 STA 2800H337
338 MVI A , F8H ; ” PRINT” 7339 STA 3800H340
341 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
342
343 DISPLAY_8 :344 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
345 STA 2800H346
347 MVI A , C0H ; ” PRINT” 0348 STA 3800H
50
349
350 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
351 STA 2800H352
353 MVI A , 80 H ; ” PRINT” 8354 STA 3800H355
356 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
357
358 DISPLAY_9 :359 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
360 STA 2800H361
362 MVI A , C0H ; ” PRINT” 0363 STA 3800H364
365 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
366 STA 2800H367
368 MVI A , 98 H ; ” PRINT” 9369 STA 3800H370
371 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
372
373 DISPLAY_A :374 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
375 STA 2800H376
377 MVI A , C0H ; ” PRINT” 0378 STA 3800H379
380 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
381 STA 2800H382
383 MVI A , 88 H ; ” PRINT” A
384 STA 3800H385
386 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
387
388 DISPLAY_B :389 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
390 STA 2800H391
51
392 MVI A , C0H ; ” PRINT” 0393 STA 3800H394
395 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
396 STA 2800H397
398 MVI A , 83 H ; ” PRINT” B
399 STA 3800H400
401 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
402
403 DISPLAY_C :404 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
405 STA 2800H406
407 MVI A , C0H ; ” PRINT” 0408 STA 3800H409
410 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
411 STA 2800H412
413 MVI A , C6H ; ” PRINT” C
414 STA 3800H415
416 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
417
418 DISPLAY_D :419 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
420 STA 2800H421
422 MVI A , C0H ; ” PRINT” 0423 STA 3800H424
425 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
426 STA 2800H427
428 MVI A , A1H ; ” PRINT” D
429 STA 3800H430
431 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
432
433 DISPLAY_E :434 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
52
435 STA 2800H436
437 MVI A , C0H ; ” PRINT” 0438 STA 3800H439
440 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
441 STA 2800H442
443 MVI A , 86 H ; ” PRINT” E
444 STA 3800H445
446 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
447
448 DISPLAY_F :449 MVI A , 02 H ; TURN ON THE SECOND FROM RIGHT DIGIT
450 STA 2800H451
452 MVI A , C0H ; ” PRINT” 0453 STA 3800H454
455 MVI A , 01 H ; TURN ON THE FIRST FROM RIGHT DIGIT
456 STA 2800H457
458 MVI A , 8 EH ; ” PRINT” F
459 STA 3800H460
461 JMP CLEAN_DIGIT ; CLEAN 7SEGMENT DISPLA
462
463 CLEAN_DIGIT :464 MVI A , FFH ; CLEAN 7SEGMENT DISPLA
465 STA 3800H466 JMP START
467
468 END
4.5 3.7-9 —Memories +Macros (Swap,Fill Addr,Rhll)
53
ΘεωρίαΆσκηση 7η
Οι προδιαγραφές προσδιορίζουν την σχεδίαση. Ο μΕ 8085 συνεπάγεται διευθύνσεις 16 bits και δεδομένα 8 bits.Από τον χάρτη μνήμης,
Διευθύνσεις A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 bitsEPROM0
Αρχή 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Bin0 0 0 0 Hex
Τέλος 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Bin1 F F F Hex
SRAM0
Αρχή 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 Bin2 0 0 0 Hex
Τέλος 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 Bin2 7 F F Hex
SRAM1
Αρχή 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 Bin2 8 0 0 Hex
Τέλος 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 Bin2 F F F Hex
SRAM2
Αρχή 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 Bin3 0 0 0 Hex
Τέλος 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 Bin3 7 F F Hex
SRAM3
Αρχή 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 Bin3 8 0 0 Hex
Τέλος 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Bin3 F F F Hex
EPROM1
Αρχή 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Bin4 0 0 0 Hex
Τέλος 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Bin5 F F F Hex
γίνεται σαφές πως για τον προσδιορισμό όλων των διευθύνσεων είτε EPROM είτε RAM, χρειάζονται ακριβώς 13bits, από A0 - A12. Συνέπεια αυτού είναι οτι κάθε περιοχή μνήμης του χάρτη μνήμης έχει μέγεθος 8ΚΒ. Η μνήμη RAMεπιλέχθηκε ως μια τετράδα από SRAM 2Κ x 8 bits σύμφωνα με τα διαθέσιμα υλικά. H μνήμη EPROM επιλέχθηκε μεμέγεθος 16ΚΒαφού συγκροτείται από δύο περιοχές στον χάρτη μνήμης, την περιοχή από 0000 - 1FFFHκαι την περιοχήαπό 4000 - 5FFFH μεγέθους 8ΚΒ η κάθε μία. Περισσότερες λεπτομέρειες υπάρχουν παρακάτω. Σημειώνεται πως ηRAM είναι μία συνεχής περιοχή μνήμης. Επίσης, από τον χάρτη μνήμης προκύπτει το A15 να χρησιμεύει ως είσοδοςεπίτρεψης, ενώ τα bits από A11 - A14 χρειάζονται για τον μοναδικό προσδιορισμό κάθε ολοκληρωμένου κυκλώματοςμνήμης. Συμπερασματικά, εξάγεται ο ακόλουθος πίνακας αποκωδικοποίησης,
15
Τα Χ στον πίνακα αληθείας αναφέρονται σεΠίνακας Αληθείαςα/α A14 A13 A12 A11 A B C Μνήμη0 0 0 0 0 0 0 0 EPROM1 0 0 0 1 X X X -2 0 0 1 0 X X X -3 0 0 1 1 0 0 0 EPROM4 0 1 0 0 0 0 1 SRAM05 0 1 0 1 0 1 0 SRAM16 0 1 1 0 0 1 1 SRAM27 0 1 1 1 0 1 0 SRAM38 1 0 0 0 0 0 0 EPROM9 1 0 0 1 X X X -10 1 0 1 0 X X X -11 1 0 1 1 0 0 0 EPROM12 1 1 0 0 X X X -13 1 1 0 1 X X X -14 1 1 1 0 X X X -15 1 1 1 1 X X X -
αδιάφορους όρους, αφού ο συνδυασμός στον οποίοαντιστοιχούν δεν έχει κάποια πρακτική σημασία.Χρειάζεται όμως προσοχή στο τι τελικά θα επιλεχθείγια τα Χ. Δύνανται άσχετοι συνδυασμοί των A11,A12, A13, A14 με κατάλληλη τιμή του Χ να οδηγούνσε ανεπιθύμητη πρόσβαση στην μνήμη. Τελικά, οιαδιάφοροι αυτοί όροι λαμβάνονται είτε ως 1 είτεως 0 κατά πως εξυπηρετεί. Η στήλη του Α περιέχειείτε μηδενικά είτε αδιάφορους όρους. Θα μπορούσεγια εξοικονόμηση χώρου στην πλακέτα, καλύτερηεικόνα της πλακέτας και για οικονομία υλικών τα Χ= 0, δηλαδή, το Α = 0 σταθερά. Όμως σε αυτήν τηνπερίπτωση αν τα Χ του Β επιλεχθούν ίσα με 0 τότεανεξάρτητα από την τιμή των Χ του C θα συμβαίνειπαράνομη πρόσβαση στην μνήμη είτε στην RAM είτεστην EPROM. Οπότε επιλέγονται όλοι οι αδιάφοροιόροι του Α ίσοι με 1. Μετά από πράξεις της λογικήςσχεδίασης προκύπτειΑ = A13A14 + A12⊕A12,B = ( A11 + A12)A13 και C = A13A11.
Προηγουμένως αναφέρθηκε πως η EPROMαποτελείται από δύο περιοχές του χάρτη μνήμης. Προφανώς η δεύτερηπεριοχή, μετά από τηνRAM, δεν αντιστοιχεί σε μια μνήμη των 8ΚΒαλλά σε μια μνήμη των 24ΚΒ τουλάχιστον. Για τηνακρίβεια η δεύτερη περιοχή συνιστά τα τελευταία 8ΚΒ μιας μνήμης των 24ΚΒ. Από την άλλη, οι διαθέσιμες μνήμεςEPROM είναι των 16ΚΒ. Προκειμένου να υπάρχει αυστηρή τήρηση του χάρτη μνήμης θα πρέπει να εισαχθούν στομΥ σύστημα δύο μνήμες των 16ΚΒ και να γίνει μερική χρήση αυτών. Με άλλα λόγια η προσπέλαση στις μνήμες αυτέςνα γίνεται μόνο στις διευθύνσεις που ορίζει ο χάρτης μνήμης. Όπως φαίνεται η αυστηρή τήρηση του χάρτη μνήμηςεισάγει κάμποση δυσκολία, πολυπλοκότητα, κόστος και σπατάλη υλικού.
Για να αποφευχθούν όλα αυτά τα προβλήματα γίνεται μετατόπιση της δεύτερης περιοχής στα όρια μιας μνήμηςτων 16ΚΒ. Συγκεκριμένα γίνεται χρήση μιας 16ΚΒ μνήμης που έχει διευθύνσεις από 0000 - 3FFFH. Η πρώτη περιοχήτου χάρτη μνήμης και της EPROM προφανώς αντιστοιχεί επακριβώς στην περιοχή από 0000 - 1FFFH της μνήμης.Η τρίτη περιοχή του χάρτη μνήμης από 4000 - 5FFFH αντιστοιχίζεται στην περιοχή από 2000 - 3FFFH της μνήμης.Ένα θέμα που ανακύπτει τώρα είναι πως θα διακρίνονται οι διευθύνσεις της πρώτης περιοχής του χάρτη μνήμης απότην τρίτη. Παρατηρώντας τον αρχικό χάρτη μνήμης διαπιστώνεται πως οι δύο περιοχές της EPROM ως προς τα bitsA11 - A14, διαφέρουν μόνο ως προς το A14. Όταν αυτό ισούται με 0 τότε λαμβάνεται η πρώτη περιοχή, ενώ όταν αυτόισούται με 1, λαμβάνεται η δεύτερη περιοχή. Το ίδιο προκύπτει κι από τον χάρτη μνήμης της μνήμης των 16ΚΒ μετην διαφορά οτι τον ρόλο του A14 έχει το A13 γεγονός αναμενόμενο. Αναμενόμενο, γιατί μια μνήμη 16ΚΒ απαιτεί 14bits από A0 - A13 για τον προσδιορισμό όλων των δυνατών διευθύνσεων. Στην σχεδίαση λοιπόν του συστήματος στοA13 που αφορά στην μνήμη εισέρχεται το A14 από τον 8085. Στον επόμενο χάρτη τα ονόματα EPROM1, EPROM2αναφέρονται στις δύο περιοχές της EPROM του αρχικού χάρτη αντίστοιχα.
Χάρτης Μνήμης 16ΚΒΔιευθύνσεις A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 bitsEPROM0
Αρχή 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Bin0 0 0 0 Hex
Τέλος 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Bin1 F F F Hex
EPROM1
Αρχή 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 Bin2 0 0 0 Hex
Τέλος 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Bin3 F F F Hex
16
Τέλος για την είσοδο και την έξοδο του συστήματος απορρέει ο χάρτης μνήμης,
Διευθύνσεις A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A06000Η
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 060Η
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 080Η
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
17
Τα bits χωρίζονται σε τρεις ομάδες, κάθε μια εκ των οποίων χρωματίζεται διαφορετικά. Η πράσινη ομάδα χρησιμεύειως είσοδος επίτρεψης όπως φαίνεται λεπτομερέστερα στο σχήμα.Η μπλε ομάδα χρειάζεται ώστε μετά την αποκωδικοποίησηνα επιλέγεται η σωστή θύρα σύμφωνα με τις τιμές των A13, A14. Τέλος, η κόκκινη ομάδα καθορίζει τις τιμές στη είσοδοτου αποκωδικοποιητή. Διευκρινίζεται πως το σχήμα που αφορά στην Ε/Ε, ως κύκλωμα βρίσκεται μαζί με το υπόλοιποκύκλωμα που παρουσιάζεται παραπάνω. Η ξεχωριστή παρουσίαση έγινε για να δοθεί η προσοχή που αρμόζει σε κάθεμέρος του μΥ συστήματος.
18
Άσκηση 8η
α)
SWAP MACRO SOURCE, DESTINATION PUSH SOURCEPUSH DESTINATIONPOP SOURCEPOP DESTINATION
ENDM
β)
FILL MACRO ADDR, LENGTH, KPUSH L ;STORE L, HPUSH H ;BECAUSE THEY ARE GOING TO CHANGEPUSH C ;STORE C FOR THE SAME REASON
LXI H,ADDR ;POINT TO THE FIRST “ARRAY” ELEMENTMVI C,LENGTH ;STORE “ARRAY” LENGTH
FILL_ARRAY:MVI M,K ;WRITE TO “ARRAY”INX H ;POINT TO THE NEXT “ARRAY” CELLDCR CJNZ FILL_ARRAY ;IF WHOLE “ARRAY” IS FILLED RETURN
POP C ;RESTORE REGISTERSPOP HPOP L
ENDM
19
5 Exam Exercises
5.1 2002
59
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΑΘΗΝΑ 7. 10. 2002
ΛΥΣΕΙΣ ΤΩΝ ΘΕΜΑΤΩΝ ΤΗΣ ΓΡΑΠΤΗΣ ΕΞΕΤΑΣΗΣ ΣΤΟ ΜΑΘΗΜΑ "Συστήµατα Μικροϋπολογιστών"
ΘΕΜΑ 1ο: Σε ένα µΥ-Σ 8085 να γραφεί πρόγραµµα Assembly που να υπολογίζει από ένα σύνολο Ν δεδοµένων (αριθµοί ακέραιοι µη αρνητικοί των 8 bit) και από αυτούς που είναι µεταξύ των αριθµών 20 Hex και 60 Hex (συµπεριλαµβανοµένων) το µέγιστο και τον ελάχιστο και να τους αποθηκεύει στους καταχωρητές C και D αντίστοιχα. Τα δεδοµένα υποθέτουµε ότι είναι αποθηκευµένα στη µνήµη µε αρχή τη διεύθυνση που δείχνει ο διπλός καταχωρητής H-L και το πλήθος Ν δίνεται στον καταχωρητή Β. Θα εκτιµηθεί η απλότητα της λύσης (πχ. µε µία σάρωση). (3 ΜΟΝΑ∆ΕΣ) ΛΥΣΗ 1ΟΥ ΘΕΜΑΤΟΣ:
MVI C, 0 ;Θέση µεγίστου
MVI D,255D ;Θέση ελαχίστου INR B ;Ρύθµιση µετρητή
START: MOV A, M ;Ανάκληση αριθµού X
DCR B ;Έλεγχος τέλους JZ STOP ; αριθµών CPI 20H ;Σύγκριση X µε 20H
JC START ;X<20H, εκτός περιοχής CPI 61H ;Σύγκzριση X µε 61H
JNC START ;X>61H, εκτός περιοχής CMP C ;Σύγκριση X µε max
JC P1 ;X< max καµία αλλαγή MOV C, A ;X≥ max, max= X
P1: CMP D ;Σύγκριση X µε min
JNC P2 ;X≥min καµία αλλαγή MOV D, A ;X< min, min= X
P2: JMP START ;Άλµα µέχρι τέλους αριθµών STOP: HLT
END
max=0, min=255B <=(B)+1
A <=(M)=XB <=(B)-1
B=0 ?
X<20H ?X>60H ?
X<max ?
X>min ?
ΟΧΙ
ΝΑΙ
ΟΧΙ
ΝΑΙ
ΟΧΙ
ΝΑΙ
max <=X
ΟΧΙ
ΝΑΙ
min <=X
END
START
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΘΕΜΑ 2ο: Να γραφεί πρόγραµµα Assembly σε ένα κατάλληλο µΥ-Σ 8085 που να επιτρέπει τον έλεγχο µιας συρόµενης ηλεκτρικής θύρας. Η θύρα αυτή ελέγχεται από δυο (2) διακόπτες (Push-Buttons), που ο ένας είναι για το ΑΝΟΙΓΜΑ (PB_A) και ο άλλος για το ΚΛΕΙΣΙΜΟ (PB_K). Θεωρούµε ότι υπάρχουν δυο τερµατικοί διακόπτες (Α-ανοιχτή θύρα, Κ-κλειστή θύρα) που δίνουν στην έξοδό τους λογικό 1 όταν η θύρα περνάει από τη θέση «τελείως ανοιχτό» και τη θέση «τελείως κλειστό». Επίσης θεωρούµε ότι η θύρα κινείται από µία µηχανή που ελέγχεται από δυο λογικά σήµατα (ΑΝΟΙΞΕ και ΚΛΕΙΣΕ) που όταν έχουν την τιµή 1 προκαλούν αντίστοιχη κίνηση στη θύρα. Φυσικά δεν θα πρέπει να γίνουν ποτέ ταυτόχρονα 1. Υποθέτουµε ότι αρχικά η θύρα ξεκινάει από κλειστή θέση. Υπακούει σε εντολή ΑΝΟΙΓΜΑ (PB_A=1) όταν Κ=1 και σταµατάει όταν Α=1. Αντίστοιχα ισχύουν για την εντολή ΚΛΕΙΣΙΜΟ (PB_K=1). Όταν έχει δοθεί εντολή και είναι σε κίνηση δεν υπακούει σε νέα εντολή εκτός και αν φτάσει στις θέσεις Α ή Κ. ∆ώστε το ∆ιάγραµµα Ροής και κάντε ότι άλλες παραδοχές χρειάζονται για την οµαλή λειτουργία του αυτοµατισµού. (2 ΜΟΝΑ∆ΕΣ) Να δοθεί η δυνατότητα αν πατηθούν ταυτόχρονα τα δύο Push-Buttons ανεξάρτητα θέσης ή κατάστασης η θύρα να κλείνει και να συµπληρωθεί το ∆ιάγραµµα Ροής. (1 ΜΟΝΑ∆Α) ΛΥΣΗ 2ΟΥ ΘΕΜΑΤΟΣ: APXH: IN 20H ;Είσοδος και αποµόνωση
ANI 02H ;του σήµατος Κ JZ A1 ;
MVI A,0 ;αν K=1 OUT 40H ;ΚΛΕΙΣΕ <= 0 IN 20 H ;Είσοδος και αποµόνωση
ANI 04H ;του σήµατος PB_A JZ A1 ;
MVI A,0 ;αν PB_A=1 OUT 40H ;ΑΝΟΙΞΕ <= 1 A1: IN 20H ;Είσοδος και αποµόνωση
ANI 01H ;του σήµατος A JZ A2 ;
MVI A,0 ;αν A=1 OUT 40H ;ΑΝΟΙΞΕ <= 0 IN 20 H ;Είσοδος και αποµόνωση
ANI 08H ;του σήµατος PB_Κ JZ A2 ;
A3: MVI A,1 ;αν PB_K=1
OUT 40H ;ΚΛΕΙΣΕ <= 1 A2: IN 20H ;Είσοδος και αποµόνωση
ANI 0CH ;των σηµάτων PB_A και CPI 0CH ;PB_K
JZ A3 ; ΚΛΕΙΣΕ JMP ΑΡΧΗ ;
Το τµήµα του προγράµµατος που είναι bold απαντάει στο δεύτερο ερώτηµα του θέµατος.
µΥ-Σ8085
ΕΙΣΟ∆ΟΣ
ΕΞΟ∆ΟΣ
ΚΛΕΙΣΕ
(LSB) (LSB)
(MSB)(MSB)
∆ιευθ.20H
∆ιευθ.40H
Push-Button ΑΝΟΙΓΜΑ PB_A
Τερµατικός ∆ιακόπτης ΚΤερµατικός ∆ιακόπτης Α ΑΝΟΙΞΕ
Push-Button ΚΛΕΙΣΙΜΟ PB_K
K=1
Αρχή
PB_A=1
PB_A=1PB_K=1
ΚΛΕΙΣΕ=0
ΑΝΟΙΞΕ=1
Α=1
PB_Κ=1
ΑΝΟΙΞΕ=0
ΚΛΕΙΣΕ=1
ΟΧΙ
ΝΑΙ
ΝΑΙ
ΟΧΙ
ΟΧΙ
ΝΑΙ
ΝΑΙ
ΟΧΙ
ΟΧΙ
ΝΑΙ
5.2 2004
62
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΑΘΗΝΑ 31. 8. 2004
ΛΥΣΕΙΣ ΤΩΝ ΘΕΜΑΤΩΝ ΤΗΣ ΓΡΑΠΤΗΣ ΕΞΕΤΑΣΗΣ ΣΤΟ ΜΑΘΗΜΑ "Συστήµατα Μικροϋπολογιστών"
ΘΕΜΑ 1ο: Σε ένα µΥ-Σ 8085 να γραφεί πρόγραµµα Assembly που να µετράει το πλήθος ίδιων χαρακτήρων ASCII και να τους αντικαθιστά µε το χαρακτήρα x εκτός από τον εκάστοτε τελευταίο, σε ένα κείµενο Ν χαρακτήρων αποθηκευµένων στη µνήµη µε αρχή τη διεύθυνση που δείχνει ο διπλός καταχωρητής H-L. Το πλήθος Ν δίνεται στον καταχωρητή Β. Το αποτέλεσµα να αποθηκευθεί στον καταχωρητή C (αντιστοιχεί στο πλήθος των χαρακτήρων x που προστέθηκαν). Παράδειγµα: aab8889*$+GGGGDxx → xabxx89*$+xxxGDxx (C)=7. (2.5 ΜΟΝΑ∆ΕΣ) ΛΥΣΗ 1ΟΥ ΘΕΜΑΤΟΣ:
MVI C, 0 ;Αρχικοποίηση µετρητή
START: MOV A, M ;Ανάκληση χαρακτήρων
INX H ;Αύξηση δείκτη µνήµης CMP M ; Σύγκριση µε τον επόµενο χαρακτήρα JNZ P1 ; Αν δεν είναι ίσα παρακάµπτω µέτρηση
INR C ;Αύξηση µετρητή
DCX H ;Ελάττωση δείκτη µνήµης MVΙ Μ, ‘x’ ;Αποθήκευση χαρακτήρα x
INX H ;Επαναφορά δείκτη µνήµης P1: DCR B ;Έλεγχος τέλους JNZ START ;χαρακτήρων
HLT
END
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΘΕΜΑ 2ο: Να γραφεί πρόγραµµα Assembly σε µΥ-Σ 8085 που δέχεται από τα 4 χαµηλότερης και υψηλότερης αξίας bit µιας θύρας εισόδου (IN_PORT) δύο αριθµούς Χ<x3x2x1x0> και Y<y3y2y1y0> αντίστοιχα µε x0, y0 να είναι τα LSB των αριθµών. Στη συνέχεια να προσοµοιώνει τον υπολογισµό του αθροίσµατος 8·X+7·Y και να εµφανίζει συνεχώς το αποτέλεσµα στη θύρα εξόδου ADD_PORT. Επίσης, όταν προκαλείται διακοπή τύπου RST6.5 να υπολογίζει το µέγιστο µεταξύ των X και Y και να το εµφανίζει στη θύρα εξόδου MAX_PORT χωρίς να επηρεάζει τον υπολογισµό του αθροίσµατος. (3.5 ΜΟΝΑ∆ΕΣ) ΛΥΣΗ 2ΟΥ ΘΕΜΑΤΟΣ:
ΚΥΡΙΟ ΠΡΟΓΡΑΜΜΑ
MVI A,0DH ;Αρχικοποίηση RST6.5
SIM
EI
APXH: IN IN_PORT ;Είσοδος MOV B,A ;Αντίγραφο εισόδου
RRC ;∆εξιά ολίσθηση RRC ;κατά 4 θέσεις RRC ;του Υ RRC
ANI 0FH ;Αποµόνωση του Υ MOV C,A ;Αντίγραφο του Υ MOV A,B ;Επαναφέρω την είσοδο
ANI 0FH ;Αποµόνωση του X
ADD C ; (A) = X+Y
ADD A ; (A) = 2X+2Y
ADD A ; (A) = 4X+4Y
ADD A ; (A) = 8X+8Y
SUB C ; (A) = 8X+7Y
OUT ADD_PORT;Έξοδος Αθροίσµατος JMP ΑΡΧΗ ;
ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΈΤΗΣΗΣ ∆ΙΑΚΟΠΗΣ
RST6.5: IN IN_PORT ;Είσοδος PUSH B
MOV B,A ;Αντίγραφο εισόδου
RRC ;∆εξιά ολίσθηση RRC ;κατά 4 θέσεις RRC ;του Υ RRC
ANI 0FH ;Αποµόνωση του Υ MOV C,A ;Αντίγραφο του Υ MOV A,B ;Επαναφέρω την είσοδο
ANI 0FH ;Αποµόνωση του X
CMP C ;
JNC X1 ;
MOV A,C ;
X1: OUT MAX_PORT;Έξοδος Μεγίστου
POP B
EI
RET
5.3 2006
65
Ε .Μ .Π . - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. & ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΥΠΟΛΟΓΙΣΤΩΝ ΑΘΗΝΑ 6. 9. 2006
ΛΥΣΕΙΣ ΤΩΝ ΘΕΜΑΤΩΝ ΤΗΣ ΓΡΑΠΤΗΣ ΕΞΕΤΑΣΗΣ ΣΤΟ ΜΑΘΗΜΑ "Συστήματα Μικροϋπολογιστών"
ΑΠΟ-ΠΛΕΚΤΗΣ
1 σε 8
S0
S1
S2
y0
y1
y2
y3
LSB LSB
MSB MSB
y4
y5
y6
y7
z
x
x
x
x ΘΕΜΑ 1ο: (α) Να γραφεί πρόγραμμα Assembly σε μΥ-Σ 8085 που να προσομοιώνει συνεχώς τη λειτουργία ενός αποπλέκτη 1 σε 8. Tα bit ελέγχου S0, S1 και S2 καθορίζουν την σύνδεση της εισόδου z με μία από τις εξόδους y0 έως y7. Υποθέτουμε ότι τα σήματα εισόδου εισάγονται από τα τέσσερα (4) χαμηλότερης αξίας bit μιας θύρας εισόδου (IN_PORT). Η έξοδος Υ παρέχεται από θύρα εξόδου (OUT_PORT). Λειτουργία αποπλέκτη: για i=S2S1S0 y i=z για τα υπόλοιπα (i≠S2S1S0)y i=0 (2 ΜΟΝΑΔΕΣ) ΛΥΣΗ 1ΟΥ ΘΕΜΑΤΟΣ και (α) ΕΡΩΤΗΜΑΤΟΣ: ARXH: IN IN_PORT MOV B,A ANI 07H ; Απομόνωση S2S1S0
MOV C,A MOV A,B ANI 08H ; Απομόνωση Z JZ ZERO ; Αν είναι μηδέν παρακάμπτουμε MVI A,80H ; Αλλιώς θέτουμε το MSB του Α (Z=1) INR C ; αυξάνουμε κατά 1 για την περίπτωση C=0 ZERO: RLC ; με την 1η ολίσθηση το Z πάει στο LSB του Α DCR C ; ολισθαίνουμε τον Α κατά τον αριθμό C=S2S1S0
JNZ ZERO OUT OUT_PORT ; Έξοδος JMP ARXH
(β) Το παραπάνω σύστημα κάθε φορά που προκαλείται διακοπή RST5.5 να κάνει τον υπολογισμό: Υ=16z+7S2+4S1+2S0 όπου Υ είναι 8-bit αριθμός που αντιστοιχεί στην έξοδο της θύρα OUT_PORT. Όταν προκαλείται διακοπή RST6.5, να επανέρχεται στην λειτουργία (α), ενώ νέες διακοπές RST6.5 να αφήνουν στην ίδια λειτουργία. Επίσης όταν είναι στην λειτουργία (β) νέες διακοπές RST5.5 να αφήνουν στην ίδια λειτουργία. (2 ΜΟΝΑΔΕΣ) ΛΥΣΗ 1ΟΥ ΘΕΜΑΤΟΣ και (β) ΕΡΩΤΗΜΑΤΟΣ:
ΚΥΡΙΟ ΠΡΟΓΡΑΜΜΑ ARXH: MVI A,0EH ;Αρχικοποίηση RST5.5 SIM EI
IN IN_PORT MOV B,A
ANI 07H ; Απομόνωση S2S1S0
MOV C,A MOV A,B ANI 08H ; Απομόνωση Z JZ ZERO ; Αν είναι μηδέν παρακάμπτω MVI A,80H ; θέτουμε το MSB του Α (Z=1) INR C ; αύξηση κατά 1 για την περίπτωση C=0 ZERO: RLC ; 1η ολίσθηση το Z στο LSB του Α DCR C ; ολίσθηση κατά τον αριθμό C=S2S1S0
JNZ ZERO OUT OUT_PORT ; Έξοδος JMP ARXH
ΡΟΥΤΙΝΕΣ ΕΞΥΠΗΡΈΤΗΣΗΣ ΔΙΑΚΟΠΩΝ RST5.5: IN IN_PORT ;Είσοδος
ANI 0FH ; Απομόνωση των ZS2S1S0
MOV B,A ; Αντίγραφο εισόδου RLC ; αριστερή ολίσθηση
A=16z+8S2+4S1+2S0
MOV D,A ; Αντίγραφο υπολογισμού MOV A,B ; Επαναφέρω την είσοδο ANI 04H ; Απομόνωση S2
JZ SKIP ; Αν είναι μηδέν παρακάμπτω DCR D ; Αλλιώς S2=1, οπότε το αφαιρώ MOV A,D ; Α=Y
SKIP: OUT OUT_PORT ; Έξοδος MVI A,0DH ; Αρχικοποίηση RST6.5 SIM EI
JMP RST5.5 RST6.5: POP HL ; αδειάζει τον PC από RST5.5
EI RET ; επαναφέρει στο Κύριο Πρόγραμμα
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
μΥ- 8085
Ε
ΞΟΔΟΣ
x
x
x
x
(LSB) (LSB)
(MSB)
ΕΙΣΟΔΟΣ
F0
F1
F2
F3
10ms
10ms
10ms
10ms 10ms
10ms
10ms
10ms
(MSB)
x
x
x
x
x
x
x= αδιάφορο
start
1ος κύκλος 2ος κύκλος ...
x
ΘΕΜΑ 2ο: (α) Να υλοποιηθεί σε ένα μΥ-Σ 8085 που διαθέτει θύρα εισόδου και εξόδου στις διευθύνσεις 40 Hex και 20 Hex αντίστοιχα ένα σύστημα που να παράγει τις κυματομορφές του διπλανού σχήματος. Δίνεται η ρουτίνα DEL10 χρονοκαθυστέρησης 10 msec. Να δοθεί το πρόγραμμα Assembly που υλοποιεί τη λειτουργία αυτή όταν start=1, αλλιώς όλες οι έξοδοι Fi να είναι 0. Ο έλεγχος και οι αλλαγές να γίνονται στην αρχή κάθε κύκλου. (1.5 ΜΟΝΑΔΕΣ) ΛΥΣΗ 2ΟΥ ΘΕΜΑΤΟΣ και (α) ΕΡΩΤΗΜΑΤΟΣ: ARXH: IN 40H ANI 01H ; Απομόνωση start JZ ARXH ; Αν είναι μηδέν περιμένω OUT 20H ; Αλλιώς Α=01H και μπορεί να δοθεί στην έξοδο F0=1 DEL10 ; Αναμονή 10 msec RLC ; ολίσθηση της μονάδας ; επανάληψη των 3ων εντολών
OUT 20H ; Α=02H και δίνεται στην έξοδο F1=1 DEL10 ; Αναμονή 10 msec RLC ; ολίσθηση της μονάδας ; επανάληψη των 3ων εντολών
OUT 20H ; Α=04H και δίνεται στην έξοδο F2=1 DEL10 ; Αναμονή 10 msec RLC ; ολίσθηση της μονάδας ; επανάληψη των 3ων εντολών
OUT 20H ; Α=04H και δίνεται στην έξοδο F3=1 DEL10 ; Αναμονή 10 msec RLC ; ολίσθηση της μονάδας JMP ARXH
(β) Να συμπληρωθεί ή να ξαναγραφεί το παραπάνω πρόγραμμα ώστε κάθε φορά που προκαλείται διακοπή RST5.5 να αναστρέφεται η σειρά που οι έξοδοι Fi γίνονται σε κάθε κύκλο 1 (αντί από F0→ F3 να είναι F3→ F0). Η λειτουργία να είναι συνεχής και οι αλλαγές να γίνονται στην αρχή κάθε κύκλου. (1 ΜΟΝΑΔΑ)
ΛΥΣΗ 2ΟΥ ΘΕΜΑΤΟΣ και (β) ΕΡΩΤΗΜΑΤΟΣ:
ΚΥΡΙΟ ΠΡΟΓΡΑΜΜΑ MVI D,0 ; Σημαία διακοπής
MVI A,0EH ; Αρχικοποίηση RST5.5 SIM EI ARXH: IN 40H
ANI 01H ; Απομόνωση start JZ ARXH ; Αν είναι μηδέν περιμένουμε MOV A,D ; Σημαία στον καταχωρητή Α
CPI 01H ; Απομόνωση start bit JZ INVERT
MVI A,01; Α=01H CYCLE0: OUT 20H ; έξοδος F0=1 DEL10 ; Αναμονή 10 msec RLC ; ολίσθηση της μονάδας
CPI 10H ; είμαστε στον 4ο κύκλο? JNZ CYCLE0 ; όχι και συνεχίζουμε JMP ARXH ; τελείωσαν οι 4 κύκλοι
INVERT: MVI A,08 CYCLE1: OUT 20H ; Α=08H, στην έξοδο F3=1 DEL10 ; Αναμονή 10 msec RRC ; δεξιά ολίσθηση της μονάδας
CPI 80H ; είμαστε στον 4ο κύκλο? JNZ CYCLE1 ; όχι και συνεχίζουμε
JMP ARXH ; τελείωσαν οι 4 κύκλοι
ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΈΤΗΣΗΣ ΔΙΑΚΟΠΗΣ
RST5.5: MOV A,D ; Σημαία στον καταχωρητή Α XRI 01H ; Αναστροφή Σημαίας MOV D,A ; Αποθήκευση Σημαίας
EI RET ; Επαναφέρει στο Κύριο Πρόγραμμα
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
(γ) Να δημιουργηθούν οι παραπάνω κυματομορφές με τις προϋποθέσεις του ερωτήματος (α) χωρίς τη χρήση χρονοκαθυστέρηση αλλά με την αξιοποίηση ενός εξωτερικού χρονιστή που θεωρούμε ότι προκαλεί διακοπές RST5.5 κάθε 10 msec. Να δοθούν το κύριο πρόγραμμα και η ρουτίνα εξυπηρέτησης της διακοπής. Ποιά τα πλεονεκτήματα/μειονεκτήματα αυτού του σχήματος; (0.5 ΜΟΝΑΔΕΣ)
ΛΥΣΗ 2ΟΥ ΘΕΜΑΤΟΣ και (γ) ΕΡΩΤΗΜΑΤΟΣ:
ΚΥΡΙΟ ΠΡΟΓΡΑΜΜΑ MVI A,0EH ; Αρχικοποίηση RST5.5
SIM EI CYCLE: IN 40H
ANI 01H ; Απομόνωση start JZ CYCLE ; Αν είναι μηδέν περιμένω STEP: OUT 20H ; αλλιώς A=01 (αρχική τιμή) και ξεκινάει ο 1ος κύκλος με έξοδο Fi
CPI 08 ; Αν είναι στον 4ο κύκλο JZ CYCLE ; ξεκινάει νέος κύκλος JMP STEP ; νέο βήμα
ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΈΤΗΣΗΣ ΔΙΑΚΟΠΗΣ ;εκτελείται κάθε 10 msec. RST5.5:RLC ; αριστερή ολίσθηση της μονάδας EI RET ; επαναφέρει στο Κύριο Πρόγραμμα
Το βασικό πλεονέκτημα αυτού του σχήματος είναι ότι δεν αναλώνεται η υπολογιστική ισχύς του μΥ-Σ στην υλοποίηση χρονοκαθυστερήσεων. Το μοναδικό μειονέκτημα είναι ότι απαιτείται η χρήση χρονιστή. Αυτό στους μικροελεγκτές δεν είναι πρόβλημα γιατί έχει προβλεφθεί να τον περιλαμβάνουν.
Εθνικό Μετσόβιο Πολυτεχνείο
Συστήματα Μικρουπολογιστών
8086
Contents
1 Macros 31.1 Generic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 RESETREG . . . . . . . . . . . . . . . . . . . . . . . . 31.1.2 EXIT . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.3 IS ODD . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.4 IS HEX . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.5 SAFE CALL . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Input Output . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.1 BACKSPACE . . . . . . . . . . . . . . . . . . . . . . . 61.2.2 PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.3 PRINT-UNSAFE . . . . . . . . . . . . . . . . . . . . . 61.2.4 PRINT-STR . . . . . . . . . . . . . . . . . . . . . . . . 71.2.5 PRINT-STR-UNSAFE . . . . . . . . . . . . . . . . . . 71.2.6 READ . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2.7 READ ECHO . . . . . . . . . . . . . . . . . . . . . . . 8
2 Routines 92.1 Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.1 Out bin word . . . . . . . . . . . . . . . . . . . . . . . 92.1.2 Out dec word . . . . . . . . . . . . . . . . . . . . . . . 92.1.3 Out hex . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1.4 Out hex byte . . . . . . . . . . . . . . . . . . . . . . . 102.1.5 Out hex word . . . . . . . . . . . . . . . . . . . . . . . 112.1.6 Out oct word . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.2.1 In oct . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.2.2 In oct 2 Digits . . . . . . . . . . . . . . . . . . . . . . . 132.2.3 In dec . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2.4 In dec 2 Digits . . . . . . . . . . . . . . . . . . . . . . 152.2.5 In dec Even . . . . . . . . . . . . . . . . . . . . . . . . 162.2.6 In dec Odd . . . . . . . . . . . . . . . . . . . . . . . . 172.2.7 In hex . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3 Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.3.1 Dec to Hex . . . . . . . . . . . . . . . . . . . . . . . . 192.3.2 Oct to Hex . . . . . . . . . . . . . . . . . . . . . . . . 19
3 Solved Problems 203.1 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.2 In 2 Dec Nums—Out Dec Sub (signed) and Mul . . . . . . . . 21
1
3.3 In 3 Hex Nums—Out Hex Sum and Mul . . . . . . . . . . . . 233.4 In 2 Oct Nums—Out Hex,Dec Sum . . . . . . . . . . . . . . . 253.5 In Series of even,odd numbers— Out compare them . . . . . . 273.6 In at most 9 Ints—Out even,sum . . . . . . . . . . . . . . . . 30
4 Exam Exercises 324.1 2002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.2 2004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.3 2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2
1 Macros
1.1 Generic
1.1.1 RESETREG
1 ; == RESETREG ==2 ; Sets a l l r e g i s t e r s o f 8086 to 0 .3 ; MODIFIES : AX, BX, CX, DX, DI , S I .4 RESETREG macro
5 mov AX , 06 mov BX , 07 mov CX , 08 mov DX , 09
10 mov DI , 011 mov SI , 012 endm
1.1.2 EXIT
1 ; == EXIT ==2 ; Su c c e s s f u l l y ha l t s program exe cu t i on .3 ; MODIFIES : AX.4 EXIT macro
5 ; S e rv i c e s e l e c t : AH <− 0x4C6 ; Returned value : AL <− 0x007 mov AX , 0x4C008 int 0x21 ; Invoke DOS so f tware i n t e r r u p t .9 endm
1.1.3 IS ODD
1 ; == IS ODD ==2 ; Sets car ry f l a g i f AL i s odd.3 ; C lear s car ry f l a g o th e rw i s e .4 ; MODIFIES : FLAGS.5 IS_ODD macro
3
6 LOCAL _MYEXIT
7 clc ; Clear c a r r y .8 test AL , 0x01 ; I s LSB o f AL = 1?9 jz _MYEXIT ; yes : Leave car ry c l e a r e d .10 stc ; no : Set c a r r y .11 _MYEXIT :12 endm
1.1.4 IS HEX
1 ; == IS HEX ==2 ; Sets car ry f l a g i f ASCII va lue o f CHAR i s a hexadecimal←
d i g i t .3 ; C lear s car ry f l a g o th e rw i s e .4 ; ASSUMES: CHAR must be an 8−b i t r e g i s t e r .5 ; MODIFIES : FLAGS.6 IS_HEX macro CHAR
7 LOCAL _HEX , _MYEXIT
8 clc ; Clear c a r r y .9 cmp CHAR , '0' ; chr (CHAR) < chr (0 ) ?10 jb _MYEXIT ; yes : Not a hex d i g i t .11 cmp CHAR , '9' ; chr (CHAR) <= chr (9 ) ?12 jbe _HEX ; yes : Hex d i g i t .13 cmp CHAR , 'A' ; chr (CHAR) < chr (A) ?14 jb _MYEXIT ; yes : Not a hex d i g i t .15 cmp CHAR , 'F' ; chr (CHAR) <= chr (F) ?16 jbe _HEX ; yes : Hex d i g i t .17 cmp CHAR , 'a' ; chr (CHAR) < chr ( a ) ?18 jb _MYEXIT ; yes : Not a hex d i g i t .19 cmp CHAR , 'f' ; chr (CHAR) > chr ( f ) ?20 jg _MYEXIT ; yes : Not a hex d i g i t .21 _HEX :22 stc ; Set c a r r y .23 _MYEXIT :24 endm
1.1.5 SAFE CALL
1 ; == SAFE CALL ==2 ; Wraps a procedure c a l l so that i t doesn ' t a f f e c t
4
3 ; any important r e g i s t e r (AX, BX, CX, DX, FLAGS) .4 ; MODIFIES : [ none ]5 SAFE_CALL macro THE_PROC
6 pushf ; Store FLAGS7 push AX ; Store AX.8 push BX ; Store BX.9 push CX ; Store CX.10 push DX ; Store DX.11
12 call THE_PROC ; Ca l l the ta rge t ed procedure .13
14 pop DX ; Restore DX.15 pop CX ; Restore CX.16 pop BX ; Restore BX.17 pop AX ; Restore AX.18 popf ; Restore FLAGS19 endm
5
1.2 Input Output
1.2.1 BACKSPACE
1 ; == BACKSP ==2 ; Causes the cur so r to d e l e t e l a s t c h a r a c t e r .3 ; MODIFIES : [ none ]4 ; Untested .5 BACKSP macro
6 push AX ; Store AX.7 push DX ; Store DX.8 mov DL , 0x08 ; Place '\b ' in DL.9 mov AH , 0x02 ; Load DOS ope r a t i on .10 int 0x21 ; Ca l l DOS.11 pop DX ; Restore DX.12 pop AX ; Restore AX.13 endm
1.2.2 PRINT
1 ; == PRINT ==2 ; Pr in t s char to s c r e e n .3 ; MODIFIES : [ none ]4 PRINT macro CHAR
5 push AX ; Store AX.6 push DX ; Store DX.7 mov DL , CHAR ; Place char byte in DL.8 mov AH , 0x02 ; Load DOS ope r a t i on .9 int 0x21 ; Ca l l DOS.10 pop DX ; Restore DX.11 pop AX ; Restore AX.12 endm
1.2.3 PRINT-UNSAFE
1 ; == PRINT UNSAFE ==2 ; Pr in t s char to s c r e e n .3 ; MODIFIES : AX, DX4 PRINT_UNSAFE macro CHAR
6
5 mov DL , CHAR ; Place char byte in DL.6 mov AH , 0x02 ; Load DOS ope r a t i on .7 int 0x21 ; Ca l l DOS.8 endm
1.2.4 PRINT-STR
1 ; == PRINT STR ==2 ; Pr in t s ' $ '− terminated s t r i n g to s c r e e n .3 ; ASSUMES: St r ing r e s i d e s in segment pointed by DS.4 ; MODIFIES : [ none ]5 PRINT_STR macro STRING
6 push AX ; Store AX.7 push DX ; Store DX.8 lea DX , STRING ; Load address o f s t r i n g @ DX.9 mov AH , 0x09 ; Load DOS ope r a t i on .10 int 0x21 ; Ca l l DOS.11 pop DX ; Restore DX.12 pop AX ; Restore AX.13 endm
1.2.5 PRINT-STR-UNSAFE
1 ; == PRINT STR UNSAFE ==2 ; Pr in t s ' $ '− terminated s t r i n g to s c r e e n .3 ; ASSUMES: St r ing r e s i d e s in segment pointed by DS.4 ; MODIFIES : AX, DX5 PRINT_STR_UNSAFE macro STRING
6 lea DX , STRING ; Load address o f s t r i n g @ DX.7 mov AH , 0x09 ; Load DOS ope r a t i on .8 int 0x21 ; Ca l l DOS.9 endm
1.2.6 READ
1 ; == READ ==2 ; Reads one char from keyboard. No echo .3 ; Character i s returned in AL.
7
4 ; MODIFIES : AX.5 READ macro
6 mov AH , 0x08 ; Load DOS ope r a t i on .7 int 0x21 ; Ca l l DOS.8 endm
1.2.7 READ ECHO
1 ; == READECHO ==2 ; Reads one char from keyboard and echoes i t on s c r e e n .3 ; Character i s returned in AL.4 ; MODIFIES : AX.5 READ_ECHO macro
6 mov AH , 0x01 ; Load DOS ope r a t i on .7 int 0x21 ; Ca l l DOS.8 endm
8
2 Routines
2.1 Output
2.1.1 Out bin word
1 ; == out bin word ==2 ; Pr in t s number in AX as sequence o f b inary d i g i t s .3 ; MODIFIES : FLAGS, AX, CX, DX4 ; REQUIRES: <i o l i b . a sm >: PRINT5 out_bin_word proc NEAR
6 mov CX , 16 ; Set up loop to p r i n t 16 b i t s .7 _BOUT :8 mov DL , '0' ; DL = chr (0 ) . ( '0 ' = 0x30 , '1 ' = 0←
x31 )9 shl AX , 1 ; S h i f t MSB of AX into CF.10 adc DL , 0 ; Add CF to DL to ad jus t the ASCII ←
code11 PRINT DL ; . . . and pr in t DL as cha r .12 loop _BOUT ; Loop un t i l no binary d i g i t s l e f t (←
CX = 0) .13 ret ; Terminate r o u t i n e .14 endp
2.1.2 Out dec word
1 ; == out dec word ==2 ; Pr in t s number in AX as sequence o f decimal d i g i t s .3 ; MODIFIES : FLAGS, AX, BX, CX, DX4 ; REQUIRES: <i o l i b . a sm >: PRINT UNSAFE5 out_dec_word proc NEAR
6 mov CX , 0 ; CX w i l l be used as counter f o r ←decimal d i g i t s .
7 _DCALC : ; Dig i t−c a l c u l a t i o n l o op .8 mov DX , 0 ; Zero DX.9 mov BX , 10 ; Divide DX:AX by 10 to f i nd next ←
decimal d i g i t .10 div BX ; Quotient in AX, remainder in DX.11 push DX ; Store decimal d i g i t .12 inc CX ; I n c r e a s e d i g i t c oun t e r .
9
13 cmp AX , 0 ; Repeat un t i l the re are no more ←d i g i t s (AX = 0) .
14 jnz _DCALC
15 _DOUT : ; Dig i t−p r i n t i n g loop ( from MSD to ←LSD) .
16 pop DX ; Pop a decimal d i g i t .17 add DX , '0' ; Generate ASCII code18 PRINT_UNSAFE DL ; . . . and pr in t as cha r .19 loop _DOUT ; Loop un t i l no decimal d i g i t s l e f t (←
CX = 0) .20 ret ; Terminate r o u t i n e .21 endp
2.1.3 Out hex
1 ; == out hex ==2 ; Pr in t s DL as a hex d i g i t .3 ; ASSUMES: 0x00 <= DL <= 0x0f4 ; MODIFIES : FLAGS, DX.5 ; REQUIRES: <i o l i b . a sm >: PRINT UNSAFE6 out_hex proc NEAR
7 cmp DL , 9 ; DL <= 9?8 jle _DEC ; yes : jump to appropr ia te f i x i n g ←
code .9 add DL , 0x37 ; no : Prepare DL by adding chr (A) − ←
10 = 0 x37 .10 jmp _HEX_OUT ; . . . and go to output s t a g e .11 _DEC :12 add DL , '0' ; Prepare DL by adding chr (0 ) = 0 x30 .13 _HEX_OUT :14 PRINT_UNSAFE DL ; Pr int char to s c r e e n .15 ret ; Terminate r o u t i n e .16 endp
2.1.4 Out hex byte
1 ; == out hex byte ==2 ; Pr in t s AL as 2 hex d i g i t s .3 ; MODIFIES : AX, CX, DX4 ; REQUIRES: <numlib.asm>: out hex
10
5 out_hex_byte proc NEAR
6 mov CH , AL ; Save AL in CH.7 mov CL , 4 ; Set r o t a t i on count e r .8 shr AL , CL ; Swap high & low n ibb l e o f AL, to ←
pr in t MSH f i r s t .9 and AL , 0x0f ; Mask out high n ibb l e ( low n ibb l e i s←
s i n g l e hex d i g i t ) .10 mov DL , AL ; Copy AL to DL.11 call out_hex ; . . . and pr in t as hex .12 mov AL , CH ; Recover unswapped AL from CH.13 and AL , 0x0f ; Mask out high n ibb l e ( a l r eady ←
pr in ted ) .14 mov DL , AL ; Copy AL to DL.15 call out_hex ; . . . and pr in t as hex .16 ret ; Terminate r o u t i n e .17 endp
2.1.5 Out hex word
1 ; == out hex word ==2 ; Pr in t s AX as 4 hex d i g i t s .3 ; MODIFIES : AX, CX, BX, DX4 ; REQUIRES: <numlib.asm>: out hex byte5 out_hex_word proc NEAR
6 mov BX , AX ; Save AX in BX.7 xchg AH , AL ; Exchange AL with AH,8 ; Now AL conta in s the two most ←
s i g n i f i c a n t hex d i g i t s .9 call out_hex_byte ; Pr int AL as 2 hex d i g i t s .10 mov AX , BX ; Restore AX from BX.11 ; Now AL conta in s the two l e a s t ←
s i g n i f i c a n t hex d i g i t s .12 call out_hex_byte ; Pr int AL as 2 hex d i g i t s .13 ret ; Terminate r o u t i n e .14 endp
2.1.6 Out oct word
1 ; Pr in t s 16−b i t (word ) number in o c t a l2 ; Input | DX: 16−b i t number
11
3 ; Modi f i e s : Nothing4 ;REQUIRES : <i o l i b . a sm >: PRINT5
6 OUT_OCT_WORD PROC NEAR
7 PUSH AX
8 PUSH BX
9 PUSH CX
10
11 ROL DX , 1 ; Pr int MSB12 MOV BX , 013 ADC BX , 30 H14 PUSH DX
15 PRINT BL
16 POP DX
17 ; I cont inue with the r e s t 15−b i t s18 ; by 3 b i t s19 MOV CX , 5 ; loop counter = 5 (15/3)20
21 ADDR10 :22 ROL DX , 123 ROL DX , 124 ROL DX , 125 MOV BX , DX26 AND BX , 0007 H ; Keep 3 LSBs27 ADD BX , 30 H ; Convert to ASCII28 PUSH DX
29 PRINT BL ; Pr int30 POP DX
31 LOOP ADDR10
32
33 POP CX
34 POP BX
35 POP AX
36
37 RET
38 PRINT_OCT ENDP
2.2 Input
2.2.1 In oct
12
1 ; == in o c t ==2 ; Repeatedly r eque s t s a cha rac t e r from keyboard un t i l ←
user en t e r s3 ; an o c t a l d i g i t . The o c t a l d i g i t i s echoed on the ←
s c r e e n .4 ; The value o f the d i g i t i s returned in AL.5 ; Routine i s terminated immediately i f user en t e r s 'Q ' .6 ;7 ; MODIFIES : FLAGS, AX8 ; REQUIRES: <i o l i b . a sm >: PRINT, READ9 in_oct proc NEAR
10 _OIGNORE :11 READ ; Read a char from keyboard.12 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.13 je _OQUIT
14 cmp AL , '0' ; chr (AL) < chr (0 ) ? .15 jl _OIGNORE ; yes : Ignore and reques t new cha r .16 cmp AL , '7' ; chr (AL) > chr (7 ) ?17 jg _OIGNORE ; yes : Ignore and reques t new cha r .18 PRINT AL ; Char i s in 0−7 range . Pr int i t to ←
s c r e e n .19 sub AL , '0' ; Get numeric va l u e .20 _OQUIT :21 ret ; Terminate r o u t i n e .22 endp
2.2.2 In oct 2 Digits
1 ; == i n o c t 2 d i g i t s ==2 ; Reads a two−d i g i t oct number. Result i s s to r ed in AL3 ; Routine i s terminated immediately i f user en t e r s 'Q ' .4 ;5 ; MODIFIES : FLAGS, AX, BX6 ; REQUIRES: <i o l i b . a sm >: PRINT, READ7 in_oct_2digits proc NEAR
8 _OIGNORE3 :9 READ ; Read a char from keyboard.10 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.11 je _OQUIT2
13
12 cmp AL , '0' ; chr (AL) < chr (0 ) ? .13 jl _OIGNORE3 ; yes : Ignore and reques t new cha r .14 cmp AL , '7' ; chr (AL) > chr (7 ) ?15 jg _OIGNORE3 ; yes : Ignore and reques t new cha r .16 PRINT AL ; Char i s in 0−7 range . Pr int i t to ←
s c r e e n .17 sub AL , '0' ; Get numeric va l u e .18
19 MOV BL , AL20 SHL BL , 3 ; BL = BL ∗ 821
22 _OIGNORE2 :23 READ ; Read a char from keyboard.24 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.25 je _OQUIT2
26 cmp AL , '0' ; chr (AL) < chr (0 ) ? .27 jl _OIGNORE2 ; yes : Ignore and reques t new cha r .28 cmp AL , '7' ; chr (AL) > chr (7 ) ?29 jg _OIGNORE2 ; yes : Ignore and reques t new cha r .30 PRINT AL ; Char i s in 0−7 range . Pr int i t to ←
s c r e e n .31 sub AL , '0' ; Get numeric va l u e .32
33 ADD AL , BL ;34 _OQUIT2 :35 ret ; Terminate r o u t i n e .36 endp
2.2.3 In dec
1 ; == in dec ==2 ; Repeatedly r eque s t s a cha rac t e r from keyboard un t i l ←
user en t e r s3 ; a decimal d i g i t . The decimal d i g i t i s echoed on the ←
s c r e e n .4 ; The value o f the d i g i t i s returned in AL.5 ; Routine i s terminated immediately i f user en t e r s 'Q ' .6 ;7 ; MODIFIES : FLAGS, AX8 ; REQUIRES: <i o l i b . a sm >: PRINT, READ
14
9 in_dec proc NEAR
10 _DIGNORE :11 READ ; Read a char from keyboard.12 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.13 je _DQUIT
14 CMP AL , 0DH ; AN DWSEI ENTER KANW QUIT15 JE _DQUIT ;16 cmp AL , '0' ; chr (AL) < chr (0 ) ? .17 jl _DIGNORE ; yes : Ignore and reques t new cha r .18 cmp AL , '9' ; chr (AL) > chr (9 ) ?19 jg _DIGNORE ; yes : Ignore and reques t new cha r .20 PRINT AL ; Char i s in 0−9 range . Pr int i t to ←
s c r e e n .21 sub AL , '0' ; Get numeric va l u e .22 _DQUIT :23 ret ; Terminate r o u t i n e .24 endp
2.2.4 In dec 2 Digits
1 ; == i n d e c 2 d i g i t s ==2 ; Reads two decimal d i g i t s . The decimal d i g i t s are echoed←
on the s c r e e n .3 ; The value o f the d i g i t s i s returned in AX.4 ; Routine i s terminated immediately i f user en t e r s 'Q ' .5 ;6 ; MODIFIES : FLAGS, AX, BX,DX7 ; REQUIRES: <i o l i b . a sm >: PRINT, READ8 in_dec_2digits proc NEAR
9 _DIGNORE3 :10 READ ; Read a char from keyboard.11 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.12 je _DQUIT4
13 CMP AL , 0DH ; AN DWSEI ENTER KANW QUIT14 JE _DQUIT4 ;15 cmp AL , '0' ; chr (AL) < chr (0 ) ? .16 jl _DIGNORE3 ; yes : Ignore and reques t new cha r .17 cmp AL , '9' ; chr (AL) > chr (9 ) ?18 jg _DIGNORE3 ; yes : Ignore and reques t new cha r .
15
19 PRINT AL ; Char i s in 0−9 range . Pr int i t to ←s c r e e n .
20 sub AL , '0' ; Get numeric va l u e .21
22 mov DL , 0 AH23 mul DL
24 mov BX , AX25
26 _DIGNORE4 :27 READ ; Read a char from keyboard.28 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.29 je _DQUIT4
30 CMP AL , 0DH ; AN DWSEI ENTER KANW QUIT31 JE _DQUIT4 ;32 cmp AL , '0' ; chr (AL) < chr (0 ) ? .33 jl _DIGNORE4 ; yes : Ignore and reques t new cha r .34 cmp AL , '9' ; chr (AL) > chr (9 ) ?35 jg _DIGNORE4 ; yes : Ignore and reques t new cha r .36 PRINT AL ; Char i s in 0−9 range . Pr int i t to ←
s c r e e n .37 sub AL , '0' ; Get numeric va l u e .38
39 mov AH , 00 H40 add AX , BX41
42 _DQUIT4 :43 ret ; Terminate r o u t i n e .44 endp
2.2.5 In dec Even
1 ;== in dec even==2 in_dec_even proc NEAR
3 _DIGNORE1 :4 READ
5 ; Read a char from keyboard.6 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.7 je _DQUIT1
8 CMP AL , 0DH ; AN DWSEI ENTER KANW QUIT
16
9 JE _DQUIT1 ;10 cmp AL , '0' ; chr (AL) < chr (0 ) ? .11 jl _DIGNORE1 ; yes : Ignore and reques t new cha r .12 cmp AL , '9' ; chr (AL) > chr (9 ) ?13 jg _DIGNORE1 ; yes : Ignore and reques t new cha r .14 sub AL , '0'15 IS_ODD
16 JC _DIGNORE1
17 add AL , '0'18 PRINT AL ; Char i s in 0−9 range . Pr int i t to ←
s c r e e n .19 sub AL , '0' ; Get numeric va l u e .20 _DQUIT1 :21 ret ; Terminate r o u t i n e .22 endp
2.2.6 In dec Odd
1 ;== in dec odd==2 in_dec_odd proc NEAR
3 _DIGNORE2 :4 READ
5 ; Read a char from keyboard.6 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.7 je _DQUIT2
8 CMP AL , 0DH ; AN DWSEI ENTER KANW QUIT9 JE _DQUIT2 ;10 cmp AL , '0' ; chr (AL) < chr (0 ) ? .11 jl _DIGNORE2 ; yes : Ignore and reques t new cha r .12 cmp AL , '9' ; chr (AL) > chr (9 ) ?13 jg _DIGNORE2 ; yes : Ignore and reques t new cha r .14 sub AL , '0'15 IS_ODD
16 JNC _DIGNORE2
17 add AL , '0'18 PRINT AL ; Char i s in 0−9 range . Pr int i t to ←
s c r e e n .19 sub AL , '0' ; Get numeric va l u e .20 _DQUIT2 :21 ret
17
22 endp
2.2.7 In hex
1 ; == in hex ==2 ; Repeatedly r eque s t s a cha rac t e r from keyboard un t i l ←
user en t e r s3 ; a hex d i g i t . The hex d i g i t i s echoed on the s c r e e n .4 ; The value o f the d i g i t i s returned in AL.5 ; Routine i s terminated immediately i f user en t e r s 'Q ' .6 ;7 ; MODIFIES : FLAGS, AX8 ; REQUIRES: <i o l i b . a sm >: PRINT, READ9 in_hex proc NEAR
10 _HIGNORE :11 READ ; Read a char from keyboard.12 cmp AL , 'Q' ; I f user entered 'Q ' , t e rminate ←
program.13 je _HQUIT
14 cmp AL , '0' ; chr (AL) < chr (0 ) ? .15 jl _HIGNORE ; yes : Ignore and reques t new cha r .16 cmp AL , '9' ; chr (AL) > chr (9 ) ?17 jg _HFORW ; Go to a−f /A−F hand l e r .18 PRINT AL ; Char i s in 0−9 range . Pr int i t to ←
s c r e e n .19 sub AL , '0' ; Get numeric va l u e .20 ret ; Terminate r o u t i n e .21 _HFORW :22 cmp AL , 'a' ; chr (AL) < chr ( a ) ?23 jl _HFORW2 ; yes : Go to A−F hand l e r .24 cmp AL , 'f' ; chr (AL) > chr ( f ) ?25 jg _HIGNORE ; yes : Ignore and reques t new cha r . (←
chr (F) < chr ( f ) )26 PRINT AL ; Char i s in a−f r ange . Pr int i t to ←
s c r e e n .27 sub AL , 'a' ; Get d i f f e r e n c e from 10 .28 add AL , 0x0a ; Proper ly ad jus t numeric va l u e .29 ret ; Terminate r o u t i n e .30 _HFORW2 :31 cmp AL , 'A' ; chr (AL) < chr (A) ?32 jl _HIGNORE ; yes : Ignore and reques t new cha r .
18
33 cmp AL , 'F' ; chr (AL) > chr (F) ?34 jg _HIGNORE ; yes : Ignore and reques t new cha r .35 PRINT AL ; Char i s in A−F range . Pr int i t to ←
s c r e e n .36 sub AL , 'A' ; Get d i f f e r e n c e from 10 .37 add AL , 0x0a ; Proper ly ad jus t numeric va l u e .38 ret ; Terminate r o u t i n e .39 _HQUIT :40 ret ; Terminate r o u t i n e .41 endp
2.3 Conversions
2.3.1 Dec to Hex
1 DEC2HEX PROC NEAR ;BH−BL −−> BL (DEK−MON)2 LOOP_DH : CMP BH , 03 JZ EXIT1
4 ADD BL , 0 AH5 DEC BH
6 JMP LOOP_DH
7
8 EXIT1 : RET
9 DEC2HEX ENDP
2.3.2 Oct to Hex
1 OCT2HEX PROC NEAR ;BH−BL −−> BL (8 ades−MON)2 LOOP_DHO : CMP BH , 03 JZ EXIT2
4 ADD BL , 08 H5 DEC BH
6 JMP LOOP_DHO
7
8 EXIT2 : RET
9 OCT2HEX ENDP
19
3 Solved Problems
3.1 Template
1 data segment
2 MSG DB 0DH , 0 AH , "MESSAGE:" , '$'3 NEWLINE DB 0AH , 0DH , '$'4 TEMP DB 0H5 TEMP1 DW 00H6 ends
7
8 stack segment
9 dw 128 dup (0 )10 ends
11
12 code segment
13 start :14 ; s e t segment r e g i s t e r s :15 mov ax , data
16 mov ds , ax
17 mov es , ax
18
19 ;←; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ←
20 ;DIABASMA 6 DEKADIKWN STHN SEIRA21 MOV CX , 06H22
23 DIGITS :24 CALL in_dec
25 IS_ODD
26 JC LOOP0
27 ADD DL , AL28
29 LOOP0 :30 LOOP DIGITS
31
32 ;←; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ←
33
34 WAIT_FOR_ENTER :
20
35 READ ; Wait f o r Enter36 CMP AL , 'T'37 JE TERMIN
38 SUB AL , 30 H39 CMP AL , 22140 JE PRINTING
41 JMP WAIT_FOR_ENTER ; Repeat whi l e no ente r42
43
44 ;AND HERE ! ! ! ! ! ! ! ! ! ! ! ! ! !45
46
47 TERMIN :48 RET
49
50 ends
7
3.2 In 2 Dec Nums—Out Dec Sub (signed) and Mul
WAP that reads two decimal numbers and after enter is pressed, prints theirsubtruction (signed) and their product in decimal.
1 data segment
2 MSG1 DB 0DH , 0 AH , "Give 1ST NUMBER:" , '$'3 MSG2 DB 0DH , 0 AH , "Give 2ND NUMBER:" , '$'4 MSG3 DB 0DH , 0 AH , "SUB:" , '$'5 MSG4 DB 0DH , 0 AH , "MUL:" , '$'6 MSG5 DB 0DH , 0 AH , "END:" , '$'7 NEWLINE DB 0AH , 0DH , '$'8 X DB 0H9 Y DB 0H10 ends
11
12 stack segment
13 dw 128 dup (0 )14 ends
15
16 code segment
17 start :18 ; s e t segment r e g i s t e r s :19 mov ax , data
21
20 mov ds , ax
21 mov es , ax
22
23 PRINT_STR MSG1
24
25 DIGITS :26 CALL in_dec
27 MOV X , AL28 mov bl , al29 PRINT_STR MSG2
30 CALL in_dec
31 MOV Y , AL32 mov dl , al33
34 WAIT_FOR_ENTER :35 READ
36 CMP AL , 'T'37 JE TERMIN
38 SUB AL , 30 H39 CMP AL , 22140 JE COMPARE
41 JMP WAIT_FOR_ENTER
42
43 COMPARE :44 PRINT_STR NEWLINE
45 CMP BL , DL46 JE XGRY
47 JG XGRY
48 JMP YGRX
49
50
51 XGRY :52 SUB BL , DL53 PRINT_STR MSG3
54 PRINT '+'55 MOV AL , BL56 MOV AH , 0 H57 CALL out_dec_word
58 JMP MULL
59
60 YGRX :61 SUB DL , BL62 PRINT_STR MSG3
22
63 PRINT '-'64 MOV AL , DL65 MOV AH , 0 H66 CALL out_dec_word
67 JMP MULL
68
69 MULL :70 MOV AL , X71 MUL Y
72 PRINT_STR MSG4
73 CALL OUT_DEC_WORD
74
75
76
77
78 TERMIN :79 RET
3.3 In 3 Hex Nums—Out Hex Sum and Mul
WAP that reads 3 hex numbers and after enter is pressed, prints their sumand their product in hex.
1 data segment
2 MSG1 DB 0DH , 0 AH , "GIVE 3 HEX NUMBERS:" , '$'3 SUMM DB 0DH , 0 AH , "SUM HEX:" , '$'4 PROD DB 0DH , 0 AH , "PRODUCT HEX:" , '$'5 NEWLINE DB 0AH , 0DH , '$'6 X DB 0H7 Y DB 0H8 Z DB 0H9 SUM DB 0H10
11 ends
12
13 stack segment
14 dw 128 dup (0 )15 ends
16
17 code segment
18
19
23
20 START :21 ; s e t segment r e g i s t e r s :22 mov ax , data
23 mov ds , ax
24 mov es , ax
25
26 PRINT_STR MSG1
27 CALL in_hex
28 mov X , AL29
30
31 CALL in_hex
32 mov Y , AL33
34
35 CALL in_hex
36 mov Z , AL37
38
39 WAIT_FOR_ENTER :40 READ
41 CMP AL , 'T'42 JE TERMIN
43 SUB AL , 30 H44 CMP AL , 22145 JE PRINTING
46 JMP WAIT_FOR_ENTER
47
48 PRINTING :49 MOV AL , X50 ADD AL , Y51 ADD AL , Z52 MOV AH , 0 H53 PRINT_STR SUMM
54 CALL out_hex_byte
55
56 MULT :57 MOV AL , X58 MOV AH , 0 H59 MUL Y
60 MUL Z
61
62 PRINT_STR PROD
24
63 CALL out_hex_word
64
65 PRINT_STR NEWLINE
66
67 JMP START
68
69
70 TERMIN :71 RET
72
73 ends
3.4 In 2 Oct Nums—Out Hex,Dec Sum
WAP that reads 2 oct numbers and after enter is pressed, prints their sumin hex and oct.
1 ata segment
2 MSG1 DB 0DH , 0 AH , "GIVE 2 OCT NUMBERS:" , '$'3 SUM_HEX DB 0DH , 0 AH , "SUM HEX:" , '$'4 SUM_DEC DB 0DH , 0 AH , "SUM DEC:" , '$'5 NEWLINE DB 0AH , 0DH , '$'6 TEMP DB 0H7 X1 DB 0H8 X2 DB 0H9 Y1 DB 0H10 Y2 DB 0H11 ends
12
13 stack segment
14 dw 128 dup (0 )15 ends
16
17 code segment
18 start :19 ; s e t segment r e g i s t e r s :20 mov ax , data
21 mov ds , ax
22 mov es , ax
23
24 READ1 :25
25
26 PRINT_STR MSG1
27 CALL IN_OCT
28 MOV X1 , AL29 CALL IN_OCT
30 MOV X2 , AL31
32 MOV BH , X133 MOV BL , X234 CALL OCT2HEX
35 MOV X1 , BL ; 1ST NUMBER36
37 READ_SIGN :38 READ
39 CMP AL , '+'40 JE READ2
41 JMP READ_SIGN
42
43 READ2 :44
45 PRINT '+'46 CALL IN_OCT
47 MOV Y1 , AL48 CALL IN_OCT
49 MOV Y2 , AL50
51 MOV BH , Y152 MOV BL , Y253 CALL OCT2HEX
54 MOV Y1 , BL ; 2ND NUMBER55
56 WAIT_FOR_ENTER :57 READ
58 CMP AL , 'T'59 JE TERMIN
60 SUB AL , 30 H61 CMP AL , 22162 JE PRINTING
63 JMP WAIT_FOR_ENTER
64
65 PRINTING :66 PRINT_STR NEWLINE
67 MOV AL , X168 ADD AL , Y1
26
69 MOV AH , 0 H70 PRINT_STR SUM_HEX
71 CALL OUT_HEX_WORD
72 MOV AL , X173 ADD AL , Y174 MOV AH , 0 H75 PRINT_STR SUM_DEC
76 CALL OUT_DEC_WORD
77
78
79
80 TERMIN :81 RET
82
83 ends
3.5 In Series of even,odd numbers— Out compare them
Δέχεται μια ακολουθία 4 άρτιων στοιχείων(2,4,6,8) και μια ακολουθία 4 περιτ-
τών ψηφίων, με το σχετικόinterfaceκαι αγνοώντας κάθε άλλο πλήκτρο εκτόςαπό ένα, που θα το τερματίζει. Να τυπώνει το πλήθος των αριθμών που εί-
ναι μεγαλύτεροι του 5, στην πρώτη ακολουθία και το πλήθος των αριθμών της
πρώτης ακολουθίας που είναι μεγαλύτεροι από τον αντίστοιχο της δεύτερης
ακολουθίας, με ίδια σειρά. πχ.:
Dose 1h akoloythia: 2886Dose 2h akoloythia: 957732και να υπολογίζει και να τυπώνει σε δεκαδική μορφή το άθροισμα των αριθμών
και των δυο σειρών (SUM= 52)
1 data segment
2 MSG1 DB 0DH , 0 AH , "COUNT ZYGWN >5:" , '$'3 MSG2 DB 0DH , 0 AH , "COUNT GREATER:" , '$'4 MSG3 DB 0DH , 0 AH , "SUM:" , '$'5 MSG4 DB 0DH , 0 AH , "DOSE 4 ZYGOUS:" , '$'6 MSG5 DB 0DH , 0 AH , "DOSE 4 MONOUS:" , '$'7 NEWLINE DB 0AH , 0DH , '$'8 CNTE DB 0H9 CNTG DB 0H10 SUM DB 0H
27
11 X1 DB 0H12 X2 DB 0H13 X3 DB 0H14 X4 DB 0H15 ends
16
17 stack segment
18 dw 128 dup (0 )19 ends
20
21 code segment
22 start :23 ; s e t segment r e g i s t e r s :24 mov ax , data
25 mov ds , ax
26 mov es , ax
27 PRINT_STR MSG4
28
29
30 DIGIT1 :31 CALL in_dec_even
32 MOV X1 , AL33 ADD SUM , AL34 CMP X1 , 05 H35 JNG DIGIT2
36 INC CNTE
37
38 DIGIT2 :39 CALL in_dec_even
40 MOV X2 , AL41 ADD SUM , AL42 CMP X2 , 05 H43 JNG DIGIT3
44 INC CNTE
45 DIGIT3 :46 CALL in_dec_even
47 MOV X3 , AL48 ADD SUM , AL49 CMP X3 , 05 H50 JNG DIGIT4
51 INC CNTE
52 DIGIT4 :53 CALL in_dec_even
28
54 MOV X4 , AL55 ADD SUM , AL56 CMP X4 , 05 H57 JNG ODD1
58 INC CNTE
59
60 PRINT_STR MSG5
61
62 ODD1 :63 CALL in_dec_odd
64 ADD SUM , AL65 CMP X1 , AL66 JNG ODD2
67 INC CNTG
68
69 ODD2 :70 CALL in_dec_odd
71 ADD SUM , AL72 CMP X2 , AL73 JNG ODD3
74 INC CNTG
75 ODD3 :76 CALL in_dec_odd
77 ADD SUM , AL78 CMP X3 , AL79 JNG ODD4
80 INC CNTG
81 ODD4 :82 CALL in_dec_odd
83 ADD SUM , AL84 CMP X4 , AL85 JNG SUMP
86 INC CNTG
87
88 SUMP :89 PRINT_STR MSG1
90 MOV AL , CNTE91 MOV AH , 0 H92 CALL out_dec_word
93 PRINT_STR MSG2
94 MOV AL , CNTG95 MOV AH , 0 H96 CALL out_dec_word
29
97 PRINT_STR MSG3
98 MOV AL , SUM99 MOV AH , 0 H100 CALL out_dec_word
101
102
103
104 TERMIN :105 RET
106
107 ends
3.6 In at most 9 Ints—Out even,sum
Να παίρνεις μια σειρά από μονοψήφιους ακεραίους αριθμούς, που δε θα είναι
παραπάνω από 9 συνολικά, χωρίς κενά. Μόλις ο χρήστης πατήσει ENTER θαπρέπει το πρόγραμμα να αλλάζει γραμμή και να υπολογίζει πόσοι από τους
αριθμούς αυτούς είναι ζυγοί (Α=...) και ποιο είναι το άθροισμα αυτών των
αριθμών (S=...). Στη συνέχεια θα αλλάζει γραμμή και θα περιμένει για νέαείσοδο.
1 data segment
2 MSG DB 0DH , 0 AH , "GIVE AT MOST 9 NUMS:" , '$'3 A DB 0DH , 0 AH , "A=" , '$'4 S DB 0DH , 0 AH , "S=" , '$'5 NEWLINE DB 0AH , 0DH , '$'6 COUNT DB 0H7 TEMP1 DW 00H8 ends
9
10 stack segment
11 dw 128 dup (0 )12 ends
13
14 code segment
15 start :16 ; s e t segment r e g i s t e r s :17 mov ax , data
18 mov ds , ax
19 mov es , ax
20
21 MOV CX , 09H
30
22 MOV COUNT , 0 H23 PRINT_STR MSG
24
25 DIGITS :26 CALL in_dec
27 CMP AL , 0 DH28 JE CONT
29 IS_ODD
30 JC LOOP0
31 ADD DL , AL32 INC COUNT
33
34 LOOP0 :35 LOOP DIGITS
36
37
38
39 WAIT_FOR_ENTER :40 READ
41 CMP AL , 'T'42 JE TERMIN
43 SUB AL , 30 H44 CMP AL , 22145 JE CONT
46 JMP WAIT_FOR_ENTER
47
48
49 CONT :50 PRINT_STR S
51 MOV AL , DL52 MOV AH , 0 H53 CALL OUT_DEC_WORD
54 PRINT_STR A
55 MOV AL , COUNT56 MOV AH , 0 H57 CALL OUT_DEC_WORD
58
59
60 TERMIN :61 RET
62
63 ends
31
4 Exam Exercises
4.1 2002
32
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΘΕΜΑ 3ο: Να γραφεί το πρόγραµµα SIMUL σε ένα προσωπικό υπολογιστή και σε Assembly 8088 που να εξοµοιώνει τη λειτουργία ενός δυαδικού µετρητή up-down των 8 bit µε τις παρακάτω προδιαγραφές: Το πρόγραµµα να ξεκινάει µε την αρχική τιµή του µετρητή που πρέπει να δίνεται στην εκκίνηση του προγράµµατος και να εµφανίζει το µήνυµα: GIVE 8 BITS: και να αναµένει (αρχίζοντας από το MSB) ένα δυαδικό αριθµό των 8 bit τον οποίον να τυπώνει σε δυαδική µορφή. Ως επόµενο βήµα να αναµένει το πάτηµα του πλήκτρου C και τότε να εµφανίζει στην επόµενη γραµµή της οθόνης το µήνυµα µε την τιµή του µετρητή: COUNTER=bbbbbbbb Στη συνέχεια o µετρητής αυξάνει µε το πάτηµα του χαρακτήρα 1 και ελαττώνεται µε το 0, ενώ η νέα τιµή του τυπώνεται κάθε φορά στην ίδια θέση χωρίς αλλαγή γραµµής. Στο σηµείο αυτό αν πατηθεί το πλήκτρο Q να τερµατίζει. Μπορείτε να κάνετε χρήση των macros READ, PRINT, PRINT_STR και EXIT. Επίσης δίνεται ότι η εκτύπωση του ASCII χαρακτήρα 08 προκαλεί κίνηση µιας θέσης πίσω του δροµέα στην οθόνη. (4 ΜΟΝΑ∆ΕΣ)
DATA SEGMENT PAGE MS1 DB "GIVE 8 BITS:",0AH,ODH,’$’ MS2 DB "COUNTER=$" MS3 DB 08,08,08,08,08,08,08,08,’$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX START: PRINT_STR MS1 MOV CX,8 MOV BL,0 X1: READ ; Ανάγνωση των 8bit MOV BH,0 CMP AL,'0' JE X2 MOV BH,1 CMP AL,'1' JE X2 JMP X1 X2: PRINT AL ; Εκτύπωση ενός bit SHL BL,1 ADD BL,BH; Στον BL σχηµατίζεται ο LOOP X1 ; 8bit αριθµός X3: READ CMP AL,'C'; Έλεγχος C JNE X3 PRINT_STR MS2 CALL DISPLAY
CALL DISPLAY; Εκτύπωση counter X4: READ CMP AL,'Q' JE QUIT CMP AL,'0'; Έλεγχος 0 JNE X5 DEC BL ; Ελάττωση counter CALL DISPLAY X5: CMP AL,'1' ; Έλεγχος 1 JNE X4 INC BL ; Αύξηση counter CALL DISPLAY JMP X4 QUIT: EXIT MAIN ENDP DISPLAY PROC NEAR MOV CX,8 MOV BH,BL X6: SHL BH,1 MOV DL,0 ADC DL,30H PRINT DL LOOP X6 PRINT_STR MS3 RET DISPLAY ENDP CODE ENDS END START
4.2 2004
34
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΘΕΜΑ 3ο: Να σχεδιάσετε σε ένα προσωπικό υπολογιστή σύστηµα µέτρησης ταχύτητας µεµονωµένου δροµέα σε κάποιο σηµείο της διαδροµής του. Υποθέτουµε ότι έχουµε δέσµη υπερύθρων µε φωτοκύτταρο σε δυο σηµεία µιας πρότυπης απόστασης (π.χ. 5m) µε τις εξόδους των φωτοκύτταρων συνδεδεµένες στα δυο χαµηλότερης αξίας bit µιας θύρας εισόδου (διεύθυνση: 48 Hex, 8 bit). Το αποτέλεσµα να απεικονίζεται στην οθόνη του PC σε m/sec και µε ακρίβεια δυο ψηφίων. Οι εκτυπώσεις να γίνονται αυστηρά στην µορφή: V=16 m/sec Να δοθεί το πρόγραµµα σε assembly του µΕ 8088/8086. Το πρόγραµµα να επιτρέπει εκκίνηση νέας µέτρησης αν πατηθεί το πλήκτρο R και να τερµατίζεται αν πατηθεί το πλήκτρο Q. Η ταχύτητα να υπολογιστεί από το χρόνο που µεσολαβεί µεταξύ της διακοπής της 1ης και της 2ης δέσµης (δεν χρειάζεται έλεγχος της επαναφοράς της δέσµης). ∆ίνεται η ρουτίνα χρονοκαθυστέρησης mSEC που εισάγει καθυστέρηση 1 msec. (4 ΜΟΝΑ∆ΕΣ)
DATA SEGMENT PAGE MS1 DB "V=$" MS2 DB " m/sec",0AH,ODH,’$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX START: MOV BL, 0 READ ; Ανάγνωση πληκτρολογίου CMP AL,'Q' ; Έλεγχος τερµατισµού JE QUIT CMP AL,'R' ; Έλεγχος R για νέα µέτρηση ταχύτητας JNE START ; Αλλιώς αναµονή X1: IN AL, 048H ;Είσοδος από τα φωτοκύτταρα RRC ;Έλεγχος 1ης δέσµης JC X1 X2: CALL mSEC ;Έναρξη µέτρησης χρόνου INC ΒL ;Μέτρησης χρόνου σε msec IN AL, 048H ;Ξανά είσοδος από τα φωτοκύτταρα RRC RRC ;Έλεγχος 2ης δέσµης. Αν διακοπεί .. JC X2 ;τερµατισµός µέτρησης χρόνου MOV AX, 5000D ; ταχύτητα =5m/BL·10-3 sec= 5000/BL(m/sec) DIV ΒL ;πηλίκο στον κατ. AL AAM ;AL/10→AH (δεκάδες), Υπόλοιπο→AL (µονάδες) PRINT_STR MS1 ; Υποθέτουµε ότι η ταχύτητα δεν ξεπερνάει τα 99 m/sec ADD AH,30H PRINT AH ;Τυπώνω τις δεκάδες, ADD AL,30H PRINT AL ;Τυπώνω τις µονάδες PRINT_STR MS2 JMP START QUIT: EXIT MAIN ENDP CODE ENDS END START
4.3 2006
36
Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ
ΘΕΜΑ 3ο: Να γραφεί πρόγραμμα σε προσωπικό υπολογιστή και σε assembly 8086 που να δέχεται από το πληκτρολόγιο δυο διψήφιους μη-μηδενικούς οκταδικούς αριθμούς (1-7) και να τυπώνει αφού υπολογίσει σε οκταδική μορφή το αποτέλεσμα του πολλαπλασιασμού και σε δεκαεξαδική μορφή το αποτέλεσμα του άθροισματός τους, αυστηρά σύμφωνα με τo παρακάτω υπόδειγμα: GIVE TWO NUMBERS:6542 3412 57 Το πρόγραμμα να είναι συνεχούς λειτουργίας και να μην απαιτείται το πάτημα πλήκτρων ελέγχου. Να αγνοούνται όλοι οι λοιποί χαρακτήρες πλην των οκταδικών αριθμών. Με το πάτημα του αριθμού 0 να τερματίζεται το πρόγραμμα. (3 ΜΟΝΑΔΕΣ) DATA SEGMENT MS1 DB "GIVE TWO NUMBERS:",0AH,ODH,’$’ MS2 DB 0AH,ODH,’$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX START: PRINT_STR MS1 CALL OCT_KEYB CMP AL,'0' ; Αν είναι το 0 τερματίζει JE TELOS MOV BL,AL SHL BL SHL BL SHL BL CALL OCT_KEYB CMP AL,'0' ; Αν είναι το 0 τερματίζει ADD BL,AL ; Στον BL σχηματίζεται ο 1ος CALL OCT_KEYB CMP AL,'0' ; Αν είναι το 0 τερματίζει JE TELOS MOV BH,AL SHL BH SHL BH SHL BH CALL OCT_KEYB CMP AL,'0' ; Αν είναι το 0 τερματίζει ADD BH,AL ; Στον BH σχηματίζεται ο 2ος PRINT_STR MS2 MOV AL,BH MUL BL MOV CX,4 ; Ολίσθησε αριστερά ROL AX,CX ; τον αριθμό 4 θέσεις ADDR2: MOV CX,4 ROL AX,1 ROL AX,1 ROL AX,1 MOV DX,AX AND DX,0007H ; Απομόνωσε τα 3 MSB
ADD DL,30H PRINT DL ; εκτύπωση οκταδικών ψηφίων LOOP ADDR2 ; επανέλαβε 4 φορές PRINT ’ ’ MOV DL,BL ADD DL,BH ; άθροισμα στον DL MOV AL,DL ; αντίγραφο στον AL MOV CL,4 ; Περιστροφή του αριθμού ROL DL,CL ; αριστερά 4 θέσεις AND DL,OFH ; απομόνωση 1ου HEX ψηφίου CALL PRINT_HEX ; εκτύπωση 1ου HEX ψηφίου MOV DL,AL AND DL,OFH ; απομόνωση 2ου HEX ψηφίου CALL PRINT_HEX ; εκτύπωση 2ου HEX ψηφίου JMP START TELOS: EXIT MAIN ENDP OCT_KEYB PROC NEAR PUSH DX IGNORE: READ ; Διάβασε από το πληκτρολόγιο CMP AL,'0' ; χωρίς να τον τυπώσεις JE ADDR2 CMP AL,’1’ ; Εξέτασε αν ο χαρακτήρας 1-7 JL IGNORE ; Αν όχι αγνόησέ τον CMP AL,’7’ JG IGNORE ; Αν όχι αγνόησέ τον PUSH AX PRINT AL ; Τύπωσε το χαρακτήρα POP AX SUB AL,30H ; Μετατροπή σε δυαδικό ADDR2: POP DX RET OCT_KEYB ENDP CODE ENDS
END MAIN
Εθνικό Μετσόβιο Πολυτεχνείο
Συστήματα Μικρουπολογιστών
AVR
Contents
1 Routines 21.1 Initialization Template . . . . . . . . . . . . . . . . . . . . . . 21.2 Initialize read from keyboard . . . . . . . . . . . . . . . . . . . 21.3 Wait mSeconds and Example . . . . . . . . . . . . . . . . . . 31.4 Initialize Timer . . . . . . . . . . . . . . . . . . . . . . . . . . 41.5 Break Input to Bits . . . . . . . . . . . . . . . . . . . . . . . . 51.6 Bin to Dec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 Solved Problems 92.1 Compare input K1-K2— Turn On Leds . . . . . . . . . . . . . 9
3 MicroLab Exercises 103.1 Exercise 1 - Routines and Delays . . . . . . . . . . . . . . . . 10
3.1.1 1.1 - Led Shifting from left to right . . . . . . . . . . . 153.1.2 1.2 - On Off Leds - Timer from dip switches . . . . . . 163.1.3 Used Routines . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Exercise 2 - Interrupts . . . . . . . . . . . . . . . . . . . . . . 193.2.1 2.1 - Count Interrupts and show them on Leds . . . . . 263.2.2 2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.3 2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3 Exercise 3 - Keyboard and Lcd . . . . . . . . . . . . . . . . . 313.3.1 3.1 - Logical . . . . . . . . . . . . . . . . . . . . . . . . 383.3.2 3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.3.3 3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.3.4 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.3.5 3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4 Instruction-Set 64
1
1 Routines
1.1 Initialization Template
Πρότυπο εκκίνησης του προγράμματος. Προετοιμασία για είσοδο/έξοδο δήλ-
ωση μεταβλητών, αρχικοποίηση στοίβας.
1 /∗∗∗∗∗∗∗∗∗∗∗ INITIALIZATION−RESET ∗∗∗∗∗∗∗∗∗∗∗∗∗/2 .include "m16def.inc"
3
4 .def temp=r315 .def input=r166 .def output=r177
8 reset :9 ldi r24 , low ( RAMEND ) ; i n i t i a l i z e s tack po in t e r10 out SPL , r2411 ldi r24 , high ( RAMEND )12 out SPH , r2413
14 ; i n i t i a l i z e I /O:15 ser r18 ; i n i t i a l i z e PORTA fo r output16 out DDRA , r1817 clr r18 ; i n i t i a l i z e PORTB fo r input18 out DDRB , r18
1.2 Initialize read from keyboard
Πρότυπο εκκίνησης του προγράμματος για ανάγνωση από το πληκτρολόγιο.
1 /∗∗∗∗∗∗∗∗∗ INITIALIZE − READ FROM KEYBOARD←∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
2 .include "m16def.inc"
3 .DSEG
4 _tmp_ : .byte 25 .CSEG
6
7 reset :8 ldi r24 , low ( RAMEND ) ; i n i t i a l i z e s tack po in t e r9 out SPL , r2410 ldi r24 , high ( RAMEND )11 out SPH , r24
2
12
13 ; i n i t i a l i z e I /O:14 ser r18 ; i n i t i a l i z e PORTA fo r output /∗ GIA LEDS ∗/15 out DDRA , r1816
17 ldi r18 , ( 1 << PD7 ) | ( 1 << PD6 ) | ( 1 << PD5 ) |(1<<PD4 ) |(1<<←PD3 ) |(1<<PD2 ) /∗ GIA LCD SCREEN ∗/
18 out DDRD , r18 ; I n i t i a l i z e PD7 − PD2 f o r output19
20 ldi r18 ,(1<<PC7 ) |(1<<PC6 ) |(1<<PC5 ) |(1<<PC4 ) /∗ GIA ←PLHKTROLOGIO ∗/
21 out DDRC , r18 ; I n i t i a l i z e portc f o r keyboard input22
23
24 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/←
25 ; READ EXAMPLE26 read1 :27 ldi r24 , 1528 rcall scan_keypad_rising_edge
29 rcall keypad_to_ascii
30 cpi r24 , 0 ;CHECK IF PRESSED31 breq read1
1.3 Wait mSeconds and Example
Ρουτίνες για χρόνο-καθυστέρηση και παράδειγμα χρήσης.
1 ; Create a 1 second delay2 ldi r24 , low (1000) ; or X000 f o r X seconds3 ldi r25 , high (1000) ; or X000 f o r X seconds4 rcall wait_msec
5 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−6
7 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−8 wait_usec :9 sbiw r24 , 110 nop
11 nop
12 nop
13 nop
14 brne wait_usec
3
15 ret
16 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−17
18
19 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−20 wait_msec :21 push r24
22 push r25
23 ldi r24 , low (998)24 ldi r25 , high (998)25 rcall wait_usec
26 pop r25
27 pop r24
28 sbiw r24 , 129 brne wait_msec
30 ret
1.4 Initialize Timer
Αρχικοποίηση χρόνο-καθυστέρησης
1 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ TIMER INITIALIZE ←∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
2 .org 0x0003 jmp reset
4
5 .org 0x0106 rjmp timer1
7
8 reset :9
10 ldi r24 ,(1<<TOIE1 ) ; Act ivate TCNT111 out TIMSK , r2412 ldi r24 ,(1<<CS12 ) |(0<<CS11 ) |(1<<CS10 ) ; CK/102413 out TCCR1B , r2414
15 ∗∗∗∗∗∗∗∗∗META TIS ARXIKOPOIHSEIS ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗16 sei ; a c t i v a t e i n t e r r up t s t imer i s i n t e r r up t17
18 ;TO VAZW STO SHMEIO POY PREPEI NA XTYPHSEI O TIMER19 ldi r24 , high (55000) ; i n i t i a l i z e t imer f o r x seconds20 out TCNT1H , r24
4
21 ldi r24 , high (55000)22 out TCNT1L , r2423
24 ;STO CHECK POY THELW NA KLEISW TON TIMER25 cli ; d i s a b l e i n t e r r up t s26
27 ;ETIKETA POU PAEI O TIMER AN PERASEI O XRONOS28 timer1 :
1.5 Break Input to Bits
Διαβάζει μια είσοδο 8 bit από την PORTB και στην συνέχεια την σπάει σταεπιμέρους bits. Τα οποία και αποθηκεύει στις μεταβλητές x0-x7.
1 .include "m16def.inc"
2
3 .def temp=r314 .def x0=r165 .def x1=r176 .def x2=r187 .def x3=r198 .def x4=r209 .def x5=r2110 .def x6=r2211 .def x7=r2312 .def y0=r2413 .def y1=r2514 .def in1=r2615 .def y00=r2716 .def y01=r2817 .def y10=r2918 .def y11=r3019
20 rjmp reset
21
22 reset :23 ldi temp , high ( RAMEND )24 out SPH , temp
25 ldi temp , low ( RAMEND )26 out SPL , temp
27
28 clr temp ; temp = 0x00
5
29 out DDRB , temp ; PORTB f o r input30 ser temp ; temp = 0xFF31 out DDRA , temp ; PORTA fo r output32
33
34 in in1 , PINB35 mov x0 , in136 mov x1 , in137 mov x2 , in138 mov x3 , in139 mov x4 , in140 mov x5 , in141 mov x6 , in142 mov x7 , in143
44 andi x0 , $0145
46 andi x1 , $0247 lsr x1
48
49 andi x2 , $0450 lsr x2
51 lsr x2
52
53 andi x3 , $0854 lsr x3
55 lsr x3
56 lsr x3
57
58 andi x4 , $1059 lsr x4
60 lsr x4
61 lsr x4
62 lsr x4
63
64 andi x5 , $2065 lsr x5
66 lsr x5
67 lsr x5
68 lsr x5
69 lsr x5
70
71 andi x6 , $40
6
72 lsr x6
73 lsr x6
74 lsr x6
75 lsr x6
76 lsr x6
77 lsr x6
78
79 andi x7 , $8080 lsr x7
81 lsr x7
82 lsr x7
83 lsr x7
84 lsr x7
85 lsr x7
86 lsr x7
1.6 Bin to Dec
Διαβάζει μια είσοδο 8 bit από την PORTB και στην συνέχεια την σπάει εκα-τοντάδες, μονάδες, δεκάδες. Επίσης ελέγχει και αν ο αριθμός που διαβάσαμε
είναι συμπλήρωμα ως προς δύο.
1 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ SPASIMO SE 100ades 10ades KAI 1ades ←∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
2 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ELEGXEI KAI GIA SIMPLIRWMA WS PROS 2 ←∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
3
4 .def temp=r315 .def input=r166 .def hundreds=r177 .def dozens=r188 .def units=r199
10 rjmp reset
11
12 reset :13 ldi temp , high ( RAMEND )14 out SPH , temp
15 ldi temp , low ( RAMEND )16 out SPL , temp
17
18 clr temp ; temp = 0x00
7
19 out DDRB , temp ; PORTB f o r input20
21 in input , PINB22
23 mov temp , input ; temp = input , input o ari8mos pou 8elw ←na spasw
24 andi temp , $80 ; Mask to keep MSB25 cpi temp , $80 ; Check i f MSB = 126 breq minus ; IF MSB = 1 go to minus and s e t s i gn = '− '27 ldi sign , '+' ; E l se s e t s i gn to +28 rjmp continue
29
30 minus :31 ldi sign , '-'32 dec input ; convert from Two ' s complement33 com input ; to p o s i t i v e binary number34
35 continue :36 clr hundreds
37 clr dozens
38 clr units
39
40 step_hundreds : ; Check f o r hundreds41 cpi input , 100 ; I f the number has a hundred42 brlo step_dozens ; then hundred counter = 143 ldi hundreds , 1 ; e l s e go to s t ep dozens to count dozens44 subi input , 10045
46 step_dozens :47 cpi input , 1048 brlo step_units
49 inc dozens
50 subi input , 1051 rjmp step_dozens
52
53 step_units :54 mov units , input ; Count how many dozens has the input
8
2 Solved Problems
2.1 Compare input K1-K2— Turn On Leds
Σε έναν μικροελεκτή AVR ορίζεται το PORTD ως θύρα εισόδου και το PORTBως θύρα εξόδου. Να υλοποιηθεί ένα σύστημα που να συγκρίνει την τιμή εισό-
δου Q(0 − 255) με δύο κατώφλια Κ1 και Κ2 με Κ1῾Κ2 που οι τιμές τουςβρίσκονται στους καταχωρητές R16 και R17 αντίστοιχα. Στην συνέχεια ναανάβει μια από τις ομάδες των Led εξόδου που αντιστοιχούν στις περιοχέςτιμών [0..K1), [K1..K2) και [K2..FFH] όπως φαίνεται και στο σχήμα ενώ ταάλλα led να παραμένουν σβηστά. Για παράδειγμα αν Χε(K1..K2] τότε έχουμεPORTB => ooxxxooo όπου ο =᾿ σβηστό led και ξ =᾿ αναμμένο led. Υπ-οθέτουμε ότι τα led είναι συνδεδεμένα στην θύρα με αρνητική λογική ( 0 =᾿αναμμένο, και 1=᾿ σβηστό). Επίσης δώστε τον τρόπο σύνδεσης του ενός ledμε την θύρα εξόδου.
Σχήμα: X¸[0..K1), LED4, 5, 6gia(K1..K2], LED7, 8gia[K2..FFH]
1 /∗2 ∗ K1K2Leds.asm
3 ∗4 ∗ SEPTEMBRIOS 20125 ∗/6
7 .def temp=r318 .def K1=r169 .def K2=r1710 .def input=r1811 .def output=r1912
13 reset :14 ldi r24 , low ( RAMEND ) ;15 out SPL , r24
16 ldi r24 , high ( RAMEND )17 out SPH , r24
18
19 ; i n i t i a l i z e I /O:20
21 ser r18 ; i n i t i a l i z e PORTB fo r output22 out DDRB , r18
23 clr r18 ;24 out DDRD , r18 ; input25
9
26 ldi k1 , 10027 ldi k2 , 20028
29 in input , pind30 cp input , K131 BRLT PRWTO
32
33 cp input , k2
34 BRLT DEUTERO
35
36 TRITO :37 ldi output , 0b0011111138 out PORTB , output39 jmp reset
40
41 DEUTERO :42 ldi output , 0b1100011143 out PORTB , output44 jmp reset
45
46 PRWTO :47 ldi output , 0b1111100048 out PORTB , output49 jmp reset
3 MicroLab Exercises
3.1 Exercise 1 - Routines and Delays
10
Εργαστηριακές ασκήσεις στον Μικροελεγκτή AVR
1η Εργαστηριακή Άσκηση AVR – Χρήση υπορουτινών και χρονοκαθυστερήσεων Χρονοκαθυστερήσεις Μια χρήσιμη εφαρμογή συστημάτων μικροελεγκτών είναι η ανταπόκριση σε εξωτερικές συνθήκες σε τακτά
χρονικά διαστήματα. Για το σκοπό αυτό είναι πολύ χρήσιμη η ανάπτυξη σχετικού λογισμικού (υπορουτίνες)
που να δημιουργεί ακριβείς και συγκεκριμένες χρονοκαθυστερήσεις και να χρησιμοποιήται από οποιαδήποτε
χρονικά εξαρτώμενη εφαρμογή. Βοήθεια για την ανάπτυξη αυτού του κώδικα δίνουν τα τεχνικά
χαρακτηριστικά του εκάστοτε μικροελεγκτή και συγκεκριμένα η περίοδος ρολογιού και οι κύκλοι εκτέλεσης
κάθε εντολής, από τα οποία προκύπτει ο χρόνος εκτέλεσης κάθε εντολής. Η δημιουργία κώδικα
χρονοκαθυστέρησης συνήθως επιτυγχάνεται με τη διαδοχική εκτέλεση μιας σειράς εντολών που δεν
παράγουν κανένα χρήσιμο αποτέλεσμα (συνηθίζεται η εντολή nop). Το μέγεθος της σειράς μαζί με
κατάλληλους πολλαπλασιαστικούς βρόχους δημιουργούν την επιθυμητή χρονοκαθυστέρηση. Η τεχνική αυτή
φαίνεται στην παρακάτω υπορουτίνα wait_usec, που για τον μικροελεγκτή AVR ATmega16 και την
αναπτυξιακή πλακέτα EasyAVR6 (συχνότητα ρολογιού 8MHz, περίοδος ρολογιού 0.125μsec), είναι μια
χρονοκαθυστέρηση τόσων μsec, όση η δυαδική τιμή του καταχωρητή r25:r24 κατά την κλήση. Επίσης
παρακάτω δίνεται η ρουτίνα wait_msec που αξιοποιεί την προηγούμενη και αυτή προκαλεί
χρονοκαθυστέρηση τόσων msec, όση η τιμή του καταχωρητή r25:r24. Οι ρουτίνες αυτές αξιοποιούνται στο
επόμενο παράδειγμα Παράδειγμα 1.1 Να προγραμματίσετε και να επιδείξετε στο εκπαιδευτικό σύστημα easyAVR6 χρονόμετρο
δευτερολέπτων που απεικονίζει το χρόνο σε δυαδική μορφή πάνω στα LED PA3-PA0. Το χρονόμετρο όταν
φτάνει στην τιμή 1510 , στο επόμενο βήμα ξαναρχίζει από την αρχή. Όλο το πρόγραμμα σας δίνετε και το
ζητούμενο είναι να περάσει από το AVRStudio5 αρχικά για προσομοίωση και στη συνέχεια την παραγωγή του
εκτελέσιμου κώδικα που πρέπει να κατέβει στην πλακέτα για την επίδειξη της ορθής λειτουργίας στο πραγματικό
σύστημα. Ακολουθούν τα αναγκαία προγράμματα και οι ρουτίνες assembly:
Πρόγραμμα Μετρητής
Μηδένισε τον Μετρητή
Αύξησε τον Μετρητή
Έξοδος Μετρητή στη θύρα Εξόδου (Led)
Μετρητής>15OXI NAI
Ρουτίνα Χρονο-καθυστέρησης 1sec
Σχήμα 1. 1. Πρόγραμμα μετρητής modulo 15.
.include "m16def.inc" reset: ldi r24 , low(RAMEND) ; initialize stack pointer
out SPL , r24 ldi r24 , high(RAMEND) out SPH , r24 ser r24 ; initialize PORTA for output out DDRA , r24 clr r26 ; clear time counter main: out PORTA , r26 ldi r24 , low(1000) ; load r25:r24 with 1000 ldi r25 , high(1000) ; delay 1 second
rcall wait_msec inc r26 ; increment time counter, one second passed cpi r26 , 16 ; compare time counter with 16 brlo main ; if lower goto main, else clear time counter clr r26 ; and then goto main rjmp main .include "wait.asm" Ρουτίνα: wait_μsec Προκαλεί καθυστέρηση τόσων μsec, όση η τιμή του καταχωρητή r25:r2 Είσοδος: Ο χρόνος (1 - 65535 μs) μέσω του καταχωρητή r25:r24 Καταχωρητές: r25:r24 wait_usec: sbiw r24 ,1 ; 2 κύκλοι (0.250 μsec) nop ; 1 κύκλος (0.125 μsec) nop ; 1 κύκλος (0.125 μsec) nop ; 1 κύκλος (0.125 μsec) nop ; 1 κύκλος (0.125 μsec) brne wait_usec ; 1 ή 2 κύκλοι (0.125 ή 0.250 μsec) ret ; 4 κύκλοι (0.500 μsec) Από τα σχόλια φαίνεται οτι ο παραπάνω κώδικας, όταν εκτελείται ο επαναλληπτικός βρόχος, απαιτεί 8
κύκλους ρολογιού ή 1μsec. Άρα, όσες φορές εκτελεστεί ο βρόχος, τόσα μsec καθυστέρησης απαιτούνται. Η
μικροδιαφορές που προκύπτουν από την μια φορά που θα εκτελεστεί η έξοδος από το βρόχο και η εντολή
επιστροφής (ret), μπορούν αν απαιτηθεί να συνυπολογιστούν στον κώδικα που καλεί την υπορουτίνα
wait_usec. (αναλυτικά, η υπορουτίνα wait_usec με είσοδο r25:r24=n καθυστερεί n-1+0.875+0.500=n+0.375 μsec). Για παράδειγμα, η παρακάτω υπορουτίνα για τον μικροελεγκτή AVR ATmega16 και την αναπτυξιακή
πλακέτα EasyAVR6 είναι μια χρονοκαθυστέρηση τόσων msec, όση η δυαδική τιμή που περιέχεται στο
ζευγάρι καταχωρητών r25:r24 κατά την κλήση και βασίζεται στην προηγούμενη (wait_usec).
Ρουτίνα: wait_msec Προκαλεί καθυστέρηση τόσων msec, όση η τιμή του καταχωρητή r25:r2 Είσοδος: Ο χρόνος (1 - 65535 ms) μέσω του καταχωρητή r25:r24 Καταχωρητές: r25:r24 Καλούμενες υπορουτίνες: wait_usec wait_msec: push r24 ; 2 κύκλοι (0.250 μsec) push r25 ; 2 κύκλοι ldi r24 , low(998) ; φόρτωσε τον καταχ. r25:r24 με 998 (1 κύκλος - 0.125 μsec) ldi r25 , high(998) ; 1 κύκλος (0.125 μsec)
rcall wait_usec ; 3 κύκλοι (0.375 μsec), προκαλεί συνολικά καθυστέρηση 998.375 μsec pop r25 ; 2 κύκλοι (0.250 μsec) pop r24 ; 2 κύκλοι sbiw r24 , 1 ; 2 κύκλοι brne wait_msec ; 1 ή 2 κύκλοι (0.125 ή 0.250 μsec) ret ; 4 κύκλοι (0.500 μsec) Από τα σχόλια φαίνεται οτι η παραπάνω υπορουτίνα wait_msec, όταν εκτελείται ο επαναληπτικός βρόχος,
απαιτεί 17 κύκλους ρολογιού ή 2.125μsec και μαζί με τη χρονοκαθυστέρηση της υπορουτίνας wait_usec, που
με είσοδο 998 είναι 998.375μsec, συνολικά 1000.5μsec ή 1.0005msec.
Kύριο πρόγραμμα Μετρητή . . .rcall wait_msec
wait_usec: . . .ret
wait_msec: . . .rcall wait_usec . .ret
Καλείται 998 φορές
1 ms
1 sec
Καλείται 1000 φορές
Σχήμα 1. 2. Κλήσεις υπορουτινών στο πρόγραμμα του μετρητή modulo 15.
Παράδειγμα 1.2 Ένα παράδειγμα προγράμματος που αναβοσβήνει συνεχώς τα LEDs εξόδου του συστήματος
easyAVR6 δίνεται στην συνέχεια. Το κύριο πρόγραμμα έχει μόνο 3 βασικές εντολές: μια που καλεί την
ρουτίνα ΟΝ, μια που καλεί την ρουτίνα OFF και μια που ξαναγυρνά στην αρχή. Το σχήμα 1.3 δείχνει πως χρησιμοποιεί υπορουτίνες για να αναβοσβήνει τα LEDs της θύρας PORTA.
flash: rcall on
rcall off
rjmp flash
on: ser r26 out PORTA, r26 ret
off: clr r26 out PORTA, r26 ret
Σχήμα 1.3. Πρόγραμμα που αναβοσβήνει τα LEDs.
Στη συνέχεια παρουσιάζουμε αναλυτικά την εφαρμογή.
Πίνακας 1.1. Πρόγραμμα που αναβοσβήνει τα LEDs
Ετικέτα Εντολή Σχόλια ser r26 ; αρχικοποίηση της PORTA out DDRA , r26 ; για έξοδο
flash: rcall on ; Άναψε τα LEDs nop ; Για προσθήκη εντολών 200 ms nop
rcall off ; Σβήσε τα LEDs nop ; Για προσθήκη εντολών nop
rjmp flash ; Επανέλαβε
;Υπορουτίνα για να ανάβουν τα LEDs on: ser r26 ; θέσε τη θύρα εξόδου των LED out PORTA , r26 ret ; Γύρισε στο κύριο πρόγραμμα
;Υπορουτίνα για να σβήνουν τα LEDs off: clr r26 ; μηδένισε τη θύρα εξόδου των LED out PORTA , r26 ret ; Γύρισε στο κύριο πρόγραμμα
Τα ζητούμενα της 1ης εργαστηριακής άσκησης του AVR
Ζήτημα 1.1 Να προγραμματίσετε σε assembly και να επιδείξετε στο εκπαιδευτικό σύστημα easyAVR6
πρόγραμμα που να απεικονίζει ένα αναμμένο led το οποίο να κινείται πάνω στα led PA0-PA7 από αριστερά
προς τα δεξιά και αντίστροφα όταν φτάσει σε ένα άκρο. Κάθε led θα μένει αναμμένο 0.5 sec. Η κίνηση του
led θα ελέγχεται από το push button PB0. Όταν αυτό είναι πατημένο η κίνηση να σταματά, ενώ διαφορετικά να συνεχίζεται. Το πρόγραμμα να δοθεί σε assembly.
Ζήτημα 1.2 Τροποποιήστε το παράδειγμα του Πίνακα 1.1, ώστε η καθυστέρηση στο άναμμα και το σβήσιμο
των leds (PA0-PA7) να καθορίζεται από τις τιμές (0 - 15) των dip switches PB0-PB3 και PB4-PB7 αντίστοιχα. Δίνεται ότι η μικρότερη καθυστέρηση είναι 100 msec και η μεγαλύτερη 1600 msec. Καθορίζεται
με βάση τη σχέση D=(x+1)*100 msec όπου x Є(0-15) είναι η δεκαεξαδική τιμή των dip switches. Το
πρόγραμμα να δοθεί σε assembly.
Ζήτημα 1.3 Να γραφτεί πρόγραμμα σε C για το σύστημα easyAVR6 το οποίο αρχικά να ανάβει το led0 που
είναι συνδεδεμένο στο bit0 της θύρας εξόδου PortB (απεικόνιση με θετική λογική - αναμμένο λογικό 1,
σβηστό λογικό 0 - αντίστοιχα και για τα υπόλοιπα ledx => bitx PortB). Στην συνέχεια με το πάτημα των
διακοπτών (Push-buttons) SW0-5 που υποθέτουμε ότι είναι συνδεδεμένα στα αντίστοιχα bit της θύρας
εισόδου PortD να συμβαίνουν τα εξής: SW0 μετακίνηση του led μια θέση αριστερά (κυκλικά).
SW1 μετακίνηση του led μια θέση δεξιά (κυκλικά).
SW2 μετακίνηση του led δυο (2) θέσεις αριστερά (κυκλικά). SW3 μετακίνηση του led δυο (2) θέσεις δεξιά (κυκλικά).
SW4 μετακίνηση του αναμένου led στην αρχική του θέση (LSB - led0). Όλες οι αλλαγές θα γίνονται αφήνοντας (επανερχόμενα) τα Push-buttons SWx (bitx PortD), οι εντολές έχουν
προτεραιότητα με μεγαλύτερη αυτή του SW5 και μικρότερη αυτή του SW0. Έτσι αν είναι πατημένο το SW2
και το SW1 τότε θα πραγματοποιηθεί η εντολή που αντιστοιχεί στο SW2. Επίσης υποθέτουμε ότι οι
διακόπτες είναι συνδεδεμένοι με θετική λογική (για πάτημα δίνουν λογικό’1’).
3.1.1 1.1 - Led Shifting from left to right
1 .include "m16def.inc"
2 .def cnt = r26 ; counter = r263 .def led_out = r20 ; l e d ou t = r204 .def inp = r18 ; input r e g i s t e r5
6 main :7 ldi r24 , low ( RAMEND ) ; i n i t i a l i z e s tack po in t e r8 out SPL , r24
9 ldi r24 , high ( RAMEND )10 out SPH , r24
11 ser r24 ; i n i t i a l i z e PORTB fo r ←output ( same as LDI r24 , 0xFF)
12 out DDRB , r24
13 clr inp ; i n i t i a l i z e PORTA fo r input14 out DDRA , inp
15 clr cnt ; c l e a r l ed counter16
17 left0 :18 ldi cnt , 8 ; i n i t i a l i z e counter19 ldi led_out , 0b11111110 ; i n i t i a l i z e l ed output20
21 left :22 in inp , pinb ; read input from pinb23 andi inp , 0x01 ; use mask to keep MSB24 cpi inp , 0x01 ; compare with 0x01 to check i f ←
PB0 i s presed25 breq wait_to_die0 ; i f PB0 i s pre s sed go to ←
wa i t t o d i e 026
27 wait_to_die0 :28 rcall wait_to_die
29
30 out PORTB , led_out ; output to l e d s31 rcall wait_5s ; wait f o r 0 . 5 s32 dec cnt ; counter = counter − 133 lsl led_out ; s h i f t l e f t l ed out ←
r e g i s t e r34 cpi cnt , 0 ; compare loop counter with 035 brne left ; i f i t ' s not equal to zero←
go to l e f t
15
36 ldi cnt , 7 ; e l s e i n i t i a l i z e counter37 ldi led_out , 0b10111111 ; i n i t i a l i z e l ed output38 rjmp right
39
40 right :41 in inp , pinb ; read input from pinb42 andi inp , 0x01 ; use mask to keep MSB43 cpi inp , 0x01 ; compare with 0x01 to check i f ←
PB0 i s presed44 breq wait_to_die1 ; i f PB0 i s pre s sed go to ←
wa i t t o d i e 145
46 wait_to_die1 :47 rcall wait_to_die
48
49 out PORTB , led_out
50 rcall wait_5s
51 dec cnt
52 asr led_out ; s h i f t r i g h t l ed counter53 cpi cnt , 0 ; compare loop counter with 054 brne right ; i f i t ' s not equal to zero←
go to main2 , go to main55 rjmp left0
56
57 .include "wait.asm"
3.1.2 1.2 - On Off Leds - Timer from dip switches
1 .include "m16def.inc"
2 .def leds = r20
3 .def inp = r18
4 .def outp = r16
5
6 main :7 ldi r24 , low ( RAMEND ) ; i n i t i a l i z e s tack po in t e r8 out SPL , r24
9 ldi r24 , high ( RAMEND )10 out SPH , r24
11 ser r16 ; i n i t i a l i z e PORTB fo r ←output ( same as LDI r24 , 0xFF)
12 out DDRB , r16
16
13 clr inp ; i n i t i a l i z e PORTA fo r input14 out DDRA , inp
15 ldi r24 , 100 ; i n i t i a l i z e f o r 100 seconds de lay16 clr r25
17
18 flash :19 in inp , portb
20 andi inp , 0b00001111 ; use mask to keep 4 LSBs21 inc inp ; input = input + 122 rcall on ; open l ed s23 rcall wait_for
24
25 in inp , portb
26 andi inp , 0b11110000 ; use mask to keep 4 MSBs27 rcall off ; turn o f f l e d s28 lsr inp ; s h i f t 4 t imes29 lsr inp
30 lsr inp
31 lsr inp
32 inc inp ; input = input + 133 rcall wait_for
34
35
36 rjmp flash ; r epeat37
38
39
40 .include "wait2.asm"
41 .include "on_off.asm"
3.1.3 Used Routines
1 wait_to_die :2 in inp , pinb ; read input from pinb3 andi inp , 0x01 ; use mask to keep MSB4 cpi inp , 0x01 ; compare with 0x01 to check i f ←
PB0 i s presed5 breq wait_to_die ; i f PB0 i s pre s sed go to ←
wa i t t o d i e6 ret
7
17
8 wait_5s :9 ldi r25 , 0 x110 ldi r24 , 0 xf411 rcall wait_msec
12 ret
13
14 wait_usec :15 sbiw r24 ,1 ; 2 c y c l e s16 nop ; 1 c y c l e17 nop ; 1 c y c l e18 nop ; 1 c y c l e19 nop ; 1 c y c l e20 brne wait_usec ; 1 c y c l e or 2 c y c l e s21 ret
22
23
24 wait_msec :25 push r24 ; 2 c y c l e s26 push r25 ; 2 c y c l e s27 ldi r24 , low (998) ; load r25 : r24 us ing 99828 ldi r25 , high (998) ; 1 cy c l e29 rcall wait_usec ; 3 c y c l e s30 pop r25 ; 2 c y c l e s31 pop r24 ; 2 c y c l e s32 sbiw r24 , 1 ; 2 c y c l e s33 brne wait_msec ; 1 or 2 c y c l e s34 ret ; 4 c y c l e s
1 wait_for :2 rcall wait_msec
3 dec inp ; input = input − 14 breq wait_for
5 ret
6
7 wait_usec :8 sbiw r24 ,1 ; 2 c y c l e s9 nop ; 1 c y c l e10 nop ; 1 c y c l e11 nop ; 1 c y c l e12 nop ; 1 c y c l e13 brne wait_usec
14 ret
18
15
16
17 wait_msec :18 push r24 ; 2 c y c l e s19 push r25 ; 2 c y c l e s20 ldi r24 , low (998) ; load r e g i s t e r s r25 : r24 us ing 99821 ldi r25 , high (998) ; 1 cyv l e22 rcall wait_usec ; 3 c y c l e s23 pop r25 ; 2 c y c l e s24 pop r24 ; 2 c y c l e s25 sbiw r24 , 1 ; 2 cyv l e s26 brne wait_msec ; 1 or 2 c y c l e s27 ret ; 4 c y c l e s
1 on :2 ser leds ; turn l e d s on3 out porta , leds4 ret
5
6
7 off :8 clr leds ; turn l e d s o f f9 out porta , leds10 ret
3.2 Exercise 2 - Interrupts
19
Εργαστηριακές ασκήσεις στον Μικροελεγκτή AVR
2η Εργαστηριακή Άσκηση του AVR– Χρήση εξωτερικών διακοπών
Μια χρήσιμη δυνατότητα των μικροελεγκτών είναι η άμεση ανταπόκρισή τους σε εξωτερικές συνθήκες. Η
ανταπόκριση αυτή επιτυγχάνεται με την εκμετάλλευση του συστήματος διακοπών του μικροελεγκτή. Ως
γνωστόν, κάθε μικροελεγκτής είναι εφοδιασμένος με μια ή περισσότερες εισόδους διακοπών. Η
ενεργοποίηση μια εισόδου διακοπής υποχρεώνει το μικροελεγκτή να σταματήσει άμεσα όποια εργασία κάνει
και να εκτελέσει τον κώδικα που υπάρχει σε μια προκαθορισμένη διεύθυνση, που ονομάζεται και διάνυσμα
διακοπής. Στο σημείο αυτό συνδέεται συνήθως μια ρουτίνα εξυπηρέτησης διακοπής (διαφορετική για κάθε
εφαρμογή). Με το τέλος της ρουτίνας εξυπηρέτησης διακοπής, ο μικροελεγκτής συνεχίζει την εργασία που
διέκοψε, από επιστρέφοντας στο σημείο ακριβώς που είχε διακοπεί.
Στην άσκηση αυτή θα γίνει μελέτη της χρήσης των διακοπών του AVR στο σύστημα easyAVR6. Στην
συνέχεια δίνεται ένα παράδειγμα προγράμματος μετρητή που διακόπτεται από την εξωτερική διακοπή INT0. Η διακοπή αυτή είναι συνδεδεμένη στο 3ο bit της PORTD (PD2).
Παράδειγμα 2.1 Ένα πρόγραμμα μέτρησης που διακόπτεται από την INT0
Αρχικά εισάγουμε ένα πρόγραμμα που μετράει δυαδικά από το 0 έως το 255 και ξαναρχίζει σε
συνεχόμενη λειτουργία με καθυστέρηση 100 ms σε κάθε μέτρηση. Το αποτέλεσμα της μέτρησης εμφανίζεται
στα Led της θύρας PORTΑ. Το διάγραμμα ροής του φαίνεται στο σχήμα 2.1.
Πρόγραμμα Μετρητή
(Modulo 256)
Μηδένισε τον
Συσσωρευτή (8 bit)
Αύξησε τον
Συσσωρευτή
Έξοδος
Συσσωρευτή στη
θύρα Εξόδου
PORTA (Led)
Καθυστέρηση
100msec
Σχήμα 2. 1. Πρόγραμμα μετρητή.
Υποθέτουμε ότι όταν προκαλείται εξωτερική διακοπή INT0, ανάβουν όλα τα led της θύρας PORTA για 1sec και στην συνέχεια επανέρχεται η μέτρηση (από το σημείο που είχε μείνει). Το listing του
προγράμματος φαίνεται στον πίνακα 2.1 και η ενεργοποίηση της διακοπής INT0 (με αποκλεισμό όλων των
άλλων) δίνεται στον πίνακα 2.2. Η ρουτίνα εξυπηρέτησης διακοπής της ζητούμενης λειτουργίας δίνεται στον
πίνακα 2.3. Πίνακας 2.1. Πρόγραμμα μετρητής
Ετικέτα Εντολή Σχόλια
ser r26 ; αρχικοποίηση της PORTA out DDRA , r26 ; για έξοδο clr r26 ; αρχικοποίηση του μετρητή loop: out PORTA , r26 ; Δείξε την τιμή του μετρητή
; στη θύρα εξόδου των LED ldi r24 , low(100) ; load r25:r24 with 100 ldi r25 , high(100) ; delay 100 ms
rcall wait_msec
inc r26 ; Αύξησε τον μετρητή rjmp loop ; Επανέλαβε
Για τη λειτουργία του συστήματος διακοπών κάθε μικροελεγκτή είναι απαραίτητη αρχικά η ενεργοποίηση
σημαιών και επιλογών, που καθορίζουν τον ακριβή τρόπο λειτουργίας του. Στον μικροελεγκτή AVR ATmega16 οι δύο βασικές σημαίες είναι η επιλογή του επιπέδου ενεργοποίησης διακοπής και η επίτρεψη της
επιθυμητής εισόδου διακοπής. Η πρώτη ενεργοποιείται γράφοντας στον καταχωρητή MCUCR (διεύθυνση
$35) και στα τέσσερα λιγότερα σημαντικά ψηφία κατάλληλες τιμές, σύμφωνα με το παρακάτω σχήμα και
τους παρακάτω πίνακες:
MCUCR: SRE SRW SE SM ISC11 ISC10 ISC01 ISC00
ISC11 ISC10 Περιγραφή 0 0 Διακοπή στη χαμηλή στάθμη του INT1 0 1 Δεσμευμένο 1 0 Διακοπή στην κατερχόμενη ακμή του INT1 1 1 Διακοπή στην ανερχόμενη ακμή του INT1
ISC01 ISC00 Περιγραφή 0 0 Διακοπή στη χαμηλή στάθμη του INT0 0 1 Δεσμευμένο 1 0 Διακοπή στην κατερχόμενη ακμή του INT0 1 1 Διακοπή στην ανερχόμενη ακμή του INT0
Η δεύτερη ενεργοποιείται γράφοντας στον καταχωρητή GICR (διεύθυνση $3B) την τιμή 1 στο ψηφίο που
αντιστοιχεί στην είσοδο διακοπής που επιθυμούμε να επιτρέψουμε, σύμφωνα με το παρακάτω σχήμα:
GICR: INT1 INT0
Επίσης, απαραίτητη είναι και η εκτέλεση της εντολής sei, που επιτρέπει την πρόκληση διακοπών. Για
παράδειγμα, το παρακάτω τμήμα κώδικα ενεργοποιεί διακοπές στην είσοδο INT0 κατά την ανερχόμενη ακμή.
Τέλος, θα πρέπει οι ρουτίνες εξυπηρέτησης της αντίστοιχης διακοπής να δηλωθεί στην κατάλληλη διεύθυνση
του προγράμματος (οι διευθύνσεις περιγράφονται λεπτομερώς στο βιβλίο), όπως στο παρακάτω παράδειγμα.
Υπενθυμίζεται ότι στον μικροελεγκτή AVR ATmega16 η είσοδος PD2 λειτουργεί εναλλακτικά και ως
εξωτερική είσοδος διακοπής INT0 και η PD3 ως INT1. Επίσης, η διεύθυνση της INT0 είναι η 0x2 και η
διεύθυνση της INT1 η 0x4.
Πίνακας 2.2. Εντολές που ενεργοποιούν τη διακοπή INT0 (και εφαρμόζει μάσκα σε όλες τις άλλες)
Εντολή Σχόλια .org 0x0 rjmp reset .org 0x2 rjmp ISR0 reset: ldi r24 ,( 1 << ISC01) | ( 1 << ISC00)
; Η αρχή του κώδικα (reset) πάντα ; θα δηλώνεται στην δ/ση 0x0 ; Η εξυπηρέτηση της INT0 ; ορίζεται στην δ/ση 0x2 ; Εδώ αρχίζει το κυρίως τμήμα ; του προγράμματος. ; ορίζεται η διακοπή INT0 να
out MCUCR , r24 ; προκαλείται με σήμα θετικής ακμής ldi r24 ,( 1 << INT0) ; Ενεργοποίησε τη διακοπή INT0 out GICR , r24 sei ; Ενεργοποίησε τις συνολικές διακοπές
Πίνακας 2.3. Ρουτίνα εξυπηρέτησης διακοπής
Ετικέτα Εντολή Σχόλια ISR0: push r26 ; Σώσε το περιεχόμενο των r26 in r26 , SREG ; και SREG push r26 ser r26 ; θέσε τη θύρα εξόδου των LED out PORTA , r26 ldi r24 , low(998) ; φόρτωσε τους r25:r24 με 980
ldi r25 , high(998) ; delay 1sec rcall wait_msec out SREG , r26 ; καταχωρητών r24 και SREG pop r26 reti ; Επιστροφή από διακοπή στο κύριο πρόγραμμα
Τα ζητούμενα της 2ης εργαστηριακής άσκησης του AVR
Ζήτημα 2.1 Υποθέτουμε ότι «τρέχει» το προηγούμενο πρόγραμμα του μετρητή. Να δοθεί ρουτίνα
εξυπηρέτησης της εξωτερικής διακοπής INT0 (PD2) που όταν ενεργοποιείται να απαριθμεί το πλήθος τους με
την προϋπόθεση ότι το dip switch PD0 είναι στο λογικό ‘0’, αλλιώς όχι. Ο μετρητής που αποτελεί το κύριο
πρόγραμμα να απεικονίζεται στα leds PA7-PA0 και να τρέχει με ταχύτητα μιας μέτρησης ανά δέκατο του
δευτερολέπτου. Η μέτρηση του πλήθους των εξωτερικών διακοπών INT0 να δίνεται στα leds PB7-PB0. Το
πρόγραμμα να δοθεί σε assembly.
Ζήτημα 2.2 Στο προηγούμενο πρόγραμμα του μετρητή, να δοθεί μια άλλη ρουτίνα εξυπηρέτησης της
εξωτερικής διακοπής INT1 (PD3) που όταν ενεργοποιείται να απεικονίζει στα 4 LSB των LEDs PC0-3 το πλήθος των διακοπτών (dip switches) της θύρας PORTB (PB7-PB0) που είναι OΝ. Το πρόγραμμα να δοθεί
σε assembly.
Το Φαινόμενο της Αναπήδησης (Σπινθηρισμού)
Εάν ο χρόνος που διαρκεί η εκτέλεση μιας ρουτίνας εξυπηρέτησης διακοπής είναι πολύ μικρός, ενδέχεται να
εμφανιστεί το φαινόμενο της αναπήδησης λόγω σπινθηρισμού στον πιεστικό διακόπτη που προκαλεί την
εξωτερική διακοπή. Συγκεκριμένα, ένα πάτημα του πιεστικού διακόπτη μπορεί να δώσει περισσότερα του
ενός σήματα διακοπής τόσο κατά την πίεση όσο και κατά την απελευθέρωση. Εφόσον η ρουτίνα
εξυπηρέτησης διακοπής διαρκεί λίγο, ένας σπινθηρισμός μπορεί να προλάβει να εξυπηρετηθεί πλήρως και
στη συνέχεια να καταφθάσουν και άλλα σήματα διακοπής, από το ίδιο πάτημα ή το άφημα του πιεστικού
διακόπτη. Το αποτέλεσμα θα είναι να προκληθούν νέες αιτήσεις διακοπής οι οποίες και θα εξυπηρετηθούν. Όπως αναφέρθηκε, τα push buttons εμφανίζουν αναπήδηση και όταν αφήνονται, με αποτέλεσμα να υπάρχει η
πιθανότητα σε ένα πάτημα του κουμπιού να εκτελεστεί δύο φορές η ρουτίνα εξυπηρέτησης διακοπής (μια
φορά όταν το πατάμε και μια όταν το αφήνουμε). Μια λύση για το πρόβλημα αυτό για τον μικροελεγκτή
AVR ATmega16 είναι ο έλεγχος από τη ρουτίνα εξυπηρέτησης διακοπής του καταχωρητή GIFR (διεύθυνση
$3A) και συγκεκριμένα των δύο περισσότερο σημαντικών ψηφίων, σύμφωνα με το παρακάτω σχήμα.
GIFR: INTF1 INTF0
Τα ψηφία INTF1 και INTF0 γίνονται λογικό 1 από το μικροελεγκτή όταν υπάρχει αίτηση εξωτερικής
διακοπής INT1 και INT0 αντίστοιχα. Όταν εξυπηρετηθεί η αίτηση γίνονται λογικό 0. Αυτό το μηδενισμό
μπορεί όμως να τον κάνει και ο χρήστης, γράφοντας λογικό 1 (προσοχή!) στο αντίστοιχο ψηφίο, π.χ. με τις
παρακάτω εντολές (για την περίπτωση του INT0). ldi r24 ,(1 << INTF0) out GIFR ,r24 ; μηδένισε το bit 6 του GIFR Ένας λοιπόν απλός αλγόριθμος αποφυγής της αναπήδησης είναι ο χρήστης να μηδενίζει στην αρχή της
ρουτίνας εξυπηρέτησης διακοπής το ψηφίο INTF1 ή INTF0 και να περιμένει ένα μικρό χρονικό διάστημα
(π.χ. 5msec). Στη συνέχεια το ελέγχει και αν είναι πάλι λογικό 1, τότε κάποιος σπινθηρισμός έχει δώσει νέο
σήμα διακοπής για το ίδιο πάτημα. Η διαδικασία αυτή επαναλαμβάνεται μέχρις ότου το ψηφίο ισορροπήσει στην τιμή 0 που επιβάλει ο χρήστης, οπότε έχουν σταματήσει οι αναπηδήσεις και μπορεί να εξυπηρετηθεί η
μία και μοναδική διακοπή. Τα παραπάνω, για την περίπτωση της εξωτερικής εισόδου INT0 φαίνονται και στο
επόμενο λογικό διάγραμμα.
Τέλος ρουτίνας
Όχι
Γράψε 1 στο bit 6 του GIFR για να γίνει 0 και περίμενε
5msec
Διάβασε το bit 6 του GIFR
Εξυπηρέτηση διακοπής
Ναι
Είναι το bit6=0;
Αρχή ρουτίνας εξυπηρέτησης διακοπής
Σχήμα 2. 2. Λογικό διάγραμμα αποσπινθηρισμού (debouncing) πλήκτρου διακοπής INT0.
Ζήτημα 2.3 Να υλοποιηθεί αυτοματισμός που να ελέγχει το άναμμα και το σβήσιμο ενός φωτιστικού
σώματος. Όταν πατάμε το push button PD2 (δηλαδή με την ενεργοποίηση της INT0) ή το PΑ0 (που
υποθέτουμε ότι αντιστοιχεί σε ένα αισθητήρα κίνησης) να ανάβει το led PA1 (που αντιπροσωπεύει το
φωτιστικό σώμα). Το led θα σβήνει μετά από 3 sec, εκτός και αν ενδιάμεσα υπάρξει νέο πάτημα του PD2 ή
PA0, οπότε και ο χρόνος των 3 sec θα ανανεώνεται. Να γίνει χρήση του χρονιστή Timer1. Μπορείτε να
βασιστείτε στο Διάγραμμα ροής που δίνεται στο Σχ. 2.3. Περιγράψτε επίσης την συνολική λειτουργία.
Σχήμα 2. 3. Λογικό διάγραμμα αυτοματισμού που ανάβει για 3 sec το led PA1.
Χρονιστής Timer1 (επαναλαμβάνεται από την θεωρία για την πληρότητα της άσκησης)
Ένα πλεονέκτημα των σύγχρονων μικροελεγκτών είναι η ενσωμάτωση στην ίδια ψηφίδα χρήσιμων
περιφερειακών συσκευών, με σύνδεση στο σύστημα διακοπών του μικροελεγκτή. Για παράδειγμα, οι
χρονιστές είναι καταχωρητές που μπορούν να προγραμματιστούν να προκαλέσουν διακοπή στον
μικροελεγκτή μετά την πάροδο συγκεκριμένου χρόνου.
O μικροελεγκτής AVR ATmega16 διαθέτει 2 χρονιστές. Τον 8-ψήφιο και απλούστερο TCNT0 (διεύθυνση
$32) και τον 16-ψήφιο TCNT1 (TCNT1H, διεύθυνση $2D και TCNT1L, διεύθυνση $2C). Στους χρονιστές
αυτούς μπορεί να τοποθετηθεί μια αρχική τιμή η οποία αυξάνεται από το μικροελεγκτή με επιλεγμένη
συχνότητα. Όταν ένας χρονιστής υπερχειλίσει, μπορεί να δημιουργήσει κατάλληλο σήμα διακοπής εφόσον
τροποποιηθεί το περιεχόμενο του καταχωρητή TIMSK (διεύθυνση $39) σύμφωνα με το παρακάτω σχήμα.
Γράφοντας 1 στο ψηφίο TOIE0 επιτρέπονται διακοπές υπερχείλισης του χρονιστή TCNT0 και αντίστοιχα με
1 στο ψηφίο TOIE1 επιτρέπονται διακοπές υπερχείλισης του χρονιστή TCNT1 (εφόσον επιτραπούν και
γενικά οι διακοπές με την εντολή sei).
TIMSK: TOIE1 TOIE0 Για παράδειγμα, με τις παρακάτω εντολές επιτρέπεται η διακοπή υπερχείλισης του μετρητή TCNT1. ldi r24 ,(1<<TOIE1) ; ενεργοποίηση διακοπής υπερχείλισης του μετρητή TCNT1 out TIMSK ,r24 ; για τον timer1
Τέλος προγράμματος
Ρουτίνα Εξυπηρέτησης
INT0
Όχι
Αρχικοποίηση του Timer1 για
υπερχείλιση σε 3 sec
Ανάβει τα LED
Ναι
Είναι το PA0=1;
Αρχή προγράμματος
Τέλος Ρουτίνας (ret)
Αρχικοποίηση του Timer1 για
υπερχείλιση σε 3 sec
Ανάβει τα LED
Ρουτίνα Εξυπηρέτησης
Timer1
Σβήνει τα LED
Τέλος Ρουτίνας (ret)
Η επιλογή συχνότητας αύξησης του κάθε χρονιστή γίνεται διαφορετικά. Για το χρονιστή TCNT1 χρησιμοποιούμε τον καταχωρητή TCCR1B (διεύθυνση $2E) σύμφωνα με το παρακάτω σχήμα και τον
παρακάτω πίνακα.
TCCR1B: CS12 CS11 CS10
CS12 CS11 CS10 Περιγραφή σήματος εισόδου χρονιστή 0 0 0 Κανένα. Χρονιστής σταματημένος 0 0 1 CLK 0 1 0 CLK/8 0 1 1 CLK/64 1 0 0 CLK/256 1 0 1 CLK/1024 1 1 0 Κατερχόμενη ακμή εξωτερικού σήματος ακροδέκτη T1 1 1 1 Ανερχόμενη ακμή εξωτερικού σήματος ακροδέκτη T1
Για παράδειγμα, με τις παρακάτω εντολές επιλέγεται συχνότητα αύξησης του χρονιστή TCNT1 ίση με τη
1/1024 της συχνότητας ρολογιού του μικροελεγκτή (δηλαδή, κάθε 1024 κύκλους ρολογιού αυξάνεται κατά 1
ο χρονιστής TCNT1). ldi r24 ,(1<<CS12) | (0<<CS11) | (1<<CS10) ; CK/1024 out TCCR1B ,r24 Στην αναπτυξιακή πλακέτας EasyAVR6 με συχνότητα ρολογιού 8MHz, η επιλογή αυτή ισοδυναμεί με
συχνότητα αύξησης του TCNT1 ίση με 8MHz/1024=7812.5Hz. Αν με αυτές τις επιλογές θέλουμε ο TCNT1 να δημιουργήσει σήμα διακοπής υπερχείλισης μετά από για παράδειγμα 5sec, πρέπει να τον κάνουμε να
μετρήσει 5×7812.5=39062.5 κύκλους. Επειδή η υπερχείλιση γίνεται όταν μετρήσει 65536 κύκλους (16
ψηφία), θα πρέπει η αρχική τιμή που θα του δοθεί πριν αρχίσει να μετράει προς τα πάνω να είναι 65536-39062.5=26473.5=0x6769. Αυτό γίνεται με τον παρακάτω κώδικα. ldi r24,0x67 ; αρχικοποίηση του TCNT1 to out TCNT1H ,r24 ; για υπερχείλιση μετά από 5 sec ldi r24 ,0x69 out TCNT1L ,r24 Για μέγιστη ασφάλεια, τα δύο τμήματα του μετρητή TCNT1 TCNT1H και TCNT1L πρέπει να διαβάζονται
αδιαίρετα, χωρίς να μεσολαβήσει για παράδειγμα κάποια άλλη διακοπή. Για το λόγο αυτό ο μικροελεγκτής
κάνει μια ειδική διαδικασία. Όταν μια τιμή γράφεται στον TCNT1H αυτή τοποθετείται στον προσωρινό
καταχωρητή TEMP. Στη συνέχεια, όταν γραφεί τιμή στον TCNT1L η τιμή που υπάρχει στον TEMP συνδυάζεται με αυτή και τα 16 ψηφία γράφονται ταυτόχρονα σε όλο το μήκος του TCNT1. Κατά την
ανάγνωση, όταν διαβάζεται μια τιμή από τον TCNT1L αυτή τοποθετείται στον επιλεγμένο καταχωρητή του
μικροελεγκτή και ταυτόχρονα η τιμή του TCNT1H μεταφέρεται στον καταχωρητή TEMP. Όταν στην
συνέχεια διαβαστεί και ο TCNT1H, μεταφέρεται στον επιλεγμένο καταχωρητή η τιμή που έχει τοποθετηθεί
στον TEMP. Με βάση αυτή τη διαδικασία κατά την εγγραφή πρέπει πάντα να γράφεται πρώτα η τιμή στον
TCNT1H και μετά στον TCNT1L ενώ κατά την ανάγνωση πρέπει πάντα να διαβάζεται πρώτα ο TCNT1L και
μετά ο TCNT1H. Σε πολύπλοκες εφαρμογές πριν την πρόσβαση στον TCNT1 μπορούν να απενεργοποιηθούν
και οι διακοπές (αν και δεν συνηθίζεται). Τέλος, η θέση μνήμης του διανύσματος διακοπής του χρονιστή
TCNT1 φαίνεται στον παρακάτω κώδικα. .org 0x10 rjmp ISR_TIMER1_OVF ; ρουτίνα εξυπηρέτησης της διακοπής υπερχείλισης του timer1
3.2.1 2.1 - Count Interrupts and show them on Leds
1 .include "m16def.inc"
2
3 jmp reset
4 jmp isr0 ; f o r i n t e r r up t INT05 reti
6
7 reset :8 ldi r26 , high ( RAMEND ) ; i n i t i a l i z e s tack po in t e r9 out SPH , r26
10 ldi r26 , low ( RAMEND )11 out SPL , r26
12
13 ser r26
14 out DDRA , r26 ; PORTA fo r output15 out DDRB , r26 ; PORTB f o r output16 clr r26
17 out DDRD , r26 ; PORTD fo r input18
19 ldi r24 , ( 1 << ISC01 ) | ( 1 << ISC00 ) ; i n i t i a l i z e f l a g ←f o r INT0
20 out MCUCR , r24
21 ldi r24 , ( 1 << INT0 )22 out GICR , r24
23 sei ; a c t i v a t e i n t e r r up t s24
25
26 loop : ; make the counter27 out PORTA , r28
28 ldi r24 , low (100) ; r epeat de lay f o r 10029 ldi r25 , high (100)30 rcall wait_msec
31 inc r28
32 rjmp loop
33
34 isr0 : ; r ou t in e f o r INT035 cli ; d ea c t i va t e i n t e r r up t s36 push r28
37 in r28 , SREG
38 push r28
39 sbic PIND , 0 ; check PIND
26
40 reti
41 inc r27 ; i n c r e a s e counter and ex i t42 out PORTB , r27
43 pop r28
44 out SREG , r28
45 pop r28
46 sei
47 reti
48
49 wait_usec :50 sbiw r24 ,151 nop
52 nop
53 nop
54 nop
55 brne wait_usec
56 ret
57
58
59 wait_msec :60 push r24
61 push r25 ;62 ldi r24 , low (998)63 ldi r25 , high (998)64 rcall wait_usec
65 pop r25
66 pop r24
67 sbiw r24 , 168 brne wait_msec
69 ret
3.2.2 2.2
1 .include "m16def.inc"
2
3 jmp reset
4 jmp isr1
5 jmp isr1 ; f o r i n t e r r up t INT16 reti
7
8 reset :
27
9 ldi r26 , high ( RAMEND ) ; i n i t i a l i z e s tack po in t e r10 out SPH , r26
11 ldi r26 , low ( RAMEND )12 out SPL , r26
13
14 ser r26
15 out DDRA , r26 ; PORTA fo r output16 clr r26
17 out DDRB , r26 ; PINB f o r input18 ldi r26 , $0F19 out DDRC , r26 ; 4 LSBs o f PORTC fo r output20 clr r26
21 out DDRD , r26 ; PIND f o r input22
23
24 ldi r24 , (1<<ISC11 ) |(1<<ISC10 ) ; i n i t i a l i z e f l a g f o r INT125 out MCUCR , r24
26 ldi r24 , ( 1 << INT1 )27 out GICR , r24
28 sei ; a c t i v a t e i n t e r r up t s29
30 loop : ; counter31 out PORTA , r2832 ldi r24 , low (100)33 ldi r25 , high (100)34 rcall wait_msec
35 inc r28
36 rjmp loop
37
38 isr1 : ; r ou t in e f o r INT139 cli ; d ea c t i va t e i n t e r r up t s40 push r28
41 in r28 , SREG42 push r28
43
44 clr r28 ; count ac t i va t ed b i t s on PINB45 sbic PINB , 046 inc r28
47 sbic PINB , 148 inc r28
49 sbic PINB , 250 inc r28
51 sbic PINB , 3
28
52 inc r28
53 sbic PINB , 454 inc r28
55 sbic PINB , 556 inc r28
57 sbic PINB , 658 inc r28
59 sbic PINB , 760 inc r28
61 out PORTC , r28 ; show the r e s u l t62 pop r28
63 out SREG , r28
64 pop r28
65 sei ; a c t i v a t e i n t e r r up t s66 reti
3.2.3 2.3
1 .include "m16def.inc"
2 .def temp=r163 .def led=r174 .equ start=65536−234385 .equ highValue=high ( start )6 .equ lowValue=low ( start )7
8 .org 0x0009 jmp reset
10 .org 0x002 ; addre s s e s o f i n t e r r up t f unc t i on s11 rjmp isr0
12 .org 0x01013 rjmp timer1
14 reti
15
16 reset :17 ldi temp , high ( RAMEND )18 out SPH , temp ; i n i t i a l i z e s tack po in t e r19 ldi temp , low ( RAMEND )20 out SPL , temp21
22 ldi temp , $02 ; second b i t o f PORTA fo r output23 out DDRA , temp
29
24
25 clr temp
26 out DDRD , temp ; PIND of input27
28 ldi temp , ( 1 << ISC01 ) | ( 1 << ISC00 ) ; i n i t i a l i z e ←i n t e r r up t INT0
29 out MCUCR , temp
30 ldi temp , ( 1 << INT0 )31 out GICR , temp
32
33 ldi temp , (1<<TOIE1 ) ; i n i t i a l i z e TCNT134 out TIMSK , temp35
36 ldi temp ,(1<<CS12 ) | (0<<CS11 ) | (1<<CS10 )37 out TCCR1B , temp38 sei ; a c t i v a t e i n t e r r up t s39
40 loop :41 sbis PINA , 0 ; Check i f PA0 i s a c t i va t ed42 rjmp loop
43
44 ldi temp , highValue ; i n i t i a l i z e TCNT1 f o r over f l ow in 3 ←s ec
45 out TCNT1H , temp46 ldi temp , lowValue47 out TCNT1L , temp48
49 ldi led , $0250 out PORTA , led ; Act ivate Output l ed51 rjmp loop
52
53 isr0 : ; r ou t in e f o r i n t e r r up t INT054 ldi temp , highValue ; i n i t i a l i z e TCNT1 f o r over f l ow in 3 ←
s ec55 out TCNT1H , temp56 ldi temp , lowValue57 out TCNT1L , temp58
59 ldi led , $0260 out PORTA , led ; Act ivate output l ed61 reti
62
63 timer1 :
30
64 ldi led , 065 out PORTA , led66 reti
3.3 Exercise 3 - Keyboard and Lcd
31
Εργαστηριακές ασκήσεις στον Μικροελεγκτή AVR
3η Εργαστηριακή Άσκηση του AVR – Χρήση πληκτρολογίου και οθόνη
Στην άσκηση αυτή θα γίνει μελέτη της χρήσης του πληκτρολογίου 4×4 και της αλφαριθμητικής οθόνη LCD
2×16 χαρακτήρων (επικοινωνία μεταξύ οθόνης και του μικροελεγκτή γίνεται με λέξεις των 4 bit).
Έλεγχος Περιφερειακών Συσκευών
Η επικοινωνία ενός μικροελεγκτή με περιφερειακές συσκευές μπορεί να γίνει με διαφορετικούς τρόπους και
πρωτόκολλα. Για κάθε διαφορετική περίπτωση και τεχνική επικοινωνίας, είναι ιδιαίτερα χρήσιμη η
κατασκευή μιας βιβλιοθήκης λογισμικού (ρουτίνες) που αναλαμβάνουν όλες τις χαμηλού επιπέδου
λειτουργίες (π.χ. τροφοδοσία και έλεγχος συγκεκριμένων ακροδεκτών, χρονισμός) που καθορίζονται από τον
τρόπο επικοινωνίας, και παρέχουν υψηλότερου επιπέδου λειτουργίες (π.χ. αποστολή και λήψη χαρακτήρων),
που χρησιμοποιούνται για την κατασκευή λογισμικού εφαρμογών. Οι βιβλιοθήκες αυτές ονομάζονται οδηγοί
συσκευών. Για την κατασκευή τους είναι απαραίτητη η γνώση του τρόπου επικοινωνίας και της
συνδεσμολογίας της περιφερειακής συσκευής. Συχνά, η περιφερειακή συσκευή συνοδεύεται από έναν
ελεγκτή ο οποίος καθορίζει και υλοποιεί τον τρόπο επικοινωνίας. Τα τεχνικά του χαρακτηριστικά περιέχονται
στο αντίστοιχο εγχειρίδιο τεχνικών προδιαγραφών. Η συνδεσμολογία προκύπτει από τα τεχνικά
χαρακτηριστικά αλλά και τους περιορισμούς του συστήματος που θα συνδεθεί η περιφερειακή συσκευή (π.χ.
διαθεσιμότητα ακροδεκτών).
Στην αναπτυξιακή πλακέτα EasyAVR6 διαθέτει μεταξύ των άλλων περιφερειακών συσκευών ένα
πληκτρολόγιο 4×4 και μια οθόνη χαρακτήρων 2×16. Στην συνέχεια παρουσιάζονται οι συσκευές αυτές σε
συνδυασμό με το αντίστοιχο λογισμικό οδήγησής τους.
Πληκτρολόγιο 4×4
Το πληκτρολόγιο 4×4 του αναπτυξιακού easyAVR6 αποτελείται από 16 πιεστικούς διακόπτες συνδεδεμένους
όπως φαίνεται στο ακόλουθο σχήμα.
Pull-down
PC7
PC6
PC5
PC4
PC3
PC2
PC1
PC0
Έξο
δο
ιΕ
ίσο
δο
ι
Port C0
0
0
1
0
0
0
1
4
3
2
1
Γρ
αμ
μή
4 3 2 1
Στήλη
Η ανάγνωση του πληκτρολογίου γίνεται ανά γραμμή. Η γραμμή που επιθυμούμε να ελέγξουμε για
πατημένους διακόπτες επιλέγεται θέτοντας έναν από τους ακροδέκτες PC7 – PC4 της θύρας PORTC του
μικροελεγκτή στο λογικό 1. Οι 4 γραμμές του πληκτρολογίου επιλέγονται από τους ακροδέκτες PC7 – PC4 οι
οποίοι πρέπει να είναι ρυθμισμένοι για έξοδο. Στη συνέχεια εντοπίζουμε τις στήλες των πιεσμένων
διακοπτών, διαβάζοντας τον καταχωρητή PINC και ελέγχοντας τους ακροδέκτες PC3 – PC0 που τους έχουμε
ρυθμίσει ως εισόδους. Λογικό 1 αντιστοιχεί σε πιεσμένο διακόπτη. Αν δεν υπάρχει πιεσμένος διακόπτης,
λόγω των pull-down αντιστάσεων, έχουμε λογικό 0 στην είσοδο.
Η αρχικοποίηση της θύρα PORTC του μικροελεγκτή μπορεί να πραγματοποιηθεί με τις ακόλουθες εντολές
(οι εσωτερικές αντιστάσεις pull-up πρέπει να είναι απενεργοποιημένες).
ldi r24 ,(1 << PC7) | (1 << PC6) | (1 << PC5) | (1 << PC4) ; θέτει ως εξόδους τα 4 MSB out DDRC ,r24 ; της θύρας PORTC
Για να ελέγξουμε μια γραμμή του πληκτρολογίου για πιεσμένους διακόπτες μπορούμε να χρησιμοποιήσουμε
τη ρουτίνα scan_row. Στον καταχωρητή r24 αποθηκεύουμε τον αριθμό της γραμμής (1 – 4) που θέλουμε να
ελέγξουμε και ανακτούμε το αποτέλεσμα του ελέγχου στα 4 λιγότερα σημαντικά bit του ίδιου καταχωρητή.
Οι δύο εντολές nop μεταξύ της εντολής που επιλέγει τη γραμμή και της εντολής που διαβάζει τον
καταχωρητή PINC είναι απαραίτητες καθώς μπορεί να απαιτηθούν μέχρι και δύο κύκλοι ρολογιού μέχρι μια αλλαγή στην κατάσταση των ακροδεκτών (λόγω της αδράνειας τους) να καταγραφεί στον καταχωρητή PINC.
Ρουτίνα: scan_row Έλεγχος μιας γραμμής του πληκτρολογίου για πιεσμένους διακόπτες. Είσοδος: Ο αριθμός της γραμμής προς ανάγνωση πρέπει να είναι αποθηκευμένος στον καταχωρητή r24 (τιμή 1-4). Έξοδος: Στα 4 λιγότερο σημαντικά bit του r24 είναι αποθηκευμένη η κατάσταση κάθε διακόπτη. Καταχωρητές: r25:r24 Καλούμενες υπορουτίνες: - scan_row: ldi r25 ,0x08 ; αρχικοποίηση με ‘0000 1000’ back_: lsl r25 ; αριστερή ολίσθηση του ‘1’ τόσες θέσεις dec r24 ; όσος είναι ο αριθμός της γραμμής brne back_ out PORTC ,r25 ; η αντίστοιχη γραμμή τίθεται στο λογικό ‘1’ nop nop ; καθυστέρηση για να προλάβει να γίνει η αλλαγή κατάστασης in r24 ,PINC ; επιστρέφουν οι θέσεις (στήλες) των διακοπτών που είναι πιεσμένοι andi r24 ,0x0f ; απομονώνονται τα 4 LSB όπου τα ‘1’ δείχνουν που είναι πατημένοι ret ; οι διακόπτες.
Τώρα που διαθέτουμε μια ρουτίνα που ελέγχει μια γραμμή του πληκτρολογίου για πιεσμένους διακόπτες
μπορούμε να γράψουμε μια άλλη που θα την ενσωματώνει και θα ελέγχει ολόκληρο το πληκτρολόγιο. Το
αποτέλεσμα του ελέγχου είναι ένας δυαδικός αριθμός με μήκος 16 bit που αποθηκεύεται στους καταχωρητές
r25:r24. Κάθε διακόπτης από τους 16 αντιστοιχεί σε ένα bit των καταχωρητών r25:r24 όπου λογικό ‘1’
σημαίνει ότι είναι πιεσμένος ο αντίστοιχος διακόπτης. Η αντιστοιχία φαίνεται στο επόμενο σχήμα. r25 r24
Α 3 2 1 Β 6 5 4 C 9 8 7 D # 0 *
Ρουτίνα: scan_keypad Έλεγχος του πληκτρολογίου για πιεσμένους διακόπτες. Είσοδος: καμία Έξοδος: Στους καταχωρητές r25:r24 είναι αποθηκευμένη η κατάσταση των 16 διακοπτών του πληκτρολογίου.
Καταχωρητές: r27:r26, r25:r24 Καλούμενες υπορουτίνες: scan_row scan_keypad: ldi r24 ,0x01 ; έλεγξε την πρώτη γραμμή του πληκτρολογίου rcall scan_row
swap r24 ; αποθήκευσε το αποτέλεσμα mov r27 ,r24 ; στα 4 msb του r27 ldi r24 ,0x02 ; έλεγξε τη δεύτερη γραμμή του πληκτρολογίου rcall scan_row add r27 ,r24 ; αποθήκευσε το αποτέλεσμα στα 4 lsb του r27 ldi r24 ,0x03 ; έλεγξε την τρίτη γραμμή του πληκτρολογίου rcall scan_row swap r24 ; αποθήκευσε το αποτέλεσμα mov r26 ,r24 ; στα 4 msb του r26 ldi r24 ,0x04 ; έλεγξε την τέταρτη γραμμή του πληκτρολογίου rcall scan_row add r26 ,r24 ; αποθήκευσε το αποτέλεσμα στα 4 lsb του r26 movw r24 ,r26 ; μετέφερε το αποτέλεσμα στους καταχωρητές r25:r24 ret Έως τώρα έχουμε δει πώς να αρχικοποιήσουμε την θύρα PORTC του μικροελεγκτή για να
χρησιμοποιήσουμε το πληκτρολόγιο και πώς να το ελέγξουμε για πιεσμένα πλήκτρα. Όμως αυτό που
πραγματικά μας ενδιαφέρει δεν είναι ποιοί διακόπτες είναι πιεσμένοι τη στιγμή που ελέγχουμε το
πληκτρολόγιο, αλλά ποιο πλήκτρο πάτησε ο χρήστης. Όταν ο χρήστης πατάει ένα πλήκτρο, αυτό μπορεί να
μείνει πιεσμένο για αυθαίρετα μεγάλο χρονικό διάστημα. Πρέπει να μπορούμε να ξεχωρίσουμε ποιο
πλήκτρο πατήθηκε (ως ολοκληρωμένη ενέργεια) και όχι ποιο πλήκτρο είναι πατημένο.
Για να το επιτύχουμε πρέπει να ελέγχουμε το πληκτρολόγιο για πιεσμένους διακόπτες με την ρουτίνα
scan_keypad, να αποθηκεύουμε το αποτέλεσμα στη μνήμη RAM του μικροελεγκτή και στη συνέχεια με
μια δεύτερη κλήση της ίδιας ρουτίνας να ξαναελέγξουμε το πληκτρολόγιο. Μια σύγκριση των δύο
καταστάσεων του πληκτρολογίου θα αποκαλύψει τις διαφορές στην κατάσταση των διακοπτών. Το χρονικό
διάστημα ανάμεσα στις διαδοχικές κλήσεις της συνάρτησης scan_keypad είναι κρίσιμο, διότι καθορίζει το
χρόνο που θα πρέπει να μείνει πιεσμένος ένας διακόπτης από το χρήστη για να καταγραφεί από τον
μικροελεγκτή. Αυτό σημαίνει ότι ένα μεγάλο χρονικό διάστημα μεταξύ των διαδοχικών κλήσεων της
ρουτίνας θα αναγκάσει το χρήστη να κρατά πατημένο το πλήκτρο για αντίστοιχα μεγάλο χρονικό διάστημα
(ώστε να μπορεί να αναγνωριστεί). Αντίθετα, ένα πολύ μικρό χρονικό διάστημα θα δημιουργήσει
προβλήματα λόγω του σπινθηρισμού που παρουσιάζουν οι διακόπτες.
Η ρουτίνα scan_keypad_rising_edge υλοποιεί όσα αναφέρθηκαν πρωτύτερα και παράλληλα αντιμετωπίζει
αποτελεσματικά το ζήτημα του σπινθηρισμού των διακοπτών.
Ρουτίνα: scan_keypad_rising_edge Έλεγχος του πληκτρολογίου για διακόπτες που δεν ήταν πιεσμένοι την τελευταία φορά που κλήθηκε η ρουτίνα και τώρα
είναι. Είσοδος: Ο αναμενόμενος χρόνος σπινθηρισμού των διακοπτών σε ms είναι αποθηκευμένος στον καταχωρητή r24. Έξοδος: Ένας αριθμός των 16 bit, ενδεικτικός των διακοπτών που «μόλις» πατήθηκαν, είναι αποθηκευμένος στους
καταχωρητές r25:r24 Καταχωρητές: r27:r26, r25:r24, r23:r22 Καλούμενες υπορουτίνες: scan_keypad, wait_msec Παρατηρήσεις: Για να καταγραφούν οι διακόπτες που έχουν «μόλις» πιεστεί, η ρουτίνα χρησιμοποιεί την μεταβλητή _tmp_. Επειδή η
μεταβλητή _tmp_ βρίσκεται στην RAM του μικροελεγκτή δεν είναι αρχικοποιημένη. Ο χρήστης πρέπει να την
αρχικοποιήσει είτε ρητά είτε με μια κλήση της ρουτίνας μόνο για αυτό το σκοπό.
; ---- Αρχή τμήματος δεδομένων .DSEG _tmp_: .byte 2
; ---- Τέλος τμήματος δεδομένων .CSEG scan_keypad_rising_edge: mov r22 ,r24 ; αποθήκευσε το χρόνο σπινθηρισμού στον r22 rcall scan_keypad ; έλεγξε το πληκτρολόγιο για πιεσμένους διακόπτες push r24 ; και αποθήκευσε το αποτέλεσμα push r25 mov r24 ,r22 ; καθυστέρησε r22 ms (τυπικές τιμές 10-20 msec που καθορίζεται από τον ldi r25 ,0 ; κατασκευαστή του πληκτρολογίου – χρονοδιάρκεια σπινθηρισμών) rcall wait_msec rcall scan_keypad ; έλεγξε το πληκτρολόγιο ξανά και pop r23 ; απόρριψε όσα πλήκτρα εμφανίζουν pop r22 ; σπινθηρισμό and r24 ,r22 and r25 ,r23 ldi r26 ,low(_tmp_) ; φόρτωσε την κατάσταση των διακοπτών στην ldi r27 ,high(_tmp_) ; προηγούμενη κλήση της ρουτίνας στους r27:r26 ld r23 ,X+ ld r22 ,X st X ,r24 ; αποθήκευσε στη RAM τη νέα κατάσταση st -X ,r25 ; των διακοπτών com r23 com r22 ; βρες τους διακόπτες που έχουν «μόλις» πατηθεί and r24 ,r22 and r25 ,r23 ret Τέλος, επειδή η κατάσταση του πληκτρολογίου στην μορφή ενός δυαδικού αριθμού δεν είναι ιδιαίτερα
χρήσιμη υπάρχει και η ρουτίνα keypad_to_ascii που εντοπίζει τον διακόπτη που έχει πατηθεί και επιστρέφει
τον κωδικό ascii του χαρακτήρα που αντιστοιχεί στον διακόπτη. Αν δεν είναι πιεσμένος κανένας διακόπτης
επιστρέφει την τιμή 0, ενώ εάν είναι πατημένοι πολλοί επιστρέφει μόνο έναν από αυτούς (ο 1ος που
εντοπίζεται με βάση την σειρά εξερεύνησης των εντολών της ρουτίνας που ακολουθεί).
Ρουτίνα: keypad_to_ascii Αντιστοίχιση διακοπτών, κωδικών ascii. Είσοδος: Στους καταχωρητές r25:r24 είναι αποθηκευμένος ένας αριθμός 16 bit, ενδεικτικός της κατάστασης κάθε
διακόπτη. Έξοδος: Ο κωδικός ascii, που αντιστοιχεί στον πρώτο πατημένο διακόπτη που εντοπίστηκε, αποθηκεύεται στον
καταχωρητή r24 ή 0 αν δεν έχει πατηθεί κάποιος. Καταχωρητές: r27:r26, r25:r24 Παρατηρήσεις: Ο αριθμός των 16 bit που αποθηκεύεται στους καταχωρητές r25:r24 κατά την κλήση της ρουτίνας
πρέπει να προέρχεται από μια εκ των scan_keypad ή scan_keypad_rising_edge. keypad_to_ascii: ; λογικό ‘1’ στις θέσεις του καταχωρητή r26 δηλώνουν movw r26 ,r24 ; τα παρακάτω σύμβολα και αριθμούς ldi r24 ,'*' sbrc r26 ,0 ret ldi r24 ,'0' sbrc r26 ,1 ret ldi r24 ,'#'
r26
C 9 8 7 D # 0 *
sbrc r26 ,2 ret ldi r24 ,'D' sbrc r26 ,3 ; αν δεν είναι ‘1’παρακάμπτει την ret, αλλιώς (αν είναι ‘1’) ret ; επιστρέφει με τον καταχωρητή r24 την ASCII τιμή του D. ldi r24 ,'7' sbrc r26 ,4 ret ldi r24 ,'8' sbrc r26 ,5 ret ldi r24 ,'9' sbrc r26 ,6 ret ldi r24 ,'C' sbrc r26 ,7 ret ldi r24 ,'4' ; λογικό ‘1’ στις θέσεις του καταχωρητή r27 δηλώνουν sbrc r27 ,0 ; τα παρακάτω σύμβολα και αριθμούς ret ldi r24 ,'5' sbrc r27 ,1 ret ldi r24 ,'6' sbrc r27 ,2 ret ldi r24 ,'B' sbrc r27 ,3 ret ldi r24 ,'1' sbrc r27 ,4 ret ldi r24 ,'2' sbrc r27 ,5 ret ldi r24 ,'3' sbrc r27 ,6 ret ldi r24 ,'A' sbrc r27 ,7 ret clr r24 ret
r27
Α 3 2 1 Β 6 5 4
Αλφαριθμητική Οθόνη Χαρακτήρων 2×16
Στην αναπτυξιακή πλακέτα EasyAVR6 μια πολύ χρήσιμη περιφερειακή συσκευή είναι η πρόσθετη οθόνη
χαρακτήρων 2×16. Η συνδεσμολογία γίνεται με τους 6 περισσότερο σημαντικούς ακροδέκτες της θύρας
PORTD (PD2-PD7), όπως φαίνεται στο σχήμα 6.1. Οι ακροδέκτες αυτοί συνδέονται σε ακροδέκτες του
ελεγκτή της οθόνης WH1602B, του οποίου το εγχειρίδιο τεχνικών προδιαγραφών παρατίθεται στις επόμενες
σελίδες. Από τους 6 ακροδέκτες, οι 2 λιγότερο σημαντικοί (PD2 και PD3) είναι ακροδέκτες ελέγχου ενώ οι
υπόλοιποι 4 σχηματίζουν λέξεις των 4 bit με τις οποίες γίνεται η επικοινωνία μικροελεγκτή – ελεγκτή οθόνης.
Σχήμα 6.1. Κυκλωματικό διάγραμμα οθόνης χαρακτήρων 2x16.
3.3.1 3.1 - Logical
1 .include "m16def.inc"
2 .def temp=r163 .def led1=r174 .def led2=r185 .def pl_C=r196 .def p0=r47 .def p1=r58 .def p2=r69 .def p3=r710
11 rjmp reset
12
13 reset : ldi temp , high ( RAMEND )14 out SPH , temp
15 ldi temp , low ( RAMEND )16 out SPL , temp
17
18 ser temp ; temp = 0xFF19 out DDRB , temp ; PORTB f o r output20 clr temp ; temp = 0x0021 out DDRA , temp ; PORTA fo r input22 out DDRC , temp ; PORTC fo r input23
24 pulh1 :25 in led1 , PINA ; l ed1 = input26 mov led2 , led1 ; l ed2 = led127 andi led1 , $01 ; Mask to keep LSB28 andi led2 , $02 ; Mask to keeb second LSB29 lsr led2 ; S h i f t Right Led230 and led2 , led1 ; l ed2 = led1 and led131 mov temp , led232
33 pulh2 :34 in led1 , PINA ; l ed1 = input35 mov led2 , led1 ; l ed2 = led136 andi led1 , $04 ; Mask to keep 3rd Bit37 andi led2 , $08 ; Mask to keep 4 th Bit38 lsr led2
39 and led2 , led1
38
40 lsr led2 ; S h i f t Right to move the r e s u l t b i t in 2nd ←b i t p lace
41 mov p1 , led2 ; p1 = led242
43 pulh5 :44 lsr led2 ; S h i f t Right to move the r e s u l t b i t in LSB ←
p lace45 or temp , led2 ; temp = temp or l ed246 mov p0 , temp47
48 pulh3 :49 in led1 , PINA ; l ed1 = input50 mov led2 , led151 andi led1 , $1052 andi led2 , $2053 lsr led2
54 or led2 , led155 com led2 ; l ed2 = led2 nor l ed156 andi led2 , $10 ; Mask to keep 5 th b i t57 lsr led2
58 lsr led2 ; move l ed2 ( r e s u l t ) to 3 rd b i t p lace59 mov p2 , led260
61 pulh4 :62 in led1 , PINA63 mov led2 , led164 andi led1 , $4065 andi led2 , $8066 lsr led2
67 eor led2 , led168 com led2 ; l ed2 = led2 nxor l ed169 andi led2 , $40 ; Mask to keep only 7 th b i t70 lsr led2
71 lsr led2
72 lsr led2 ; move l ed2 ( r e s u l t ) to 4 th b i t p lace73 mov p3 , led274
75 result :76 clr led1
77 or led1 , p078 or led1 , p179 or led1 , p280 or led1 , p3
39
81 out PORTB , led1
82
83 pc7_0 :84 in pl_C , PINC ; read PC buttons 0−7 to p l c85 cpi pl_C , 0 ; check i f any PC button i s pre s s ed86 breq pulh1
87 mov led2 , led188 eor led2 , pl_C89 out PORTB , led290 rjmp pc7_0
3.3.2 3.3
1 .include "m16def.inc"
2 .def temp=r163
4 .DSEG
5 _tmp_ : .byte 26
7 .CSEG
8 .org 0x0009 jmp reset
10
11 reset :12 ldi temp , high ( RAMEND )13 out SPH , temp
14 ldi temp , low ( RAMEND )15 out SPL , temp
16 ldi r24 , ( 1 << PC7 ) | (1 << PC6 ) | (1 << PC5 ) | (1 << PC4←) ; i n i t i a l i z e 4 MSB
17 out DDRC , r24 ; o f PORTC as output18
19 loop :20 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms21 call scan_keypad_rising_edge
22 call keypad_to_ascii
23 cpi r24 , '4'24 brne loop
25 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms26 call scan_keypad_rising_edge
27 call keypad_to_ascii
40
28 cpi r24 , '2'29 breq leds_on
30 rjmp loop
31
32
33 leds_on :34 ldi temp , $FF35 out PORTA , temp
36 ldi r24 , 0x07 ; wait f o r 2 seconds37 ldi r25 , 0xD0 ; 2 .000=0x07D038 call wait_msec
39 ldi temp , 040 out PORTA , temp41 rjmp loop
42
43
44 scan_row :45 ldi r25 ,0 x08 ; i n i t i a l i z e us ing 0000100046 back_ :47 lsl r25 ; s h i f t l e f t r24 t imes48 dec r24
49 brne back_
50 out PORTC , r2551 nop
52 nop
53 in r24 , PINC54 andi r24 ,0 x0f55 ret
56
57 scan_keypad :58 ldi r24 ,0 x0159 rcall scan_row
60 swap r24
61 mov r27 , r2462 ldi r24 ,0 x0263 rcall scan_row
64 add r27 , r2465 ldi r24 ,0 x0366 rcall scan_row
67 swap r24
68 mov r26 , r2469 ldi r24 ,0 x0470 rcall scan_row
41
71 add r26 , r2472 movw r24 , r2673 ret
74
75 scan_keypad_rising_edge :76 mov r22 , r2477 rcall scan_keypad
78 push r24
79 push r25
80 mov r24 , r2281 ldi r25 ,082 rcall wait_msec
83 rcall scan_keypad
84 pop r23
85 pop r22
86 and r24 , r2287 and r25 , r2388 ldi r26 , low ( _tmp_ )89 ldi r27 , high ( _tmp_ )90 ld r23 ,X+91 ld r22 ,X92 st X , r2493 st −X , r2594 com r23
95 com r22
96 and r24 , r2297 and r25 , r2398 ret
99
100 keypad_to_ascii :101 movw r26 , r24102 ldi r24 , '*'103 sbrc r26 ,0104 ret
105 ldi r24 , '0'106 sbrc r26 ,1107 ret
108 ldi r24 , '#'109 sbrc r26 ,2110 ret
111 ldi r24 , 'D'112 sbrc r26 ,3113 ret
42
114 ldi r24 , '7'115 sbrc r26 ,4116 ret
117 ldi r24 , '8'118 sbrc r26 ,5119 ret
120 ldi r24 , '9'121 sbrc r26 ,6122 ret
123 ldi r24 , 'C'124 sbrc r26 ,7125 ret
126 ldi r24 , '4'127 sbrc r27 ,0128 ret
129 ldi r24 , '5'130 sbrc r27 ,1131 ret
132 ldi r24 , '6'133 sbrc r27 ,2134 ret
135 ldi r24 , 'B'136 sbrc r27 ,3137 ret
138 ldi r24 , '1'139 sbrc r27 ,4140 ret
141 ldi r24 , '2'142 sbrc r27 ,5143 ret
144 ldi r24 , '3'145 sbrc r27 ,6146 ret
147 ldi r24 , 'A'148 sbrc r27 ,7149 ret
150 clr r24
151 ret
152
153 wait_usec :154 sbiw r24 ,1155 nop
156 nop
43
157 nop
158 nop
159 brne wait_usec
160 ret
161
162 wait_msec :163 push r24
164 push r25
165 ldi r24 , low (998)166 ldi r25 , high (998)167 rcall wait_usec
168 pop r25
169 pop r24
170 sbiw r24 , 1171 brne wait_msec
172 ret
3.3.3 3.4
1 .include "m16def.inc"
2 .def temp=r163
4 .DSEG
5 _tmp_ : .byte 26
7 .CSEG
8 .org 0x0009 jmp reset
10
11 reset :12 ldi temp , LOW ( RAMEND )13 out SPL , temp14 ldi temp , HIGH ( RAMEND )15 out SPH , temp16
17 ldi temp , ( 1 << PD7 ) | ( 1 << PD6 ) | ( 1 << PD5 ) |(1<<PD4 ) |(1<<←PD3 ) |(1<<PD2 )
18 out DDRD , temp ; i n i t i a l i z e PD7− PD2 f o r output19 ldi temp ,(1<<PC7 ) |(1<<PC6 ) |(1<<PC5 ) |(1<<PC4 )20 out DDRC , temp ; i n i t i a l i z e PC7−PC4 f o r output21
44
22 rcall lcd_init ; i n i t i a l i z e LCD23 ldi r24 , 'N' ; p r i n t NONE24 rcall lcd_data
25 ldi r24 , 'O'26 rcall lcd_data
27 ldi r24 , 'N'28 rcall lcd_data
29 ldi r24 , 'E'30 rcall lcd_data
31
32 main :33 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms34 rcall scan_keypad_rising_edge ; read from keyboard35 rcall keypad_to_ascii ; convert to ASCII36 push r24
37 cpi r24 , 0 x0038 brne screen_write ; I f r24=0 then read again e l s e go to←
s c r e e n wr i t e39 rjmp main
40
41 screen_write :42 rcall lcd_init ; c a l l l c d i n i t to r e s e t l cd43 pop r24
44 rcall lcd_data ; p r i n t r2445 rjmp main
46
47
48 scan_row :49 ldi r25 ,0 x08 ; i n i t i a l i z e us ing 0000100050 back_ :51 lsl r25 ; s h i f t l e f t r24 t imes52 dec r24
53 brne back_
54 out PORTC , r2555 nop
56 nop
57 in r24 , PINC58 andi r24 ,0 x0f59 ret
60
61 scan_keypad :62 ldi r24 ,0 x0163 rcall scan_row
45
64 swap r24
65 mov r27 , r2466 ldi r24 ,0 x0267 rcall scan_row
68 add r27 , r2469 ldi r24 ,0 x0370 rcall scan_row
71 swap r24
72 mov r26 , r2473 ldi r24 ,0 x0474 rcall scan_row
75 add r26 , r2476 movw r24 , r2677 ret
78
79 scan_keypad_rising_edge :80 mov r22 , r2481 rcall scan_keypad
82 push r24
83 push r25
84 mov r24 , r2285 ldi r25 ,086 rcall wait_msec
87 rcall scan_keypad
88 pop r23
89 pop r22
90 and r24 , r2291 and r25 , r2392 ldi r26 , low ( _tmp_ )93 ldi r27 , high ( _tmp_ )94 ld r23 ,X+95 ld r22 ,X96 st X , r2497 st −X , r2598 com r23
99 com r22
100 and r24 , r22101 and r25 , r23102 ret
103
104 keypad_to_ascii :105 movw r26 , r24106 ldi r24 , '*'
46
107 sbrc r26 ,0108 ret
109 ldi r24 , '0'110 sbrc r26 ,1111 ret
112 ldi r24 , '#'113 sbrc r26 ,2114 ret
115 ldi r24 , 'D'116 sbrc r26 ,3117 ret
118 ldi r24 , '7'119 sbrc r26 ,4120 ret
121 ldi r24 , '8'122 sbrc r26 ,5123 ret
124 ldi r24 , '9'125 sbrc r26 ,6126 ret
127 ldi r24 , 'C'128 sbrc r26 ,7129 ret
130 ldi r24 , '4'131 sbrc r27 ,0132 ret
133 ldi r24 , '5'134 sbrc r27 ,1135 ret
136 ldi r24 , '6'137 sbrc r27 ,2138 ret
139 ldi r24 , 'B'140 sbrc r27 ,3141 ret
142 ldi r24 , '1'143 sbrc r27 ,4144 ret
145 ldi r24 , '2'146 sbrc r27 ,5147 ret
148 ldi r24 , '3'149 sbrc r27 ,6
47
150 ret
151 ldi r24 , 'A'152 sbrc r27 ,7153 ret
154 clr r24
155 ret
156
157 wait_usec :158 sbiw r24 ,1159 nop
160 nop
161 nop
162 nop
163 brne wait_usec
164 ret
165
166 wait_msec :167 push r24
168 push r25
169 ldi r24 , low (998)170 ldi r25 , high (998)171 rcall wait_usec
172 pop r25
173 pop r24
174 sbiw r24 , 1175 brne wait_msec
176 ret
177
178 lcd_init :179 ldi r24 ,40180 ldi r25 ,0181 rcall wait_msec
182 ldi r24 ,0 x30183 out PORTD , r24184 sbi PORTD , PD3185 cbi PORTD , PD3186 ldi r24 ,39187 ldi r25 ,0188 rcall wait_usec
189 ldi r24 ,0 x30190 out PORTD , r24191 sbi PORTD , PD3192 cbi PORTD , PD3
48
193 ldi r24 ,39194 ldi r25 ,0195 rcall wait_usec
196 ldi r24 ,0 x20197 out PORTD , r24198 sbi PORTD , PD3199 cbi PORTD , PD3200 ldi r24 ,39201 ldi r25 ,0202 rcall wait_usec
203 ldi r24 ,0 x28204 rcall lcd_command
205 ldi r24 ,0 x0c206 rcall lcd_command
207 ldi r24 ,0 x01208 rcall lcd_command
209 ldi r24 , low (1530)210 ldi r25 , high (1530)211 rcall wait_usec
212 ldi r24 ,0 x06213 rcall lcd_command
214 ret
215
216 lcd_data :217 sbi PORTD , PD2218 rcall write_2_nibbles
219 ldi r24 ,43220 ldi r25 ,0221 rcall wait_usec
222 ret
223
224 lcd_command :225 cbi PORTD , PD2226 rcall write_2_nibbles
227 ldi r24 ,39228 ldi r25 ,0229 rcall wait_usec
230 ret
3.3.4 3.5
49
1 .include "m16def.inc"
2 .def temp=r163
4 .DSEG
5 _tmp_ : .byte 26
7 .CSEG
8 .org 0x0009 jmp reset
10 .org 0x01011 rjmp timer1
12
13 reset :14 ldi temp , LOW ( RAMEND ) ; i n i t i a l i z e s tack po in t e r15 out SPL , temp16 ldi temp , HIGH ( RAMEND )17 out SPH , temp18
19 ldi r24 ,(1<<TOIE1 ) ; Act ivate TCNT120 out TIMSK , r2421 ldi r24 ,(1<<CS12 ) |(0<<CS11 ) |(1<<CS10 ) ; CK/102422 out TCCR1B , r2423
24 clr r24 ; r24 = 0x0025 out DDRB , r24 ; i n i t i a l i z e PORTB fo r input26 ser r24 ; r24 = 0xFF27 out DDRA , r24 ; i n i t i a l i z e PORTA fo r output28 ldi temp , ( 1 << PD7 ) | ( 1 << PD6 ) | ( 1 << PD5 ) |(1<<PD4 ) |(1<<←
PD3 ) |(1<<PD2 )29 out DDRD , temp ; i n i t i a l i z e PD7 − PD2 f o r output30 ldi temp ,(1<<PC7 ) |(1<<PC6 ) |(1<<PC5 ) |(1<<PC4 )31 out DDRC , temp ; i n i t i a l i z e PC7−PC4 f o r output32 sei ; a c t i v a t e i n t e r r up t s33 rcall lcd_init
34
35 step1 :36 in r24 , PINB37 cpi r24 , 0 ; Check i f any Push button B i s pre s sed38 breq step1
39
40 ldi r24 , 0 x67 ; i n i t i a l i z e t imer f o r 8 . 4 seconds41 out TCNT1H , r2442 ldi r24 ,0 x69
50
43 out TCNT1L , r2444
45 step2 :46 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms47 rcall scan_keypad_rising_edge ; read from keyboard48 rcall keypad_to_ascii ; convert to ASCII49 cpi r24 , 050 breq step2
51 mov r18 , r24 ; save 1 s t input to r1852 rcall lcd_data ; p r i n t input to l cd53
54 step3 :55 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms56 rcall scan_keypad_rising_edge ; read from keyboard57 rcall keypad_to_ascii ; convert to ASCII58 cpi r24 , 059 breq step3
60 mov r19 , r24 ; save 2nd input to r1961 rcall lcd_data ; p r i n t input to l cd62
63 step4 :64 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms65 rcall scan_keypad_rising_edge ; read from keyboard66 rcall keypad_to_ascii ; convert to ASCII67 cpi r24 , 068 breq step4
69 mov r20 , r24 ; save 3 rd input to r2070 rcall lcd_data ; p r i n t input to l cd71
72 step5 :73 ldi r24 , 15 ; s c i n t i l l a t i o n time = 15 ms74 rcall scan_keypad_rising_edge ; read from keyboard75 rcall keypad_to_ascii ; convert to ASCII76 cpi r24 , 077 breq step5
78 mov r21 , r24 ; save 4 th input to r2179 rcall lcd_data ; p r i n t input to l cd80
81 check :82 cpi r18 , '0'83 brne alarm_on
84 cpi r19 , '9'85 brne alarm_on
51
86 cpi r20 , '4'87 brne alarm_on
88 cpi r21 , '2' ; i f password i s wrong go to almarm on89 brne alarm_on ; e l s e cont inue to a l a rm o f f90 cli ; d i s a b l e i n t e r r up t s91
92 alarm_off :93 rcall lcd_init ; i n i t i a l i z e LCD94 ldi r24 , 'A' ; p r i n t ALARM OFF95 rcall lcd_data
96 ldi r24 , 'L'97 rcall lcd_data
98 ldi r24 , 'A'99 rcall lcd_data
100 ldi r24 , 'R'101 rcall lcd_data
102 ldi r24 , 'M'103 rcall lcd_data
104 ldi r24 , 0 x20105 rcall lcd_data
106 ldi r24 , 'O'107 rcall lcd_data
108 ldi r24 , 'F'109 rcall lcd_data
110 ldi r24 , 'F'111 rcall lcd_data
112 rjmp end
113
114 timer1 :115 rjmp alarm_on ; i f time exp i red jump to alarm on116
117 alarm_on :118 rcall lcd_init ; i n i t i a l i z e LCD119 ldi r24 , 'A' ; p r i n t ALARM ON120 rcall lcd_data
121 ldi r24 , 'L'122 rcall lcd_data
123 ldi r24 , 'A'124 rcall lcd_data
125 ldi r24 , 'R'126 rcall lcd_data
127 ldi r24 , 'M'128 rcall lcd_data
52
129 ldi r24 , 0 x20130 rcall lcd_data
131 ldi r24 , 'O'132 rcall lcd_data
133 ldi r24 , 'N'134 rcall lcd_data
135 ser r24
136 out PORTA , r24 ; Act ivate PORTA l ed s137 rjmp end
138
139 end :140 ldi r25 , HIGH (5000)141 ldi r24 , LOW (5000) ; de lay 5000 ms142 rcall wait_msec
143 rjmp reset
144
145
146 scan_row :147 ldi r25 ,0 x08 ; i n i t i a l i z e us ing 00001000148 back_ :149 lsl r25 ; s h i f t l e f t r24 t imes150 dec r24
151 brne back_
152 out PORTC , r25153 nop
154 nop
155 in r24 , PINC156 andi r24 ,0 x0f157 ret
158
159 scan_keypad :160 ldi r24 ,0 x01161 rcall scan_row
162 swap r24
163 mov r27 , r24164 ldi r24 ,0 x02165 rcall scan_row
166 add r27 , r24167 ldi r24 ,0 x03168 rcall scan_row
169 swap r24
170 mov r26 , r24171 ldi r24 ,0 x04
53
172 rcall scan_row
173 add r26 , r24174 movw r24 , r26175 ret
176
177 scan_keypad_rising_edge :178 mov r22 , r24179 rcall scan_keypad
180 push r24
181 push r25
182 mov r24 , r22183 ldi r25 ,0184 rcall wait_msec
185 rcall scan_keypad
186 pop r23
187 pop r22
188 and r24 , r22189 and r25 , r23190 ldi r26 , low ( _tmp_ )191 ldi r27 , high ( _tmp_ )192 ld r23 ,X+193 ld r22 ,X194 st X , r24195 st −X , r25196 com r23
197 com r22
198 and r24 , r22199 and r25 , r23200 ret
201
202 keypad_to_ascii :203 movw r26 , r24204 ldi r24 , '*'205 sbrc r26 ,0206 ret
207 ldi r24 , '0'208 sbrc r26 ,1209 ret
210 ldi r24 , '#'211 sbrc r26 ,2212 ret
213 ldi r24 , 'D'214 sbrc r26 ,3
54
215 ret
216 ldi r24 , '7'217 sbrc r26 ,4218 ret
219 ldi r24 , '8'220 sbrc r26 ,5221 ret
222 ldi r24 , '9'223 sbrc r26 ,6224 ret
225 ldi r24 , 'C'226 sbrc r26 ,7227 ret
228 ldi r24 , '4'229 sbrc r27 ,0230 ret
231 ldi r24 , '5'232 sbrc r27 ,1233 ret
234 ldi r24 , '6'235 sbrc r27 ,2236 ret
237 ldi r24 , 'B'238 sbrc r27 ,3239 ret
240 ldi r24 , '1'241 sbrc r27 ,4242 ret
243 ldi r24 , '2'244 sbrc r27 ,5245 ret
246 ldi r24 , '3'247 sbrc r27 ,6248 ret
249 ldi r24 , 'A'250 sbrc r27 ,7251 ret
252 clr r24
253 ret
254
255 wait_usec :256 sbiw r24 ,1257 nop
55
258 nop
259 nop
260 nop
261 brne wait_usec
262 ret
263
264 wait_msec :265 push r24
266 push r25
267 ldi r24 , low (998)268 ldi r25 , high (998)269 rcall wait_usec
270 pop r25
271 pop r24
272 sbiw r24 , 1273 brne wait_msec
274 ret
275
276 lcd_init :277 ldi r24 ,40278 ldi r25 ,0279 rcall wait_msec
280 ldi r24 ,0 x30281 out PORTD , r24282 sbi PORTD , PD3283 cbi PORTD , PD3284 ldi r24 ,39285 ldi r25 ,0286 rcall wait_usec
287 ldi r24 ,0 x30288 out PORTD , r24289 sbi PORTD , PD3290 cbi PORTD , PD3291 ldi r24 ,39292 ldi r25 ,0293 rcall wait_usec
294 ldi r24 ,0 x20295 out PORTD , r24296 sbi PORTD , PD3297 cbi PORTD , PD3298 ldi r24 ,39299 ldi r25 ,0300 rcall wait_usec
56
301 ldi r24 ,0 x28302 rcall lcd_command
303 ldi r24 ,0 x0c304 rcall lcd_command
305 ldi r24 ,0 x01306 rcall lcd_command
307 ldi r24 , low (1530)308 ldi r25 , high (1530)309 rcall wait_usec
310 ldi r24 ,0 x06311 rcall lcd_command
312 ret
313
314 lcd_data :315 sbi PORTD , PD2316 rcall write_2_nibbles
317 ldi r24 ,43318 ldi r25 ,0319 rcall wait_usec
320 ret
321
322 lcd_command :323 cbi PORTD , PD2324 rcall write_2_nibbles
325 ldi r24 ,39326 ldi r25 ,0327 rcall wait_usec
328 ret
329
330 write_2_nibbles :331 push r24
332 in r25 , PIND333 andi r25 ,0 x0f334 andi r24 ,0 xf0335 add r24 , r25336 out PORTD , r24337 sbi PORTD , PD3338 cbi PORTD , PD3339 pop r24
340 swap r24
341 andi r24 ,0 xf0342 add r24 , r25343 out PORTD , r24
57
344 sbi PORTD , PD3345 cbi PORTD , PD3346 ret
3.3.5 3.6
1 .include "m16def.inc"
2 .def temp=r163 .def input=r174 .def sign=r185 .def hundreds=r196 .def dozens=r207 .def units=r218
9 .DSEG
10 _tmp_ : .byte 211
12 .CSEG
13 jmp reset
14
15 reset :16 ldi temp , LOW ( RAMEND ) ; i n i t i a l i z e s tack po in t e r17 out SPL , temp18 ldi temp , HIGH ( RAMEND )19 out SPH , temp20
21 clr temp ; temp = 0x0022 out DDRA , temp ; i n i t i a l i z e PORTA fo r input23 ldi temp , ( 1 << PD7 ) | ( 1 << PD6 ) | ( 1 << PD5 ) |(1<<PD4 ) |(1<<←
PD3 ) |(1<<PD2 )24 out DDRD , temp ; i n i t i a l i z e PD7 − PD2 f o r output25 in input , PINA ; read from PINA and save to input26 mov temp , input ; temp = input27 andi temp , $80 ; Mask to keep MSB28 cpi temp , $80 ; Check i f MSB = 129 breq minus ; IF MSB = 1 go to minus and s e t s i gn = ←
'− '30 ldi sign , '+' ; E l se s e t s i gn to +31 rjmp continue
32
33 minus :
58
34 ldi sign , '-'35 dec input ; convert from Two ' s complement36 com input ; to p o s i t i v e binary number37
38 continue :39 clr hundreds
40 clr dozens
41 clr units
42
43 step_hundreds : ; Check f o r hundreds44 cpi input , 100 ; I f the number has a hundred45 brlo step_dozens ; then hundred counter = 146 ldi hundreds , 1 ; e l s e go to s t ep dozens to count ←
dozens47 subi input , 10048
49 step_dozens : ; Count how many dozens has the input50 cpi input , 1051 brlo step_units
52 inc dozens
53 subi input , 1054 rjmp step_dozens
55
56 step_units :57 mov units , input58
59 ldi temp , 48 ; Convert them to ASCII code60 add hundreds , temp61 add dozens , temp62 add units , temp63
64 mov r24 , sign ; Move Sign to r24 in order to p r i n t i t65 rcall lcd_init
66 rcall lcd_data
67
68 mov r24 , hundreds69 rcall lcd_data
70 mov r24 , dozens71 rcall lcd_data
72 mov r24 , units73 rcall lcd_data
74 jmp reset
75
59
76
77 scan_row :78 ldi r25 ,0 x08 ; i n i t i a l i z e us ing 0000100079 back_ :80 lsl r25 ; s h i f t l e f t r24 t imes81 dec r24
82 brne back_
83 out PORTC , r2584 nop
85 nop
86 in r24 , PINC87 andi r24 ,0 x0f88 ret
89
90 scan_keypad :91 ldi r24 ,0 x0192 rcall scan_row
93 swap r24
94 mov r27 , r2495 ldi r24 ,0 x0296 rcall scan_row
97 add r27 , r2498 ldi r24 ,0 x0399 rcall scan_row
100 swap r24
101 mov r26 , r24102 ldi r24 ,0 x04103 rcall scan_row
104 add r26 , r24105 movw r24 , r26106 ret
107
108 scan_keypad_rising_edge :109 mov r22 , r24110 rcall scan_keypad
111 push r24
112 push r25
113 mov r24 , r22114 ldi r25 ,0115 rcall wait_msec
116 rcall scan_keypad
117 pop r23
118 pop r22
60
119 and r24 , r22120 and r25 , r23121 ldi r26 , low ( _tmp_ )122 ldi r27 , high ( _tmp_ )123 ld r23 ,X+124 ld r22 ,X125 st X , r24126 st −X , r25127 com r23
128 com r22
129 and r24 , r22130 and r25 , r23131 ret
132
133 keypad_to_ascii :134 movw r26 , r24135 ldi r24 , '*'136 sbrc r26 ,0137 ret
138 ldi r24 , '0'139 sbrc r26 ,1140 ret
141 ldi r24 , '#'142 sbrc r26 ,2143 ret
144 ldi r24 , 'D'145 sbrc r26 ,3146 ret
147 ldi r24 , '7'148 sbrc r26 ,4149 ret
150 ldi r24 , '8'151 sbrc r26 ,5152 ret
153 ldi r24 , '9'154 sbrc r26 ,6155 ret
156 ldi r24 , 'C'157 sbrc r26 ,7158 ret
159 ldi r24 , '4'160 sbrc r27 ,0161 ret
61
162 ldi r24 , '5'163 sbrc r27 ,1164 ret
165 ldi r24 , '6'166 sbrc r27 ,2167 ret
168 ldi r24 , 'B'169 sbrc r27 ,3170 ret
171 ldi r24 , '1'172 sbrc r27 ,4173 ret
174 ldi r24 , '2'175 sbrc r27 ,5176 ret
177 ldi r24 , '3'178 sbrc r27 ,6179 ret
180 ldi r24 , 'A'181 sbrc r27 ,7182 ret
183 clr r24
184 ret
185
186 wait_usec :187 sbiw r24 ,1188 nop
189 nop
190 nop
191 nop
192 brne wait_usec
193 ret
194
195 wait_msec :196 push r24
197 push r25
198 ldi r24 , low (998)199 ldi r25 , high (998)200 rcall wait_usec
201 pop r25
202 pop r24
203 sbiw r24 , 1204 brne wait_msec
62
205 ret
206
207 lcd_init :208 ldi r24 ,40209 ldi r25 ,0210 rcall wait_msec
211 ldi r24 ,0 x30212 out PORTD , r24213 sbi PORTD , PD3214 cbi PORTD , PD3215 ldi r24 ,39216 ldi r25 ,0217 rcall wait_usec
218 ldi r24 ,0 x30219 out PORTD , r24220 sbi PORTD , PD3221 cbi PORTD , PD3222 ldi r24 ,39223 ldi r25 ,0224 rcall wait_usec
225 ldi r24 ,0 x20226 out PORTD , r24227 sbi PORTD , PD3228 cbi PORTD , PD3229 ldi r24 ,39230 ldi r25 ,0231 rcall wait_usec
232 ldi r24 ,0 x28233 rcall lcd_command
234 ldi r24 ,0 x0c235 rcall lcd_command
236 ldi r24 ,0 x01237 rcall lcd_command
238 ldi r24 , low (1530)239 ldi r25 , high (1530)240 rcall wait_usec
241 ldi r24 ,0 x06242 rcall lcd_command
243 ret
244
245 lcd_data :246 sbi PORTD , PD2247 rcall write_2_nibbles
63
248 ldi r24 ,43249 ldi r25 ,0250 rcall wait_usec
251 ret
252
253 lcd_command :254 cbi PORTD , PD2255 rcall write_2_nibbles
256 ldi r24 ,39257 ldi r25 ,0258 rcall wait_usec
259 ret
260
261 write_2_nibbles :262 push r24
263 in r25 , PIND264 andi r25 ,0 x0f265 andi r24 ,0 xf0266 add r24 , r25267 out PORTD , r24268 sbi PORTD , PD3269 cbi PORTD , PD3270 pop r24
271 swap r24
272 andi r24 ,0 xf0273 add r24 , r25274 out PORTD , r24275 sbi PORTD , PD3276 cbi PORTD , PD3277 ret
4 Instruction-Set
64
100856I–AVR–07/10
AVR Instruction Set
Conditional Branch Summary
Note: 1. Interchange Rd and Rr in the operation before the test, i.e., CP Rd,Rr → CP Rr,Rd
Test Boolean Mnemonic Complementary Boolean Mnemonic Comment
Rd > Rr Z•(N ⊕ V) = 0 BRLT(1) Rd ≤ Rr Z+(N ⊕ V) = 1 BRGE* Signed
Rd Rr (N ⊕ V) = 0 BRGE Rd < Rr (N ⊕ V) = 1 BRLT Signed
Rd = Rr Z = 1 BREQ Rd ≠ Rr Z = 0 BRNE Signed
Rd ≤ Rr Z+(N ⊕ V) = 1 BRGE(1) Rd > Rr Z•(N ⊕ V) = 0 BRLT* Signed
Rd < Rr (N ⊕ V) = 1 BRLT Rd ≥ Rr (N ⊕ V) = 0 BRGE Signed
Rd > Rr C + Z = 0 BRLO(1) Rd ≤ Rr C + Z = 1 BRSH* Unsigned
Rd Rr C = 0 BRSH/BRCC Rd < Rr C = 1 BRLO/BRCS Unsigned
Rd = Rr Z = 1 BREQ Rd ≠ Rr Z = 0 BRNE Unsigned
Rd ≤ Rr C + Z = 1 BRSH(1) Rd > Rr C + Z = 0 BRLO* Unsigned
Rd < Rr C = 1 BRLO/BRCS Rd ≥ Rr C = 0 BRSH/BRCC Unsigned
Carry C = 1 BRCS No carry C = 0 BRCC Simple
Negative N = 1 BRMI Positive N = 0 BRPL Simple
Overflow V = 1 BRVS No overflow V = 0 BRVC Simple
Zero Z = 1 BREQ Not zero Z = 0 BRNE Simple
110856I–AVR–07/10
AVR Instruction Set
Complete Instruction Set Summary
Instruction Set Summary
Mnemonics Operands Description Operation Flags #Clocks#ClocksXMEGA
Arithmetic and Logic Instructions
ADD Rd, Rr Add without Carry Rd ← Rd + Rr Z,C,N,V,S,H 1
ADC Rd, Rr Add with Carry Rd ← Rd + Rr + C Z,C,N,V,S,H 1
ADIW(1) Rd, K Add Immediate to Word Rd ← Rd + 1:Rd + K Z,C,N,V,S 2
SUB Rd, Rr Subtract without Carry Rd ← Rd - Rr Z,C,N,V,S,H 1
SUBI Rd, K Subtract Immediate Rd ← Rd - K Z,C,N,V,S,H 1
SBC Rd, Rr Subtract with Carry Rd ← Rd - Rr - C Z,C,N,V,S,H 1
SBCI Rd, K Subtract Immediate with Carry Rd ← Rd - K - C Z,C,N,V,S,H 1
SBIW(1) Rd, K Subtract Immediate from Word Rd + 1:Rd ← Rd + 1:Rd - K Z,C,N,V,S 2
AND Rd, Rr Logical AND Rd ← Rd • Rr Z,N,V,S 1
ANDI Rd, K Logical AND with Immediate Rd ← Rd • K Z,N,V,S 1
OR Rd, Rr Logical OR Rd ← Rd v Rr Z,N,V,S 1
ORI Rd, K Logical OR with Immediate Rd ← Rd v K Z,N,V,S 1
EOR Rd, Rr Exclusive OR Rd ← Rd ⊕ Rr Z,N,V,S 1
COM Rd One’s Complement Rd ← $FF - Rd Z,C,N,V,S 1
NEG Rd Two’s Complement Rd ← $00 - Rd Z,C,N,V,S,H 1
SBR Rd,K Set Bit(s) in Register Rd ← Rd v K Z,N,V,S 1
CBR Rd,K Clear Bit(s) in Register Rd ← Rd • ($FFh - K) Z,N,V,S 1
INC Rd Increment Rd ← Rd + 1 Z,N,V,S 1
DEC Rd Decrement Rd ← Rd - 1 Z,N,V,S 1
TST Rd Test for Zero or Minus Rd ← Rd • Rd Z,N,V,S 1
CLR Rd Clear Register Rd ← Rd ⊕ Rd Z,N,V,S 1
SER Rd Set Register Rd ← $FF None 1
MUL(1) Rd,Rr Multiply Unsigned R1:R0 ← Rd x Rr (UU) Z,C 2
MULS(1) Rd,Rr Multiply Signed R1:R0 ← Rd x Rr (SS) Z,C 2
MULSU(1) Rd,Rr Multiply Signed with Unsigned R1:R0 ← Rd x Rr (SU) Z,C 2
FMUL(1) Rd,Rr Fractional Multiply Unsigned R1:R0 ← Rd x Rr<<1 (UU) Z,C 2
FMULS(1) Rd,Rr Fractional Multiply Signed R1:R0 ← Rd x Rr<<1 (SS) Z,C 2
FMULSU(1) Rd,Rr Fractional Multiply Signed with Unsigned R1:R0 ← Rd x Rr<<1 (SU) Z,C 2
DES K Data Encryption if (H = 0) then R15:R0else if (H = 1) then R15:R0
←←
Encrypt(R15:R0, K)Decrypt(R15:R0, K)
1/2
Branch Instructions
RJMP k Relative Jump PC ← PC + k + 1 None 2
IJMP(1) Indirect Jump to (Z) PC(15:0)PC(21:16)
←←
Z,0
None 2
EIJMP(1) Extended Indirect Jump to (Z) PC(15:0)PC(21:16)
←←
Z,EIND
None 2
JMP(1) k Jump PC ← k None 3
120856I–AVR–07/10
AVR Instruction Set
RCALL k Relative Call Subroutine PC ← PC + k + 1 None 3 / 4(3)(5) 2 / 3(3)
ICALL(1) Indirect Call to (Z) PC(15:0)PC(21:16)
←←
Z,0
None 3 / 4(3) 2 / 3(3)
EICALL(1) Extended Indirect Call to (Z) PC(15:0)PC(21:16)
←←
Z,EIND
None 4 (3) 3 (3)
CALL(1) k call Subroutine PC ← k None 4 / 5(3) 3 / 4(3)
RET Subroutine Return PC ← STACK None 4 / 5(3)
RETI Interrupt Return PC ← STACK I 4 / 5(3)
CPSE Rd,Rr Compare, Skip if Equal if (Rd = Rr) PC ← PC + 2 or 3 None 1 / 2 / 3
CP Rd,Rr Compare Rd - Rr Z,C,N,V,S,H 1
CPC Rd,Rr Compare with Carry Rd - Rr - C Z,C,N,V,S,H 1
CPI Rd,K Compare with Immediate Rd - K Z,C,N,V,S,H 1
SBRC Rr, b Skip if Bit in Register Cleared if (Rr(b) = 0) PC ← PC + 2 or 3 None 1 / 2 / 3
SBRS Rr, b Skip if Bit in Register Set if (Rr(b) = 1) PC ← PC + 2 or 3 None 1 / 2 / 3
SBIC A, b Skip if Bit in I/O Register Cleared if (I/O(A,b) = 0) PC ← PC + 2 or 3 None 1 / 2 / 3 2 / 3 / 4
SBIS A, b Skip if Bit in I/O Register Set If (I/O(A,b) =1) PC ← PC + 2 or 3 None 1 / 2 / 3 2 / 3 / 4
BRBS s, k Branch if Status Flag Set if (SREG(s) = 1) then PC ← PC + k + 1 None 1 / 2
BRBC s, k Branch if Status Flag Cleared if (SREG(s) = 0) then PC ← PC + k + 1 None 1 / 2
BREQ k Branch if Equal if (Z = 1) then PC ← PC + k + 1 None 1 / 2
BRNE k Branch if Not Equal if (Z = 0) then PC ← PC + k + 1 None 1 / 2
BRCS k Branch if Carry Set if (C = 1) then PC ← PC + k + 1 None 1 / 2
BRCC k Branch if Carry Cleared if (C = 0) then PC ← PC + k + 1 None 1 / 2
BRSH k Branch if Same or Higher if (C = 0) then PC ← PC + k + 1 None 1 / 2
BRLO k Branch if Lower if (C = 1) then PC ← PC + k + 1 None 1 / 2
BRMI k Branch if Minus if (N = 1) then PC ← PC + k + 1 None 1 / 2
BRPL k Branch if Plus if (N = 0) then PC ← PC + k + 1 None 1 / 2
BRGE k Branch if Greater or Equal, Signed if (N ⊕ V= 0) then PC ← PC + k + 1 None 1 / 2
BRLT k Branch if Less Than, Signed if (N ⊕ V= 1) then PC ← PC + k + 1 None 1 / 2
BRHS k Branch if Half Carry Flag Set if (H = 1) then PC ← PC + k + 1 None 1 / 2
BRHC k Branch if Half Carry Flag Cleared if (H = 0) then PC ← PC + k + 1 None 1 / 2
BRTS k Branch if T Flag Set if (T = 1) then PC ← PC + k + 1 None 1 / 2
BRTC k Branch if T Flag Cleared if (T = 0) then PC ← PC + k + 1 None 1 / 2
BRVS k Branch if Overflow Flag is Set if (V = 1) then PC ← PC + k + 1 None 1 / 2
BRVC k Branch if Overflow Flag is Cleared if (V = 0) then PC ← PC + k + 1 None 1 / 2
BRIE k Branch if Interrupt Enabled if (I = 1) then PC ← PC + k + 1 None 1 / 2
BRID k Branch if Interrupt Disabled if (I = 0) then PC ← PC + k + 1 None 1 / 2
Data Transfer Instructions
MOV Rd, Rr Copy Register Rd ← Rr None 1
MOVW(1) Rd, Rr Copy Register Pair Rd+1:Rd ← Rr+1:Rr None 1
LDI Rd, K Load Immediate Rd ← K None 1
LDS(1) Rd, k Load Direct from data space Rd ← (k) None 1(5)/2(3) 2(3)(4)
LD(2) Rd, X Load Indirect Rd ← (X) None 1(5)2(3) 1(3)(4)
Mnemonics Operands Description Operation Flags #Clocks#ClocksXMEGA
130856I–AVR–07/10
AVR Instruction Set
LD(2) Rd, X+ Load Indirect and Post-Increment RdX
←←
(X)X + 1
None 2(3) 1(3)(4)
LD(2) Rd, -X Load Indirect and Pre-Decrement X ← X - 1,Rd ← (X)
←←
X - 1(X)
None 2(3)/3(5) 2(3)(4)
LD(2) Rd, Y Load Indirect Rd ← (Y) ← (Y) None 1(5)/2(3) 1(3)(4)
LD(2) Rd, Y+ Load Indirect and Post-Increment RdY
←←
(Y)Y + 1
None 2(3) 1(3)(4)
LD(2) Rd, -Y Load Indirect and Pre-Decrement YRd
←←
Y - 1(Y)
None 2(3)/3(5) 2(3)(4)
LDD(1) Rd, Y+q Load Indirect with Displacement Rd ← (Y + q) None 2(3) 2(3)(4)
LD(2) Rd, Z Load Indirect Rd ← (Z) None 1(5)/2(3) 1(3)(4)
LD(2) Rd, Z+ Load Indirect and Post-Increment RdZ
←←
(Z),Z+1
None 2(3) 1(3)(4)
LD(2) Rd, -Z Load Indirect and Pre-Decrement ZRd
←←
Z - 1,(Z)
None 2(3)/3(5) 2(3)(4)
LDD(1) Rd, Z+q Load Indirect with Displacement Rd ← (Z + q) None 2(3) 2(3)(4)
STS(1) k, Rr Store Direct to Data Space (k) ← Rd None 1(5)/2(3) 2(3)
ST(2) X, Rr Store Indirect (X) ← Rr None 1(5)/2(3) 1(3)
ST(2) X+, Rr Store Indirect and Post-Increment (X)X
←←
Rr,X + 1
None 1(5)/2(3) 1(3)
ST(2) -X, Rr Store Indirect and Pre-Decrement X(X)
←←
X - 1,Rr
None 2(3) 2(3)
ST(2) Y, Rr Store Indirect (Y) ← Rr None 1(5)/2(3) 1(3)
ST(2) Y+, Rr Store Indirect and Post-Increment (Y)Y
←←
Rr,Y + 1
None 1(5)/2(3) 1(3)
ST(2) -Y, Rr Store Indirect and Pre-Decrement Y(Y)
←←
Y - 1,Rr
None 2(3) 2(3)
STD(1) Y+q, Rr Store Indirect with Displacement (Y + q) ← Rr None 2(3) 2(3)
ST(2) Z, Rr Store Indirect (Z) ← Rr None 1(5)/2(3) 1(3)
ST(2) Z+, Rr Store Indirect and Post-Increment (Z)Z
←←
RrZ + 1
None 1(5)/2(3) 1(3)
ST(2) -Z, Rr Store Indirect and Pre-Decrement Z ← Z - 1 None 2(3) 2(3)
STD(1) Z+q,Rr Store Indirect with Displacement (Z + q) ← Rr None 2(3) 2(3)
LPM(1)(2) Load Program Memory R0 ← (Z) None 3 3
LPM(1)(2) Rd, Z Load Program Memory Rd ← (Z) None 3 3
LPM(1)(2) Rd, Z+ Load Program Memory and Post-Increment
RdZ
←←
(Z),Z + 1
None 3 3
ELPM(1) Extended Load Program Memory R0 ← (RAMPZ:Z) None 3
ELPM(1) Rd, Z Extended Load Program Memory Rd ← (RAMPZ:Z) None 3
ELPM(1) Rd, Z+ Extended Load Program Memory and Post-Increment
RdZ
←←
(RAMPZ:Z),Z + 1
None 3
SPM(1) Store Program Memory (RAMPZ:Z) ← R1:R0 None - -
SPM(1) Z+ Store Program Memory and Post-Increment by 2
(RAMPZ:Z)Z
←←
R1:R0,Z + 2
None - -
IN Rd, A In From I/O Location Rd ← I/O(A) None 1
OUT A, Rr Out To I/O Location I/O(A) ← Rr None 1
PUSH(1) Rr Push Register on Stack STACK ← Rr None 2 1(3)
POP(1) Rd Pop Register from Stack Rd ← STACK None 2 2(3)
Mnemonics Operands Description Operation Flags #Clocks#ClocksXMEGA
140856I–AVR–07/10
AVR Instruction Set
XCH Z, Rd Exchange (Z)Rd
←←
Rd,(Z)
None 1
LAS Z, Rd Load and Set (Z)Rd
←←
Rd v (Z)(Z)
None 1
LAC Z, Rd Load and Clear (Z)Rd
←←
($FF – Rd) • (Z)(Z)
None 1
LAT Z, Rd Load and Toggle (Z)Rd
←←
Rd ⊕ (Z)(Z)
None 1
Bit and Bit-test Instructions
LSL Rd Logical Shift Left Rd(n+1)Rd(0)
C
←←←
Rd(n),0,Rd(7)
Z,C,N,V,H 1
LSR Rd Logical Shift Right Rd(n)Rd(7)
C
←←←
Rd(n+1),0,Rd(0)
Z,C,N,V 1
ROL Rd Rotate Left Through Carry Rd(0)Rd(n+1)
C
←←←
C,Rd(n),Rd(7)
Z,C,N,V,H 1
ROR Rd Rotate Right Through Carry Rd(7)Rd(n)
C
←←←
C,Rd(n+1),Rd(0)
Z,C,N,V 1
ASR Rd Arithmetic Shift Right Rd(n) ← Rd(n+1), n=0..6 Z,C,N,V 1
SWAP Rd Swap Nibbles Rd(3..0) ↔ Rd(7..4) None 1
BSET s Flag Set SREG(s) ← 1 SREG(s) 1
BCLR s Flag Clear SREG(s) ← 0 SREG(s) 1
SBI A, b Set Bit in I/O Register I/O(A, b) ← 1 None 1(5)2 1
CBI A, b Clear Bit in I/O Register I/O(A, b) ← 0 None 1(5)/2 1
BST Rr, b Bit Store from Register to T T ← Rr(b) T 1
BLD Rd, b Bit load from T to Register Rd(b) ← T None 1
SEC Set Carry C ← 1 C 1
CLC Clear Carry C ← 0 C 1
SEN Set Negative Flag N ← 1 N 1
CLN Clear Negative Flag N ← 0 N 1
SEZ Set Zero Flag Z ← 1 Z 1
CLZ Clear Zero Flag Z ← 0 Z 1
SEI Global Interrupt Enable I ← 1 I 1
CLI Global Interrupt Disable I ← 0 I 1
SES Set Signed Test Flag S ← 1 S 1
CLS Clear Signed Test Flag S ← 0 S 1
SEV Set Two’s Complement Overflow V ← 1 V 1
CLV Clear Two’s Complement Overflow V ← 0 V 1
SET Set T in SREG T ← 1 T 1
CLT Clear T in SREG T ← 0 T 1
SEH Set Half Carry Flag in SREG H ← 1 H 1
CLH Clear Half Carry Flag in SREG H ← 0 H 1
MCU Control Instructions
BREAK(1) Break (See specific descr. for BREAK) None 1
Mnemonics Operands Description Operation Flags #Clocks#ClocksXMEGA
150856I–AVR–07/10
AVR Instruction Set
Notes: 1. This instruction is not available in all devices. Refer to the device specific instruction set summary.2. Not all variants of this instruction are available in all devices. Refer to the device specific instruction set summary.3. Cycle times for Data memory accesses assume internal memory accesses, and are not valid for accesses via the external
RAM interface.4. One extra cycle must be added when accessing Internal SRAM.5. Number of clock cycles for Reduced Core tinyAVR.
NOP No Operation None 1
SLEEP Sleep (see specific descr. for Sleep) None 1
WDR Watchdog Reset (see specific descr. for WDR) None 1
Mnemonics Operands Description Operation Flags #Clocks#ClocksXMEGA
Εθνικό Μετσόβιο Πολυτεχνείο
Συστήματα Μικρουπολογιστών
Θεωρία
Contents
1 MicroControllers Vs MicroProccessors 21.1 Generally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3 Introduction Slides . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Memories 352.1 EEPROM VS FLASH . . . . . . . . . . . . . . . . . . . . . . 362.2 Introduction Slides . . . . . . . . . . . . . . . . . . . . . . . . 37
3 Circuit Design Techniques for Low Power 53
1
1 MicroControllers Vs MicroProccessors
1.1 Generally
The term microprocessor and microcontroller have always been confused witheach other. Both of them have been designed for real time application. Theyshare many common features and at the same time they have significant dif-ferences. Both the IC’s i.e., the microprocessor and microcontroller cannotbe distinguished by looking at them. They are available in different versionstarting from 6 pin to as high as 80 to 100 pins or even higher depending onthe features.
Difference between microprocessor and microcontroller Microprocessor is anIC which has only the CPU inside them i.e. only the processing powers suchas Intel’s Pentium 1,2,3,4, core 2 duo, i3, i5 etc. These microprocessors don’thave RAM, ROM, and other peripheral on the chip. A system designer hasto add them externally to make them functional. Application of micropro-cessor includes Desktop PC’s, Laptops, notepads etc.
But this is not the case with Microcontrollers. Microcontroller has a CPU,in addition with a fixed amount of RAM, ROM and other peripherals allembedded on a single chip. At times it is also termed as a mini computer ora computer on a single chip. Today different manufacturers produce micro-controllers with a wide range of features available in different versions. Somemanufacturers are ATMEL, Microchip, TI, Freescale, Philips, Motorola etc.
Microcontrollers are designed to perform specific tasks. Specific meansapplications where the relationship of input and output is defined. Depend-ing on the input, some processing needs to be done and output is delivered.For example, keyboards, mouse, washing machine, digicam, pendrive, re-mote, microwave, cars, bikes, telephone, mobiles, watches, etc. Since theapplications are very specific, they need small resources like RAM, ROM,I/O ports etc and hence can be embedded on a single chip. This in turnreduces the size and the cost.
Microprocessor find applications where tasks are unspecific like develop-ing software, games, websites, photo editing, creating documents etc. Insuch cases the relationship between input and output is not defined. Theyneed high amount of resources like RAM, ROM, I/O ports etc. The clockspeed of the Microprocessor is quite high as compared to the microcontroller.Whereas the microcontrollers operate from a few MHz to 30 to 50 MHz, to-
2
day’s microprocessor operate above 1GHz as they perform complex tasks.Read more about what is microcontroller.
Comparing microcontroller and microprocessor in terms of cost is not jus-tified. Undoubtedly a microcontroller is far cheaper than a microprocessor.However microcontroller cannot be used in place of microprocessor and usinga microprocessor is not advised in place of a microcontroller as it makes theapplication quite costly. Microprocessor cannot be used stand alone. Theyneed other peripherals like RAM, ROM, buffer, I/O ports etc and hence asystem designed around a microprocessor is quite costly.
1.2 Differences
Architecture: Most of the microprocessors use CISC and Von-Neumannarchitecture. There microprocessors used Harvard and RISC also. But pop-ularly microprocessor uses CISC. Where as Microcontroller uses RISC andHarvard architecture. But there are some microcontroller uses CISC archi-tecture like 8051 and SHARC. Microprocessor has ROM, RAM, secondarystorage memory I/O peripherals, timers; counters etc are placed on a boardand connected through buses where as in the microcontroller all these pe-ripherals are combined in a single integrated circuit (IC).CPU Speed: Processors are more speed than controllers because of theclock. Processors can have high clock rate, even if they become heat due toover clock rate the heat sink will stop from over heating. Controllers maybe slow when compared to the processors but they are reliably fast. Theexecution speed will always depends up on the clock. If we take the overallperformance and application execution speed microcontroller will be fast be-cause all the peripherals are inbuilt. Processors will be slow because it hasget every resource from outside of the cpu through busesDesign Time: The design an application microcontroller will take less timewhen compared to the processor. The interfacing between the peripheralsand programming them will be easy when compared to the processor.Protection: if you programmed the microcontroller it is hard to get theprogram from the Rom by other users. The rom will be locked and it is veryhard to retrieve the program from the rom of microcontroller. Processor willnot give that much protection to its program. Cost: cost of microprocessorsand implementing microprocessor based systems will be costly when com-pared to the microcontroller based system. The microprocessor system willnever be a compact system. Most of the microcontroller based systems arecompact systemsApplications: processors are mainly used in computation systems, defense
3
systems, network communications etc. microcontrollers are mainly used inembedded application like watches, cellphone, mp3 player, etc.
1.3 Introduction Slides
4
2 Memories
35
2.1 EEPROM VS FLASH
FLASH - A special type of EEPROM that can be erased and reprogrammedin blocks instead of one byte at a time.The principal difference is that EEPROM requires data to be written orerased one byte at a time whereas flash memory allows data to be written orerased in blocks. This makes flash memory faster.
Electronically Erasable Programmable Read Only Memory (EEPROM) andflash memory have much in common. Both EEPROM and flash memory arebuilt on a chip format, can store data that can be erased and rewritten, anduse the same floating-gate transistor technology. While it is correct to statethat flash memory is a type of EEPROM, the terms EEPROM and flashmemory usually describe different devices.EEPROM, in general terms, refers to any type of data memory device thatcan have digital data written to it and erased through use of an electronicdevice of some type. This is in contrast to Erasable Programmable ReadOnly Memory (EPROM), which must be physically removed and erased viaa non-electronic method, such as with ultraviolet light. As the write anderase executions of flash memory are performed with a computer, flash mem-ory is, by definition, EEPROM.Even though flash memory is a type of EEPROM, the two terms usuallydescribe very different types of devices. For example, EEPROM is typi-cally incorporated into a larger integrated circuit (IC). It serves the func-tion of storing various pieces of data that the rest of the IC needs in order toaccomplish its purpose. EEPROM does this by storing data in small blocks,usually only a single byte in length.Flash memory, on the other hand, typically sees use in stand-alonememory storage devices, such as USB drives or camera memory cards, andstores computer user files. To do this, the data is organized into large blocks,each containing many bytes of data. These large blocks can be accessed anderased much faster than single-byte blocks of data. This far greater speed inhandling data is where flash memory derives its name.EEPROM and flash memory both use floating-gate transistors to store data.As a result, both forms of memory are non-volatile. Non-volatile refers tomemory that can continue to store data even when there is no power avail-able. This is in contrast to other types of memory, such as computer randomaccess memory, that dump all stored data as soon as power is removed.Another shared attribute of floating-gate transistor based technologies is thelimited life cycle of the transistors due to a phenomenon called memory wear.Each time data is written or erased from these devices, a little more wear
36
occurs. Eventually, after 10,000 to 100,000 cycles, the transistors will beginto fail. While EEPROM contains operational data that seldom changes, datastored on flash memory is often changed. Therefore, while both EEPROMand flash memory experience memory wear, it typically has a much greatereffect on flash memory.
2.2 Introduction Slides
37
3 Circuit Design Techniques for Low Power
Voltage ScalingVoltage scaling is the easiest and most effective way of controlling power.Adjustments to the operating voltage affect the delay in a linear manner,while having a quadratic effect on the power. The most common techniqueis to architecturally increase the performance of a system, and then lower thevoltage for a reduction in the power consumption (see parallelisim below.)
Transistor SizingThis technique directly trades speed for power. Decreasing the size of thetransistor lowers power requirements and decreases the current drive, therebymaking the gates slower. Increasing the size of non-critical path transistorscan decrease power while not effecting the delay. This is difficult to imple-ment in synthesis tools, however, and thus is not a widely-used technique.
Adiabatic CircuitsAdiabatic circuits are also known as charge recovery circuits. They resonatethe load capacitance with an inductor in order to recover some of the energyused to change the capacitor’s voltage. This is not a widely used techniquebecause it introduces substantial delay.
Technology ScalingTechnology shrinks cause the capacitance of nets to decrease. This decreasein capacitance results in not only the performance of a design increasing,but also in a reduction of the power requirements. This is not so muchof a technique as an effect that occurs with the passage of time. Whilemaintaining constant performance, the power dissipation of a circut is relatedto x4 where x is the ratio of the process shrink.
Transition ReductionIn static CMOS design, a transition on a bit line is the fundamental event thatuses power. Gating clocks to functional blocks is one common and effectivemethod for reducing unnecssary switching. It is also theoretically possibleto synthesize circuits so as to reduce the number of spurious transitions, butthis is difficult and hard to achieve in practice.
ParallelismParallelism can be used in a system to increase overall performance. Thevoltage of the system can then be reduced, lowering the performance tooriginal levels, and lowering the power consumed even further. There is anoverhead incurred with adding parallelism (control, inefficency) so this isnot always a win-win situation. (For example, the overhead of super-scalaroperation makes it poor for power-reduction.)
53