Σημειωσεις Μικρουπολογιστων 1 Συστηματα...

233
Εθνικό Μετσόβιο Πολυτεχνείο Συστήmατα Μικρουπολογιστών Σηmειώσεις Εξέτασης

description

Συστηματα Μικρουπολογιστων 1

Transcript of Σημειωσεις Μικρουπολογιστων 1 Συστηματα...

Page 1: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εθνικό Μετσόβιο Πολυτεχνείο

Συστήματα Μικρουπολογιστών

Σημειώσεις Εξέτασης

Page 2: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εθνικό Μετσόβιο Πολυτεχνείο

Συστήματα Μικρουπολογιστών

8085

Page 3: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 4: Σημειωσεις Μικρουπολογιστων 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

Page 5: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 6: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 7: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 8: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 9: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 10: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 11: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 12: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 13: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 14: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 15: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

2 SIM

3 EI

13

Page 16: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 17: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 18: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 19: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

62 STA 3000H63 JMP START

64

65 END

3 2nd Series 2011

17

Page 20: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝΑΚΑΔ. ΕΤΟΣ 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 και την ανάγκη για διευθυνσιοδότηση με το σχήμα Διεύθυνση- Γραμμής και μετά Διεύθυνση-Στήλης του πίνακα μνήμης.

Page 21: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 22: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 23: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 24: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 25: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 26: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 27: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

ΘεωρίαΆσκηση 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

Page 28: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 29: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 30: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Προφανώς τέτοια λειτουργία του μΥ - Σ κρίνεται απαράδεκτη. Επόμένως τα Χ του Α λαμβάνονται ίσα με 1 καιτο Α = A12A13. Για τις άλλες δύο εισόδους, Β, C μετά από πράξεις και μεθόδους της σχεδίασης λογικών κυκλωμάτωνπροκύπτουν,

Β = A13 και C = A12 + A11A13. Όλα τα παραπάνω τελικά οδηγούν στην ακόλουθη σχεδίαση.

8

Page 31: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Άσκηση 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

Page 32: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ξεκάθαρα το ασυμπτωτικό όριο της τιμής του Ι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

Page 33: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Οι τεχνολογίες υπερέχουν η μία της άλλης - Συντελεστής υπεροχήςΤο κόστος κάθε τεχνολογίας εξαρτάται πλέον κι από έναν συντελεστή, τον συντελεστή υπεροχής( ΣΥ). Από τα

