Pages: [1]   Go Down
Print
Author Topic: การขยาย I/O  (Read 21353 times)
0 Members and 4 Guests are viewing this topic.
tandy
Jr. Member
**
Offline Offline

Posts: 20



« on: April 22, 2010, 06:03:02 PM »

ขอสอบถามเรื่องการขยาย I/O ค่ะ
หากเราใช้ IC พวก shift register ขยาย I/O เพื่อต้องการให้ไมโครฯ ตัวเล็กๆ ราคาถูกให้มี I/O เยอะๆ
มีผลดีและผลเสีย และหลักการใช้งานอย่างไรค่ะ พอดีไปเห็นไปเห็นในเว็ปอื่นมา
ขอบคุณค่ะ
Logged
s_engine
Sr. Member
****
Offline Offline

Posts: 187


« Reply #1 on: April 24, 2010, 10:47:46 PM »

การขยาย i/o เป็นเรื่องที่ต้องพิจารณา กันให้ดีมันมีหลาหลายทางเลือก
ต้องถามก่อนว่าต้องการ ขยาย อินพุต หรือเอาต์พุต หรือ ทั้งอินพุตและเอาต์พุต
การขยาย i/o มีอุปกรณ์เยอะแยะมากมาย เช่น พวก pcf8574 pcf8575 เป็นของ ฟิลลิป
mcp23008 mcp23016  เป็นของไมโครชิพ ทั้ง2ตัว สื่อสารในรูปแบบ I2C หรือจะเอาแบบ สื่อสารแบบซีเรียลก็มีเบอร์ก็ใกล้ๆกับที่กล่าวมา ส่วนเจ้า ชิพ รีจิสเตอร์ที่ถามมานั้น จะเป็นได้แค่ ขยายเอาต์พุตอย่างเดียว เหมาะสำหรับงานอย่าง 7 เซกเม้นต์ ขับหลอด LED แบบ เมทริกซ์
แต่ถ้าต้องการ i/o มากขึ้น เอาแบบง่ายๆก็ เปลี่ยนเบอร์ไปเบอร์ที่ใหญ่ขึ้น อย่าง pic24fjxxxgpxxx มีขาเป็นร้อย และไม่ต้องยุ่งยากกับ อุปกรณ์ขยายอีก เคยคิดที่จะทำอยู่ช่วงนึง แต่ก็ต้องพักไว้ เลยไม่ได้ทำต่อ
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #2 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 ขึ้นมาในการติดต่อระหว่างโมดูล
« Last Edit: April 27, 2010, 08:33:49 PM by smitdh » Logged
tandy
Jr. Member
**
Offline Offline

Posts: 20



« Reply #3 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 ก็ดีขึ้นแต่ก็ยังไม่หายทั้งหมดค่ะ
เศร้าเลย จะผ่านโปรไหมเนี่ย ฮื่อๆ
Logged
gundam
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #4 on: April 26, 2010, 09:12:16 PM »

สนใจเรื่องการขยาย i/o เหมือนกันครับ แต่สงสัยว่าทำไมต้องใช้ไมโครฯ ด้วยครับ
มันต่างกันกับการเปิด/ปิดไฟด้วยสวิทซ์ธรรมดาตรงไหนครับ หรือเป็นการใช้แรงดันไฟต่ำเพื่อความปลอดภัยครับ
Logged
tandy
Jr. Member
**
Offline Offline

Posts: 20



« Reply #5 on: April 27, 2010, 12:19:53 AM »

เหตุที่ต้องใช้ไมโครฯ ก็เพราะแต่ละห้องต้องใช้ Keycard ค่ะ(สำหรับโรงแรม)
เมื่อเสียบ Keycard แล้วไฟหน้าห้องจะติดเพื่อให้เห็นแผงควบคุม ต่อไปจะเปิดอะไรก็แล้วแต่
เมื่อเวลาถอด Keycard ออกแล้วภายใน 1 นาทีทุกอย่างในห้องจะดับหมด
อีกอย่างหนึ่งก็คือปุ่มที่ เปิด/ปิดเป็น Scenes เช่น Entrance, Bath, etc. แต่ละ Scenes จะควบคุมหลายจุดตามที่ตั้งไว้ค่ะ
Logged
gundam
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #6 on: April 27, 2010, 01:09:46 PM »

