|
|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | |
|
| |
|
|
|
|
|
|
|
|
นาฬิกานับถอยหลัง + สกอร์บอร์ด 2 หลัก ด้วย PIC แจกโค๊ดเพื่อศึกษาฟรี
วันนี้เอาโครงงานอิเล็กทรอนิกส์มาแจกนะครับ


ตัวนับเวลาถอยหลัง 3+ 15-99 วินาที พร้อมเสียงเตือนเมื่อหมดเวลา และ และสกอร์บอร์ด 2 หลัก ในตัวเดียว
อ่ะ 3+ นั่นคืออะไร มันคือ เวลา 3 วินาทีบอกความพร้อมครับ เมื่อกดปุ่มเริ่ม จะนับความพร้อมก่อน 3 วิ แล้วจึงเริ่มจับเวลาจริง มีเสียงเตือนเหมือนตอนรถแข่งออกตัวเลยนะคับ แล้วก็ตอนหมดเวลา 10 วินาทีสุดท้ายมีเสียงติ๊กๆ เตือนด้วย เมื่อนับครบ จะมีเสียงยาวแสดงว่าหมดเวลา
ใช้ MCU เบอร์ PIC12F675 ที่มีแค่ 8 ขาเท่านั้น หน่วยความจำโปรแกรม 1024 เวิร์ด แรม 64 ไบต์ มีอะนาล็อกคอมพาราเตอร์ และ ADC แต่ไม่ได้ใช้ครับ (อ่ะ เบอร์ที่ตัด 2 ฟังก์ชั่นนี้ออก ถูกกว่า แต่ ไม่มีขายให้ผมซื้อนี่นา)
วงจรครับป๋มม

เอ้า ปริ้นต์ เนกาทีฟ ขนาดเท่าของจริง เอาไปปริ้นต์ใส่กระดาษไข แล้วถ่ายแสงได้เลยยยย

ภาพการลงอุปกรณ์