δεδομένα λοιπόν της άσκησης η συνάρτηση κόστους Κ = Κ( 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

Page 34: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 35: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

4 3rd Series 2011

33

Page 36: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΑΚΑΔ. ΕΤΟΣ 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.

Page 37: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Θεωρητικές Ασκήσεις 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 Προαιρετικές

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

Page 38: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 39: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 40: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 41: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 42: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 43: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 44: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 45: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 46: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 47: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 48: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 49: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 50: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 51: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 52: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 53: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 54: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 55: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 56: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

ΘεωρίαΆσκηση 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

Page 57: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Τα Χ στον πίνακα αληθείας αναφέρονται σεΠίνακας Αληθείαςα/α 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

Page 58: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Τέλος για την είσοδο και την έξοδο του συστήματος απορρέει ο χάρτης μνήμης,

Διευθύνσεις 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

Page 59: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Τα bits χωρίζονται σε τρεις ομάδες, κάθε μια εκ των οποίων χρωματίζεται διαφορετικά. Η πράσινη ομάδα χρησιμεύειως είσοδος επίτρεψης όπως φαίνεται λεπτομερέστερα στο σχήμα.Η μπλε ομάδα χρειάζεται ώστε μετά την αποκωδικοποίησηνα επιλέγεται η σωστή θύρα σύμφωνα με τις τιμές των A13, A14. Τέλος, η κόκκινη ομάδα καθορίζει τις τιμές στη είσοδοτου αποκωδικοποιητή. Διευκρινίζεται πως το σχήμα που αφορά στην Ε/Ε, ως κύκλωμα βρίσκεται μαζί με το υπόλοιποκύκλωμα που παρουσιάζεται παραπάνω. Η ξεχωριστή παρουσίαση έγινε για να δοθεί η προσοχή που αρμόζει σε κάθεμέρος του μΥ συστήματος.

18

Page 60: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Άσκηση 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

Page 61: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

5 Exam Exercises

5.1 2002

59

Page 62: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΑΘΗΝΑ 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

Page 63: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΘΕΜΑ 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

ΟΧΙ

ΝΑΙ

ΝΑΙ

ΟΧΙ

ΟΧΙ

ΝΑΙ

ΝΑΙ

ΟΧΙ

ΟΧΙ

ΝΑΙ

Page 64: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

5.2 2004

62

Page 65: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΕΜΠ - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΑΘΗΝΑ 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

Page 66: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΘΕΜΑ 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

Page 67: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

5.3 2006

65

Page 68: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε .Μ .Π . - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧ. & ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΥΠΟΛΟΓΙΣΤΩΝ ΑΘΗΝΑ 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 ; επαναφέρει στο Κύριο Πρόγραμμα

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

Page 69: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

μΥ- 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 ; Επαναφέρει στο Κύριο Πρόγραμμα

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

Page 70: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

(γ) Να δημιουργηθούν οι παραπάνω κυματομορφές με τις προϋποθέσεις του ερωτήματος (α) χωρίς τη χρήση χρονοκαθυστέρηση αλλά με την αξιοποίηση ενός εξωτερικού χρονιστή που θεωρούμε ότι προκαλεί διακοπές 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 ; επαναφέρει στο Κύριο Πρόγραμμα

Το βασικό πλεονέκτημα αυτού του σχήματος είναι ότι δεν αναλώνεται η υπολογιστική ισχύς του μΥ-Σ στην υλοποίηση χρονοκαθυστερήσεων. Το μοναδικό μειονέκτημα είναι ότι απαιτείται η χρήση χρονιστή. Αυτό στους μικροελεγκτές δεν είναι πρόβλημα γιατί έχει προβλεφθεί να τον περιλαμβάνουν.

Page 71: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εθνικό Μετσόβιο Πολυτεχνείο

Συστήματα Μικρουπολογιστών

8086

Page 72: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 73: Σημειωσεις Μικρουπολογιστων 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

Page 74: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 75: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 76: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 77: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 78: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 79: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 80: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 81: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 82: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 83: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 84: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 85: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 86: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 87: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 88: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 89: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 90: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 91: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 92: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 93: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 94: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 95: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 96: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 97: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 98: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 99: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 100: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 101: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 102: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 103: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

4 Exam Exercises

4.1 2002

32

Page 104: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΘΕΜΑ 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

Page 105: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

4.2 2004

34

Page 106: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΘΕΜΑ 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

Page 107: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

4.3 2006

36

Page 108: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ε.Μ.Π. - ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΥΠΕΥΘΥΝΟΣ: ΚΑΘ. Κ. ΠΕΚΜΕΣΤΖΗ

ΘΕΜΑ 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

Page 109: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εθνικό Μετσόβιο Πολυτεχνείο

Συστήματα Μικρουπολογιστών

AVR

Page 110: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 111: Σημειωσεις Μικρουπολογιστων 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

Page 112: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 113: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 114: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 115: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 116: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 117: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 118: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 119: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 120: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εργαστηριακές ασκήσεις στον Μικροελεγκτή 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.

Page 121: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

.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)

Page 122: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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 ; Επανέλαβε

Page 123: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

;Υπορουτίνα για να ανάβουν τα 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’).

Page 124: Σημειωσεις Μικρουπολογιστων 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

Page 125: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 126: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 127: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 128: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 129: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εργαστηριακές ασκήσεις στον Μικροελεγκτή 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 (με αποκλεισμό όλων των

Page 130: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

άλλων) δίνεται στον πίνακα 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.

Page 131: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Πίνακας 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.

Το Φαινόμενο της Αναπήδησης (Σπινθηρισμού)

Εάν ο χρόνος που διαρκεί η εκτέλεση μιας ρουτίνας εξυπηρέτησης διακοπής είναι πολύ μικρός, ενδέχεται να

εμφανιστεί το φαινόμενο της αναπήδησης λόγω σπινθηρισμού στον πιεστικό διακόπτη που προκαλεί την

εξωτερική διακοπή. Συγκεκριμένα, ένα πάτημα του πιεστικού διακόπτη μπορεί να δώσει περισσότερα του

