บริษัท อีเลคทรอนิ คสซอร ซ จํัดาก คู...
TRANSCRIPT
บริษัท อีเลคทรอนิคส ซอรซ จํากดั คูมือการใชงาน
F2MC-8L FAMILY 8-BIT MICROCONTROLLER
MB89201 SERIES
เร่ิมตนการใชงาน DEV-MB89N202-APP1
Rev. 2
2สารบัญ บทนํา 3
1. บทที่ 1 Hardware 1.1 คุณสมบัติ 4 1.2 ลักษณะของบอรด DEV-MB89N202-APP1 5 1.3 การเชื่อมตอและการเซต 6 1.4 คุณสมบัติทางฮารดแวร 7
2. บทที่ 2 Fujitsu Flash Software Programmer 2.1 การจัดฮารดแวรสําหรบัการดาวนโหลดโปรแกรมแบบ
In-circuit serial programming 8 2.2 การติดตั้ง software Programmer 9 2.3 ติดตอกับ DEV-MB89N202-APP1 10
3. บทที่ 3 Fujitsu Softune Workbench IDE 3.1 การติดตั้งโปรแกรม Softune workbench 15 3.2 การเริ่มตนใชงานโปรแกรม Softune Workbench 18 3.3 การสรางโปรเจคทใหม 26
4. บทที่ 4 โปรแกรมตัวอยาง 4.1 การขับ LED 7 เซ็กเมนต 37 4.2 การใชงาน Timer 40 4.3 การใชงาน Interrupt Timer 43 4.4 การเขียนโปรแกรมรับสวิตช
4.4.1 โปรเจคท KeyBasic 1 46 4.4.2 โปรเจคท KeyBasic 2 49 4.4.3 โปรเจคท KeyAdvance 52
4.5 การใชงานสวนแปลงสัญญาณอนาลอกเปนดิจิตอล (ADC) 54 4.6 การอินเตอรเฟซกับหนวยความจํา EEPROM (24C01) 56
3บทนํา บอรดพัฒนา DEV-MB89N202-APP1 ไดถูกพัฒนาขึ้นเพื่อเปนตัวอยางการใชงานไมโคร- คอนโทรลเลอรของ Fujitsu เบอร MB89F202/MB89N202 เปนพื้นฐานที่สําคัญสําหรับวิศวกร ชางเทคนิค นกัวิจัย นักศึกษา และ นกัอิเล็กทรอนิกสสมัครเลน ที่มีความสนใจที่จะเริ่มตนการพัฒนาชิ้นงานเพื่อการใชงานจริงดวย MB89F202/MB89N202 อุปกรณที่ใชในการพัฒนาบอรดเปนอุปกรณพื้นฐานที่สามารถหาไดทั่วไปในทองตลาด วงจรของบอรดจะแสดง การสรางวงจร in-circuit serial programming พื้นฐานการเชื่อมตออุปกรณภายนอกเชน LED 7-Segment EEPROM คียสวิตช และ Buzzer คูมือการใชงานแบงเปน 4 บท โดยในบทแรกจะแสดงสวนประกอบทางฮารดแวรของบอรด DEV-MB89N202-APP1 การปรับตั้ง หนาที่ของแตละสวน และขอควรระวังในการใชงาน สวนที่สองแสดงการใชงานวงจร in-circuit serial programming การติดตั้งและใชงานโปรแกรมบนคอมพิวเตอรเพื่อติดตอกับบอรด DEV-MB89N202–APP1 ผานพอรตสื่อสารขอมูลอนุกรม (RS232) เพื่อดาวนโหลด machine code ลงในหนวยความจําโปรแกรมภายในแบบแฟลช และในบทที่สามจะกลาวถึงการใชงานโปรแกรม Softune Workbench เพื่อการเขียนโปรแกรมภาษาซี อยางละเอียดทีละขั้นตอน ดวยรูปภาพ ประกอบเพื่องายสําหรับการทําความเขาใจ โดยตลอดการอธิบายจะเนนวิธีการใชงานบอรด DEV-MB89N202-APP1 แตจะไมลงรายละเอียดในการเขียนโปรแกรม และในบทที่สี่ จะอธิบายโปรแกรมตัวอยางที่ไดพัฒนาสําหรับการนําไปใชงานจริงและทดสอบการทํางานของบอรดพัฒนา DEV-MB89N202-APP1 ซึ่งประกอบดวย การขับLED 7 เซกเมนต การใชงาน Timer การเขียนโปรแกรมรับสวิตช การอินเตอรเฟซกับ EEPROM เบอร 24C01 และการใชงานสวนแปลงสัญญาณอนาลอกเปนดิจิตอล (ADC) ที่มีอยูในตัว MB89F202/MB89N202
4
บทที ่1 Hardware 1.1 คุณสมบัติ • ใช MCU เบอร MB89F202/MB89N202
- หนวยความจําโปรแกรมแบบแฟลชขนาด 16 กิโลไบท - โปรแกรมซ้ําได 1,000 ครั้ง สําหรับ MB89N202 - โปรแกรมซ้ําได 10,000 ครั้ง สาํหรับ MB89F202 - หนวยความจําขอมูล (RAM) ขนาด 512 ไบท
- หนวยแปลงสัญญาณอนาลอกเปนดิจิตอลความละเอียด 10 บิท - หนวยสื่อสารขอมูลอนุกรม (UART ) - ไทเมอรขนาด 8 บิท และ 16 bit • ใช main clock ความถี่ 8 MHz • In-Circuit Serial Programming ดวย พอรตอนุกรม RS232 • LED 7 Segments 4 หลัก • LED 3 ดวง • มีหนวยความจําแบบ EEPROM : 24C01 • คียสวิตช 4 คีย • มีอินพุทสําหรับเทอรมิสเตอร 2 ชอง • มีหนาสัมผัสของรีเลยพิกัด 10A/120V จํานวน 2 ชุด • Buzzer • มีตัวอยางโปรแกรมเพื่องายสําหรับการเริ่มตน • มีเทอรมิสเตอรรวมมากับบอรด
5
1.2 ลักษณะของบอรด DEV-MB89N202-APP1 บอรด DEV-MB89N202-APP1 นําเสนอตัวอยางการนําไมโครคอนโทรลเลอร MB89F202/ MB89N202 เพื่อการใชงานจริง ประกอบดวยวงจรพื้นฐานอยางเชน วงจรขับ LED 7-Segment และ LED 3 ดวง วงจรรับคียจํานวน 4 คีย เปนตน ซึ่งวงจรเหลานี้มีประโยชนอยางย่ิงสําหรับการใชในการพัฒนาและทดสอบโปรแกรมพืน้ฐาน
SW1: EEPROM Resonator Fujitsu MCU Display
Mainboard
Display Panel
LED1
LED2
LED3
Key1 Key2 Key3 Key4
Reset Button 24C01 8MHz MB89N202 P anel Thermister Input1
CN5:
CN4: Thermister Input2
Relay Contact1
CN3:
CN2: Relay Contact2
CN1: Power Connection CN5 RS232: Serial Communication Serial SL1:
Programming Program/Run Connection
BuzzerCircuit Selection
6
1.3 การเชื่อมตอและการปรับตั้ง การตอแหลงจายไฟ ในภาคแหลงจายไฟของบอรด DEV-MB89N202-APP1 ไดรวมวงจรเรียงกระแส วงจรกรอง และวงจรรักษาระดับแรงดันไวแลว ดังนั้นจึงสามารถปอนแรงดันไฟตรง 12 โวลต และแรงดันไฟสลับ 9 โวลต ไดโดยไมตองคํานึงถึงขั้วของแหลงจายไฟจากภายนอก แตส่ิงที่ควรระวังคือ อยาปอนแรงดันเกินพกิัด
วงจร In-Circuit Serial Programming ขอดีประการหนึ่งของ MB89F202/MB89N202 คือ สามารถดาวนโหลดโปรแกรมดวยวงจร in-circuit serial programming ได โดยใชเพียงขา TXD, RXD และขา P60( high voltage) เทานั้น MAX232 กับอุปกรณภายนอกเพียงเล็กนอยก็สามารถสรางวงจรไดตามตองการ การเลือกโหมด Program/Run สไลดสวิตช SL1 ทําหนาที่เปนสวิตชเลือกโหมดการทํางานของ MB89F202/MB89N202 การปรับตั้งแสดงดังรูปขางลาง เมื่อตองการทํางานในโหมด “โปรแกรม” ใหเลื่อนสวิตชไปที่ตําแหนง “ P ” และเมื่อดาวนโหลดโปรแกรมเสร็จแลว หากตองการรัน ใหเลอืกสวติชไปที่ตําแหนง “ R “ Run Program ขอสังเกต : หลังจากเลื่อนสวิตชแลว ใหกดสวิตชรีเซต 1 ครั้ง เพื่อเขาสูโหมดรัน หรือโหมดโปรแกรม
7
1.4 ลักษณะทางดานฮารดแวร
L = 91mm
W = 75mm
H = 40mm
** ขอสังเกต : รูปที่แสดงขางบนไมใชขนาดจริง เงื่อนไขแนะนําในการใชงาน 1. แรงดันขาเขา ดานอินพุทของ Power Supply +12 VDC , 9VAC 2. แรงดันขาเขา ดานขั้วตอเทอรมิสเตอร 5V 3. พิกัดหนาสัมผัสรีเลย 10A/120V
8 บทที ่2 Fujitsu Flash Software Programmer 2.1 การจัดฮารดแวรสาํหรับการดาวนโหลดโปรแกรมแบบ in-circuit serial programming
Reset Button Program/RunSelector
Serial Port (RS232) Power Connector RS232 Connector ขั้นตอนการเตรียมบอรด DEV-MB89N202-APP1 สําหรับดาวนโหลดโปรแกรม
1. ตอแหลงจายไฟที่คอนเนคเตอร CN1 2. ตอสายดาวนโหลดระหวางพอรตอนุกรมของคอมพิวเตอรกับคอนเนคเตอร
RS232 ของบอรด 3. เลื่อนสไลดสวิตชไปที่ตําแหนง “ P ” 4. กดสวิตชรีเซตเพื่อเขาสูโหมดโปรแกรม
92.2 การติดตั้งซอฟทแวรสาํหรับดาวนโหลดโปรแกรมของ Fujitsu รัน “Setup.exe” ในโฟลเดอร Fujitsu MCU Programmer V 5.0.02
คลิก OK เลือกโฟลเดอรสําหรับเก็บโปรแกรม แลวคลิก Next.
กําลังทําการติดตั้ง
102.1 ติดตอกับบอรด DEV-MB89N202-APP1
รันโปรแกรม Fujitsu MCU Programmer Version 5.0.02 จากสตารทเมนู “Start>Programs>MCU Programmer”
โปรแกรมเมอรจะแสดง COM port ที่มีอยูบนคอมพิวเตอร
พอรตอนุกรมท่ีมีบนเครือ่ง
11 เลือก F2MC8L Asynchronous และเลือกเบอร MCU แลวคลิกปุม Connect
พอรตอนุกรมที่ตออยูกับบอรด
ถาบอรด DEV-MB89N202-APP1 ตออยูกับคอมพิวเตอร โปรแกรมเมอรจะแสดงดังตัวอยางขางบน ซึ่งแสดงวาพอรตอนุกรมหมายเลข 1 (COM1) ตออยูกับบอรด
และอีกสักครู โปรแกรมเมอรจะแสดงไดอะล็อกบ็อกดังรูปขางลาง. คลิกเลือก “Advanced Mode”
12 เลือกชนิดของ machine code ที่ตองการดาวนโหลด ดังเชน “Motorola S” คลิก “Load File/Project” เพื่อโหลด machine code สูบัฟเฟอร
13โปรแกรมเมอรจะแสดงไฟลไดอะล็อกบ็อกดังรูปขางลาง โดยปกติ machine code จะถูกเก็บอยูในโฟลเดอร ABS
สําหรับตัวอยางขางลาง เลือก “ UART.mhx ”
14 คลิก “OK” เพื่อเริ่มตนการโปรแกรม
15บทที่ 3 Fujitsu Softune Workbench IDE 3.1 การติดตั้งโปรแกรม Softune Workbench
รันโปรแกรม “Setup.exe” ของ Softune Workbench V30L29 คลิก OK เลือกโฟลเดอรท่ีใชเก็บโปรแกรม
คลิก Next
16 เลือกสวนประกอบของโปรแกรมที่ตองการ หากคอมพวิเตอรมีทรัพยากรมากพอ ขอแนะนําใหเลือกทั้งหมด
คลิกเลือกสวนประกอบที่ตองการ
คลิก Next
กําลังติดตั้งโปรแกรม
17
คลิก Finish
183.2 เริ่มตนใชงานโปรแกรม Softune Workbench รัน Softune Workbench V30L29 จาก “Start” เมนู Start>Programs>Softune V3>FFMC-8L-Family-Softune-Workbench หลังจากรันโปรแกรมสักครู โปรแกรมจะแสดงโลโกดังรูปขางลาง ลักษณะวินโดวของ Sotune Workbench แสดงดังรูปขางลาง
เมนูบาร ทูลบาร Build All ไอคอน
Project Window Editor Window Output Window
19การเปดโปรเจคทตัวอยาง 1. เลือกเมนู File
2. คลิกเลือก Open Workspace 3. คลิกเลือกไฟลนามสกุล wsp 4. คลิก Open
20 หลังจากเลอืกไฟลนามสกุล wsp แลว Softune Workbench จะแสดงรายละเอียด ของโปรเจคท
Build All
Project Window
Editor การปรับแตงวินโดวของ Softune Workbench
1. คลิกขวาบน editor window
2. เลือก Customize
21
4. ปุมเลือกแบบตัวอักษร
3. คลิกเพื่อเลือกหรือยกเลิก การเปลี่ยนแบบตัวอักษรของ editor window ดวยการใชเมนู
1. เลือกเมนู View
2. เลือก Font
22 การเปลี่ยน configuration ของโปรเจคท
2. เลือก setup Project
1. เลือกเมนู Project ตรวจสอบดูวา register bank ถูกเลือกไวหรอืไม ตองเลือกอยางนอย 1 bank เพื่อปองกันการซอนทับกันของหนวยความจํา ดังแสดงในรูปขางลาง
3. เลือก Linker
4. เลือก Bank0
23การเริ่มการทํางานของ Absolute Module Converter . 5. เลือก Converter
6. คลิกเลือก
8. คลิก OK
7. เลือกรูปแบบไฟลของ ไฟลภาษาเครื่อง (hex file)
การจําลองการทํางานดวยโปรแกรม
1. เลือกเมนู Debug
2. เลือก Start Debug
24
3. คลิกเพื่อทําการเซต Debug .
4. เลือก Simulator Debugger
5. คลิก Next
25 6. เลือกเมนู Debug
7. เลือก Load target file
263.3 การสรางโปรเจคทใหม
1. เลือกเมน ูFile
2. เลือก New
4. คลิก OK 3. คลิกเลือก
27
** ขอสังเกต : หากไมมีเบอร MB89N202 หรือ MB89F202 ไมมีอยูใน list box ใหเลือกเบอร MB89P935A แทน เพราะมีโครงสรางเหมอืนกัน
5. คลิกเลือก
4. เลือก Project
6. เลือก MCU Family
8. ต้ังชื่อ Project และ Workspace 7. เลือกเบอร MCU **
9. เลือกโฟลเดอรท่ีใชเก็บ Project และ Workspace 10. คลิก OK
28หลังจากไดสรางโปรเจคทใหมแลว โปรแกรม Softune จะสรางโฟลเดอรเพื่อใชเก็บโปรเจคท ซึ่งจะมีชื่อเหมือนกับชื่อโปรเจคท ไวในโฟลเดอรที่ไดเลือกไว แตไมมี Source Code วิธีที่งายที่สุดคือการกอปป Source Code จากโปรเจคทตัวอยาง แลวทําการแกไข
2. ดับเบิลคลิกเพื่อดูรายละเอียด ในโฟลเดอร
1. หาโฟลเดอรท่ีใชเก็บโปรเจคท
29
3. หาโฟลเดอรของโปรเจคทตัวอยาง
4. กอปป Source Code ไปไว ในโฟลเดอรของโปรเจคทใหม
30
6. เลือก Add Member to folder
5. คลิกขวาบน Source Files
7. เลือกไฟล Source Code ท้ังหมดในโฟลเดอร
9. เลือกเมน ู Project
10. เลือก Setup Project
8. สังเกตจาก Project Window เห็นวา Source Code ไดถูกเลือกมาไวในโปรเจคท
31
11. เลือก MCU
12. ตรวจสอบเบอร MCU
13. เลือก C Compiler
14. เพิ่มออปชั่นให Compilerยอมรบั เครื่องหมาย “ // “
32
15. เลือก Linker
16. คลิกเลือก Disposition/Connection
17. คลิกเลือก Set Section
33
18. เลือก ROM Section
21. คลิกเพื่อกําหนด section
20. เลือกชนดิของ section
19. เลือกชื่อของ Section
ทังสอง Section นี้ตองทําการกําหนดไว
17. กําหนดตําแหนงของ I/O Section 18. คลิกเพื่อกําหนด section
24. คลิก OK เพื่อเสร็จสิ้นการกําหนด
34
25. เลือก Register Bank
26. เลือก Bank 0
27. เลือก Converter
29. เลือกชนิดของ hex file
28. คลิกเพื่อเริ่มตนการทํางานของ Absolute Module Converter
30. คลิกเพื่อเสร็จสิ้นการเซต project
35
31. คลิกเพื่อทดลอง compile โปรเจคทใหม
แสดงวา Hex file ถูกสรางขึ้น
หากไมมีความผิดพลาดเกิดขึ้น แสดงวาการสรางโปรเจคทใหมสําเร็จ
36 บทที ่4 โปรแกรมตัวอยาง
เพื่อใหการเริ่มตนการใชงานบอรดพัฒนา DEV-MB89N202-APP1 เปนไปไดอยางรวดเร็ว ทางผูจัดทําบอรดจึงไดพัฒนาโปรแกรมตัวอยางเพื่อใหผูใชงานสามารถนําไปประยุกตใชงานจริง และ ทดสอบการทํางานของบอรด โดยจะเนนโปรแกรมพื้นฐานที่มีการใชงานบอย ในการเริ่มตนศึกษาควรเริ่มตนตามลําดับจากโปรแกรมที่หนึ่งถึงโปรแกรมสุดทาย
ในการอธิบายโปรแกรมตัวอยางในบทนี้เนนอธิบายแนวความคิดในการเขียนโปรแกรม จะเปนการมองภาพโดยรวมของโปรแกรมเพือ่ใหงายสําหรับผูเริ่มตนใชงานซึ่งอาจจะยังไมคุนเคยกับ MB89F202/MB89N202 มากนัก ในสวนของรายละเอียดในการเขียนโปรแกรมนั้น ถึงแมจะมิไดเปนโปรแกรมที่มีความซบัซอนแตหากจะใหอธิบายโดยละเอียดทุกจุดนั้นคงตองใชพื้นที่ในการเขียนอธิบายมาก เพราะตองอางอิงไปถึงโครงสรางภายในของ MB89F202/MB89N202 และวงจรของบอรดดวยดวย โปรแกรมเมอรสามารถศึกษารายละเอียดไดโดยการทดลองใชบอรด DEV-MB89N202-APP1 ทดลองปรับเปลี่ยนโปรแกรมและสังเกตการเปลี่ยนแปลง สวนของโครงสรางภายในของไมโครคอนโทรลเลอรนั้นสามารถศึกษาไดจาก Datasheet และ Hardware Manual ที่มีอยูใน CD-ROM โปรแกรมตัวอยางที่ใหมากับบอรด DEV-MB89N202-APP1 มีทั้งที่เขียนดวย ภาษา แอสเซมบลี และ ภาษาซี แตจะอธิบายเฉพาะโปรแกรม ภาษาซี เทานั้น เพราะทําความเขาใจงายกวา
374.1 การขับ LED 7 เซกเมนต ชื่อโปรเจคท : Segment จุดประสงค : แสดงขอมูลทาง LED 7 เซกเมนต และ LED 3 ดวง การแสดงผล : แสดงตัวเลข “ 1234” บน LED 7 เซกเมนต และ LED ทั่ง 3 ดวง สลับกนัสวาง ( ไฟวิ่ง )
รูปที่ 4.1 แสดงไฟลสมาชิกของโปรเจคท Segment จากรูปที่ 4.1 จะเหน็วาโปรเจคท Segment มีไฟลสมาชิกทั้งหมด 3 ไฟลดวยกัน คือ main.c , MB89201.asm และ START.asm นั้น โดยไฟล main.c นั้นทําหนาที่เก็บโปรแกรมที่ไดสรางขึน้สําหรับโปรเจคทนี้ สวนไฟล MB89202.asm และ START.asm นั้นเปนไฟลมาตรฐานที่จําเปนตองรวมเขามาในโปรเจคท สําหรบัการระบุ I/O register ภายในตัว MB89F202/MB89N202 และ กําหนดคาเริ่มตนของโปรเจคทตามลําดับ โดยในการเขียนโปรแกรมโดยปกติจะไมมีการเปลี่ยนแปลงขอมูลในไฟลทั้งสองนี้
38
รูปที่ 4.2 แสดงฟงกชั่นหลักของโปรเจคท Segment
ในสวนตนของฟงกชั่นหลักจะเปนการกําหนดความถี่การทํางานของบัสภายใน (Internal bus clock) ดวยการเรียกฟงกชั่น InitSysClock() โดยกําหนดใหเลือกความถี่การทํางานของบัสภายใน เปนไปดังสมการตอไป FBUS
= FOSC / 4 = 8,000,000 Hz / 4 = 2,000,000 Hz ฟงกชั่น InitPort() เปนการกําหนดคาเริ่มตนและโหมดการทํางานของพอรททั้งหมดที่เกี่ยวของกับการทํางาน และฟงกชั่น InitLed() ทําหนาที่กําหนดคาเริ่มตนของตัวแปรที่เกี่ยวของกับการขับ LED 7 เซกเมนต แนวความคดิในการเขียนโปรแกรมขับ LED 7 เซกเมนต คือ กําหนดกลุมตัวแปรที่ใชเก็บรหัสของ LED 7 เซกเมนตทุกหลัก และ LED 3 ดวงจะถูกกําหนดเหมือนกับ LED 7 เซกเมนต 1 หลัก ในสวนของการนํารหัสมาแสดงผลที่ LED 7 เซกเมนตนั้นจะมีฟงกชั่นทําหนาที่นี้โดยเฉพาะ จากรูปที่ 4.2 จะเห็นไดวากลุมตัวแปรที่ใชเก็บรหัสคือ LedBuf ซึ่ง
39เปนตัวแปร Array จํานวน 5 ไบท ซึ่งถูกกําหนดใหเก็บรหัสของตัวเลข 1,2,3,4 ตามลําดับ และฟงกชัน่ที่ทําหนานํารหัสมาแสดงผลคอื LedDrive() ซึ่งถูกวางอยูในวงรอบการทํางานของฟงกชั่นหลัก ดังนั้นหากตองการเปลี่ยนคาที่แสดงผลที่ LED 7 เซกเมนตและกําหนดให LED ดวงไหนสวาง ก็เพียงเปลี่ยนคาใน LedBuf เทานั้น ซึ่งฟงกชั่น Moving_Led() เปนตัวอยางการเปลี่ยนแปลงคาใน LedBuf เพื่อทําไฟวิ่งบน LED 3 ดวง ฟงกชั่น Delay() ทําหนาที่หนวงเวลา เพือ่กําหนดความถี่ในการสแกน LED ซึ่งตองกําหนดใหมีคาที่เหมาะสม หากกําหนดใหหนวงเวลามากไปจะทําให LED กระพริบ หรือกําหนดใหหนวงเวลานอยไปจะทําให LED สวางนอย ในตัวอยางโปรแกรมตอไปจะนําเสนอการใช Timer ที่มีอยูในตัว MB89F202/MB89N202 เปนตัวกําหนดความถี่ในการสแกน ซึ่งจะใหความแมนยํามากกวา
404.2 การใชงาน Timer
ชื่อโปรเจคท : Timer จุดประสงค
1. ใช Timer1 เพื่อต้ังฐานเวลา 4 millisecond ( 250 Hz) 2. ใชฐานเวลาที่ไดเปนตัวกําหนดความถี่ในการสแกน LED 7 เซกเมนต
การแสดงผล : แสดงเวลาบน LED 7 เซกเมนต และ LED ทั่ง 3 ดวง สลับกนัสวาง ( ไฟวิ่ง ) โดยมีการเปลี่ยนแปลงทุก 1 วินาที
รูปที่ 4.3 แสดงไฟลสมาชิกของโปรเจคท Timer ในตัวอยางโปรแกรมการขับ LED 7 เซ็กเมนต นั้นจะเห็นไดวา หากมีโปรแกรมอื่นเพิ่มขึ้นในวงรอบการทํางานแลว จะทําใหความถี่ในการสแกนเปลี่ยนไป ซึ่งผลกระทบดังกลาวทําใหเกิดความไมสะดวกหากโปรแกรมมีขนาดใหญขึ้น แนวทางในการแกไขปญหาดังกลาวคือ การประยุกตใชงาน Timer ที่มีอยูในตัว MB89F202/MB89N202 เปนฐานเวลาเพื่อกําหนดความถี่ในการสแกน นอกจากนี้ยังสามารถนําฐานเวลาดังกลาวไปประยุกตใชงานอื่นไดอีก เชน สรางนาฬิกา และกําหนดระยะในการทํางานของ Buzzer เปนตน
41
รูปที่ 4.4 แสดงฟงกชั่นหลักของโปรเจคท Timer
แนวความคดิในการใชงาน Timer ในตัวอยางโปรแกรมนี้คือ เลือก Timer 1 ซึ่งเปน Timer ขนาด 8 บิท ใหนับเวลาและสรางสัญญาณ Interrupt ตามระยะเวลาที่ไดกําหนดไว ซึ่งในตัวอยางโปรแกรมนี้กําหนดใหสรางสญัญาณทุก ๆ 4 millisecond หรือ 250 Hz และในสวนของฟงกชั่นหลักจะทําหนาที่วนตรวจสอบสัญญาณ Interrupt และทํางานตาง ๆ ไดแก การสแกน LED นับเวลา และควบคุมระยะเวลาในการทํางานของ Buzzer จากรูปที่ 4.4 ในสวนตนของฟงกชั่นหลัก ไดเพิ่มเติมฟงกชั่น InitTimer () และ ShowTime() โดยฟงกชั่น InitTimer() ทําหนาที่กําหนดคาเริ่มตนและระยะเวลาในการสรางสัญญาณ Interrupt ใหกับ Timer 1 ฟงกชั่น ShowTime() ทําหนาที่แปลงคาเวลาใหเปนรหัส LED 7 เซ็กเมนต เพื่อการแสดงผล ในสวนของวงรอบการทํางานจะวน
42ตรวจสอบสัญญาณ Interrupt ของ Timer1 และทนัทีที่มีสัญญาณ Interrupt ก็จะทําการเคลียร และ ทํางานตามฟงกชั่นดังตอไปนี้
- LedDrive() สแกน LED - Moving_Led() ไฟวิ่ง - Timer() นับเวลา เพื่อสรางฐานเวลาจริง ( Real Time Cock ) - ShowTime() นําคาเวลาจริงมาแปลงเปนรหัส LED 7 เซ็กเมนต - SoundControl() ควบคุมระยะเวลาในการทํางานของ Buzzer
หลังจากที่ทํางานทั้งหมดแลวก็จะวนกลับไปตรวจสอบสัญญาน Interrupt ของ Timer1 อีกครั้ง
434.3 การใชงาน Interrupt Timer
ชื่อโปรเจคท : Timer_Interrupt จุดประสงค
1. ใช Timer1 สราง Interrupt ทุก ๆ 4 millisecond ( 250 Hz) 2. เปนตัวอยางการใชงาน Interrupt ของ MB89F202/MB89N202 3. ใชฐานเวลาที่ไดเปนตัวกําหนดความถี่ในการสแกน LED 7 เซกเมนต
การแสดงผล : แสดงเวลาบน LED 7 เซกเมนต และ LED ทั่ง 3 ดวง สลับกนัสวาง ( ไฟวิ่ง ) โดยมีการเปลี่ยนแปลงทุก 1 วินาที
รูปที่ 4.5 แสดงไฟลสมาชิกของโปรเจคท Timer_Interrupt โครงสราง MB89F202/MB89N202 สามารถตอบสนองการเกิด Interrupt ไดหลายแหลง แตในตัวอยางโปรแกรมนี้ จะใช Interrupt ของ Timer 1 เปนกรณีศึกษา เพราะงายตอการแสดงผล จากตัวอยางโปรแกรมการใชงาน Timer 1 ที่ผานมา ใชวิธีการวนตรวจสอบสัญญาณ Interrupt แตในบางกรณีที่มีความตองการการตอบสนองตอสัญญาณ Interrupt อยางทันที ซึ่งไมโครคอนโทรลเลอรจะตองพักการทํางานในฟงกชันหลกัเพื่อ
44ตอบสนองการเกิด Interrupt และหลังจากที่ทํางานในฟงกชั่นของ Interrupt เสร็จแลวจึงกลับมาทํางานในฟงกชั่นหลักตอไป
รูปที่ 4.6 การกําหนดฟงกชั่นสําหรับ Interrupt ของ Timer 1
สําหรับโปรแกรม Softune Workbench ในขั้นตนตองกําหนดชื่อฟงกชั่นสําหรับตอบสนองการเกิด Interrupt ไวที่สวนตนของโปรแกรมกอน ดังรูปที่ 4.6 ประโยคที่กําหนดชื่อฟงกชั่นสําหรับตอบสนองการเกิด Interrupt มีดังนี้ #pragma intvect Timer_Int 3 ซึ่งหมายความวา ฟงกชั่นสําหรับสนองการเกิด Interrupt ชื่อวา Timer_Int ตัวเลข 3 ที่อยูหลังสุด คือ หมายเลข Interrupt ของ Timer 1
รูปที่ 4.7 แสดงฟงกชั่น Interrupt ของโปรเจคท Timer_Interrupt หลังจากที่ไดกําหนดชื่อฟงกชั่นที่ตอบสนองการเกิด Interrupt แลว ขั้นตอนตอไปจะตองสรางฟงกชั่นชื่อดังกลาวไวในโปรแกรม ดังรปูที่ 4.7 โดยจะตองมีคําวา __interrupt นําหนาชื่อฟงกช่ัน
45
รูปที่ 4.8 แสดงฟงกชั่นหลักของโปรเจคท Timer_Interrupt จากรูปที่ 4.7 และ 4.8 จะเห็นวา มีการยายฟงกชั่นยอย LedDrive() , Moving_Led() และ Timer() จากฟงกชั่นหลัก ไปไวในฟงกชั่นสําหรับการตอบสนอง Interrupt ของ Timer 1 เพราะตองการความเที่ยงตรงของเวลา
464.4 การเขียนโปรแกรมรับสวิตช
เพื่องายตอการทําความเขาใจ จึงไดจัดทําตัวอยางการเขียนโปรแกรมรับสวิตชไว 3 โปรแกรม โดยเริ่มตนจากโปรแกรมงาย ๆ กอน แลวจึงเพิ่มความสามารถของโปรแกรมเขาไป เพื่อประโยชนสําหรับการนําไปใชงานจริง 4.4.1 โปรเจคท KeyBasic1 จุดประสงค
1. แสดงตัวอยางโปรแกรมรับสวิตชอยางงาย 2. เปนตัวอยางการประยุกตใชงาน Interrupt ของ Timer1
การทดสอบและการแสดงผล เมื่อกดสวิตช LED 7 เซ็กเมนตจะแสดงรหัสประจําตัวของสวิตช (KeyCode)
รูปที่ 4.9 แสดงไฟลสมาชิกของโปรเจคท KeyBasic1
47
รูปที่ 4.10 แสดงฟงกชั่นหลักของโปรเจคท KeyBasic1
รูปที่ 4.11 แสดงฟงกชั่น Interrupt ของโปรเจคท KeyBasic1 จากรูปที่ 4.11 จะเห็นไดวามีการเพิ่มฟงกชั่นยอย GetKey() ไวในฟงกชั่น Interrupt เพราะตองการความเที่ยงตรงของเวลาในการสแกนรับสวิตช โดยฟงกชั่นยอย GetKey() จะทําหนาที่รับคาจากพอรทที่สวิตชตออยู และทําการหนวงเวลาโดยการใชฐานเวลาที่ได
48จาก Timer 1 (250 Hz) เพื่อปองกันการรับสวิตชซ้ําเนื่องจากการสั่นของหนาสัมผัสของสวิตชในขณะกด เมื่อตรวจสอบไดวาสวิตชใดถูกกดก็จะทําการเขารหัส สวิตชแตละตัวมีรหัสประจําตัวดังตอไปนี้ สวิตชที่ 1 (Key1) -> 0x30 (48) สวิตชที่ 2 (Key2) -> 0x31 (49) สวิตชที่ 3 (Key3) -> 0x32 (50) สวิตชที่ 4 (Key4) -> 0x33 (51)
รูปที่ 4.12 แสดงฟงกชั่น GetKey() ของโปรเจคท KeyBasic1
จากรูปที่ 4.12 ฟงกชั่นยอย ShowByte(KeyCode) ซึ่งอยูในบรรทัดที่ 340 ทําหนาที่แปลงคารหสัประจําตัวของสวิตช (KeyCode) ใหเปนรหัสของ LED 7 เซ็กเมนต และเก็บคาที่แปลงไดไวในตัวแปร และ ฟงกชั่นยอย LedDrive() ที่อยูในฟงกชั่น Interrupt จะนาํขอมูลที่แปลงไดไปแสดงผลที่ LED 7 Segment
494.4.2 โปรเจคท KeyBasic2
จุดประสงค แสดงตัวอยางการนํารหัสของสวติชที่ได (KeyCode) ไปใชงาน
การทดสอบและการแสดงผล 1. หลังจากรีเซต LED 7 เซ็กเมนตจะแสดงคาเริ่มตนของตัวแปร Counter 2. เมื่อกดสวิตชที่ 3 (Key3) ตัวแปร Counter จะมีคาเพิ่มขึน้ 1 คา 3. เมื่อกดสวิตชที่ 4 (Key4) ตัวแปร Counter จะมีคาลดลง 1 คา
รูปที่ 4.13 แสดงไฟลสมาชิกของโปรเจคท KeyBasic2
50
รูปที่ 4.14 แสดงฟงกชั่นหลักของโปรเจคท KeyBasic2
จากรูปที่ 4.14 ฟงกชั่นยอย KeyOperation() ไดถูกเพิ่มเขามาในวงรอบการทํางานของฟงกชั่นหลัก เพือ่นําคารหัสประจําตัวของสวิตช (KeyCode) ไปใชงาน
51
รูปที่ 4.15 แสดงฟงกชั่น KeyOperation() ของโปรเจคท KeyBasic2
จากรูปที่ 4.15 ฟงกชั่นยอย KeyOperation() จะทําการตรวจสอบคาของ KeyCode หากมีคาตรงกับรหัสประจําตัวของสวิตชที่ 3 ก็จะทําการเพิ่มคาตัวแปร Counter ขึน้ 1 คา และทําการแปลงคา Counter ใหเปนรหัส LED 7 เซ็กเมนต และในทํานองเดียวกัน หากมีคาตรงกับรหัสประจําตัวของสวิตชที่ 4 ก็จะลดคาตัวแปรลง 1 คา และทาํการแปลงคา Counter ใหเปนรหัส LED 7 เซ็กเมนต
524.4.3 โปรเจคท KeyAdvance
จุดประสงค แสดงตัวอยางการเขียนโปรแกรมรับคาจากสวิตชแบบกดคางได
การทดสอบและการแสดงผล 1. หลังจากรีเซต LED 7 เซ็กเมนตจะแสดงคาเริ่มตนของตัวแปร Counter 2. เมื่อกดสวิตชที่ 1 (Key1) ตัวแปร Counter จะมีคาเพิ่มขึน้ 1 คา 3. เมื่อกดสวิตชที่ 2 (Key2) ตัวแปร Counter จะมีคาลดลง 1 คา 4. เมื่อกดสวิตชที่ 3 (Key3) ตัวแปร Counter จะมีคาเพิ่มขึ้น 1 คา และเมื่อ
กดคางไว ตัวแปร Counter จะเพิ่มคาขึ้นเรื่อย ๆ จนถึงคาสูงสุด 5. เมื่อกดสวิตชที่ 4 (Key4) ตัวแปร Counter จะมีคาลดลง 1 คา และเมื่อ
กดคางไว ตัวแปร Counter จะมีคาลดลงเรื่อย ๆ จนถึงศูนย
รูปที่ 4.16 แสดงไฟลสมาชิกของโปรเจคท KeyAdvance
53
รูปที่ 4.17 แสดงฟงกชั่น GetKey() ของโปรเจคท KeyAdvance
544.5 การใชงานสวนแปลงสัญญาณอนาลอกเปนดิจิตอล (ADC)
ชื่อโปรเจคท : ADC จุดประสงค
แสดงตัวอยางการเขียนโปรแกรมควบคุมการทํางานของสวนการแปลงสัญญาณอนาลอกเปนดิจิตอล (ADC)
การทดสอบและการแสดงผล นําตัวตานทานปรับคาไดคาประมาณ 10 กิโลโอหม ตอที่ CN4 (Thermistor Input2 ) แลวสังเกตคาที่แสดงผลที่ LED 7 เซ็กเมนต
รูปที่ 4.18 แสดงไฟลสมาชิกของโปรเจคท ADC เพื่อไมใหไฟล main.c มีขนาดใหญเกินไป จึงไดเขียนโปรแกรมเพื่อควบคุมการทํางานของสวนแปลงสญัญาณอนาลอกเปนดิจิตอลและเก็บไวในไฟล ADC.c นอกจากนี้ยังมีความสะดวกหากตองการนําไปใชกับโปรเจคทอ่ืน ๆ ดวย
55
รูปที่ 4.19 แสดงฟงกชั่นหลักของโปรเจคท ADC
ฟงกชั่นยอย GetAdc() ทําหนาที่สแกนรับขอมูลจากสวนแปลงสัญญาณอนาลอกเปนดิจิตอลจํานวน 2 ชอง คือ ชองที่ 4 และ 5 โดยจะใชฐานเวลา 250 Hz จาก Timer 1 เปนตัวกําหนดความถี่ในการสแกนรับขอมูล (Sampling Rate) นอกจากนี้ยังทําการเฉลี่ยคาจากขอมูลดิบจํานวน 8 จุดดวย แลวนําขอมูลที่ไดเก็บไวในตัวแปร adc_channel4 และ adc_channel5 สวนฟงกชั่นในบรรทัดที่ 139 ShowInt(adc_channel5) จะแปลงคาตัวแปร adc_channel5 ใหเปนรหัส LED 7 เซ็กเมนต เพื่อนําไปแสดงผลตอไป
564.6 การอินเตอรเฟซกับหนวยความจํา EEPROM (24C01)
ชื่อโปรเจคท : 24C01 จุดประสงค
แสดงตัวอยางการเขียนโปรแกรมติดตอกับหนวยความจําแบบ EEPROM เบอร 24C01 ซึ่งใชการอินเตอรเฟชแบบ I2C
การทดสอบและการแสดงผล ทดลองเปลี่ยนคาที่เขียนลงใน 24C01 แลวสงัเกตคาที่อานกลับมา ซึ่งแสดงผลบน LED 7 เซ็กเมนต
รูปที่ 4.20 แสดงไฟลสมาชิกของโปรเจคท 24C01 เหตุผลที่เลือก EEPROM เบอร 24C01 มาใชกับบอรด DEV-MB89N202-APP1 เพราะวาใชการอินเตอรเฟชแบบ I2C ซึ่งมีการใชงานอยางกวางขวางในอุปกรณตางๆโดยเฉพาะในวงการเครื่องเสียงและโทรทัศน ดังนั้นจึงไดเขียนโปรแกรมการอินเตอรเฟชแบบ I2C แยกออกเปนไฟลตางหาก แลวจึงรวมเขามาในโปรเจคท
57
รูปที่ 4.21 แสดงฟงกชั่นหลักของโปรเจคท 24C01 จากรูปที่ 4.21 โปรแกรมในบรรทัดที่ 128 ถึงบรรทัดที่ 135 เปนการทดสอบการทํางานของโปรแกรมอินเตอรเฟชแบบ I2C วิธีการทดสอบคือ ทดลองเขียนคาลงหนวยความจํา EEPROM แลวทดลองอานคากลับ หากคาที่อานกลับมาไดมีคาตรงกับคาที่เขียนลงไปแสดงวาการทํางานของโปรแกรมถูกตอง วิธีการใชงานเรียกใชงานโปรแกรมอินเตอรเฟชแบบ I2C มีขั้นตอนดังตอไปนี้ การเขียนคา
1. ใสคาลงในกลุมตัวแปร (Array) i2c_buf 2. เรียกฟงกชั่นยอย i2c_write โดยตองสงคาใหฟงกชั่นดังนี้
i2c_write(a, b, c, d)
58 a -> แอดเดรสของอุปกรณที่ตองการเขียนคา b -> แอดเดรสเริ่มตนที่ตองการเขียน c -> แอดเดรสเริ่มตนของกลุมตัวแปร i2c_buf d -> จํานวนขอมูลที่ตองการเขียน
จากรูปที่ 4.21 ในบรรทัดที่ 129 เปนตัวอยางการเรียกใชงานฟงกชั่นการเขียนคาลง EEPROM ซึ่งมีความหมายวา EEPROM มีคาแอดเดรสเทากับ 0xa0 เริ่มตนเขียนขอมูลที่แอดเดรส 0 ขอมูลที่ตองการเขียนเก็บอยูในกลุมตัวแปร i2c_buf และตองการเขียนขอมูลจํานวน 1 ไบท การอานคา
1. เรียกฟงกชั่นยอย i2c_read โดยตองสงคาใหฟงกชัน่ดังนี้ i2c_read(a,b,c,d) a -> แอดเดรสของอุปกรณที่ตองการอานคา b -> แอดเดรสเริ่มตนที่ตองการอาน c -> แอดเดรสเริ่มตนของกลุมตัวแปร i2c_buf d -> จํานวนขอมูลที่ตองการอาน
2. อานคาจากกลุมตัวแปร i2c_buf จากรูปที่ 4.21 ในบรรทัดที่ 134 เปนตัวอยางการใชงานฟงกชั่นการอานคาจาก
EEPROM โดยที่แอดเดรสของ EEPROM มีคาเทากับ 0xa0 เริ่มอานขอมูลที่แอดเดรส 0 ขอมูลที่อานไดจะเก็บไวในกลุมตัวแปร i2c_buf และตองการอานขอมูลเปนจํานวน 1 ไบท