วงจรนี้เป็นเครื่องจับเวลานับถอยหลัง 15-99 วินาที เอาไว้เล่นเกม แล้วก็ใช้เป็นสกอร์บอร์ดนับคะแนนได้ด้วย มี 2 หลัก ถ้าจะใช้นับคะแนนเล่นบาสหรือกีฬาอื่นๆ ก็ใช้ 2 ชุด ฝ่ายละ 1 อันพอดี อย่าเล่นให้เกิน 100 คะแนนเป็นพอ อิอิ หรือถ้าใครจะปรุงมันใหม่ให้เป็น 3-4 หลัก หรือมีฟังก์ชั่นเพิ่มเติมก็ได้ เช่น มีตัวกำเนิดเลขสุ่ม หรือทำเป็นนาฬิกาไปเลยก็ได้ อยู่ที่คุณจะต้องเขียนโปรแกรมต่อ และใช้ชิพที่มีขนาดโปรแกรมเมมโมรี่ และพอร์ทมากกว่านี้
ที่เลือกชิพตัวเล็กๆ มาเล่นก็เพราะว่า งานนี้ การนับเวลาที่ใช้ ไม่ต้องการความเที่ยงตรงสูงนัก เอามาแค่เล่นเกมสนุกๆ เท่านั้น จึงใช้ชิพเล็กๆ ราคาถูกๆ ขาที่ใช้ครบ 8 ขาพอดี ไม่ได้ใช้ X-Tal แต่ใช้วงจรสัญญาณนาฬิกาภายใน 4MHz แทน
อ้อ 8 ขา แล้วจะขับเซกเม้นท์ 2 หลักได้ยังไงละเนี่ย งานนี้ใช้ไอซีชิฟท์รีจิสเตอร์ยอดนิยม 74HC595 มาขยายพอร์ทครับ
ขา 7,6,5 ของ PIC12F675 เป็นขา Serial Data, Serial Clock และ Latch ตามลำดับ ต่อเข้า74HC595 2 ตัว อนุกรมกัน เพื่อให้ได้ข้อมูลแลทช์จำนวน 16 บิต
ของ PIC12F675 ขา 4,3 เป็นปุ่มกด ขา 2 เป็นสัญญาณเสียงออกลำโพง ขา 1,2 เป็นไฟเลี้ยง
LED 7-Segment ไม่มีการสแกนครับ เพราะงานนี้ใช้กลางแจ้ง ต้องสว่างสุดๆ เท่านั้น และการสแกน 2 หลัก ไม่คุ้มครับ ราคาอุปกรณ์จะแพงกว่าครับ ต้องหลักมากๆ เช่น 3หลักขึ้นไป จึงจะใช้การสแกนแล้วคุ้มกว่า
มาดูโปรแกรมกันก่อนเลยดีไหม โปรแกรมที่เขียนนี่ ขาดไปไม่กี่ไบต์ก็หมดหน่วยความจำพอดี เพราะว่ามีที่เหลืองัยครับ เลยใส่ลูกเล่นเข้าไปทีละหน่อยจนหมดเลย เหอๆๆๆๆ หมดทั้งโปรแกรมเมมโมรี่และแรมที่มี 64 ไบต์
โปรแกรมที่เขียน ใช้เทคนิคการเขียนที่ผมคิดขึ้นเอง แต้ ใครที่เรียนวิศวะคอมมา อาจจะว่ามันเป็นเทคนิคธรรมดาๆ ก็ได้ โดยผมได้ไอเดียจากการเขียนโปรแกรมวิชวลเบสิค ที่ใช้ Event หรือภาษาไทยคือ "เหตุการณ์" ของการทำงานของ User เป็นตัวกำหนดการทำงานของโปรแกรม
เช่น ผู้ใช้กดคีย์บอร์ด โปรแกรมจะไปทำที่บล็อกของ Event คีย์บอร์ด เมื่อผู้ใช้ เลื่อนเม้าส์ไปยังพื้นที่ที่กำหนด โปรแกรมก็ไปทำงานที่บล็อกของ Mouse Over เป็นต้น
แต่ไมโครคอนโทรลเลอร์ ไม่มีคีย์บอร์ด มีแต่ปุ่มกด ก็ไอ้ปุ่มกดนั่นแหละ คือ Event
การติดต่อ User หรือสัญญาณอินพุตอื่นใดก็ตาม ก็ถือเป็น Event เช่นกัน เช่น สัญญาณร้องขอข้อมูลจากวงจรส่วนอื่น, สัญญาณซิงโครไนซ์กับกลไกที่ควบคุม เช่น ลิมิตสวิตช์, สัญญาณบอกตำแหน่งลูกสูบของเครื่องยนต์ เป็นต้น
ยังมีส่วนสำคัญอีก คือ การกำหนด Timing ของโปรแกรม ซึ่งปกติแล้วโปรแกรมทุกโปรแกรมจะหนีไม่พ้นที่จะต้องมีซับรูทีน Delay เพื่อหน่วงเวลาการทำงานต่างๆ แต่การทำเช่นนี้จะเสีย MCU Time ไปเปล่าๆ เพื่อวนลูบนับตัวเลขเพื่อให้เสียเวลาไปเท่านั้น ระหว่างการทำงานของซับรูทีน Delay เราจะทำงานอื่นไปด้วยกันไม่ได้เลย เช่น เมื่อโปรแกรมหน่วงเวลาทำงาน เราจะกดปุ่มไม่ติด เป็นต้น ซึ่งถ้าจะให้ทำงานร่วมกันไปด้วย ก็จะเขียนซับซ้อนสับสนมากขึ้นไปอีก ไล่โปรแกรมยากขึ้น
ดังนั้น เราจะใช้ Timer ของ MCU เป็นตัวกำหนดเวลาของโปรแกรมส่วนต่างๆ โดยไม่ใช้การหน่วงโดยวนลูป Delay ให้เสีย MCU เปล่าๆ โดย Timer0 ของ MCU จะถูกแจกจ่ายออกมาโดยโปรแกรมส่วนของ Timer เพื่อสร้างฐานเวลาที่ต่างๆ กันหลายๆ ชุด ใช้งานได้พร้อมกันในเวลาเดียวกันหลายๆ ตัว และไทเมอร์ที่เราสร้างขึ้นผมขอถือวิสาสะเรียกชื่อเอาเองว่า Secondary Timer และเซคันดารีไทเมอร์นี้เมื่อนับเวลาครบ จะเป็น Event ในระบบเช่นกัน
โปรแกรมที่เราเขียน จะถูกแบ่งเป็นส่วนย่อยๆ ซอยงานใหญ่ๆ ออกเป็นงานเล็กๆ จำนวนหลายๆ งาน ซึ่งการทำงานจะขึ้นกับเหตุการณ์อินพุตที่เกิด หรือเหตุการณ์ภายใน เช่น เซคกันดารีไทเมอร์นับเวลาครบ
โปรแกรมของเรา จะมีส่วนของโปรแกรมบริหารเหตุการณ์ ซึ่งวนลูปคอยโพลอินพุตต่างๆ และจัดการ Secondary Timer ส่วนโปรแกรมนี้จะวนรอบทำงานตลอดเวลาเพื่อรอรับอินพุตและเหตุการณ์ต่างๆ เหมือนหัวหน้างานที่คอยดูว่ามีงานอะไรต้องทำ เมื่อมีงานเข้ามา ก็จะแจกจ่ายงานให้ลูกน้องทำต่อ
ส่วนโปรแกรมที่บริหารเหตุการณ์ต่างๆ ขอถือวิสาสะเรียกว่า System ก็แล้วกัน ถ้ามันไม่ตรงกับตำราเรียนก็กรุณาทำใจนะครับ ว่าคำเรียกที่นี่ ใช้เฉพาะที่นี่เท่านั้น
ใน System เมื่อมีเหตุการณ์เกิด จะส่งต่อให้งานให้"ลูกน้อง" ทำ (ขอเรียก "ลูกน้อง" ในที่นี้ว่า Task) โดยเหตุการณ์ต่างๆ จะมี Vector หรือ ตัวชี้ว่า งานนี้ต้องถูกส่งไปทำที่ไหน และเจ้า Vector นี้ สามารถเปลี่ยนได้ตลอดเวลาที่ทำงาน เช่น เมื่อมีการกดปุ่มซอฟท์คีย์ของโทรศัพท์มือถือ ที่ขณะนี้แสดงว่าเป็นปุ่ม "เลือก" พอกดแล้ว ปุ่มนี้ก็เปลี่ยนสถานะเป็น "แก้ไข" เป็นต้น การทำงานของปุ่มปุ่มเดียว แต่ การทำงานแตกต่างกันนี้ ทำโดยเปลี่ยน Vector นั่นเอง
เหตุการณ์แต่ละเหตุการณ์ มี Vector ของตัวเอง Vector นี้ ชี้ไปที่ Program Counter ตำแหน่งที่บรรจุโค๊ดเพื่อทำงานที่ต้องการไว้
การทำงาน เช่น เมื่อมีการกดปุ่ม หรือมีอินพุตอันนึงเข้ามา โปรแกรม System จะโหลดเอาค่า Vector ออกมาใส่ใน Program Counter ทันที และการทำงานจะกระโดดจาก System ไปยังตำแหน่ง Task (โปรแกรม) ที่เกี่ยวข้องทันที เมื่อทำงานเสร็จ ส่วนท้ายสุดของ Task นั้น จะเป็นคำสั่งกระโดดกลับมาที่ System เพื่อบริหารเหตุการณ์ต่อไป
การทำงานแต่ละ Task จะต้องไม่ยาวมาก เพราะมันจะไปขวางการทำงานอื่น เช่น การคำนวณซับซ้อน จะถูกแบ่งลูปออกมาก่อน และทำงานทีละลูปของ System ไม่งั้นมันจะไปอุดการทำงานของ System
ส่วนของ System มีส่วนหนึ่งเป็น Vector List ของ Task ที่ทำไม่เสร็จ เป็นงานค้าง ซึ่งถ้ามีงานยาวๆ ค้างอยู่ System จะกระโดดไปทำงานที่ถูกลงทะเบียนว่าเป็นงานค้าง เพื่อทำงานนั้นต่อ ซึ่งวนไปทำได้เรื่อยๆ เมื่องานหมดแล้ว Task นั้น ก็จะไม่ใส่ Vector ตัวเองลงในลิสต์ เพื่อปล่อย MCU ให้ว่างต่อไป
มาดูตัวอย่าง โปรแกรมกันดีกั่ววววววว
หน้า 1

หน้า 2

หน้า 3

สองหน้าแรก และหน้า 3 ส่วนบน เป็นการกำหนดตัวแปร แฟลก และค่าคงที่ที่ใช้ในโปรแกรม
ตั้งแต่ ORG 0x00 เป็นตัวโปรแกรม ซึ่งจะ Goto ไปตำแหน่งที่มโปรแกรมหลักอยู่ ส่วน 0x04 เป็นตำแหน่งของอินเตอรัพท์เวกเตอร์ ส่วนของอินเตอรัพท์จะอยู่ตรงนี้เลย
อินเตอรัพท์ มีแหล่งเดียวคือ TMR0 ตั้งไว้ให้อินเตอรรัพท์ทุก 512 us
อินเตอรัพท์ส่วนแรก ทำงานเป็นตัวกำเนิดเสียงบี๊บ ออกทางพอร์ท GP5
ส่วนต่อมา และต่อไปยังหน้า 4 เป็นส่วนที่คอยตรวจสอบคีย์กด
หน้า 4

หน้า 5

หน้า 4 ตั้งแต่เลเบิล _t0i_Timer เป็นตัวสร้างเซกกันดารีไทเมอร์ขึ้นมาเพิ่มอีก เพื่อให้ในโปรแกรมหลักใช้งานไทเมอร์แยกกันได้อิสระหลายๆ ตัว พร้อมกัน
หน้า 5 ส่วนสุดท้ายคือเลเบิล _EndInt เป็นการคืนค่าตัวรีจิสเตอร์ก่อนกลับไปประมวลผลต่อ ณ จุดที่เกิดอินเตอร์รัพท์ ให้เหมือนกับไม่มีอะไรเกิดขึ้น
หลังจากนี้ ที่เลเบิล main เป็นโปรแกรมหลัก ส่วนนี้เป็นส่วนที่ประมวลผลทันทีหลังจากรีเซ็ทระบบ (จ่ายไฟเข้า) ก่อนอื่นเลยก็เซ็ทพอร์ท และคอนโทรลรีจิสเตอร์ต่างๆ ให้พร้อมใช้งานในโหมดที่ต้องการ
****โปรดติดตามตอนต่อไปครับ****
| Create Date : 15 มกราคม 2549 |
| Last Update : 26 มกราคม 2549 19:58:35 น. |
|
54 comments
|
| Counter : Pageviews. |
|
|
|
โดย: L-twin วันที่: 15 มกราคม 2549 เวลา:18:34:02 น. |
|
|
|
โดย: **mp5** วันที่: 15 มกราคม 2549 เวลา:20:12:02 น. |
|
|
|
โดย: Justin's mommy (Baby I love you ) วันที่: 15 มกราคม 2549 เวลา:22:07:17 น. |
|
|
|
โดย: NaCl (NaCl ) วันที่: 26 มกราคม 2549 เวลา:20:00:34 น. |
|
|
|
| โดย: Array IP: 202.5.90.138 วันที่: 31 ตุลาคม 2549 เวลา:12:05:23 น. |
|
|
|
| โดย: NaCl IP: 203.170.231.232 วันที่: 19 ธันวาคม 2549 เวลา:12:07:56 น. |
|
|
|
| โดย: ว่าน IP: 202.28.47.11 วันที่: 26 กุมภาพันธ์ 2550 เวลา:10:15:26 น. |
|
|
|
| โดย: DEW IP: 124.120.167.72 วันที่: 11 เมษายน 2550 เวลา:1:29:29 น. |
|
|
|
| โดย: อนันต์ จัเสนา IP: 203.113.19.199 วันที่: 7 ธันวาคม 2550 เวลา:19:44:01 น. |
|
|
|
| โดย: วัฒน์ IP: 125.25.27.31 วันที่: 12 ธันวาคม 2550 เวลา:20:36:26 น. |
|
|
|
| โดย: ตุ๊ก IP: 125.25.102.205 วันที่: 24 มกราคม 2551 เวลา:14:34:04 น. |
|
|
|
| โดย: tatum IP: 124.120.97.78 วันที่: 29 เมษายน 2551 เวลา:12:51:06 น. |
|
|
|
| โดย: เมย์ IP: 203.113.101.131 วันที่: 15 สิงหาคม 2551 เวลา:9:13:27 น. |
|
|
|
| โดย: Taan IP: 118.173.36.216 วันที่: 19 สิงหาคม 2551 เวลา:10:51:32 น. |
|
|
|
| โดย: catzy IP: 161.246.1.32 วันที่: 12 กันยายน 2551 เวลา:4:20:20 น. |
|
|
|
| โดย: catzy IP: 161.246.1.32 วันที่: 12 กันยายน 2551 เวลา:4:23:02 น. |
|
|
|
| โดย: Mr.Panupan IP: 118.173.32.138 วันที่: 12 กันยายน 2551 เวลา:21:27:46 น. |
|
|
|
| โดย: Bank IP: 124.157.154.22 วันที่: 25 กันยายน 2551 เวลา:20:07:52 น. |
|
|
|
| โดย: gafare IP: 203.158.176.20 วันที่: 26 กันยายน 2551 เวลา:20:26:46 น. |
|
|
|
| โดย: ต้อม IP: 203.118.104.139 วันที่: 6 พฤศจิกายน 2551 เวลา:20:45:07 น. |
|
|
|
| โดย: NaCl IP: 58.8.173.29 วันที่: 14 พฤศจิกายน 2551 เวลา:11:30:05 น. |
|
|
|
| โดย: เนเธเนเธเนเธเธฃเธเธเธฒเธ IP: 58.10.204.182 วันที่: 18 พฤศจิกายน 2551 เวลา:18:25:57 น. |
|
|
|
| โดย: เจต IP: 125.24.15.181 วันที่: 8 ธันวาคม 2551 เวลา:11:54:53 น. |
|
|
|
| โดย: 002 IP: 222.123.224.245 วันที่: 15 ธันวาคม 2551 เวลา:23:13:02 น. |
|
|
|
| โดย: เด็กดี IP: 202.29.16.253 วันที่: 5 มกราคม 2552 เวลา:13:58:56 น. |
|
|
|
| โดย: PoD IP: 124.157.153.63 วันที่: 21 มกราคม 2552 เวลา:19:10:01 น. |
|
|
|
| โดย: bank IP: 222.123.71.207 วันที่: 17 มีนาคม 2552 เวลา:17:41:14 น. |
|
|
|
| โดย: เกรียงไกร IP: 118.172.202.162 วันที่: 15 สิงหาคม 2552 เวลา:22:42:47 น. |
|
|
|
| โดย: surakich@gmail.com IP: 125.26.224.124 วันที่: 23 พฤศจิกายน 2552 เวลา:7:32:33 น. |
|
|
|
| โดย: สุวัฒน์ จันโท IP: 125.26.155.148 วันที่: 23 พฤศจิกายน 2552 เวลา:22:53:59 น. |
|
|
|
| โดย: ธวัชชัย IP: 124.157.147.217 วันที่: 2 มกราคม 2553 เวลา:17:02:34 น. |
|
|
|
| โดย: ประสาน IP: 113.53.164.149 วันที่: 16 เมษายน 2553 เวลา:10:22:14 น. |
|
|
|
| โดย: phonruang1992@hotmail.com IP: 110.164.235.5 วันที่: 27 พฤษภาคม 2553 เวลา:15:10:19 น. |
|
|
|
| โดย: กอล์ฟ IP: 172.18.2.108, 203.158.207.55 วันที่: 6 ตุลาคม 2553 เวลา:11:52:09 น. |
|
|
|
| โดย: กอล์ฟ IP: 172.18.2.108, 203.158.207.55 วันที่: 6 ตุลาคม 2553 เวลา:11:58:02 น. |
|
|
|
| โดย: กอล์ฟ IP: 172.18.2.108, 203.158.207.55 วันที่: 6 ตุลาคม 2553 เวลา:11:59:08 น. |
|
|
|
| โดย: x\\\\ปาร์คพิดโลก IP: 222.123.172.62 วันที่: 13 ตุลาคม 2553 เวลา:18:15:35 น. |
|
|
|
| โดย: TXT IP: 113.53.164.50 วันที่: 2 พฤศจิกายน 2553 เวลา:20:31:29 น. |
|
|
|
| โดย: Ken IP: 192.168.100.170, 182.52.196.170 วันที่: 29 พฤศจิกายน 2553 เวลา:17:53:17 น. |
|
|
|
| โดย: ice IP: 61.90.103.234 วันที่: 10 ธันวาคม 2553 เวลา:19:40:59 น. |
|
|
|
| โดย: BIG IP: 203.158.207.55 วันที่: 27 มกราคม 2554 เวลา:17:45:14 น. |
|
|
|
| โดย: ไมค์ IP: 10.0.3.17, 118.175.23.114 วันที่: 2 พฤศจิกายน 2554 เวลา:9:38:15 น. |
|
|
|
| โดย: Teef IP: 14.207.225.55 วันที่: 26 ธันวาคม 2554 เวลา:15:26:32 น. |
|
|
|
| โดย: ผู้กำลังทำโครงงาน IP: 171.4.241.83 วันที่: 4 มกราคม 2555 เวลา:11:50:18 น. |
|
|
|
| โดย: virut1978 IP: 110.49.5.98 วันที่: 13 พฤษภาคม 2555 เวลา:19:18:36 น. |
|
|
|
| โดย: Andy IP: 58.8.100.15 วันที่: 30 พฤษภาคม 2555 เวลา:19:57:24 น. |
|
|
|
| โดย: กรีน IP: 202.29.6.67 วันที่: 13 มิถุนายน 2555 เวลา:10:06:39 น. |
|
|
|
| โดย: ด้วง IP: 223.207.15.167 วันที่: 10 สิงหาคม 2555 เวลา:18:06:38 น. |
|
|
|
| โดย: ครูชล IP: 180.183.105.70 วันที่: 27 สิงหาคม 2555 เวลา:11:20:23 น. |
|
|
|
| โดย: ออฟ IP: 122.154.37.211 วันที่: 31 สิงหาคม 2555 เวลา:13:56:05 น. |
|
|
|
| โดย: Nitty IP: 49.48.49.226 วันที่: 20 กันยายน 2555 เวลา:13:01:24 น. |
|
|
|
| โดย: มิว IP: 118.173.86.100 วันที่: 11 ตุลาคม 2555 เวลา:22:57:07 น. |
|
|
|
| โดย: ตี๋ IP: 101.109.37.10 วันที่: 29 มกราคม 2556 เวลา:17:16:12 น. |
|
|
|
| โดย: samaporn IP: 183.88.249.218 วันที่: 4 กุมภาพันธ์ 2556 เวลา:12:17:13 น. |
|
|
|
|
|
|
|