Thai microtron community

Electronic Knowledge Base => Microcontoller & Electronics => Topic started by: tandy on April 22, 2010, 06:03:02 PM



Title: การขยาย I/O
Post by: tandy on April 22, 2010, 06:03:02 PM
ขอสอบถามเรื่องการขยาย I/O ค่ะ
หากเราใช้ IC พวก shift register ขยาย I/O เพื่อต้องการให้ไมโครฯ ตัวเล็กๆ ราคาถูกให้มี I/O เยอะๆ
มีผลดีและผลเสีย และหลักการใช้งานอย่างไรค่ะ พอดีไปเห็นไปเห็นในเว็ปอื่นมา
ขอบคุณค่ะ


Title: Re: การขยาย I/O
Post by: s_engine on April 24, 2010, 10:47:46 PM
การขยาย i/o เป็นเรื่องที่ต้องพิจารณา กันให้ดีมันมีหลาหลายทางเลือก
ต้องถามก่อนว่าต้องการ ขยาย อินพุต หรือเอาต์พุต หรือ ทั้งอินพุตและเอาต์พุต
การขยาย i/o มีอุปกรณ์เยอะแยะมากมาย เช่น พวก pcf8574 pcf8575 เป็นของ ฟิลลิป
mcp23008 mcp23016  เป็นของไมโครชิพ ทั้ง2ตัว สื่อสารในรูปแบบ I2C หรือจะเอาแบบ สื่อสารแบบซีเรียลก็มีเบอร์ก็ใกล้ๆกับที่กล่าวมา ส่วนเจ้า ชิพ รีจิสเตอร์ที่ถามมานั้น จะเป็นได้แค่ ขยายเอาต์พุตอย่างเดียว เหมาะสำหรับงานอย่าง 7 เซกเม้นต์ ขับหลอด LED แบบ เมทริกซ์
แต่ถ้าต้องการ i/o มากขึ้น เอาแบบง่ายๆก็ เปลี่ยนเบอร์ไปเบอร์ที่ใหญ่ขึ้น อย่าง pic24fjxxxgpxxx มีขาเป็นร้อย และไม่ต้องยุ่งยากกับ อุปกรณ์ขยายอีก เคยคิดที่จะทำอยู่ช่วงนึง แต่ก็ต้องพักไว้ เลยไม่ได้ทำต่อ


Title: Re: การขยาย I/O
Post by: smitdh on April 26, 2010, 11:46:01 AM
มันขึ้นอยู่กับงานด้วยครับ ว่าเป็นงานประเภทไหน ผมจะสรุปแบบกว้างๆ นะครับ