ενός σήματα διακοπής τόσο κατά την πίεση όσο και κατά την απελευθέρωση. Εφόσον η ρουτίνα

Page 132: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

εξυπηρέτησης διακοπής διαρκεί λίγο, ένας σπινθηρισμός μπορεί να προλάβει να εξυπηρετηθεί πλήρως και

στη συνέχεια να καταφθάσουν και άλλα σήματα διακοπής, από το ίδιο πάτημα ή το άφημα του πιεστικού

διακόπτη. Το αποτέλεσμα θα είναι να προκληθούν νέες αιτήσεις διακοπής οι οποίες και θα εξυπηρετηθούν. Όπως αναφέρθηκε, τα 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.

Page 133: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Ζήτημα 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)

Page 134: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Η επιλογή συχνότητας αύξησης του κάθε χρονιστή γίνεται διαφορετικά. Για το χρονιστή 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

Page 135: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 136: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 137: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 138: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 139: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 140: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

64 ldi led , 065 out PORTA , led66 reti

3.3 Exercise 3 - Keyboard and Lcd

31

Page 141: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εργαστηριακές ασκήσεις στον Μικροελεγκτή 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

Στήλη

Page 142: Σημειωσεις Μικρουπολογιστων 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 διακοπτών του πληκτρολογίου.

Page 143: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Καταχωρητές: 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 του μικροελεγκτή δεν είναι αρχικοποιημένη. Ο χρήστης πρέπει να την

αρχικοποιήσει είτε ρητά είτε με μια κλήση της ρουτίνας μόνο για αυτό το σκοπό.

Page 144: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

; ---- Αρχή τμήματος δεδομένων .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 *

Page 145: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 146: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Αλφαριθμητική Οθόνη Χαρακτήρων 2×16

Στην αναπτυξιακή πλακέτα EasyAVR6 μια πολύ χρήσιμη περιφερειακή συσκευή είναι η πρόσθετη οθόνη

χαρακτήρων 2×16. Η συνδεσμολογία γίνεται με τους 6 περισσότερο σημαντικούς ακροδέκτες της θύρας

PORTD (PD2-PD7), όπως φαίνεται στο σχήμα 6.1. Οι ακροδέκτες αυτοί συνδέονται σε ακροδέκτες του

ελεγκτή της οθόνης WH1602B, του οποίου το εγχειρίδιο τεχνικών προδιαγραφών παρατίθεται στις επόμενες

σελίδες. Από τους 6 ακροδέκτες, οι 2 λιγότερο σημαντικοί (PD2 και PD3) είναι ακροδέκτες ελέγχου ενώ οι

υπόλοιποι 4 σχηματίζουν λέξεις των 4 bit με τις οποίες γίνεται η επικοινωνία μικροελεγκτή – ελεγκτή οθόνης.

Σχήμα 6.1. Κυκλωματικό διάγραμμα οθόνης χαρακτήρων 2x16.

Page 147: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 148: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 149: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 150: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 151: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 152: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 153: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 154: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 155: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 156: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 157: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 158: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 159: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 160: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 161: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 162: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 163: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 164: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 165: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 166: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 167: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 168: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 169: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 170: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 171: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 172: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 173: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 174: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 175: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 176: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 177: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 178: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 179: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 180: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

Εθνικό Μετσόβιο Πολυτεχνείο

Συστήματα Μικρουπολογιστών

Θεωρία

Page 181: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 182: Σημειωσεις Μικρουπολογιστων 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

Page 183: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 184: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

systems, network communications etc. microcontrollers are mainly used inembedded application like watches, cellphone, mp3 player, etc.

1.3 Introduction Slides

4

Page 185: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 186: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 187: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 188: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 189: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 190: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 191: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 192: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 193: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 194: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 195: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 196: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 197: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 198: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 199: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 200: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 201: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 202: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 203: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 204: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 205: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 206: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 207: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 208: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 209: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 210: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 211: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 212: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 213: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 214: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 215: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

2 Memories

35

Page 216: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 217: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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

Page 218: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 219: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 220: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 221: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 222: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 223: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 224: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 225: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 226: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 227: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 228: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 229: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 230: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 231: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 232: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων
Page 233: Σημειωσεις Μικρουπολογιστων 1 Συστηματα Μικρουπολογιστων

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