microprocessor and microcontroller architectures and ... 04_programming.pdft h e b o a r d p r o t o...
TRANSCRIPT
Life cycle of a microcontroller project
หลงจากก าหนดเปาหมายของโครงงานแลว ขนตอนตอมาคอการรวบรวมความคด (brain storming) และการออกแบบ hardware ซงตองค านงถงปจจยทางกายภาพตางๆ เชน ระดบแรงดน ต าแหนงและขาของอปกรณ ฯลฯ เพราะสวนของการโปรแกรมนนเปนสวนทมความยดหยนมากกวาการออกแบบ hardware หลงจากนนการโปรแกรมจะท าภายใตขอจ ากดของ hardware ทออกแบบไวแลว
Hardware design
Programming & debugging
Transfering to the board
Prototype, Testing
Brain Storming
รปท 1
การน าโปรแกรมทเขยนแลวไปบรรจในไมโครคอนโทรลเลอรสามารถท าไดหลายวธขนอยกบชนดของหนวยความจ าในตวไมโครคอนโทรเลอรเอง โปรแกรมทถกสรางเปน HEX file โดย compiler จะถกบนทกลงหนวยความจ าโปรแกรม (program memory) ซงสวนใหญจะเปน ROM สงทควรค านงถงคอ ความเปนไปไดทระบบจะสามารถท างานไดในครงแรกๆททดลองใชงานนนมนอยมากเพราะฉะนนผออกแบบระบบจงตองมความอดทนและพยายามพอสมควร 1. Basic Programming Techniques
Programming คออะไร
จากปญหาทตองแก หรองานทเราตองการท า จะมวธการทเปนขนตอนทใชในการแกปญหาเรยกวา Algorithms Algorithms สามารถอธบายไดดวยภาษาหรอสญลกษณตางๆ เชน
1 เอาชอนตกขาว
2 ยกชอนขนเอาขาวเขาปาก
3 เคยวและกลน
4 ท าตามขอ 1-3 จนกวาขาวจะหมด หรอ รสกอม
ถา Algorithms นถกตอง เราจะสามารถกนขาวไดจนถงปรมาณทตองการ เนองจาก Computer ไมสามารถทจะเขาใจภาษาพดในลกษณะนได Algorithm จงตองถกเปลยนใหอยในรปแบบทเหมาะสม ทเรยกวา Programming language การเปลยนน จงเรยกวา Programming หรอ Coding
โดยทวไปแลวค าวา Programming ไมใชแคการ Coding เทานน แตจะรวมถงการออกแบบตวโปรแกรมทงหมด และการก าหนดโครงสรางของขอมลดวย โปรแกรมทดมาจาก สวนประกอบหลายๆ อยาง เชนความสามารถของเรา ในการจดสรรทรพยากรของระบบ รวมไปถงการ
เลอกค าสง/วธการทเหมาะสมเพอใหไดการท างานทรวดเรว และทขาดไมไดกคอ งานเอกสาร ทจะอธบายการท างาน/ การใชงานของโปรแกรม และการจดสรรทรพยากรของระบบ
1.1 Information Representation
ขอมลทกอยางทอยใน Computer จะอยในรปของ กลมของขอมลแบบ Bit กลมของ 8 Bit ขอมลเรยกวา Byte
ขอมลทอยใน Computer น แบงเปนชนดตางๆ คอ
Program representation
Numeric data representation
Alphanumeric representations
1.1.1 Program representation
ค าสง หรอโปรแกรม อยในรปแบบของ Byte เดยว (Short instruction) หรอหลาย Byte (Long instruction) กได รหสนถกก าหนดโดยผสราง Microprocessor
1.1.2 Numeric data representation
การเกบขอมลคาตวเลขใน Computer เกบในรปแบบของเลขฐาน 2 (Binary number)
b7 b6 b5 b4 b3 b2 b1 b0
เลขฐาน 2 เปนสามารถแปลงเลขฐาน 10 ได และในทางกลบกน การเกบขอมลในรปเลขฐานสองมหลายวธ เชน
Binary data เลขฐานสองธรรมดา สามารถใช กฎเกณฑ ทางคณตศาสตรทวไปได
Hexadecimal แทนทจะแสดงขอมลในรปแบบของ Binary กแทนเลข Binary 4 หลก โดยใช 0-9 , A-F แทน เพอใหงายในการจ า
Signed Binary การแทนคาตวเลขทเปนลบ สามารถท าไดโดยก าหนดใช Bit หนาสดของขอมลเปน Bit ของเครองหมาย ( 0 = ‛+‛, 1 = ‚-‚) แตวธการน ไมสามารถกระท าทางคณตศาสตรโดยตรงกบขอมลได
00000001 = 1 และ 10000001 = -1
Two’s Complement โดยการบวก ‚หนง‛ เขากบตวเลขแบบ One’s Complement วธการน สามารถกระท าการทาง Math กบขอมลไดโดยตรงอยางถกตอง
00000011 = 3 และ 11111101 = -3
Fraction การเกบขอมลของคาตวเลขทไมเปนจ านวนเตม เชนทเปนทศนยม สามารถท าไดสองวธดวยกนคอ Fixed point และ Floating point
Fixed point โดยการก าหนดต าแหนงหลกของจด ทตองในการเกบขอมลเลขฐานสอง เชน 1011.11ซงสามารถคดเปนเลขฐาน 10 ได โดยคณคาประจ าหลก (1*23+0*22+1*21+1*20+1*2-1+1*2-2) =11.75 ดงนนแลว ถาในการเกบขอมลมการน า 22 คณเขาไป กจะไดเลขฐานสองทเปนจ านวนเตม ในกรณน ผใชจะตองตดตามต าแหนงของจด ในการค านวณใหถกตองเอง
Floating point โดยการเกบขอมล แยกเปนสองสวน คอ Mantissa (เลขจ านวนเตม) และ Exponent (เลขก าลง) โดยมการใชงานเปน Mantissa * 10Exponent
BCD Representation เปนการใชตวเลขฐาน 2 ในการแทนเลขฐาน 10 โดยตรง ซงใชรหสเลขฐาน 2 เพยง 00002 – 10012 เทานน การใช BCD จะสะดวกในการน าไปใชแสดงผลตอไป (External Data)
Number representations
ตาราง 1
Hexadecimal (base 16) Binary (base 2) Decimal (base 10)
00H 00000000B 0
0FFH 11111111B 255
0AAH 10101010B 170
0FFFFH 1111111111111111B 65535
0FFAAH 1111111110101010B 65450
Alphanumeric representation
การเกบขอมลตวอกษร ท าโดยการใชรหสเลขฐาน 2 ทตรงกบตวอกษร ทตองการ
ในตารางเปนการแสดงรหส ASCII (American Standard Code for Information) ฐาน 16 (MSD LSD) ขอเสยของรหส ASCII คอ ไมสามารถแทนภาษาทไมใชภาษาองกฤษได
ตาราง 2 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI 1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 2 SP ! " # $ % & ' ( ) * + , - . / 3 0 1 2 3 4 5 6 7 8 9 : < = > ? 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ \ ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ~ DEL
ตาราง 3 Characters Representation
Hexadecimal (base 16) Binary (base 2) Character
0EH 0001110B ‘a’
015H 0010101B ‘R’
017H 0010111B ‘r’
000H 0000000B NUL
068H 1101000B CR
1.2 Program development step
1.2.1 Defining the Problem
ในการเขยนโปรแกรมตองก าหนดหรอหาใหไดวา การท างานของโปรแกรมทตองการ นนเปนเชนไร สรปออกมาแลวเขยนเปน ล าดบขนตอนของสงทตองการใหท า เชน
1. อานคาของอณหภม จาก Sensor 2. ท าการปรบคาใหถกตอง โดยการบวกเพมอก 7 องศา 3. เกบคาขอมลทไดน เขาในหนวยความจ า
1.2.2 Representing Program Operation
ขบวนการหรอสมการทใชในการแกปญหาหนงๆ จะเรยกวา Algorithms การทจะแสดง หรออธบายตว Algorithm นสามารถท าไดสองวธการใหญๆ คอ
Flowcharts
จะท าโดยการใชสญลกษณ มาเรยงตอกนเพอแสดงขนตอนการท างาน
Process DecisionData
Input/Output
START Sub-routineOn-page
ConnectorOff-Page Connector
รปท 2 แสดงสญลกษณตางๆของการเขยน Flow chart
ตวอยางเชน ถาตองการให Computer เกบขอมลของอณหภม ทกๆ ชวโมง เปนเวลา 1 วน และส าหรบขอมลทเกบมาไดจะตองปรบใหถกตองกอนโดยการบวกคาอก 7 กอนทจะน าไปเกบในหนวยความจ า
Structured Programming and Pseudo code
ส าหรบโปรแกรมทมขนาดใหญแลว การแสดงการท างานทงหมด โดยใช Flowchart เพยงอนเดยว จะมความซบซอนมากเกนไป และผทมาศกษาในภายหลง กจะท าความเขาใจไดยาก
ในการออกแบบโปรแกรมทมการท างานซบซอนจะท าในหลกการของ Top-Down Design โดยการท างานทงหมดจะถกแบงออกเปน Module ยอยๆ ดงนนใน Flowchart ระดบบนสดจะแสดงถงโครงสรางทงหมดของการท างาน และล าดบการท างานของ Module ตางๆ ส าหรบในแตละ Module จะถกแสดงดวย Flowchart ของ Module ยอยๆ ตอลงไปอก การแบงจะท าตอไปเรอยๆ จนกระทงถงระดบทสามารถเขาใจไดในการท างานของ Computer หรอในอกวธการหนงทตรงขามกนคอ Bottom-Up Design วธการน ท าการออกแบบสรางโปรแกรมในสวนยอยๆ ขนมากอน แลวกคาดหวงวา Module ยอยๆ เหลานมนจะสามารถท างานรวมกนได รปท 3 แตโดยทวไปส าหรบการออกแบบโปรแกรมจะใชวธการทงสองนรวมกน คอ ในตอนแรกท าการออกแบบการท างานโดยรวมทงหมด จากนนในการสรางเปนโปรแกรม จะท าการเขยนและทดสอบ Module ยอยๆ กอนจากการพฒนาของวธการเขยนโปรแกรม จนไดขอสรปวา การท างานของโปรแกรม Computer จะสามารถแบงไดเปน 3 แบบใหญๆ คอ
Sequence เปนการท างานตามล าดบขน
Decision or Selection (IF-THEN-ELSE) เปนการตดสนใจหรอเลอกการท างานตามเงอนไข
Repetition or Iteration (WHILE-DO) เปนการท างานซ าถาเงอนไขเปนจรง จากการท างานทง 3 น สามารถน ามาจดใหมเพอใหเปน ค าอธบายการท างานแบบตางๆ ไดตอไป ซงการแสดง Algorithms ดวยค าอธบายในลกษณะน เรยกวาเปน Pseudo code ซงประหยดพนทมากกวาการใช Flowchart ดงแสดงในตวอยาง
1.3 Standard Programming Structures
START
Read value from sensor
ADD 7
Store in memory
Wait 1 Hour
24 Samples ?
No
END
Yes
STATEMENT(S)1
STATEMENT(S)2
SIMPLE SEQUENCE FLOWCHART
PSEUDOCODESTATEMENT(S)1STATEMENT(S)2
EXAMPLE GET DATA SAMPLE
ADD 7STORE IN MEMORY LOCATION
IF-THEN FLOWCHART
CONDITION ?
STATEMENT(S)
PSEUDOCODEIF CONDITION THEN
STATEMENT(S)
EXAMPLEIF HUNGRY THEN
GET FOOD
NO
YES
รปท 4
CONDITION?
STATEMENT(S)1 STATEMENT(S)1
IF-THEN-ELSE FLOWCHART
PSEUDOCODEIF CONDITION THEN
STATEMENT(S)1ELSE
STATEMENT(S)2
YES NO
EXAMPLEIF ROOM TEMPERATURE LESS THAN SET POINT THEN
TURN ON FURNACEELSE
TURN OFF FURNACE
รปท 5
MONDAY?
TUESDAY?
SUNDAY?
MAKE CELERYSOUP
MAKEMINESTRONE
SOUP
MAKEMUSHROOM
SOUP
CASE EXPRESSED AS MULTIPLE IF-THEN-ELSE FLOWCHART
YES
YES
NO
NO
YES
PSEUDOCODEIF MONDAY THEN
MAKE CELERY SOUPELSE IF TUESDAY THEN
MAKE MINESTRONE SOUPELSE IF EWDNESDAY THEN
MAKE ONION SOUP . .
ELSE IF SUNDAY THENMAKE MUSHROOM SOUP
รปท 6
WHILE-DO LOOP FLOWCHART
NO
YES
PSEUDOCODE WHILE CONDITION DO
STATEMENT(S)
EXAMPLEWHILE MONEY LASTS DO
EAT SUPPER OUTGO TO MOVETAKE TAXI HOME
CONDITION?
STATEMENT(S)
รปท 7
STATEMENT
CONDITION?
REPEAT-UNTIL FLOWCHART
NO
YES
PSEUDOCODEREPEAT
STATEMENT(S) UNTIL CONDITION
EXAMPLEREPEAT
GET DATA SAMPLEADD 7STORE RESULT IN MEMORYWAIT 3 HR
UNTIL 24 SAMPLES TAKEN รปท 8
หลงจากทได Flowchart หรอ Pseudo code แลว การเขยนเปนโปรแกรมจะท าโดยการเลอกค าสงทเหมาะสม มาประกอบกนเพอใหไดการท างานตามตองการ
1.4 การเขยนโปรแกรม
ในการเขยนโปรแกรม นอกจากทจะเลอกชดค าสงทมการท างานตามตองการแลว ยงตองมการจดการทรพยากรตางๆ ในระบบ Microcomputer ดวย เชนการจดสรรหนวยความจ า การควบคมการท างานของสวนประกอบตางๆ เปนตน ดงนนในโปรแกรม จะตองมชดค าสงอกสวนหนงทจะก าหนดคาเรมตนของสวนตางๆ ในระบบ เชนถาในโปรแกรม มการใชงานของ STACK อาจจะตองก าหนดต าแหนงทอยของ STACK ใน Memory กอน และในระบบ Microcomputer ทประกอบดวยอปกรณทสามารถเลอกรปแบบการท างานได มนกจะตองถกก าหนดรปแบบการท างานตงแตแรก หรอถาจะมการใชขอมลใน Memory มนกจะตองมคาเรมตนทแนนอนดวยเชนกน
เราจะสรปสงทตองท าเมอเรมการท างานของโปรแกรมไดดงน
1. Stack pointer (SP) 2. Setup 8255 Programmable port 3. Initialize data variable 4. Set Interrupt mode & interrupt enable flag
ตาราง 4 Standard Program Format
Address Data/Code Labels MNEM. Operand(s) Comments
0000 75 START: MOV SP, #80H ;Initialize Stack pointer
0001 81
0002 80
0003 E5 MOV A, 08H ;Read value from memory address 0008H
0004 08
0005 24 ADD A, #07 ;Add 7
0006 07
0007 F8 MOV R0, A ;Store result in register B
0008 80 SJMP START ;Start over again
0009 F6
จากตวอยาง โปรแกรมเรมตนโดยการก าหนดพนทของ stack ใหเรมทต าแหนง 80H ใน Data memory และเมอขอมลเขามาจะเรมเกบทต าแหนง 81H, 82H, … ไปเรอยๆ ใน MCS-51 โดยปกตแลว ถาไมมการก าหนด ต าแหนงของ stack เรมทต าแหนง 07H ใน Data memory และเมอขอมลเขามาจะเรมเกบทต าแหนง 08H, 09H, … ไปเรอยๆ
1.5 Documentation
การจดท าเอกสารนนเปนสงจ าเปนทจะชวยใหผอนเขาใจการท างานของโปรแกรมได และยงชวยในการตรวจสอบขอผดพลาดในโปรแกรม ในเอกสารควรแสดง Algorithms ทใช การท างานของ Module ตางๆ การจดการทเกบขอมล และ Register ทใช
1.6 Program format
1.6.1 ลกษณะของภาษาเครอง ภาษาเครอง คอ ภาษาทสงให CPU ดงนนถาจะเขยนโปรแกรมภาษาเครองกบเครองคอมพวเตอรใดๆ ตองรวาเครองนนใช CPU เบอรใด เมอรเบอร CPU แลวกสามารถเปดคมอ CPU นน เพอเขยนโปรแกรมรหสภาษาเครองใหตรงกบเบอรนนได ฟลดของภาษาเครองมเพยง 2 ฟลด คอ ฟลดต าแหนง (Address) และฟลดขอมล (Data) ตาราง 5 โปรแกรมท 1
ภาษาเครอง ภาษาแอสเซมบล Address Data Label Op-code Operand Comment N FC00 USER EQU 0FC00H N 8100 ORG 8100H 8100 90 FC 03 START: MOV DPTR, #USER+3 ;SET POINTER 8103 74 80 MOV A, #80H 8105 F0 MOVX @DPTR, A ;MOVE DATA TO POINTER 8106 90 FC 00 MOV DPTR, #USER 8109 74 49 MOV A, #01001001B 810B 23 LOOP: RL A ;ROTATE LEFT 810C F0 MOVX @DPTR, a
810D 78 0A MOV R0, #10 810F 79 FA DELAY: MOV R1, #250 ;TIME DELAY 8111 00 DE1: NOP 8112 00 NOP 8113 D9 FC DJNZ R1, DE1 8115 D8 F8 DJNZ R0, DELAY 8117 80 F2 SJMP LOOP END การปอนโปรแกรมภาษาเครองหมายถงการน าขอมลลงในหนวยความจ าของไมโครคอมพวเตอร ตงแตต าแหนงแรกสดถงต าแหนงทายสด
Lecture 04
11
รปท 9 แสดงการเกบโปรแกรมของโปรแกรมท 1 ลงหนวยความจ าตามต าแหนงของขอมล Address Data 8100 90 8101 FC 8102 03 8103 74 8104 80 8105 F0 8106 90 8107 FC
8108 00 8109 74 810A 49 810B 23 810C F0 810D 78 810E 0A 810F 79 8110 FA
8111 00 8112 00 8113 D9 8114 FC 8115 D8 8116 F8 8117 80 8118 F2
รปท 9
1.6.2 ลกษณะของภาษาแอสเซมบล ภาษาแอสเซมบลเปนภาษาทสงกวาภาษาเครอง มความสะดวกในการใชงานมากกวาภาษาเครอง โดยค าสงจะเขยนอยในรปค ายอภาษาองกฤษ เชน MOV ยอมาจาก MOVE หมายถง การยายขอมล หรอค าสง JMP ยอมาจาก JUMP หมายถงการกระโดด จะเหนวาแตละค าสงนนมความหมายในตวเอง และจ าไดงายกวาค าสงในรปรหสฐานสบหกของภาษาเครอง ฟลดของภาษาแอสเซมบลจะแบงแยกออกจากกน แตละฟลดจะถกแบงดวยชองวาง แตละฟลดมขอก าหนดดงน
เลเบลฟลด (Label field) เปนสวนใชส าหรบอางถงในโปรแกรม หรอเปนต าแหนง Address ในการเขยนโปรแกรมเปนภาษา Assembly นนผ เขยนจะไมทราบวา ต าแหนงทอยของรหสค าสงนนๆ อยทใดใน Memory ดงนนจงเปนการสะดวกทจะอางถงต าแหนงทตองการในโปรแกรมโดยการใช Label เชน start : , loop:, loop 2:, f16 : เปนตน
ขอก าหนดทวไปของการตงชอเลเบลมดงน
1. ชอเลเบลควรมความหมายตรงกบงานทท า
2. เปนตวอกษร A ถง Z (เปนตวพมพใหญหรอเลกกได)
3. เปนตวเลข 0 ถง 9
4. เปนสญลกษณพเศษบางตวเชน ขดลาง (_) เปนตน
5. ประกอบไปดวยตวอกษรจากขอ 1 ถง 3 อยางไรกได สวนความยาวขนอยกบตวแปลภาษาทใช (6 – 10 ตว) 6. ขนตนดวยตวอกษรในขอ 2 เสมอ
7. เลเบลตองตามหลงดวยโคลอน (:) ยกเวนค าสงทใชคกบค าสงเทยม EQU
8. หามตงชอซ ากบรหสนโมนคของ CPU หรอค าสงเทยม
Lecture 04
12
นโมนคฟลด (mnemonic field) เปนฟลดค าสงซงมอย 2 ประเภท คอ 1. ค าสงของ CPU (รหสนโมนค) ค าสงประเภทนเราตองดจากของ CPU เชนค าสงเกยวกบ การยายขอมลของไมโครคอนโทลเลอร MCSS 1 จะใชค าสง MOV สวนของ Z – 80 ใชค าสง LD 2. ค าส งเทยม (Pseudo) เปนค าสงทสรางขนมาเพออ านวยความสะดวกในการเขยนโปรแกรม มอยดวยกนหลายค าสง ขนอยกบตวแปลโปรแกรม ตวอยางของค าสงเทยมทเปนมาตรฐานมดงน ORG ยอมาจาก ORIGIN เปนตวก าหนด Address ของค าสงทอยถดไป เชน ตวอยางในโปรแกรมท 1 ค าสงในแถวเลเบลทชอ start ต าแหนง address จะเรมตนท 8100H EQU ยอมาจาก EQUAL เปนการก าหนดคาของตวแปล เชน ตวอยางในโปรแกรมท 1 ตวแปล user จะมคาเทากบ 0fc00h DB ยอมาจาก Define Byte เปนการก าหนดคาในหนวยความจ าครงละ 1 byte หรอหลาย byte เชน ตาราง 6
Address Code data Label Op-code Operand Comment
8200 FF DATA: ORG DB
8200H 255
;ขอมลในหนวยความจ าเทากบ 255
8201 FB DB -5 ;ขอมลในหนวยความจ าเทากบ -5
8202 09 DB 2+7
8203 4F65 DB 4FH, 65H ;ก าหนดตอเนองกน คนดวยคอมมา
8205 8209
4920414D 20434F4F
DB ‘I AM COOL’
;ก าหนดคาขอมลในรป ASCII
820D 4C DW ยอมาจาก Define Word เปนการก าหนดคาในหนวยความจ าครงละสอง byte ลกษณะการใชคลายกบ DB เชน ตาราง 7
Address Code data Label Op-code Operand Comment
ORG 0000H
0000 00 FF DATA: DW 255 ;ขอมลในหนวยความจ าเทากบ 255
0002 0 09 DW 2+7
0004 00 4F 00 65 DW 4FH, 65H ;ก าหนดตอเนองกน คนดวยคอมมา
0008 04 56 FF 56 DW 456H, 0FF56H
Lecture 04
13
DS ยอมาจาก Define Storage เปนการจองพนทในหนวยความจ า มคาเปนจ านวน byte เชน จองพนทในหนวยความจ าตงแต address ทชอ light เปนจ านวน 9 byte (โดยปกตพนททจองจะใสคา 00 ไวให) ตาราง 8
Address Code data Label Op-code Operand Comment
ORG 8000H
8000 00 00 00 00 LIGHT: DS 9
8004 00 00 00 00
8008 00
8009 04 56 FF 56 DW 456H, 0FF56H
END เปนค าสงบอกจดสนสดของโปรแกรม ตองมทกครง
โอเปอรแรนดฟลด (operand field) เปนฟลดทบอกถงตวกระท า ซงอาจจะเปน register data address หรอตวแปร ขนอยกบค าสงนนๆตวอยางแสดงดงโปรแกรมท 1
ฟลดหมายเหต (comment field) เปนสวนทใชอธบายโปรแกรม ฟลดนตองน าหนาดวยเครองหมาย เซม โคลอน (:) เสมอ และอาจใหเปนหมายเหตทงบรรทดกได
1.6.3 Type of Number Use in Data Statements
BINARY
MOV A, #101110B
DECIMAL
MOV A, #26
HEXADECIMAL
MOV A, #0FFH
ASCII
MOV A, #‘z’
เปนการก าหนดให Register A มคาเทากบรหส ASCII ของตวอกษร ‘z’
Lecture 04
14
1.6.4 Accessing Named Data with Program Instructions
คาคงท ทก าหนดโดย ค าสง EQU สามารถน ามาใชไดเลย เชน
Count EQU 10
MOV A, #Count
2. Assemble Language Program Developing Tools
2.1 Editor ส าหรบการ ปอนโปรแกรมภาษา Assembly เขาไป เชน Notepad ของ Windows หรอ EDIT ของ DOS โดยทวไป
แลว ไฟลทเปนโปรแกรมภาษา Assembly จะก าหนดใหมนามสกลเปน .ASM
2.2 Assembler
เมอตองการน าโปรแกรมไปใชงานตองแปลงโปรแกรมจาก Mnemonic และ Operand(s) ใหเปนรหสค าสงในแบบของเลขฐานสอง โดยใชวธการเปดตารางค าสงแลวเทยบ Code เอง อยางไรกดการแปลง รหสดวยตวเองนน มโอกาสผดพลาดมาก และเสยเวลา การแปลงรหสสามารถท าไดโดยใช Software บน Computer ทเรยกวา Assembler ซงใชแปลงโปรแกรมภาษา ใหเปนรหสค าสงของ Microprocessor นนๆ และสามารถใชค าสงควบคมในการแปลงรหสได (Assembler directive) เชน A51 เอาทพททไดจะมนามสกลเปน .OBJ
D:\PK51\BIN>A51 test.asm
MS-DOS MCS-51 MACRO ASSEMBLER A51 V4.4
Copyright (c) Franklin Software, Inc. 1988, 1989
ASSEMBLY COMPLETE, NO ERRORS FOUND
D:\PK51\BIN>
2.3 Linker
เปนตวรวม OBJ หลายๆ ไฟลใหเปนโปรแกรมเดยวกน เพราะในโปรแกรมขนาดใหญ เราจะเขยนโปรแกรมเปน Module แลวจงน ามาประกอบเขาดวยกนภายหลง ผลลพธทไดจะเปนชดของรหสค าสงทท างานไดสมบรณ เอาทพททไดจะมนามสกลเปน .HEX
Lecture 04
15
2.4 Simulator / Debugger
ส าหรบการทดสอบการท างานของโปรแกรม สามารถก าหนดใหท างานไปทละค าสงได (Single step) เพอดผลทเกดขนไดทน แตส าหรบโปรแกรมทมขนาดใหญแลว การทดสอบการทงานแบบทละขนจะเสยเวลามาก ดงนนจงจะใชวธการตง Break point เมอ โปรแกรมท างานมาถงจดทก าหนด มนกจะหยดใหเราไดดคาขอมลตางๆ ได Software ทใชในการจ าลองการท างานของ MCS-51 กเชน Emulator 8051
รปท 10
2.5 Emulator
Emulator สามารถจ าลองการท างานใน Hardware ได โดยไมตองมการ Burn ลงใน Program Memory จรงท าใหการตรวจสอบการท างานของระบบทงหมดท าไดสะดวก
Lecture 04
16
2.6 Implementation
หลงจากททดสอบการท างานของโปรแกรม เปนทตองการแลว เราสามารถน าไฟล .HEX ทไดน ไปท าการอด (Burn) ลงใน EPROM ภายในของ MCS-51 หรอ EPROM ภายนอก แลวใชงานเปน External program memory ได
2.7 Integrate Development Environment (IDE)
นอกจากโปรแกรมส าหรบการพฒนา ตามทไดยกตวอยางไปแลวขางตน ยงมโปรแกรมอนๆ ส าหรบการพฒนา ทไดรวมขนตอนตางๆ เขาไวดวยกนเพอความสะดวกเชน โปรแกรม SXA51 ทรวมขบวนการของ Assembler และ Linker เชนโปรแกรมของ MIDE Studio ทเปน Assembler, Linker, Simulator/Emulator ท างานบน Windows
รปท 11
Lecture 04
17
2.8 ตวอยางขนตอนในการเขยนโปรแกรม 8-Bit Addition
2.8.1 Defining the problem and writing the algorithms
การออกแบบโปรแกรมควรจะเรมการท าความเขาใจในสงทตองการจะท าเปนอยางด จากทตองการบวกตวเลขสองจ านวนเขาดวยกนแลวไดผลลพธออกมา จะไดเปน
บวกคาตวเลขสองจ านวน
น าคาผลลพธไปเกบ
2.8.2 Setting up the data structure
เราจะตองทราบหรอก าหนดรปแบบของขอมลทจะน ามาใชงาน โดยตองตอบปญหาเหลานใหได
1. ขอมลทจะน ามาบวก นอยทไหน ? ใน Internal/External Data Memory หรอ Program Memory 2. ขอมลนเปนแบบ Byte หรอ Word? หรอมากกวาน 3. จ านวนของขอมลนนมเทาไร? 4. ขอมลนมแตจ านวน บวก หรอไม ? หรอมการคด เครองหมายอยางไร? 5. ในกรณทเปนโปรแกรมทมความซบซอน การเกบขอมลอาจมโครงสรางเฉพาะ ซงเราจะตองทราบ
จากปญหา ถาให ขอมลทงหมดนอยใน Internal Data Memory และเปนขอมลแบบ Byte ทมแตเลขจ านวน บวกอยางเดยว
ในทนสมมตวา เราก าหนดให ขอมลของตวตง OP1 อยใน Internal Data Memory ท ADR1 และตวบวก OP2 อยท ADR2 แลวใหเกบผลลพธท ADR3
2.8.3 Initialization check list
จากทโปรแกรมนไมมการใชงานของ STACK และไมไดก าหนดอปกรณภายนอกอนๆ จงยงไมตองท าอะไร
2.8.4 การเลอกค าสงใหไดการท างานตามตองการ
ADR1 EQU 10H ; First operand address
ADR2 EQU 11H ; Second operand address
ADR3 EQU 12H ; Result address
MOV A, ADR1 ; Load OP1 into A
ADD A, ADR2 ; Add OP2 to OP1
MOV ADR3, A ; Save result at ADR3
Lecture 04
18
จากตวอยางขางตน ถาขอมลทงหมดนอยใน External Data Memory และเปนขอมลแบบ Byte ทมแตเลขจ านวน บวกอยางเดยว ก าหนดให ขอมลของตวตง OP1 อยใน External Data Memory ท ADR1 และตวบวก OP2 อยท ADR2 แลวใหเกบผลลพธท ADR3 จะไดเปนโปรแกรมคอ
ADR1 EQU 0F10H ; First operand address
ADR2 EQU 0F11H ; Second operand address
ADR3 EQU 0F12H ; Result address
MOV DPTR, ADR1 ; Load Address of OP1 into DPTR
MOVX A, @DPTR ; Load OP1 into A
MOV R0, A ; Temporary store OP1 in R0
INC DPTR ; Address the second operand
MOVX A, @DPTR ; Load OP2 into A
ADD A, R0 ; Add OP2 to OP1
INC DPTR ; Address of Result
MOVX @DPTR, A ; Save result at ADR3
2.8.5 การหาและแกขอผดพลาดในโปรแกรมภาษา Assembly
1. ท าการก าหนดปญหาใหชดเจน แลวหา Algorithms ทเหมาะสมทสด 2. เขยนและทดสอบการท างานของโปรแกรมในสวนยอยๆ ใหถกตองกอน แทนทจะเขยนทงหมดแลวคอยทดสอบ
ทเดยว 3. ถามสวนหนงสวนใดของโปรแกรมทผดพลาด ใหตรวจสอบ Algorithms ทใชอกครง ใหแนใจวา มนสามารถใชไดตาม
ตองการ บางครงอาจตองใหคนอนมาชวยดให 4. ถา Algorithms นถกตอง กตรวจสอบดทความผดพลาดในการพมพค าสงตางๆ 5. ทดลองใช Debugger/Simulator ในการทดสอบการท างานแบบ Single step เพอดวาผลทได ณ ทใดทไมถกตอง
ตามความคาดหมาย 6. ในโปรแกรมขนาดใหญ การท า Single step จะเสยเวลามาก กใหใชวธของ Break point แทน
3. MCS-51 Addressing Modes
Addressing หมายถง เปนการใส code ในรหสค าสงเพอระบถงทมาทไปของขอมล (Operand) ทจะถกน ามาใชงานกบค าสงน Addressing Methods ท MCS-51 ใชในการท างานของค าสงตางๆ จะมดงน
3.1 Register Addressing
Lecture 04
19
จากใน Register bank ทเรยกเปน R0 – R7 จะสามารถเรยกใชไดโดยตรงดวยค าสงตางๆ ซงใน Op-code ของค าสงประกอบดวย ขอมล 3 Bit ทระบถง Register ทตองการ ดงนนแลวค าสงทเปน Register addressing จงเปนค าสงทมประสทธภาพในเรองของการใชหนวยความจ า เนองจากมนไมตองการตวระบต าแหนงของขอมลทเพมจาก Op-code
เมอค าสงแบบ Register instruction ท างาน กจะเปนการอางถงขอมลทอยใน Register ของ bank ทถกเลอกโดย RS0, RS1 ใน PSW ทเวลานนๆ
MOV A, Rn ; Op-code 1 1 1 0 1 r r r MOV Rn, A ; Op-code 1 1 1 1 1 r r r
รปท 12
Register –specific Instructions
ส าหรบบางค าสงทเปนการเจาะจงอยแลววาจะกระท ากบขอมลทอยใน Register ทก าหนด เชน ค าสงทกระท ากบขอมลทอยใน Accumulator หรอ DPTR ค าสงเหลาน กไมจ าเปนทจะใชตวระบ Address อก
DA A ; Op-code 1 1 0 1 0 1 0 0
3.2 Immediate Addressing (or Immediate Constant)
รปท 13
Immediate Addressing น ตอจาก Byte ทเปน Op-code แลวตามดวย ขอมลของคาคงท ซงอาจจะเปน 8 หรอ 16 Bit ขนอยกบ Register ทใช ซงเปนการก าหนดคาคงทโดยตรง ซงสามารถเขยนใน Program ไดเลย ตวอยางเชน
MOV A, #100 ; **คาคงทจะมเครองหมาย # น าหนาเสมอ เปนการใสคา 100 เขาใน Accumulator หรอถาตองการใสขอมลเปนเลขฐาน 16 กจะท าไดคอ
MOV A, #64H
Lecture 04
20
3.3 Direct Addressing
การอางต าแหนงแบบ Direct addressing เปนการอางถงต าแหนงของขอมลทตองการ โดยใชตวระบต าแหนง 8 Bit ซงใชไดเฉพาะกบ Lower 128 ของ Internal data memory และ SFR เทานนเชน
รปท 14
เชน MOV A, 0FFH
Microprocessor
PC
0000000000001011
015
Program Memory 07
000AH
000BH000CH000DH000EH
11100101
0010H0011H
000FH
Address Bus
Microprocessor
PC
0000000000001101
015
Data Memory 07
00FAH
00FBH00FCH00FDH00FEH
1000000010100H0101H
00FFH
Data Bus
Instruction 11111111
A
11110101
07
A
10000001
07
MOV A0FFH
รปท 15 แสดงการท างานตามค าสง MOV A, 0FFH
Lecture 04
21
3.4 Indirect Addressing
รปท 16 รปแบบค าสงทเปน indirect addressing
Microprocessor
PC
0000000000001011
015
Program Memory 07
000AH
000BH000CH000DH000EH
11100110
0010H0011H
000FH
Address Bus
Microprocessor
PC
0000000000001101
015
Data Memory 07
00FAH
00FBH00FCH00FDH00FEH
100000111
0100H0101H
00FFH
Data Bus
Instruction A
11110101
07
A
10000111
07
MOV A, @R0
R0
11111010
07
R0
11111010
07Address Bus
Lecture 04
22
รปท 17 แสดงการท างานตามค าสง MOV A, @R0 การอางต าแหนงแบบ Indirect addressing เปนการอางถงต าแหนงของขอมลทตองการ โดยใช Register เปนตวชไปยงขอมลนน ซงใชไดกบ Internal และ External data memory
การอางต าแหนงของ Internal data memory สามารถท าโดยใช Register ขนาด 8 Bit R0 หรอ R1 หรอใช SP เปนตวช ส าหรบ External data memory การอางต าแหนงท าไดในแบบ 16 Bit โดยใช Register DPTR เปนตวช หรอแบบ 8 Bit โดยใช R0 หรอ R1
เชนถา R0 มคาเทากบ FAH
MOV A, @R0 ; เปนการน าขอมลใน Int. data memory ต าแหนงท FAH มาเกบใน Accumulator
3.5 Indexed Addressing
การอางต าแหนงถงต าแหนงของขอมลในแบบ Indexed addressing ท าไดกบ Program memory เทานน โดยมประโยชนใชในการท า Look-up table (อานคาขอมลจากตาราง)
โดยใช Register DPTR หรอ PC ท าหนาทเปนตวชจดเรมตนของตารางขอมลทตองการ (Base pointer) และใช Accumulator เปนตวเลอกล าดบทของขอมลทอยในตารางนน (Entry number) ซงคา Address ของขอมลทจะอานจาก Program memory จะไดจากการน าเอา Base pointer + Entry number นนเอง นอกจากนแลวการใชงานของ Indexed addressing จะใชในการท า ‚Case jump‛ ในกรณน คาต าแหนงของโปรแกรมทจะกระโดดไปท างาน จะไดจาก Base pointer + Accumulator data เชน
MOV A, @A+DPTR
รปท 18 แสดงการท างานเมอใช Indexed Addressing
Lecture 04
23
4. MCS-51 Instruction Set
CPU ทกเบอรในตระกล MCS-51 มค าสงใชงานทเหมอนกน ซงค าสงตางๆ ของ MCS-51 เปนค าสงทถกออกแบบมาใหเหมาะทจะใชในงานควบคมแบบ 8 Bit ซงมวธอางถงขอมลภายใน (Internal data memory) แบบตางๆ ทท าไดอยางรวดเรว นอกจากน ยงมชดค าสงทกระท ากบขอมลแบบ Bit ได ท าใหสะดวกในการเขยนโปรแกรมควบคมตางๆ ทมการท างานเปนตรรกะ ค าสงของ 8051 สามารถแบงออกเปนชดๆตามประเภทการท างานไดดงน
4.1 Arithmetic Instructions
ค าสงทเปนการท างานทาง Math แสดงดงตารางซงแสดง Addressing mode ทสามารถน ามาใชเปน <byte> Operand ไดส าหรบแตละค าสง
เชน ค าสง ADD A, <byte> สามารถใช Addressing mode ตางๆ ไดคอ
ADD A, 7FH (direct addressing) ADD A, @R0 (indirect addressing) ADD A, R7 (register addressing) ADD A, #127 (immediate constant)
ส าหรบคาเวลาทใชในการท างานนน สมมตให CPU ท างานท Clock 12 MHz ซงค าสงสวนมากจะใชเวลา 1 uS (1 machine cycle) เวนแตค าสงทท างานกบขอมลทเปน 16 Bit (DPTR) หรอการ คณ, หารเลข และจากตารางค าสงจะเหนวา MCS-51 สามารถท า INC, DEC กบ internal Data memory ไดโดยไมตองผาน Accumulator
ตาราง 9
ส าหรบการท างานของค าสง MUL AB จะเปนการคณเลข ของขอมลทอยใน Accumulator และ register B เขาดวยกน ซงผลลพธทไดจะเปนเลข 16 Bit ทจะแบงเกบใน Acc และ register B ตามล าดบ ตวอยางเชน
Lecture 04
24
MOV A, #80 ; A <- 80 (50H)
MOV B, #160 ; B <- 160 (0A0H)
MUL AB ; Multiply A by B
.... ; will give the product 12,800(3200H)
; B is changed to 32H and the Accumulator is cleared.
; The overflow flag is set, carry is cleared.
และค าสง DIV AB เปนการหารเลขของขอมลทอยใน Accumulator (ตวตง) ดวย register B (ตวหาร) ผลการหารสวนทเปนจ านวนเตมจะเกบใน Accumulator และเศษทหารไมลงตวจะถกเกบใน register B ดงตวอยาง
MOV A, #251 ; A <- 251 (0FBH)
MOV B, #18 ; B <- 18 (12H)
DIV AB ; A Division by B
.... ; Accumulator will contain 13 (0DH) and
; register B will contain 17 (11H)
; 251 = ( 13 x 18) + 17
; The overflow and carry flag is cleared.
นอกจากการคณ หรอหารเลขแลว เราสามารถประยกตใชในการแปลงเลขฐานตางๆ หรอใชในการท า Shifter (ตวเลอนขอมล) ทก าหนดได โดยการท า Right shift จะไดจากการคณดวย 2n สวนการท า Left shift จะไดจากการหาร
4.2 Logical Instructions
ค าสงในกลมทเปนการกระท าทาง Logic (AND, OR, XOR, NOT) เปนการท างานกบขอมลทง Byte โดยคดผลทไดในแบบของ Bit-by-Bit เชนถา
MOV A, #00110101b ; Load Acc with 0011 0101 b
MOV R1, #01010011b ; Load R1 with 0101 0011 b
Lecture 04
25
ANL A, R1 ; after execution of ANL
; Acc will be 0001 0001 b
ตาราง 10
MCS-51 ไมมค าสงส าหรบการ Shift ขอมล มเฉพาะแตค าสงส าหรบการ rotate เทานน การ rotate จะสามารถเลอกไดวาจะเปนการ rotate โดยไมใช carry flag (RL A, RR A) หรอใช carry flag (RLC A, RRC A)
ในกรณทตองการ Shift ขอมลตองท าโดยการเพมค าสงส าหรบการ Clear ขอมลบตท rotate เขามา หรอประยกตใชค าสง MUL, DIV
รปท 19
ค าสง SWAP A จะเปนการสลบขอมลใน Accumulator 4 บต บน กบ 4 บต ลาง ซงค าสงนมประโยชนในการท างานกบตวเลขขอมลแบบ BCD
4.3 Data Transfers
Lecture 04
26
นอกจากการเคลอนยายขอมลกบ Accumulator แลว MCS-51 สามารถเคลอนยายขอมลใน Internal data memory address ตางๆ ได โดยไมผาน Accumulator ดวยค าสง
MOV <dest>, <src>
ตาราง 11 Internal RAM
การใชงานของ Stack ใน MCS-51 นน จะใช Internal data memory เปนพนทในการเกบขอมล และจะเกบขอมลเพม ใน Address ทเพมขนดวย อธบายไดคอ เมอท าการเกบขอมล (ดวยค าสง PUSH) คาของ SP (Stack pointer) จะเพมขน 1 แลวจงท าการเกบขอมลทตองการเขาใน Address ท SP ชอย ส าหรบขอมลทตองการ PUSH เขาไปส stack หรอ POP ออกมาจาก Stack จะก าหนดไดดวยวธการของ Direct addressing สวนการท างาน/การเกบขอมลของ Stack นนจะเปนแบบ Indirect addressing โดยใช SP ช ดงนนแลวเราสามารถใช Internal data memory ในสวนของ Upper 128 เปนทอยของ Stack ได แตตองระวงวา ถา MCS-51 ทเลอกใชนน ไมมหนวยความจ าในสวนของ Upper 128 อย จะท าใหขอมลท PUSH เขาไปสญหาย และการ POP ขอมลออกมากจะไดคาทไมแนนอน
ค าสง XCH A, <byte> สามารถใชในการสลบขอมลระหวาง Accumulator กบขอมลใน internal data memory address ตางๆ ได สวนค าสง XCHD A, @Ri นนจะสลบขอมลใน Accumulator กบขอมลใน Address ทก าหนดโดย Ri (R0, R1) เฉพาะ 4 บตลางเทานน
ตาราง 12 External RAM การเคลอนยายขอมลกบ External data memory ท าไดกบ Accumulator เทานน และการก าหนด ต าแหนงของขอมลทตองการ ตองใชวธ Indirect addressing โดยผาน Ri (R0, R1) หรอ DPTR
Lecture 04
27
การใช @Ri เปนการอาง Address ของ External data memory แบบ 8 บต (อางได 256 Byte) ถาใช @DPTR จะเปนการอาง Address ของ External data memory แบบ 16 บต ซงใช Port 0 และ Port 2 ทงหมดเพอเปน Data/Address Bus ท าใหสามารถ อางหนวยความจ าไดทง 64K Byte ในกรณทตองการใช External data memory เพยงไมก K Byte นน การอางต าแหนงแบบ 16 Bit จะท าใหเปลองขาของ Port 2 ไปโดยไมจ าเปน ทางแกไขสามารถท าไดโดยใชเทคนคการอางถงหนวยความจ าเปน Page โดยใชขาของ Port 2 เพยงบางสวนในการเลอก Page ของขอมลทตองการ (ขาของ Port 2 ทเหลอจงสามารถน าไปใชเปน I/O ได)
MCS-51
P0P1
P3 P2
ALE
EA
INTERNAL
ROMLATCH
OE
RAM
DATA
ADDR
WR
VCC
WR
PAGE
BITES
I/ORD
0000H
รปท 20
การเคลอนยายขอมลตองมโปรแกรมเพมเตมเพอเลอก Page ของขอมล (ไมจ าเปนในกรณทขอมลอยใน Page เดยวกน) แลวใช การอาง Address แบบ 8 บตผาน Ri ตวอยางโปรแกรม ก าหนดใหใช Port 2 เพยง 3 บต ในการเลอก Page และบตทเหลอ ก าหนดใหใชเปน I/O ANL P2, #1111 1000b ; Clear Page select Bit
OR P2, #2 ; Select data page 2
MOVX A, @R0 ; Load A with data @R0 in page 2
ตาราง 13 Lookup table Lookup table คอการบรรจขอมลไวในหนวยความจ า แลวใชค าสงเรยกเอาขอมลทตองการออกมาใชงาน ในการเขยนโปรแกรมส าหรบ MCS-51 สามารถใสตารางของขอมลเขาไปพรอมกบโปรแกรมได เชน ตารางคาของ
Function Sine ทมมองศาตางๆ หรออาจเปนตาราง Pattern ของการแสดงผล เปนตน
Lecture 04
28
Table EQU 1000H ; Define table start at address 1000h
MOV DPTR, #Table ; Load table start address
. . .
MOV A, #3 ; Load A with the select entry in table - 1
MOVC A, @A+DPTR ; Load 4th entry of table
. . .
ORG Table ; Begin of the Table
DB 00H, 22H, 0A3H, 0AAH, . . . ; Data in table
วธการขางตนน มปญหาทส าคญคอตองก าหนด Address ของ Table ทแนนอน ซงไมยดหยนในการเขยนโปรแกรม อาจแกไขไดดงน . . .
MOV A, #EntryNumber ; Load A with the select entry in table
CALL Table ; Call subroutine for getting data
. . .
Table: MOVC A, @A+PC ; Get data from table below
RET
DB 00H, 22H, 0A3H, 0AAH, . . . ; Data in table
แตการใชโปรแกรมน ไมสามารถใช Entry number 0 ได เนองจากในขณะท Execute ค าสง MOVC A, @A+PC นน คาของ PC จะชอยท Address ของค าสง RET นนเอง ตาราง 14
Lecture 04
29
4.4 Boolean Instructions
จากท MCS-51 ถกออก แบบมาใหสามารถกระท า Single-Bit Boolean operation ไดอยางสมบรณ ท าใหมความสะดวกในการเขยนโปรแกรมเพอการควบคม ทหาไมไดใน CPU อนๆ ซงท างานกบขอมลทละ Byte
ต าแหนงของ Internal data memory ในบางสวนสามารถอางถงและใชงานในระดบ Bit ได โดยท Bit address 00 – 7FH จะอยในสวนของ Lower 128 และ 80 – FFH อยใน SFR ในการท างานระดบ Bit นน MCS-51 จะใช Carry flag เปน Single-bit Accumulator ดงจะเหนไดจากค าสงตางๆ ทกระท าการกบ Carry flag ตวอยางเชน ถาตองการให Bit 0 ของ Port 1 มสถานะเปน ‘1’ เมอม Logic ‘1’ เขามาท Bit 1 และ Bit 2 ของ Port 1 กจะเขยนโปรแกรมไดดงน MOV C, P1.1 ; Load status of P1.1 into C
ANL C, P1.2 ; AND with status from P1.2
MOV P1.0, C ; Output the result to P1.0
จากตารางค าสงของ Boolean operation ทมเฉพาะการ AND (ANL) และ OR เทานน ไมมค าสงในการท า Exclusive OR ซงถาตองการท า XOR แลวจะสามารถเขยนเปนโปรแกรมไดเชนกน
C = bit1 XRL bit2 MOV C, bit1 ; Load status of bit1 into Carry
JNB bit2, Over ; Test bit2 and jump if bit2 = 0
CPL C ; Invert Carry
Over: . . .
การท างานอธบายได คอ จากสถานะของ bit1 ทถกเกบเขาไปใน Carry ถาสถานะของ bit2 เปน ‘0’ แสดงวา Carry มคาทถกตองแลว ( 0 XOR 0 = 0; 1 XOR 0 = 1) แตถา bit2 เปน ‘1’ กจะตองกลบ Invert สถานะของ Carry เพอใหไดค าตอบทถกตอง ( 0 XOR 1 = 1; 1 XOR 1 = 0) ดงนนเมอสถานะของ bit2 เปน ‘0’ ตองท าค าสง CPL C ซงท าไดโดยใช JNB (Jump not bit) เมอ bit2 เปน ‘0’ MCS-51 กจะท างานขาม CPL C ไป การท างานของค าสง JBC น จะแตกตางจาก JB (Jump ถา bit เปน ‘1’) อยท เมอการ Jump เกดขนแลว bit address นนๆ จะถก Clear ดวย
Lecture 04
30
4.5 Jump Instructions
ค าสงในการ Jump ซงในตารางแสดงเปน Mnemonic คอ JMP addr นน ทจรงแลวส าหรบ MCS-51 มค าสงส าหรบการ Jump คอ SJMP, LJMP, AJMP โดยจะมขอแตกตางกนท วธการก าหนด Address ทตองการ Jump ไป ในการเขยนโปรแกรมนน เราสามารถ ใช JMP ไดถาเราไมสนใจวธการก าหนด Address ซงตว Assembler จะท าการเลอกค าสงของการ Jump พรอมกบการก าหนด Address ทเหมาะสมใหเอง
ตาราง 15
ค าสงในการ Jump ซงในตารางแสดงเปน Mnemonic คอ JMP addr นน ทจรงแลวส าหรบ MCS-51 มค าสงส าหรบการ Jump คอ SJMP, LJMP, AJMP โดยจะมขอแตกตางกนท วธการก าหนด Address ทตองการ Jump ไป ในการเขยนโปรแกรมนน เราสามารถ ใช JMP ไดถาเราไมสนใจวธการก าหนด Address ซงตว Assembler จะท าการเลอกค าสงของการ Jump พรอมกบการก าหนด Address ทเหมาะสมใหเอง
Lecture 04
31
โดยทวไปของค าสง JUMP หรอ BRANCH แลวประกอบดวย Op-code 8 Bit แลวตามดวย Address ของโปรแกรมต าแหนงทตองการจะไป มขอเสยคอ ท างานไดชา ผออกแบบ Microprocessor จงก าหนดวธการทมประสทธภาพกวา คอ Relative Addressing ซงรหสค าสงประกอบดวย Byte แรกเปน Op-code ทระบการ JUMP แบบ Relative (จะมเงอนไข หรอไมมกได) และ Byte ทสองเปน Displacement
จากทการ JUMP จะตองไปขางหนา หรอยอนกลบได คาของ Displacement นจงเปนแบบ 2’s Complement (-128 ถง +127) แตเมอ CPU กระท าค าสงนแลว คาของ PC จะเพมขน ดงนนระยะทางทกระโดดไปไดจรงๆ จะนบจาก Address เรมตนของค าสงทอยตอจากค าสงในการ JUMP นน
การใชงานของ Relative Address นมประโยชน มากในโปรแกรมทเปนการวน Loop (เพราะโดยมากแลวการวน Loop จะเปนการวนในระยะใกลๆ) ซงท าใหโปรแกรมนนสามารถท างานเรวขนอยางเหนไดชด และประโยชนอกประการหนงคอ ตวโปรแกรมน สามารถยายไปอยทใดๆ กไดเนองจากมนไมขนอยกบคา Address ทใช
SJMP เปนการ Jump โดยก าหนดต าแหนงทตองการ ในแบบของ Relative offset ดงทไดกลาวไปแลว ซงค าสงนจะเปนแบบ 2 Byte ประกอบดวย Opcode byteและ relative offset byte (-128 ถง +127) โดยนบจาก Address เรมตนของค าสงทอยตอจาก SJMP
LJMP ใชการก าหนดต าแหนงทตองการ ในแบบของ 16 Bit ดงนนค าสงนจงเปนแบบ 3 Byte (1 Byte Opcode and 2 Byte address) การใช LJMP ท าใหสามารถ Jump ไปทไดกไดของ Program memory ทง 64K
AJMP ใชการก าหนดต าแหนงทตองการดวยเลข 11 Bit ค าสงนจะเปนแบบ 2 Byte ประกอบดวย Byte แรกทเปน Opcode ทม 3 Bit ของ Address อยดวย ตามดวยอก Byte ซงก าหนด Address สวนทเหลอ ดงแสดง
A10 A9 A8 0 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0 ใน MCS-51น A10 A9 A8 เปน 0 0 0 การท างานเมอการ Jump เกดขน ต าแหนง Address ทจะ Jump ไปจะไดจากการน าเอา address 11 bit น แทนเขาไปใน 11 Bit ลางของ PC เพราะฉะนนต าแหนงทจะท าการ Jump ไปไดตองอยใน Block 2K เดยวกบค าสงทอยถดจาก AJMP Jump address = PC15 PC14 PC13 PC12 PC11 A10 – A0 เชน
PC Instruction (Binary) Instruction (Assembly)
0000 1001 0000 0000 หรอ 0900H 0000 0001 0010 0011 AJMP 23H
ต าแหนงทจะท าการ Jump ไปคอ 0000 1000 0010 0011 หรอ 0823
Lecture 04
32
JMP @A+DPTR ใชในการท า Case jumps (การท า Switch-Case) ซงต าแหนงทจะ Jump ไปจะถกค านวณจาก DPTR + คาใน Accumulator ในการใชงานตองก าหนด DPTR ใหเปนคา Address เรมตนของ Jump table และ Accumulator ใหเปนตวชต าแหนง ดงตวอยาง ถาตองการท า 5-ways branch โดยก าหนดจากคาใน Accumulator 0 – 4
MOV DPTR, #Jump_Table
MOV A, Index_Number
RL A ; Convert index number (0 – 4) to an even number 0 – 8 ; because AJMP is 2 bytes long
JMP @A+DPTR
. . .
Jump_Table:
AJMP Case_0
AJMP Case_1
AJMP Case_2
AJMP Case_3
AJMP Case_4
4.6 ค าสงในการเรยกใช Sub-routine
ส าหรบ MCS-51 สามารถท าได 2 แบบคอ LCALL และ ACALL เชนเดยวกบการ JUMP ดงทอธบายขางตน
การใชงานของ Sub-routine ตองจบดวยค าสง RET เสมอ ซงเปนการให MCS-51 กระโดดกลบไปท างานยงค าสงทอยตอจาก เรยกใช Sub-routine (CALL)
ส าหรบค าสง RETI นน จะใชในการ Return เมอจบการท างานของ Interrupt service routine ขอแตกตางระหวาง RET กบ RETI คอ เมอท า RETI จะมการสงสญญาณไปบอก ระบบทควบคมการ Interrupt ดวยวา Interrupt ทเกดขนนน ไดท างานเสรจแลว และพรอมทจะท างาน Interrupt ทรออยได แตถาไมม Interrupt ทรออย การท างานของ RETI จะไมแตกตางกบ RET
4.7 การ Jump แบบมเงอนไข
ตาราง 16
Lecture 04
33
ดงทแสดงในตาราง จะเหนไดวาการ Jump แบบมเงอนไขทงหมดมการก าหนด Address ในแบบ Relative offset
ค าสง DJNZ (Decrement and jump if not zero) ใชในการวน Loop เปนจ านวนทก าหนด โดยการก าหนดคาใหกบ Counter ดวยจ านวนรอบ การท างาน ทตองการ แลวจบการท างานทตองการนนดวย DJNZ
ค าสง CJNE (Compare and jump if not equal) กสามารถใชควบคมการวน Loop ได ดงตวอยางทแสดงตอไปน
ตวอยาง โปรแกรมคนหาขอมล ‚*‛ ทอยใน External data memory 100 Byte ก าหนดให Address เรมตนของ ขอมลอยท 0
การใชIndirect addressing ในการเขาถงขอมลทอยตดตอกน (Block) มขอจ ากดทสามารถใชไดกบขอมลเพยง 256 ตวเทานน ถาใช Register ในการอางองแบบ indirect address จะมขนาดได 8 Bit
SEARCH: MOV R0, #0
MOV R1, #100 TEST: MOVX A, @R0 CJNE A, #’*‛, NEXT
JMP FOUND NEXT: INC R0 DJNZ R1, TEST
NOTFND: . . .
รปท 21
5. ตวอยางการเขยนโปรแกรม
การเขยนโปรแกรม 16-Bit Addition
INITIALIZE TO
ELEMENT 0
READ NEXT
ELEMENT
IS
LAST
ELEMENT
IS
ELEMENT=' * '
POINT TO NEXT
ELEMENT
NO
YES
YESNO
FOUND
NOT
FOUND
Lecture 04
34
ในการบวกเลขแบบ 8-Bit นนมนจะบวกเลขไดเพยง 0 – 255 เทานน ในการใชงานเราอาจตองการบวกเลขทมจ านวนมากกวาน ซงกจะท าไดโดยการเกบขอมลโดยใชจ านวน bit ทมากขน
1. Defining the problem and writing the algorithms
หลกการหรอวธการทใชในการหาค าตอบ
1. บวกคาตวเลขของขอมลทงสอง ในสวนของ Low byte 2. น าผลลพธไปเกบเปน Low byte 3. บวกคาตวเลขของขอมลทงสอง ในสวนของ High byte และตองรวมคาของตวทดทไดจาก การท างานในขนท 1. ดวย 4. น าผลลพธไปเกบเปน High byte
2. Setting up the data structure
ในการท างานกบขอมลในหนวยความจ าทเปนแบบ Multiple byte นน เราตองร หรอ ก าหนดวา ขอมลทเกบนน จดเรยงอยเชนไร ถาก าหนดให ขอมลของตวตง OP1 อยใน Internal Data Memory ท AD1 กบ AD1+1 และตวบวก OP2 อยท AD2 กบ AD2+1 แลวใหเกบผลลพธท AD3 กบ AD3+1 โดยการเกบขอมล ใหเกบ คาในสวนของ Low byte กอน แลวจงเกบ High byte
3. Initialization check list
จากทโปรแกรมนไมมการใชงานของ STACK และไมไดก าหนดอปกรณภายนอกอนๆ
4. การเลอกค าสงใหไดการท างานตามตองการ
AD1L EQU 30H ; First operand LOW byte address
AD1H EQU 31H ; First operand HIGH byte address
AD2L EQU 40H ; Second operand LOW byte address
AD2H EQU 41H ; Second operand HIGH byte address
AD3L EQU 50H ; Result LOW byte address
AD3H EQU 51H ; Result HIGH byte address
MOV A, AD1L ; Load low byte of OP1
ADD A, AD2L ; Add OP2 to OP1 low byte
MOV AD3L, A ; Store result, low byte
MOV A, AD1H ; Load high byte of OP1
ADDC A, AD2H ; High byte OP1 + OP2 + carry
MOV AD3H, A ; Store result, high byte
Lecture 04
35
แลวถาในการบวกเลขในสวนของ High byte มตวทดเกดขน ทางเลอกทมไดคอ
1. ปลอยไว ใหเปนความผดพลาดของโปรแกรม หรอก าหนดใหโปรแกรมนใชไดเฉพาะตวเลขทบวกมาแลวไมเกน 16 bit
2. เขยนโปรแกรมเพอท าการตรวจสอบ ตวทดทเกดขน แสดงวาผลลพธทไดไมถกตอง หรอมการตรวจสอบสถานะของ OV Flag
Subtracting Number
ในการลบเลข นนจะใชค าสง SUBB แทน ADD แตเนองจากวา SUBB จะเปนการลบเลขแบบ คดตวทดดวย ดงนนจงตองท าการ CLEAR คาของตวทดกอน
ADR1 EQU 10H ; First operand address
ADR2 EQU 11H ; Second operand address
ADR3 EQU 12H ; Result address
MOV A, ADR1 ; Load OP1 into A
CLR C ; Clear carry flag
SUBB A, ADR2 ; OP1 – OP2 -> A
MOV ADR3, A ; Save result at ADR3
การเขยนโปรแกรม 8-Bit BCD Addition
การเกบขอมลแบบ BCD มความสะดวกในการใชงานเมอตองการปฏบตงานกบขอมลตวเลขทละหลก หรอเมอเกยวกบการแสดงตวเลขทละหลก จากการทตวเลข BCD ใชเลขฐานสอง จ านวน 4 bit เปนตวแทนของเลขฐานสบ 1 หลก ดงนนในการบวกเลข คาของขอมลทไดมากกวา 9 จะตอง ทด ขนไปอยในหลกตอไป
‘08’ 0000 1000 (BCD) ‘03’ 0000 0011 (BCD) ‘11’ 0000 1011 (BIN) ‘ทด’ 0001 0001 (BCD)
MCS-51 ถกออกแบบมาใหท างานกบขอมลเลข BCD ไดงาย โดยการใชงานของค าสง DA A (Decimal Adjust) การท างานอาศยคาสถานะของ AC Flag (Auxiliary carry flag) ซงเปนตวทดภายใน จาก bit 3 ไป 4
การใชงานของ DA A ตองใชตามหลงการบวก (ADD, ADDC) ของตวเลขทเปน BCD อยแลว
ADR1 EQU 10H ; First BCD operand address
ADR2 EQU 11H ; Second BCD operand address
Lecture 04
36
ADR3 EQU 12H ; Result address
MOV A, ADR1 ; Load OP1 into A
ADD A, ADR2 ; Add OP2 to OP1
DA A ; Adjust the result to BCD
MOV ADR3, A ; Save result at ADR3
การเขยนโปรแกรม 4-Digits BCD Addition (16 Bits)
การบวกสามารถท าไดโดยใชขบวนการเดยวกน กบการบวกเลขฐานสอง ดงตวอยางขางตน เพยงแตเพมค าสง DA A ตามหลงการ บวก เทานน (ADD, ADC)
การเขยนโปรแกรม BCD Subtraction
การลบเลข BCD นคอนขางยงยาก เพราะเมอท าการลบเลข ตองท าการบวกดวย Ten’s complement ของเลข BCD นนๆ ซงท าไดยาก
การเขยนโปรแกรม Converting Two ASCII Codes to Packed BCD
ทวไปแลว การสงขอมล หรอการแสดงผลขอมล ท าโดยใชรหส ASCII เชน เมอ เราตองการ พมพ ตวเลข ‘9’ ออกทาง Printer เราจะตองสงขอมล ASCII ของ ‘9’ ไปให
ASCII 5 0011 0101 = 35H ASCII 9 0011 1001 = 39H
Unpack BCD 5 0000 0101 = 05H Move to upper nibble
Unpack BCD 5 0101 0000 = 50H Unpack BCD 9 0000 1001 = 09H
Packed BCD 59 0101 1001 = 59H
จากตวอยางของขอมลทแสดง เราจะได Algorithms เปน
1. เปลยนรหส ASCII ของขอมลตวแรกใหเปน Unpacked BCD 2. เปลยนรหส ASCII ของขอมลตวทสอง ใหเปน Unpacked BCD 3. ยายขอมล BCD ของตวแรก จาก 4 Bit ลาง ใหเปน 4 Bit บน 4. Pack ขอมลเขาดวยกนใหเปนหนง Byte
Lecture 04
37
การเขยนโปรแกรม Masking with the AND instruction
จากรหส ASCII สามารถแปลงใหเปน BCD ไดโดยการท าให 4 Bit หนามคาเปน 0 จากการกระท าทาง Logic การ AND ดวยขอมล 0 ใหผลลพธทเปน 0 เสมอ การท าเชนนเรยกวาการท า Masking ดงนนการแปลงจะท าไดโดยการ AND ขอมล ASCII ดวย Mask
ASCII 5 0011 0101 = 35H MASK 0000 1111 = 0FH Unpack BCD 5 0000 0101 = 05H
การเขยนโปรแกรม Moving a nibble with ROTATE instruction
การทยายขอมลจาก 4 Bit ลางใหมาเปน 4 Bit บน น สามารถท าไดโดยการ SHIFT หรอ ROTATE ของขอมลไปทางซาย
รปท 22
ในการ SHIFT หนงครง ขอมลของ Bit ทถก shift ออกมาจะอยใน Carry flag และขอมล 0 จะถกใสเขาไปอกดานหนง แต MCS-51 ไมมค าสงส าหรบการ SHIFT
ส าหรบการ ROTATE นน ขอมลของ Bit ทเลอนออกไปจะเขาไปใน Carry flag และสามารถเลอกไดวา จะเอาขอมลจาก Carry flag หรอ จาก Bit ทเลอนออกไป มาใสแทนท
การเขยนโปรแกรม Combining BYTE or BIT with the ADD or the OR instruction
ในการรวมขอมลสอง Byte เขาดวยกนนน สามารถท าไดโดยการ ADD ขอมลเขาดวยกน ถาขอมลชดแรกมเฉพาะ Byte และอกชดหนงมเฉพาะ Byte ลาง การ ADD จะใหผลลพธตามตองการ หรออกวธการหนงคอการใชค าสง OR จากการกระท าทาง Logic ของ OR ‘0’ OR กบอะไรกไดคาเดม และ อะไรท OR กบ ‘1’ จะไดเปน ‘1’
การใชงานของ OR น ยงสามารถใชในการท าให Bit ของขอมลทตองการใน Byte เปน ‘1’ ได
ดงนน โปรแกรมทไดจะเปน
Lecture 04
38
MASK EQU 0FH ; Mask
ASCII1 EQU ‘5’ ; ASCII of ‘5’ = 35H
ASCII2 EQU ‘9’ ; ASCII of ‘9’ = 39H
MOV A, #ASCII1 ; Load ACCII ‘5’ into A
ANL A, #MASK ; AND A with MASK
RL A ; Rotate left 4 times
RL A
RL A
RL A
MOV R0, A ; Store result high
MOV A, #ASCII2 ; Load ACCII ‘9’ into A
ANL A, #MASK ; AND A with MASK
ORL A, R0 ; Packed result
การเขยนโปรแกรม Converting Binary number to BCD
การแปลง Binary number ใหเปน BCD นน สามารถท าไดโดยงาย จากการท MCS-51 มค าสงส าหรบการ หาร เลข และดวยการใชงานของค าสง SWAP A ทท าการสลบ 4 บต บน กบ 4 บต ลางของ Accumulator (แทนการ Rotate 4 ครงจากตวอยางทแลว)
ADR1 EQU 10H ; Address of Binary to be converted to BCD
MOV A, ADR1 ; Load Binary number into A
MOV B, #10
DIV AB
SWAP A ; Move 10’s to high nibble
ADD A, B ; Packed result
การเขยนโปรแกรม Converting BCD to Binary number
การแปลง BCD ใหเปน Binary นน สามารถท าไดโดยงาย ดวยการคณเลข คาประจ าหลก (หนวย, สบ, รอย ...) แลวน าผลทไดของแตละหลกมาบวกกน
Lecture 04
39
การเขยนโปรแกรม Boolean Operations
MCS-51 ไดถกออกแบบมาใหสามารถประมวลผลขอมลแบบ Bit ได (Single –bit processor) โดยจะใช Carry flag เสมอนเปน Accumulator ของขอมลแบบ บต น
MOV C, P1.0 ; Load Port 1 bit 0 status
ANL C, P1.1 ; AND with status from Port 1 bit 1
MOV P1.2, C ; Output to Port 1 bit 2
การเขยนโปรแกรม IF-THEN, IF-THEN-ELSE Programs
IF-THEN ใชในการตดสนใจวาจะท า หรอไมท า สวนของ Program
IF condition THEN action A action B
สวน IF-THEN-ELSE นใชในการเลอกวา จะท างานอะไร
IF condition THEN action A ELSE action B
ส าหรบ Microprocessor ทวไปแลว เงอนไขทใชในการตดสนใจนน ไดจาก FLAG แตส าหรบ MCS-51 ไดออกแบบใหสามารถใชเงอนไข จากสถานะของขอมลแบบบต หรอคาของขอมลทมอยใน Accumulator หรอหนวยความจ า ในการเลอกวาจะท าหรอไมท างานตามสวนของโปรแกรมใดๆ โดยใชค าสงของการ JUMP แบบมเงอนไข (Conditional JUMP) ท าใหสามารถเขยนโปรแกรมไดโดยงาย
6. MCS-51 FLAGS
ใน MCS-51 Flag คอสถานะของ Bit ทอยใน Register PSW ดงแสดงในรป
Lecture 04
40
รปท 23
Carry (CY)
ส าหรบ Microprocessor ทวไปแลว Carry flag มหนาทอยสองอยางคอใชในการแสดงสถานะวา ในการ บวก หรอ ลบ เลข นนม ตวทด (ยม) หรอไม และใชเปน Bit ท 9 ของการ ROTATE ในการใช Carry flag ตองเขาใจวา การท างานของค าสงในการค านวณ จะสงผลถงสถานะของ Carry flag ขนอยกบผลทไดจากการท างานนนๆ และการใชค าสง RLC, RRC สงผลถงสถานะของ flag ขนอยกบขอมลทออกมา
Auxiliary Carry Flag (AC)
เปนคาสถานะทแสดงถงตวทด ทเกดขนจาก 4 Bit ลาง ไปยง 4 Bit บน ถกใชในการท าค าสง DA A
General purpose status flag (F0, F1)
เปน Flag ส าหรบการใชงานทวไป ซงผใชสามารถเขยนโปรแกรมเพอก าหนดคา และตรวจสอบคาของ F0 นได
Register bank select (RS1, RS0)
ส าหรบการเลอก Bank ของ Register R0 – R7 ทจะใชงาน โดยการก าหนดคา Bank ทตองการ กอนการใชงาน
Lecture 04
41
รปท 24
Overflow flag (OV)
ส าหรบ Flag นท าหนาทคอ ใชแสดงสถานะ การเกด Overflow ในการท างานทางคณตศาสตร
Parity of Accumulator (P)
สถานะของ P Flag ขนอยกบ Parity ของขอมลทมอยใน Accumulator ถาจ านวนของ Bit ทเปน ‘1’ ถามจ านวนเปน ‘ODD’ Parity Flag จะ set เปน ‘1’ แตถามเปน ‘EVEN’ Parity Flag จะ reset เปน ‘0’ Parity มประโยชนใชในการตรวจสอบความถกตองของขอมลทเกบไว หรอรบเขามา
Summary of the Flags
การเปลยนแปลงสถานะของ Flag ตางๆ ขนอยกบผลของการท างานของค าสงตางๆ ทพอสรปได ดงน
นอกจากนแลว การกระท ากบ Register PSW หรอ Bit ของ PSW กจะเปนการเปลยนสถานะของ Flag โดยตรง
รปท 25
การเขยนโปรแกรม JUMPS and Conditional JUMPS
Branch instruction เปนค าสงท ท าใหการท างานของ Microprocessor กระโดดไปยง โปรแกรม ในต าแหนงทตองการ การกระโดดไปน อาจเปนแบบมเงอนไข หรอไมมกได
การกระโดดแบบมเงอนไข คอการกระโดดจะเกดขน เมอเงอนไขนนเปนจรง การกระโดดในแบบน ใชในการตดสนใจทขนอยกบสถานะของขอมล หรอผลทไดจากการท างานกอนหนา เงอนไขทสามารถใชได คอ
สถานะของ Carry flag: Jump if C = 1, Jump if C = 0
สถานะของ Bit address: Jump if bit = 1, Jump if bit = 0
ขอมลใน Accumulator: Jump if Acc = 0 Jump if Acc != 0 Jump if Acc != คาในหนวยความจ า หรอคาคงท
ขอมลในหนวยความจ า: Jump if คาในหนวยความจ า != คาคงท
Lecture 04
42
นอกจากค าสง JUMPS แลว การกระโดดสามารถท าไดในอกรปแบบหนง ทเรยกวา การเรยกใช (CALL) โปรแกรมยอย (Subroutine) ซงกสามารถท าไดแบบไมมเงอนไขเทานน
Example program
ถาตองการตรวจสอบคาของขอมลในหนวยความจ าทต าแหนง LOC วา มนมคาเปน ‘A’ หรอ ‘B’ หรอเปนคาอนๆ ตาม Algorithm ทแสดง
IF @LOC = ‘A’ THEN action A ELSE IF @LOC = ‘B’ THEN action B ELSE action C
รปท 26
MAIN: MOV A, LOC ; Read character in TEST1: CJNE A, #’A’, TEST2 ; Compare to ‘A’ ACT_A: . . . ; Action A . . . JP FIN ; Finish TEST2: CJNE A, #’B’ , ACT_C
ACT_B: . . . ; Action B . . . JP FIN ; Finish ACT_C: . . . ; Action C . . . FIN: . . . ; Finish
Action A
@LOC
= ‘A’
@LOC
= ‘B’
Action B Action C
Yes
Yes
No
No
Lecture 04
43
WHILE-DO Programs
WHILE condition is present DO action A action B
ในการเลอกใชงานของ WHILE-DO นนมจดทสงเกตคอ เงอนไขจะถกตรวจสอบกอนทจะมการท างาน
TEMP_IN: MOV A, P0 ; Read Temp.
CLR C ; Clear Carry
SUBB A, #100 ; Compare to 100
JNC T_OFF ; If temp >= 100 then off
T_ON: . . . ; Turn On Heater
. . .
JP TEMP_IN
T_OFF: . . . ; Turn off heater
. . .
START
Read value from sensor
Stroe in memory
Wait 1 Hour
24 Samples ?
END
Temp.>= 100
Turn ON HeaterYes
No
START
Read Temp.
Turn OFF Heater
Lecture 04
44
รปท 27
REPEAT-UNTIL Programs
REPEAT action . . . UNTL condition is present
ส าหรบการท างานของ REPEAT-UNTIL น มการท างานกอน แลวจงตรวจสอบเงอนไข วาจะตองท างาน นนๆ อกรอบหรอไม
Example Monitoring the Duration
การตรวจวดระยะเวลาของสญญาณ Input สามารถจะท าไดเชนเดยวกบการสรางสญญาณ คอท าไดโดยการใช Software หรอ Hardware กได การนบชวงเวลาโดย Software จะท าโดย การเพมคาของ Counter ขนเรอยๆ ถายงมสญญาณ Input อย ดงนนเมอสญญาณ Input หายไป คาทมอยใน Counter กคอระยะเวลาของสญญาณทเขามา จะเขยนเปน Program คอ
MOV R7, #0 ; Clear counter Start: JNB P1.0, Start ; Read Input and Testing Bit 0 for ‘1’ Count: INC R7 ; Increment counter NOP NOP
JB P1.0, Count ; Reading Input and Testing Bit 0 for ‘0’
ส าหรบการท างานของโปรแกรมน จะมขอจ ากดคอ ระยะเวลาทจะตรวจสอบ ตองไมนานเกนไป เพราะจะท าใหเกด Overflow ขน
Lecture 04
45
7. Subroutines
กคอกลมของค าสง ทผ เขยนโปรแกรมไดตงขน โดยเรมจาก สวนทก าหนดต าแหนงหนวยความจ าเรมตนทเกบค าสงแรกของ Subroutine และตว Subroutine จะสนสดดวยค าสงเฉพาะ ทเรยกวา RETURN การท างาน หรอการเรยกใชงานของ Subroutine สามารถแสดงไดดงรป
รปท 28
จากสวนของ Main program ทางดานซาย และ สวนของ Subroutine ทแสดงทางดานขวา เมอ CPU ท างานตามค าสงตางๆ ใน Main program มาจนถงค าสง CALL SUB (เปนค าสงส าหรบการเรยกใช Subroutine) เปนผลให CPU กระโดดไปท างานยง ค าสงแรกสดของ Subroutine (แสดงโดยเสนหมายเลข 1)
CPU จะท างานตามค าสงตางๆ ใน Subroutine นไปเรอยๆ เชนเดยวกบการท างานตามปกต จนไปถงค าสงสดทายใน Subroutine ซงกคอ RETURN ค าสงนจะท าให CPU กระโดดกลบไปท างานในสวนของ Main program ยงค าสง ทอยตอจาก CALL SUB (แสดงโดยเสนหมายเลข 3) และท างานตอใน Main program (แสดงโดยเสนหมายเลข 4)
จนกระทงพบค าสง CALL SUB เปนครงทสอง การกระโดดไปท างานยง Subroutine จะเกดขนอก (เสนหมายเลข 5) และเมอถง RETURN มนกกลบมาท างานใน Main program ณ. ค าสงทอยตอจาก CALL SUB ทเรยกไปนนเอง (เสนหมายเลข 7)
ประโยชนของการใชงาน Subroutine กคอ มนสามารถทจะเรยกใชซ าๆ ไดจากหลายๆ สวนใน Main program โดยไมตองเขยนกลมของค าสงเหลานนอก ท าใหประหยดหนวยความจ าในการเกบโปรแกรม และประโยชนอกขอคอ เมอเราออกแบบ Subroutine ทท างานตามตองการ เพยงครงเดยว แลวสามารถน ามาใชใหมไดในภายหลง ท าใหการเขยนโปรแกรมงายขน
สวนขอเสยของการใชงาน Subroutine กคอ การท างานทชากวานนเอง
7.1 การท างานทเกดขนเมอเรยกใช Subroutine
Lecture 04
46
สงทเกดขนเมอ CPU ท าค าสง CALL SUB คอ CPU จะท าการ FETCH ค าสงแรกของ Subroutine นนๆ มาท างาน นนคอการท า CALL SUB จะเปนการเปลยนคาของ PC (Program Counter) ใหม เปนคา Address ของค าสงแรกของ Subroutine
สวนการท างานของค าสง RETURN ซงเปนการเปลยนคาของ PC กลบเปนคา Address ของค าสงทอยตอจากการใช CALL SUB จะท าเชนนได กแสดงวา มนจะตองมการเกบคาของ PC เมอท า CALL SUB เอาไว ทใดทหนง เมอท าค าสง RETURN กเพยงแตน าคาน กลบมาใสท PC คน นนเอง ปญหาตอไปกคอ เราจะเอาคา Address ทจะ return นไปเกบไวทใด
ในการใชงานโดยทวไปของ Subroutines นน อาจมการเรยกใชซอนๆ กนไดเปนจ านวน N ชน (N nested call) ดงแสดงในรป
รปท 29 เมอใดกตามทมการท าค าสง CALL ตองมกลไกทจะ เกบคาของ PC เอาไว ซงเราจะตองม Memory เปน 2N เพอท าการเกบคาของ PC และในการ return กจะตองมการ return จาก SUB2 กอน แลวจง return จาก SUB1 ดงนนในการเกบคาของ PC จงตองเปนไปตามล าดบดวย
การเกบคาของ PC นจะท าโดยใช Stack ดงจะแสดงการท างานทเกดขนไดดงน
ตาราง 17
Stack 1st Time 2nd Time 3rd Time 4th Time
0008H 0103H 0103H 0103H
0009H 0303H
จากท Address 100 มค าสง CALL SUB1 (ซงถาใหค าสง CALL SUB ใน CPU นเปนค าสงแบบ 3 Byte) เมอท าค าสง CALL SUB1 คาของ PC ซงเปน 103 จะถกเกบลงใน Stack และคา Address ของ SUB1 (280) จะถกใสใน PC
Lecture 04
47
ในการท างานของ Program SUB2 เมอไปถงค าสง RETURN คาบนสดของ Stack จะถกน ากลบไปใสกลบไปใสใน PC ท าใหคาของ PC กจะเปนคาเดมกอนทจะไปท าใน SUB2 จากนนเมอ Program SUB1 เมอไปถงค าสง RETURN คาบนสดของ Stack จะถกน ากลบไปใสกลบไปใสใน PC ท าใหคาของ PC กจะเปนคาเดมกอนทจะไปท าใน SUB1
จากขบวนการท างานของ Subroutine น จะเหนไดวาจ านวนครงทสามารถเรยกใชซอนกนไดนน (Nested Call) ขนอยกบขนาดของ Stack
ในรปตวอยางทยกมาน ไดเขยนแสดง สวนของ Subroutine ไวทางดาน ขวามอ กเพอใหสามารถอธบายการท างานไดสะดวกเทานน โดยทวไปแลว Subroutine จะถกเขยนไวตอจาก main program โดยม Label ทเปนตวบอกชอของ Subroutine และควรม Comment ทอธบายการท างานของมนดวย
7.2 MCS-51 Subroutines
จะเหนไดวาในการท างานของ Subroutines นนตองม Stack ส าหรบ MCS-51 แลว Stack เปนแบบ Software Stack โดยการท างานของ Stack-Pointer Register (SP) ซงขนาดของ Stack และต าแหนงทอยของ Stack ใน Memory ผ เขยนโปรแกรมสามารถก าหนดไดและจะตองถกกนเอาไว แตในปกตแลวหลงจากการ Reset Stack จะถกก าหนดใหเรมตนเกบขอมลท Address 08H เปนตนไป (SP = 07H)
การเรยกใช Subroutine ใน MCS-51 ท าโดยใชค าสง CALL แลวตามดวย Address ของ Subroutine การใชงานของค าสง CALL นน ท าไดแบบ ไมมเงอนไขเทานน
เชนเดยวกบการ Return จาก Subroutine กเปนแบบไมมเงอนไข (RET) เชนเดยวกบค าสงส าหรบการ Return จาก Interrupt routine (RETI) ซงจะไดอธบายในหวขอของ Interrupt
7.3 Subroutine Examples
ตวอยางเชน ถาในการท างานของโปรแกรม มความตองการแปลงเลข Bin เปน BCD อยหลายครง เราสามารถสราง Subroutine ของการแปลงเลขได จากตวอยางของโปรแกรมแปลงเลข Bin เปน BCD ทผานมา สามารถท าเปน Subroutine โดยใหชอเปน Bin_BCD และในตอนจบของโปรแกรมก เตมค าสง RET
มขอควรระวงทส าคญคอ การท างานของ โปรแกรมใน Subroutine จะสงผลถงสถานะของ Register และ Flag ตางๆ ดวย ดงนนถาไมตองการใหสถานะ หรอคาของ Register มการเปลยนแปลง กตองท าการเกบคาเหลานนเอาไว และน ามาคนเมอ return จาก Subroutine ท าไดโดยการเกบคาของ Register (เฉพาะทตองการคงคาเดม) ลงใน Stack และกอนขนตอนของการ return กท าการ POP คานนๆ กลบมาคนส Register หรอส าหรบการใชงานของ Register R0 – R7 นน กสามารถท าไดโดยการสลบ Register Bank ทใชงาน ซงมขอดคอท าไดสะดวกรวดเรว แตจะไมสามารถเรยก Subroutine ซอนกนได
Bin_BCD: PUSH A ; Store Acc
Lecture 04
48
PUSH B ; Store B
PUSH PSW ; Store PSW
MOV PSW, #0000 1000B ; Change used Register bank to 01
ADR1 EQU 30H ; Address of Binary to be converted to BCD
MOV A, ADR1 ; Load Binary number into A
MOV B, #10
DIV AB
SWAP A ; Move 10’s to high nibble
ADD A, B ; Packed result
MOV ADR1, A ; Store result
POP PSW ; Restore old value
POP B
POP A
RET ; Return
7.4 Subroutine Parameters
เมอมการเรยกใชงาน Subroutine โดยทวไปแลว เมอตองการให มนกระท ากบขอมลจ านวนใด เชนในตวอยางของ Subroutine ของการแปลงเลข เรากตองสงคาตวเลข Binary นนไปใหมนท าการแปลง และตองการไดผลลพธ กลบออกมา จากตวอยางทแลว Subroutine ไดรบ คาของตวเลข Binary จากหนวยความจ าในต าแหนงทก าหนดไว (ADR1: 30H) และผลลพธ จะไดกลบมาท Address เดยวกน
ส าหรบวธการทใชในการสงคาใหกบ Subroutine สามารถท าไดหลายๆ วธคอ
Using Registers
โดยใช Register เปนตวสงคาไปให ท าไดรวดเรว และเปน Subroutine ทไมขนอยกบ Address ของ Memory แตมขอจ ากดทจ านวนของ Register เชน
MOV R0, #01AH
Delay: DJNZ R0, Delay
Lecture 04
49
RET
Using Memory
เปนวธการทยดหยนกวา สามารถสงคาตวแปรไปให ไดมาก แตมการท างานทชาลง และตองมการ กนทใน Memory ไวเปนทางผานของขอมลเชน
MOV 20H, #01AH
Delay: DJNZ 20H, Delay
RET
Using Stack
มขอดเชนเดยวกบการใช Register แตจะท าใหการใชงานของ Stack นนเตมเรวขน เชน
MOV 20H, #01AH
PUSH 20H
Delay: POP 20H
Delay1: DJNZ 20H, Delay1
RET
การเลอกวธการทจะใชนขนอยกบผ เขยนโปรแกรม ซงโดยทวไปแลวควรเลอกวธการทไมขนอยกบ Address ของ Memory มากกวา ในกรณทขอมลทตองการประมวลผลโดย Subroutine มจ านวนมาก ไมควรสงขอมลนนๆ ไปให Subroutine โดยตรง แตควรสงตวชต าแหนงของขอมล (Data pointer) ซงเปนคา Address เรมตนของ ขอมล ไปใหแทน
7.5 Subroutine Library
เราสามารถสราง Subroutine ทมการท างานตางๆ เกบไวใช ภายหลงได หรอรวบรวมเอาไว ในการเขยนโปรแกรมตอไปกจะท าไดโดยงาย ซงในขบวนการ Link นน จะเลอกเอาเฉพาะ Code ของโปรแกรม ทมการใชงานมารวมกนเทานน