1). ก่อนที่จะคิดขยาย I/O  ควรจะเลือกเปลี่ยนชิพดูก่อนครับ หากราคาชิพที่เพิ่มขึ้นคุ้มกับพอร์ตที่เพิ่ม ก็ควรจะใช้วิธีเปลี่ยนชิพดีกว่า เพราะคำสั่งพื้นๆ ก็จะเหมือนเดิม และการเปลี่ยนชิพที่ ใหญ่ขึ้น จะมักจะได้หน่วยความจำโปรแกรม ที่ใหญ่ขึ้นด้วยครับ การใช้ชิพตัวเล็กๆ แล้วมาขยาย I/O เพื่อควบคุมงานที่ซับซ้อน อาจจะต้องใช้หน่วยความจำโปรแกรม จำนวนมาก จะทำให้โค๊ดเต็มได้ครับ
2).  แล้วอีกอย่างหนึ่งเกี่ยวกับ I/O ที่ใช้ควบคุมอุปกรณ์ไฟฟ้า เรามักจะใช้โลจิก 1 ในการไดร์ทรานซิสเตอร์ขนิด NPN หรือ IC ULN2803, ULN2003 เพื่อขับรีเลย์ อีกทีหนึ่ง   ดังนั้น เมื่อเริ่มจ่ายไฟหรือ MCU ถูกรีเซ็ต พอร์ตจะต้องถูกเคลียร์ เป็นโลจิก 0 เพื่อให้เอาต์พุตทั้งหมดหยุดทำงาน ตรงนี้สำคัญ เพราะมันจะรวนและควบคุมยาก ในช่วงนี้
3).  อุปกรณ์ที่ใช้ขยาย I/O ก็มีทั้งแบบ I2C และ  ชิพรีจิสเตอร์ ขึ้นอยู่กับวงจรที่เราออกแบบครับ เช่นถ้าในวงจรของเราใช้ RTC เช่น DS1307 ซึ่งเป็น BUS แบบ I2C หากเราใช้ขยาย I/O แบบ I2C โดยมีแอดเดรสที่ต่างกัน ก็จะทำให้ประยัดพอร์ตครับ
4). การออกแบบบอร์ด ทั้งแบบ I2C และ  ชิพรีจิสเตอร์ Control BUS การเดินสายจะต้องให้ห่างจากเอาต์พุตที่เกินกระแสสูง และสัญญาณ clock อื่นๆ และจะต้องเดินสายให้สั้นที่สุด เพื่อป้องกันสัญญาณรบกวน
5). การขยาย I/O แบบ ชิพรีจิสเตอร์ มักจะใช้กับภาคแสดงผลเช่น 7 SEG ,LED  แบบ matrix ไม่ควรไปใช้ควบคุมโหลดพวกมอเตอร์หรือเครื่องจักรครับ เพราะการส่งข้อมูลให้ชิพรีจิสเตอร์ ไม่ชัวร์เหมือนแบบขนานครับ (เพราะสามารถตรวจสอบความถูกต้องโดยการอ่านพอร์ตนั้นกลับเข้ามา) ข้อมูลที่ส่งอาจผิดพลาดได้เนื่องจากสัญญาณรบกวน
6). หากทำเป็นการค้า ให้พิจารณาเรื่องราคาและการหาของด้วย บางทีอุปกรณ์ที่ใช้ขยาย I/O มีราคาสูงกว่าไมโครฯ ซะอีก หรืออุปกรณ์หายาก ของหมดแล้วนานๆจะโผล่มาให้เห็นสักที
ึ7). หากอุปกรณ์หายาก หรือมีราคาแพง สิ่งที่มักจะลืมกันก็คือ การนำไมโครหลายๆตัวมาทำเป็นโมดูลซะเลย โดยให้แต่ละโมดูลลิงค์กันด้วย UART โดยสร้าง format และ Protocol (http://www.thaimicrotron.com/webboard2/index.php?topic=206.msg644#msg644) ขึ้นมาในการติดต่อระหว่างโมดูล


Title: Re: การขยาย I/O
Post by: tandy on April 26, 2010, 03:51:32 PM
ขอบคุณพี่ s_engine กับพี่ smitdh มากค่ะที่ช่วยตอบคำถาม ขอโทษค่ะที่ให้รายละเอียดน้อยไปหน่อย
หนู๋ได้มาสมัครงานที่บริษัทแถวสมุทรปราการค่ะ  ได้โจทย์ไมโครฯ ตัวเล็กๆ ราคาถูกให้มี I/O เยอะๆ โดนเป็นโปรเจคแรกเลย เพื่อนำไปใช้กับควบคุมห้องพักประเภทโรงแรม, คอนโด, อพาร์ตเมนต์ ค่ะ
โดยต้องการ 24 อินพุต(แบบชอร์ตลงกราวน์) 16 เอาต์พุต (ใช้เอาต์พุต 8 ตัวขับรีเลย์ขนาด 10A 7 ตัว 30A หนึ่งตัว  อีก 8 ตัวที่เหลือสำรองไว้สำหรับขยายในอนาคต)
ตอนนี้ทดลองใช้ PIC16F88 ค่ะ อินพุตใช้ 74HC165 เอาต์พุตใช้ 74HC595 ต่อกับ ULN2803A ค่ะ โดยนำโค๊ดมาจากหนังสือ+เวป และใช้ภาษาซี ของ CCS ค่ะ ตอนนี้ลองอ่านอินพุตแล้ว ไปขับรีเลย์ตามที่กำหนด ดูจากโค๊ดก็ไม่ใหญ่มากพอไหว
แต่ปัญหาก็คือ ทางอินพุตต่อออกมาได้ฟุตเดียว ก็รวนแล้วค่ะ ยังไม่ได้กดอะไรเลยแต่อ่านค่าออกมาได้แบบมั่วๆค่ะ แต่ตอนทดลองบนโปรโตบอร์ด ต่อกับ dipswitch ได้ผลถูกต้องค่ะ
แล้วทางเอาต์พุตเหมือนกับที่พี่ smitdh ว่า เวลาเปิด/ปิดไฟให้กับบอร์ด รีเลย์มันทำงาน ต๊อกแต็กๆ ค่ะ แก้ไขโดยเมื่อเริ่มโปรแกรมให้เครียร์เอาพุตเป็น 0 ก็ดีขึ้นแต่ก็ยังไม่หายทั้งหมดค่ะ
เศร้าเลย จะผ่านโปรไหมเนี่ย ฮื่อๆ


Title: Re: การขยาย I/O
Post by: gundam on April 26, 2010, 09:12:16 PM
สนใจเรื่องการขยาย i/o เหมือนกันครับ แต่สงสัยว่าทำไมต้องใช้ไมโครฯ ด้วยครับ
มันต่างกันกับการเปิด/ปิดไฟด้วยสวิทซ์ธรรมดาตรงไหนครับ หรือเป็นการใช้แรงดันไฟต่ำเพื่อความปลอดภัยครับ


Title: Re: การขยาย I/O
Post by: tandy on April 27, 2010, 12:19:53 AM
เหตุที่ต้องใช้ไมโครฯ ก็เพราะแต่ละห้องต้องใช้ Keycard ค่ะ(สำหรับโรงแรม)
เมื่อเสียบ Keycard แล้วไฟหน้าห้องจะติดเพื่อให้เห็นแผงควบคุม ต่อไปจะเปิดอะไรก็แล้วแต่
เมื่อเวลาถอด Keycard ออกแล้วภายใน 1 นาทีทุกอย่างในห้องจะดับหมด
อีกอย่างหนึ่งก็คือปุ่มที่ เปิด/ปิดเป็น Scenes เช่น Entrance, Bath, etc. แต่ละ Scenes จะควบคุมหลายจุดตามที่ตั้งไว้ค่ะ


Title: Re: การขยาย I/O
Post by: gundam on April 27, 2010, 01:09:46 PM
เป็นอย่างนี้นี่เอง
ขอบคุณครับ


Title: Re: การขยาย I/O
Post by: smitdh on April 27, 2010, 09:36:25 PM
จริงๆแล้ว นี่เป็นโจทย์เก่าเมื่อ 10 กว่าปีที่แล้วครับ ตอนนั้นระบบควบคุมห้องพักกำลังบูม
การใช้ชิพรีจิสเตอร์เพื่อขยายอินพุต
(http://www.thaimicrotron.com/forum/images/SR_INPUT.png)
ทางด้านอินพุตต้องต่อ R pullup 10K แล้วต่อกับไดโอด 1N14148 ดังรูปครับ จึงสามารถลากอินพุตไปได้ไกลๆ
จากรูปเป็น IC CD4021 ซึ่งหลักการก็เหมือนๆ กับ 74HC165 ครับ ในสมัยก่อนพวก HC หายากครับ วงจรตามข้างบนพิสูจน์แล้วว่าใช้งานได้จริง โดยสามารถต่อสายอินพุตออกไปได้ยาวกว่า 15 เมตรครับ

การใช้ชิพรีจิสเตอร์เพื่อขยายเอาต์พุต
(http://www.thaimicrotron.com/forum/images/SR_OUTPUT.png)
ในกรณีนี้ใช้ขับหลอดไฟ 24V ครับ ซึ่งก็คงคล้ายๆกับการขับ Relay ของคุณ tandy
ที่ขา QE หรือเอาต์พุตอีนาเบิล ซึ่ง active low เราจะ pullup ไว้กับ R 4.7K เมื่อเริ่มจ่ายไฟหรือ MCU ถูกรีเซ็ต ขานี้จะเป็น high ทำให้เอาต์พุตทุกตัวหยุดทำงาน

แนวทางการเขียนโปรแกรม
main()
{
  หน่วงเวลา 100 ms เพื่อให้ระดับแรงดันไฟคงที่
  initial I/O ต่างๆ ว่าตัวใดเป็นอินพุต หรือ เอาต์พุต
  ขา RA4 =high
  เคลียร์ข้อมูลชิพรีจิสเตอร์ (ให้เป็น low ทั้งหมด)
  ขา RA4 =low เริ่มให้เอาต์พุตทำงาน
.
.
.
}


Title: Re: การขยาย I/O
Post by: tandy on April 28, 2010, 11:57:24 AM
ขอบคุณมากๆ เลยค่ะ  :D
จะรีบทดสอบแล้วนำมาปรึกษาอีกทีนะค่ะ


Title: Re: การขยาย I/O
Post by: gundam on April 28, 2010, 01:47:34 PM
เรียน อ.smitdh ครับ
ปกติการต่ออินพุตออกจากบอร์ดไปไกลๆ มักจะใช้ IC OPTO พวก PC817 เพื่อป้องกันสัญญาณรบกวน
ทำไมการต่อ R pullup แล้วต่อกับไดโอด 1N14148 แล้วถึงทำให้ต่ออินพุตไปได้ไกลครับ
ขอบคุณครับ


Title: Re: การขยาย I/O
Post by: smitdh on April 30, 2010, 09:13:21 AM
สัญญาณรบกวนมักมีค่าเป็นบวกเมื่อเทียบกับกราวน์ครับ เนื่องจากเราต่อ R pullup ไว้ที่อินพุต ดังนั้นมันจึงเป็นโลจิก 1 อยู่แล้ว แล้วต่อไดโอดไว้อีกเพื่อคั้นสัญญาณรบกวนที่เล็กกว่า 0.6V เพื่อไม่ให้มารบกวนขณะกดปุ่มครับ จึงทำให้สามารถต่อสายอินพุตออกไปได้ไกลครับ


Title: Re: การขยาย I/O
Post by: s_engine on May 01, 2010, 09:16:53 PM
ยังสุดยอดเหมือนเดิม สำหรับท่านอาจารย์ smitdh คงจะเป็นประโยชน์สำหรับอีกหลายๆท่าน
ที่ยังสงสัยในเรื่องนี้ สู้ๆนะครับ คุณ tandy
มาแอบเป็นกำลังใจครับ


Title: Re: การขยาย I/O
Post by: tandy on May 03, 2010, 05:52:31 PM
เรียบร้อยค่ะ ขอบคุณ อ.smitdh มากค่ะ
ได้เปลี่ยน อินพุตของ 74HC165 จาก pulldown 10 K เป็น pullup 10K แล้วต่อไดโอดกับสวิทช์ตามที่ อาจารย์บอก ใช้ได้ดีค่ะ
ส่วนภาคเอาต์พุตขา QE จากที่ pulldown ไว้กับ R10K มาเป็น pullup 4.7K แล้วต่อขา QE กับขา RA4 ตอนเริ่มต้นโปรแกรม
ให้ขา RA4=0 หน่วงเวลา 100 ms เครียร์ข้อมูลในชิพรีจิสเตอร์  แล้วค่อยอีนาเบิ้ลขา QE โดยให้ RA4 =1 ไม่ต๊อกแต๊กแล้วค่ะ

ขอบคุณ อ.smitdh อีกครั้งนะค่ะ ขอบคุณพี่ s_engine ด้วยค่ะที่มาเป็นกำลังใจ