เป็นอย่างนี้นี่เอง
ขอบคุณครับ
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #7 on: April 27, 2010, 09:36:25 PM »

จริงๆแล้ว นี่เป็นโจทย์เก่าเมื่อ 10 กว่าปีที่แล้วครับ ตอนนั้นระบบควบคุมห้องพักกำลังบูม
การใช้ชิพรีจิสเตอร์เพื่อขยายอินพุต

ทางด้านอินพุตต้องต่อ R pullup 10K แล้วต่อกับไดโอด 1N14148 ดังรูปครับ จึงสามารถลากอินพุตไปได้ไกลๆ
จากรูปเป็น IC CD4021 ซึ่งหลักการก็เหมือนๆ กับ 74HC165 ครับ ในสมัยก่อนพวก HC หายากครับ วงจรตามข้างบนพิสูจน์แล้วว่าใช้งานได้จริง โดยสามารถต่อสายอินพุตออกไปได้ยาวกว่า 15 เมตรครับ

การใช้ชิพรีจิสเตอร์เพื่อขยายเอาต์พุต

ในกรณีนี้ใช้ขับหลอดไฟ 24V ครับ ซึ่งก็คงคล้ายๆกับการขับ Relay ของคุณ tandy
ที่ขา QE หรือเอาต์พุตอีนาเบิล ซึ่ง active low เราจะ pullup ไว้กับ R 4.7K เมื่อเริ่มจ่ายไฟหรือ MCU ถูกรีเซ็ต ขานี้จะเป็น high ทำให้เอาต์พุตทุกตัวหยุดทำงาน

แนวทางการเขียนโปรแกรม
main()
{
  หน่วงเวลา 100 ms เพื่อให้ระดับแรงดันไฟคงที่
  initial I/O ต่างๆ ว่าตัวใดเป็นอินพุต หรือ เอาต์พุต
  ขา RA4 =high
  เคลียร์ข้อมูลชิพรีจิสเตอร์ (ให้เป็น low ทั้งหมด)
  ขา RA4 =low เริ่มให้เอาต์พุตทำงาน
.
.
.
}
« Last Edit: May 13, 2010, 07:49:55 AM by smitdh » Logged
tandy
Jr. Member
**
Offline Offline

Posts: 20



« Reply #8 on: April 28, 2010, 11:57:24 AM »

ขอบคุณมากๆ เลยค่ะ  Cheesy
จะรีบทดสอบแล้วนำมาปรึกษาอีกทีนะค่ะ
Logged
gundam
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #9 on: April 28, 2010, 01:47:34 PM »

เรียน อ.smitdh ครับ
ปกติการต่ออินพุตออกจากบอร์ดไปไกลๆ มักจะใช้ IC OPTO พวก PC817 เพื่อป้องกันสัญญาณรบกวน
ทำไมการต่อ R pullup แล้วต่อกับไดโอด 1N14148 แล้วถึงทำให้ต่ออินพุตไปได้ไกลครับ
ขอบคุณครับ
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #10 on: April 30, 2010, 09:13:21 AM »

สัญญาณรบกวนมักมีค่าเป็นบวกเมื่อเทียบกับกราวน์ครับ เนื่องจากเราต่อ R pullup ไว้ที่อินพุต ดังนั้นมันจึงเป็นโลจิก 1 อยู่แล้ว แล้วต่อไดโอดไว้อีกเพื่อคั้นสัญญาณรบกวนที่เล็กกว่า 0.6V เพื่อไม่ให้มารบกวนขณะกดปุ่มครับ จึงทำให้สามารถต่อสายอินพุตออกไปได้ไกลครับ
Logged
s_engine
Sr. Member
****
Offline Offline

Posts: 187


« Reply #11 on: May 01, 2010, 09:16:53 PM »

ยังสุดยอดเหมือนเดิม สำหรับท่านอาจารย์ smitdh คงจะเป็นประโยชน์สำหรับอีกหลายๆท่าน
ที่ยังสงสัยในเรื่องนี้ สู้ๆนะครับ คุณ tandy
มาแอบเป็นกำลังใจครับ
Logged
tandy
Jr. Member
**
Offline Offline

Posts: 20



« Reply #12 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 ด้วยค่ะที่มาเป็นกำลังใจ
Logged
Pages: [1]   Go Up
Print
 
Jump to: