ผลต่างระหว่างรุ่นของ "แผงวงจรพ่วง (Peripheral Board)"
Chaiporn (คุย | มีส่วนร่วม) |
Chaiporn (คุย | มีส่วนร่วม) |
||
แถว 23: | แถว 23: | ||
DDRC &= ~(0b00001000); // ให้ PC3 เป็นอินพุท บิตอื่นไม่เปลี่ยนแปลง | DDRC &= ~(0b00001000); // ให้ PC3 เป็นอินพุท บิตอื่นไม่เปลี่ยนแปลง | ||
PORTC |= 0b00001000; // เปิดใช้ pull-up resister ที่ขา PC3 | PORTC |= 0b00001000; // เปิดใช้ pull-up resister ที่ขา PC3 | ||
− | if (PINC & | + | if (PINC & 0b00001000) |
+ | // สวิตช์ไม่ถูกกด | ||
+ | else | ||
// สวิตช์ถูกกด | // สวิตช์ถูกกด | ||
− | |||
− | |||
สวิตช์กลไกโดยทั่วไปมักจะมีหน้าสัมผัสที่ต่อกับสปริงซึ่งทำให้เกิดการเด้งไปกลับของหน้าสัมผัสเมื่อกดหรือปล่อยสวิตช์ ปรากฏการณ์เช่นนี้เรียกว่า [http://en.wikipedia.org/wiki/Switch#Contact_bounce Contact Bounce] ซึ่งทำให้ไมโครคอนโทรลเลอร์ตีความว่าสวิตช์ถูกกดและปล่อยติดกันหลาย ๆ ครั้งในเวลาสั้น ๆ และส่งผลให้การทำงานของโปรแกรมแตกต่างไปจากที่ผู้เขียนโปรแกรมต้องการ การแก้ไขนั้นสามารถทำได้ผ่านทางซอฟต์แวร์โดยเมื่อตรวจสอบได้ว่าลอจิกของขาอินพุทมีการเปลี่ยนแปลงให้หน่วงเวลาไว้เล็กน้อยก่อนที่จะอ่านสถานะของขาอินพุทเดิมในครั้งถัดไป | สวิตช์กลไกโดยทั่วไปมักจะมีหน้าสัมผัสที่ต่อกับสปริงซึ่งทำให้เกิดการเด้งไปกลับของหน้าสัมผัสเมื่อกดหรือปล่อยสวิตช์ ปรากฏการณ์เช่นนี้เรียกว่า [http://en.wikipedia.org/wiki/Switch#Contact_bounce Contact Bounce] ซึ่งทำให้ไมโครคอนโทรลเลอร์ตีความว่าสวิตช์ถูกกดและปล่อยติดกันหลาย ๆ ครั้งในเวลาสั้น ๆ และส่งผลให้การทำงานของโปรแกรมแตกต่างไปจากที่ผู้เขียนโปรแกรมต้องการ การแก้ไขนั้นสามารถทำได้ผ่านทางซอฟต์แวร์โดยเมื่อตรวจสอบได้ว่าลอจิกของขาอินพุทมีการเปลี่ยนแปลงให้หน่วงเวลาไว้เล็กน้อยก่อนที่จะอ่านสถานะของขาอินพุทเดิมในครั้งถัดไป |
รุ่นแก้ไขเมื่อ 03:35, 31 สิงหาคม 2552
เราประกอบแผงวงจรนี้เพื่อใช้เป็นวงจรทดสอบและเรียนรู้การใช้งานไมโครคอนโทรลเลอร์ โดยต่อผ่านสายแพเข้ากับ JP2 (พอร์ท C) ของแผงวงจรหลัก วงจรพ่วงประกอบไปด้วยวงจรย่อยสามวงจร ได้แก่ (1) วงจรแสดงผล LED สามสี (2) วงจรสวิตช์อินพุท และ (3) วงจรวัดแสง
เนื้อหา
วงจรแสดงผล LED สามสี
เป็นการเชื่อมแต่ละสัญญาณของ PC0..PC2 เข้ากับขาแอโนด (A) ของ LED และต่อด้านแคโทด (K) ผ่านตัวต้านทานลงสู่กราวนด์ ดังนั้นการใช้งานจึงต้องตั้งค่าในรีจีสเตอร์ DDRC ให้ขาทั้งสามทำหน้าที่เป็นเอาท์พุท และส่งลอจิก 1 มายังแต่ละขาผ่านทางรีจีสเตอร์ PORTC เพื่อให้หลอด LED ติด
ตัวอย่างโปรแกรมด้านล่างเป็นการตั้งค่าให้ PC0..PC2 เป็นเอาท์พุท และสั่งให้ขา PC0 และ PC1 มีลอจิกเป็น 1 และ PC2 มีลอจิก 0 โดยที่ไม่กระทบกับค่าในบิตอื่น ๆ ของรีจีสเตอร์ สังเกตว่าเราอาศัยคำสั่งประเภท read-modify-write ซึ่งได้แก่ |= และ &=
DDRC |= 0b00000111; // ให้ PC0-PC2 เป็นเอาท์พุท บิตอื่นไม่เปลี่ยน PORTC |= 0b00000011; // ให้ PC0,PC1 มีลอจิก 1 บิตอื่นไม่เปลี่ยน PORTC &= ~(0b00000100); // ให้ PC2 มีลอจิก 0 บิตอื่นไม่เปลี่ยน
หมายเหตุ: คำสั่ง a |= b
มีการทำงานเทียบเท่ากับ a = a|b
วงจรสวิตช์อินพุท
วงจรนี้ทำหน้าที่เป็นลอจิกอินพุทโดยต่อสวิตช์แบบกดติด-ปล่อยดับเข้ากับขา PC3 และต่ออีกด้านหนึ่งลงกราวนด์โดยตรง นั่นคือหากสวิตช์โดนกดจะทำให้ขา PC3 มีศักย์เป็นกราวนด์
การใช้งานเพื่อให้อ่านค่าลอจิกเข้ามาอย่างถูกต้องต้องดำเนินการดังนี้
- ตั้งค่าบิตที่ 3 ของรีจีสเตอร์ DDRC ให้เป็น 0 เพื่อกำหนดให้ PC3 เป็นอินพุท
- ตั้งค่าบิตที่ 3 ของรีจีสเตอร์ PORTC ให้เป็น 1 เพื่อเปิดใช้งาน pull-up resistor ในวงจร I/O ของไมโครคอนโทรลเลอร์ ซึ่งเสมือนว่าเป็นการต่อขา PC3 ผ่านตัวต้านทานหนึ่งตัวเข้ากับ VCC อันจะทำให้ศักย์ของขา PC3 มีค่าเป็น 5V (ลอจิก 1) หากขาถูกปล่อยลอย
- อ่านสถานะลอจิกของขา PC3 ผ่านทางบิตที่ 3 ของรีจีสเตอร์ PINC
ตัวอย่างโปรแกรม
DDRC &= ~(0b00001000); // ให้ PC3 เป็นอินพุท บิตอื่นไม่เปลี่ยนแปลง PORTC |= 0b00001000; // เปิดใช้ pull-up resister ที่ขา PC3 if (PINC & 0b00001000) // สวิตช์ไม่ถูกกด else // สวิตช์ถูกกด
สวิตช์กลไกโดยทั่วไปมักจะมีหน้าสัมผัสที่ต่อกับสปริงซึ่งทำให้เกิดการเด้งไปกลับของหน้าสัมผัสเมื่อกดหรือปล่อยสวิตช์ ปรากฏการณ์เช่นนี้เรียกว่า Contact Bounce ซึ่งทำให้ไมโครคอนโทรลเลอร์ตีความว่าสวิตช์ถูกกดและปล่อยติดกันหลาย ๆ ครั้งในเวลาสั้น ๆ และส่งผลให้การทำงานของโปรแกรมแตกต่างไปจากที่ผู้เขียนโปรแกรมต้องการ การแก้ไขนั้นสามารถทำได้ผ่านทางซอฟต์แวร์โดยเมื่อตรวจสอบได้ว่าลอจิกของขาอินพุทมีการเปลี่ยนแปลงให้หน่วงเวลาไว้เล็กน้อยก่อนที่จะอ่านสถานะของขาอินพุทเดิมในครั้งถัดไป
วงจรวัดแสง
วงจรส่วนนี้อาศัยอุปกรณ์ที่เรียกว่า Light Dependent Resister (LDR) หรือเรียกอีกอย่างว่า photoresistor ซึ่งเป็นตัวต้านทานที่มีค่าผันแปรตามแสง โดยทั่วไปแล้ว LDR มักจะให้ค่าความต้านทานต่ำ (เข้าใกล้ค่าศูนย์) เมื่อแสงมาก และให้ค่าความต้านทานสูง (เข้าใกล้ค่าอนันต์) เมื่อแสงน้อย
เนื่องจากไมโครคอนโทรลเลอร์ไม่สามารถอ่านค่าความต้านทานได้โดยตรง แต่สามารถวัดค่าแรงดันที่เปลี่ยนแปลงที่ขาอินพุทได้ ดังนั้นเราจึงต้องนำเอาอุปกรณ์ LDR มาต่อเป็นวงจรที่ให้ค่าแรงดันผันแปรไปตามแสง จากรูป (3) ด้านบนเรานำเอา LDR มาต่ออนุกรมกับ R4 และจ่ายไฟเลี้ยงคร่อมอุปกรณ์ทั้งคู่ สมมติว่า LDR1 ให้ค่าความต้านทานเป็น เราสามารถคำนวณหาความต่างศักย์ที่สัญญาณ PC4 จากกฎการแบ่งแรงดันได้ดังนี้
จากสูตรข้างต้น เมื่อแสงสว่างมาก จะมีค่าเข้าใกล้ศูนย์ ทำให้ มีค่าเข้าใกล้ (5 โวลท์) ในทางตรงกันข้าม หากแสงสว่างน้อย จะมีค่าเข้าใกล้อนันต์ ทำให้ มีค่าเข้าใกล้ศูนย์ เราสามารถเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร์ AVR ให้ตีความค่าแรงดันเหล่านี้ได้ด้วยความละเอียดสูงถึง 10 บิต (1024 ระดับ) ซึ่งศึกษาจากบทความการวัดสัญญาณแอนะล็อกด้วยไมโครคอนโทรลเลอร์เพิ่มเติม
โปรแกรมทดสอบแผงวงจรพ่วง
เพื่อตรวจสอบว่าแผงวงจรพ่วงที่ทำขึ้นมาใช้งานได้ถูกต้อง โหลดโปรแกรม testperi.hex (ซอร์สโค้ด) และใช้คำสั่ง avrdude เพื่อเขียนแฟลชบนบอร์ด หากวงจรไม่มีความผิดพลาด โปรแกรมควรมีพฤติกรรมดังนี้
- LED 3 ดวงบนบอร์ดพ่วงทำหน้าที่เป็นตัววัดแสง โดยจะติดทีละดวงเท่านั้น สีแดงจะติดเมื่อแสงมืด และสีเขียวจะติดเมื่อไฟสว่าง ส่วนสีเหลืองจะติดเมื่อแสงปานกลาง
- เมื่อกดและปล่อยสวิตช์บนบอร์ดพ่วง (ไม่ใช่สวิตช์รีเซ็ตบนบอร์ดหลัก) LED สีเขียวบนบอร์ดหลักจะติดและดับสลับกันไป