tag:blogger.com,1999:blog-74458041076817836562024-03-20T02:18:47.946-07:00Microcon99 Open sourceOpen source Microcontroller Project
เจอกันได้อีกหนึ่งช่องทางที่
mcu4fun.blogspot.commicrocon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-7445804107681783656.post-74589522601816273742011-09-29T00:44:00.001-07:002011-09-29T00:44:48.483-07:007 Segment Serial interface (แก้ขัด MAX7219)เมื่อไม่นานมานี้ผมทำเกี่ยวกับ 7segment เยอะก็เลยปิ๊งไอเดียที่จะเอามาทำ<br />display module แบบสำเร็จรูปคือมี controller chip ในตัวเลย<br />โดยการใช้งานจะต้องให้ง่ายมากที่สุด มาดูวิดีโอกันก่อน<br /><br /><iframe width="425" height="349" src="http://www.youtube.com/embed/QQsVvjFV7GI" frameborder="0" allowfullscreen></iframe><br /><br />จะเห็นว่าสามารถควบคุมการทำงานต่างๆได้อย่างง่ายดายโดยมี command บางตัว<br />ที่ใกล้เคียงกับ LCD ทั่วไป ส่วนที่เหลือยังไม่ได้กำหนดเป็นมาตรฐาน และใน version<br />ต่อๆไปอาจไม่ได้อ้าง command นี้<br /><br /><embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5632195218978181345%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCLKjluK6sLfDKA%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />จริงๆอุปกรณ์ไม่ได้เยอะขนาดนี้ถ้าผมใช้ 7segment common A เพราะ mcs-51<br />มันขับแบบซอร์ซไม่ได้อย่างที่เรารู้กัน วงจรก็เลยใหญ่อย่างที่เห็น แต่ก็เอาเหอะอันแรก<br />เอาอะไรมากชิมิ<br /><br />มาดู specification กันก่อน<br />Controller :at89c2051 @11.0592-MHz<br />Baud :9600-bps<br />Fifo Buffer :32-byte<br />Display Data Register :8-byte<br />Character Gen. Register :n/a<br />Scan frq. :~500Hz<br />Support Ascii :0-9<br /><br />รายละเอียดกลุ่มคำสั่งมีดังนี้<br />Command pre fix :0xfe<br />Home Address :0x01<br />Clear Display :0x02<br />Display Off :0x03<br />Display On :0x04<br />Dot Control :0x09<br />Define Bin :0x0c<br />Rotate Display Register Left :0x0d<br />Rotate Display Register Right :0x0e<br />CG-Ram Address :0x40 -->> n/a<br />DD-Ram Address :0x80<br /><br />Home Address<br />กำหนดให้ DD-Ram Address ไปอยู่ในตำแหน่ง 0 หรือ Digit1<br />--ตัวอย่าง--<br />[0xfe]-[0x01]<br /><br />Clear All Display Register<br />เคลียร์ Display Register ทั้ง 8byte พร้อมกับ<br />กำหนดให้ DD-Ram Address ไปอยู่ในตำแหน่ง 0 หรือ Digit1<br />--ตัวอย่าง--<br />[0xfe]-[0x02]<br /><br />Display Off<br />ปิดการแสดงผล ไม่มีผลกับ Display Register<br />--ตัวอย่าง--<br />[0xfe]-[0x03]<br /><br />Display On<br />เปิดการแสดงผล ไม่มีผลกับ Display Register<br />--ตัวอย่าง--<br />[0xfe]-[0x04]<br /><br />Dot Control Page1<br />ใช้ส่งข้อมูลเฉพาะ Dot-segment ของ Display Register ทั้ง 8-byte<br />--ตัวอย่าง--<br />[0xfe]-[0x09]-[xxxxxxxx]<br />Dot-On x=1<br />Dot-Off x=0<br />บิต 0 เป็น Dot ของ Digit1 ไล่ขึ้นไปจนถึง Digit8<br /><br />Define Bin<br />ใช้ส่งข้อมูลแบบ Binary เช่นต้องการตัวอักษรแปลกๆ ที่เราสร้างขึ้นเอง<br />หลังกระทำคำสั่ง DD-Ram Address+1<br />--ตัวอย่าง--<br />[0xfe]-[0x0c]-[xxxxxxxx]<br />Segment-On x=1<br />Segment-Off x=0<br />Bit0 = Segment-A<br />Bit1 = Segment-B<br />Bit2 = Segment-C<br />Bit3 = Segment-D<br />Bit4 = Segment-E<br />Bit5 = Segment-F<br />Bit6 = Segment-G<br />Bit7 = Segment-Dot<br /><br />Rotate Display Register Left<br />ใช้หมุนข้อมูล Display Register ไปทาง ซ้ายหนึ่งครั้ง ต่อคำสั่ง ไม่มีผลกับ DD-Ram Address<br />--ตัวอย่าง--<br />[0xfe]-[0x0d]<br /><br />Rotate Display Register Right<br />ใช้หมุนข้อมูล Display Register ไปทาง ขวาหนึ่งครั้ง ต่อคำสั่ง ไม่มีผลกับ DD-Ram Address<br />--ตัวอย่าง--<br />[0xfe]-[0x0e]<br /><br />DD-Ram Address<br />ใช้กำหนด DD-Ram Address<br />--ตัวอย่าง--<br />[0xfe]-[0x80... thru 0x87]<br /><br />การใช้งาน<br />เราสามารถส่งตัวเลข 0-9 ที่เป็นรหัส ascii ไปแสดงผลได้ทันที นอกเหนื่อจากนี้จะไม่มีผล<br />หรือข้อมูลจะถูกละทิ้งไป ในทุกๆครั้งที่ส่งข้อมูลไปแสดงผล display buffer address จะ<br />เพิ่มขึ้นเองอัตโนมัติ รวมทั้งคำสั่ง define bin ด้วย ที่เหลือศึกษาได้จาก code ครับ<br /><br /><a href="http://www.4shared.com/file/EeqBxETB/Serial_LED_4Digit_v10.html">Source Code v1.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-80924848932894090872011-09-29T00:43:00.001-07:002011-09-29T00:43:59.468-07:00Low Cost Serial LCD Backpackจริงๆ function เยอะกว่านี้แต่ผมตัดออกเพราะไม่ได้ใช้ แต่เป็น commend อยู่ใน code<br />เช่น การ เปิด ปิด backlight .... ลองไปแก้ code กันเอานะครับ ตัวนี้เป็น source<br />ที่สมบูรณ์ที่สุดแล้ว..... สามารถแก้ไปใช้กับ 89LPxxxx รองรับ baud 115k ได้สบายๆ<br />ส่วน auto baud กับ soft fifo ผมเพิ่งใส่ไป อาจมี bug แต่ผมลองแล้วยังไม่เจอ<br />ใครใช้แล้วมีปัญหากรุณารายงานผมด้วยครับ.....<br /><br /><iframe width="425" height="349" src="http://www.youtube.com/embed/bapqZL_TAqQ" frameborder="0" allowfullscreen></iframe><br /><br /><embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5632398287433455345%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCKOR89yrw82K2AE%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />คุณสมบัติ<br />Support Baud 1200,2400,4800,9600,19200,57600<br />Auto Baud rate function.<br />Software FIFO 80 byte<br />Command Prefix 254(0xFE)<br />Support CLCD 16x1 16x2 20x4 and more...<br /><br />การ initial (Auto Baud rate function)<br />กำหนด Baud rate ฝั่งส่งให้เรียบร้อย<br />รอ 1 วินาที ให้ Serial LCD initial<br />ส่งค่า 0x20 ไปยัง Serial LCD<br />หาก ถูกต้อง LCD จะแสดงข้อความ Detect-xxxxx.bps<br />รอ 2 วินาที<br />ส่งข้อมูลตามต้องการ<br /><br /><a href="http://www.4shared.com/file/TBIKdZ8O/SerialLCDv8full.html">Source code v8.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-40390334917788122522011-06-22T22:31:00.000-07:002011-09-29T00:28:58.514-07:00Countdown Timer 3 Mode with Alarmเนื่องมาจากที่บ้านผม<br />มีเครื่องซักผ้าแบบ กึ่ง อัตโนมือ... เวลาปั่นเสร็จมันจะไม่เตื่อนใดๆทั้งสิ้น<br />ส่วนระหว่างปั่น ผมก็จะมานั่งเล่น internet มันก็จะเพลินจน<br />เลยเวลาตากผ้าหรือเวลาหมดแดด ก็เลยทำเครื่องเตือนเป็น CountDown<br />ขึ้นมาจะได้ไม่เล่นเพลินจนลืมตากผ้าดังกล่าว...เห่อๆๆ<br /><br /><iframe width="425" height="349" src="http://www.youtube.com/embed/ISDyS7gfiAI" frameborder="0" allowfullscreen></iframe><br /><br />ของจริง<br /><embed flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5632195644253332929%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCKXpx_nv4e3dhgE%26hl%3Dth" height="349" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="425"></embed><br /><br />รายละเอียดการใช้งาน<br />CountDown ตัวนี้มีด้วยกันหลักๆ 3 โหมด คือ<br />1-99 วินาที,1-99 นาที,1-99 ชั่วโมง<br />แต่ละโหมด จะมีย่อย อีก 4 แบบ คือ ตั้งเวลาปิด,เปิด ให้ alarm หรือไม่ alarm<br />โดย dot1 หากติดคือเปิด alarm ไม่ติดคือปิด alarm<br />ส่วน dot2 ถ้าติดคือ การตั้งเวลาเปิด ถ้าไม่ติดคือ การตั้งเวลาปิด<br /><br />A = sec<br />b = min<br />C = hour<br /><br />ปุ่ม Set ทำงานสองหน้าที่<br />กดปล่อย = start,stop<br />กดค้าง = set<br /><br />การตั้งเวลาทำได้โดยกด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง<br />หน้าจอจะแสดง mode ให้กด + ตั้งค่า mode ตามต้องการ จากนั้นกด set 1ครั้ง<br />จะเป็นการตั้งค่าหลัก สิบ กด + เลือก 0-9 จากนั้นกด set 1ครั้ง เป็นการตั้งหลัก<br />หน่วย กด + เพื่อตั้งค่า กด set 1ครั้ง ตัวเลขจะหยุดกระพริบ กด set 1ครั้ง<br />จะเห็น dot2 กระพริบแสดงว่าเวลาเริ่มเดินแล้ว ในระหว่างเวลานับถอยหลังอยู่<br />สามารถหยุดได้โดยกด set 1ครั้งหรือกด set ค้างไว้ประมาน 1วินาที<br />จะได้ยินเสียง beep 1ครั้ง เป็นการกลับไปตั้งค่าใหม่อีกครั้ง...<br /><br />เปิด alarm<br />เมื่อการนับถอยหลังเสร็จสิ้น จะเกิด alarm ประมาณ 30วินาที<br />จากนั้นจะหยุดไปเอง ถ้าในระหว่างเกิด alarm อยู่แล้วต้องการปิด<br />ให้กด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง<br />alarm จะหยุด...<br /><br /><a href="http://www.4shared.com/file/0kus ... 3Mode_With_Ala.html">Source Code v1.0</a><br /><a href="http://www.4shared.com/file/JkcU ... 3Mode_With_Ala.html">Source Code v1.2</a> ใส่ alarm relay เพิ่ม...microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-66311121352259239292011-06-07T23:24:00.000-07:002011-09-29T00:35:04.719-07:00Digital Temprature Controllerเป็น project ที่ไม่ซีเรียสมากแต่เอาไปใช้ได้จริง สามารถคุมได้ทั้งร้อนและเย็น<br />ตั้งแต่ -55องศา ถึง 125องศาcompare routine สามารถคำนวนและเปรียบเทียบ<br />ค่าลบได้ด้วย โดยคำนวนร่วมกับ flag tn,th,tl<br /><br /><iframe width="425" height="349" src="http://www.youtube.com/embed/VDgXL8c7kcA" frameborder="0" allowfullscreen></iframe><br /><br /><embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5632196343265461297%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCKOQn_nUufzoYw%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />มาว่ากันเรื่องการคำนวน มีหลักๆก็<br />TN ค่าอุณหภูมิ ปัจจุบันที่อ่านได้จาก ds18b20<br />TH ค่าอุณหภูมิ สูงสุดที่เรากำหนด<br />TL ค่าอุณหภูมิ ต่ำสุดที่เรากำหนด<br /><br />เริ่มแรกให้คำนวน TH กับ TN ก่อน TNน้อยกว่าTH ??<br />ผมลองสุ่มค่าดังนี้<br />tn+15 th+10 = tnมากกว่าth<br />tn+15 th-10 = tnมากกว่าth<br />tn+15 th-15 = tnมากกว่าth<br />tn-15 th-20 = tnมากกว่าth<br />tn-15 th+15 = tnน้อยกว่าth**<br />การคำนวนให้คิดเครื่องหมายก่อนถ้าเป็นบวกทั้งคู่ใช้ th-tn<br />ถ้าเป็นลบทั้งคู่ใช้ tn-th แต่ถ้า tn เป็นบวก th เป็นลบจะคิด<br />แต่เครื่องหมายเพราะยังไง tn ก็ต้องเยอะกว่าแนนอนอยู่แล้ว<br />ในทางตรงกันข้าม ถ้า tn เป็นลบ th เป็นบวก tn จะมีค่า<br />น้อยกว่า ก็ข้ามไปคำนวณ tl ต่อไป<br /><br />TL กับ TN ก่อน TNน้อยกว่าTL ??<br />ผมลองสุ่มค่าดังนี้<br />tl+15 tn+10 = tnน้อยกว่าtl<br />tl+15 tn-10 = tnน้อยกว่าtl<br />tl+15 tn-15 = tnน้อยกว่าtl<br />tl-15 tn-20 = tnน้อยกว่าtl<br />tl-15 tn+15 = tnมากกว่าtl**<br />การคำนวนให้คิดเครื่องหมายก่อนเช่นเดียวกับ th แต่คราวนี้<br />ใช้ tn เป็นตัวตั้งลบด้วย tl หากเป็นค่าบวกทั้งคู่....<br />ที่เหลื่อก้จะคำนวณคล้ายๆกันแค่สลับตัวตั้งเท่านั้น.....<br /><br />การทำงานใน Hot mode (คุมร้อน)<br />เมื่อ TN ต่ำกว่าหรือเท่ากับ TL รีเลย์จะทำงานและจะตัด<br />การทำงานจนกว่าค่าของ TN จะสูงกว่าหรือเท่ากับ TH<br /><br />การทำงานใน Cool mode (คุมเย็น)<br />คล้าย คุมร้อน แต่สลับกัน...<br />พอมองภาพออกกันมั๊ยครับ (ทั้งหมดนี่จะไม่มีความหมายหากเขียนด้วย ภาษาc)<br /><br /><a href="http://www.4shared.com/file/gfLqfc-x/Digital_temperature_controller.html">Source code v2.0f</a><br /><br />FIRMWARE 4.0F<br />รุ่นท้ายสุด... ผมปรับแก้ bug จนหมดแล้วครับ<br />อีกอย่างคือยัดอะไรไม่ได้แล้ว เต็ม2kแล้วจริงๆ อยากใส่ delay time<br />ให้ รีเลย์ แต่ยัดไม่ลงครับ ก็เลยเอาเท่าที่ได้...<br /><br />การตั้งค่า กด set ค้างไว้ 1 วิครับมันจะขึ้น HC_x ซึง x ก็คือ ตัวกระพริบ<br />ถ้าเป็น C กระพริบก็ Cool คุมเย็น ถ้าเป็น H ก็คือ Hot คุมร้อน<br />กดปุ่ม inc เพื่อตั้งค่า จากนั้นกด set อีกครั้ง หน้าจอจะแสดง Hi_t<br />ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิสูง<br />กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set<br />เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Lo_t<br />ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิต่ำ<br />กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set<br />เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Succ<br />เป้นอันเสร็จการตั้งค่า<br /><br />การ ลบค่าอุณหภูมิที่ตั้งไว้ทั้งหมด ทำได้โดยกด ปุ่ม set กับ inc ค้าง<br />ไว้ 1วิ หน้าจอจะแสดง CLr เท่านี้ค่าต่างๆก็จะถูกลบออกหมดแล้ว...<br /><br />4.0F ผมตัด function ที่เกี่ยวกับ EEPROM ทั้งหมดออกนะครับ<br />อยากได้ต้องไปเพิ่มกันเองครับ เหลือไว้ให้คิดเองบ้างครับ ชีวิตจะได้<br />มีรสชาติ...อิอิ คงไปต่อยอดกันเองได้ไม่ยากนะ...<br /><br />ปล. เกี่ยวกับ error msg.<br />Er_1 = family code ไม่ตรง หรือไม่ใช่ ds18b20 ที่ต่ออยู่<br />แต่ผมตัดออกเพาระไม่จำเป็น.<br />Er_2 = Device not Presence ไม่มีการตอบสนอง ต่อการ<br />reset บน bus 1-wire ซึ่งตัว ds18b20 อาจจะเสียหรือหลุด<br />หือสายอาจจะขาดก็ว่าไป.<br />Er_3 = ค่าอุณหภูมิสูง มีค่าที่น้อยกว่า ค่าอุณหภูมิต่ำ.<br />Er_4 = ค่าอุณหภูมิสูง และหรือ ค่าอุณหภูมิต่ำ มีค่าเกินย่านวัด<br />คือ -55 ถึง +125 องศา.<br />Er_5 = อันนี้เกี่ยวกับ EEPROM ทั้งหมด 4.0F จะไม่มี<br /><br /><a href="http://www.4shared.com/file/ozlAOxSW/Digital_temperature_controller.html">Source code v4.0f</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-2270351905832951792011-05-21T03:10:00.000-07:002011-09-29T00:36:28.773-07:00Digital Clock & Temp with FTTL-655 DisplayFTTL-655 เป็นจอแบบ Duplex LED Display ผมไม่เคยเล่นหรือเจอจอแบบนี้มาก่อน<br />มันประหลาดดี มันจะมี 2 common แถมแต่ละ sigment พ่วงกันแบบ งงๆ<br />หา datasheet ก็ไม่มี แต่ไปเจออันนี้เข้า<br />http://libesz.digitaltrip.hu/digital-clock/<br />มีที่เดียวจริงๆ แถม Source ดันเป็นภาษา C อีก เลยต้องดำน้ำเอง<br /><br /><iframe width="425" height="349" src="http://www.youtube.com/embed/p8BHQMSrdJU?hl=th&fs=1" frameborder="0" allowfullscreen></iframe><br /><br />มาว่ากันถึงหลักการขับแบบที่ผมคิดเอง<br />FTTL655S มีตัวเลข 4 หลัก ใช้ pin ในการขับ segment 14pin<br />มี colon ด้วยก็ 15pin พอดี แบบไม่รวม common และ am-pm ผมไม่ได้ใช้<br /><br /><embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5633528040671486065%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCJWl-OGdrPD8_AE%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />อันดับแรกผมจะแบ่ง จอออกเป็น 4 ส่วน เพื่อง่ายต่อการมอง<br />ใช้ข้อมูล 4byte คือ 2byte บน 2byte ล่าง แยกจากกัน<br />ข้อมูล segment หลัก1-2 ใช้ 2byte คือ 1byte บน 1byte ล่าง<br />ข้อมูล segment หลัก3-4 ใช้ 2byte คือ 1byte บน 1byte ล่าง<br /><br />ในข้อมูล 1byte ที่ส่งให้กับ segment จะประกอบด้วย<br />เลขสองหลัก และในตัวเลขสองหลักจะมี 2common sigment พ่วงกัน<br />จึงต้องแบ่งแยกข้อมูลออกเป็น 4 ชุดคือ<br /><br />Table A = digit1บน+digit2บน<br />Table B = digit1ล่าง+digit2ล่าง<br /><br />เอาทั้งหมดมารวมกันเป็น 2byte บนกับล่าง (A กับ B) ส่งแล้ว scan ตามลำดับ<br /><br />เนื่องจากจอเป็นแบบ 2common การ scan จึงทำได้สองครั้ง<br />ผมก็เอาข้อมูล หลัก1-2 บน กับ หลัก3-4 บน ส่งออกไปยัง port 1-2<br />ตามลำดับ จากนั้นสั่ง common1 on ต่อไป ก็เอาข้อมูล หลัก1-2 ล่าง<br />กับ หลัก3-4 ล่าง ส่งออกไปยัง port 1-2 จากนั้นสั่ง common 2 on<br /><br />การเปิดตาราง (อ้างจาก Code) โปรดดูรูปวงจรของ FTTL655S ประกอบ<br />ถ้านับหลักซ้ายมือสุดเป็นหลักที่1จะเห็นว่ามีการต่อ segment เหมือนกัน<br />ในหลักที่ 2 และ 4 สามารถใช้ตารางเดียกันได้ ส่วนหลักที่ 1 และ 3 ต่างกัน<br />เราก็แยกเป็นสองตาราง รวมทั้งหมด 3 ตาราง โดย table-A ใช้กับหลักที่ 1<br />table-B ใช้กับหลักที่ 3 และ table-C ใช้กับหลักที่ 2และ4<br /><br />ต่อไปเป็นการเปิดตารางผมจะเรียกข้อมูลชุดบนว่า A และชุดล่างว่า B<br />ทุกครั้งที่เปิดตารางของแต่ละหลัก จะได้ข้อมูล 2 ชุด คือ A และ B<br />ซึ่งก็คือข้อมูลของ Common ซึ่งมีอยู่สองชุดนั่นเอง<br />แต่ใน 1 byte นั้นมันจะมีตัวเลขอยู่สองหลัก ดังนั้นเมื่อเปิดตารางแล้ว<br />ก็จะได้ข้อมูลมา 4 ชุดหรือ 4 byte คือ<br /><br />A หลักที่ 1 และ B หลักที่ 1<br />A หลักที่ 2 และ B หลักที่ 2<br /><br />นำข้อมูล A1 กับ A2 มา OR กันเป็น 1 byte<br />นำข้อมูล B1 กับ B2 มา OR กันเป็น 1 byte<br /><br />การ scan ทำดังนี้<br />1.สั่ง Common 1-2 Off<br />2.เอาข้อมูลที่ได้จาก A1+A2 ส่งออกไปที่ port สั่ง Common 1 On<br />ค้างไว้ 5ms จากนั้น<br />3.สั่ง Common 1-2 Off<br />4.เอาข้อมูลที่ได้จาก B1+B2 ส่งออกไปที่ port สั่ง Common 2 On<br />ค้างไว้ 5ms กลับไปทำข้อ 1<br /><br />จบแล้วครับ อาจไม่สมบูรณ์เท่าไร แต่คงพอเป็นแนวทางได้นะครับ<br /><br />ประกอบไปด้วย Program Driver ตัวอย่าง และ Program นาฬิกา DS1307<br />และ Temp DS18B20 แก้ไขจาก Digital clock - Temp with 1.8 LED Display<br /><br /><a href="http://www.4shared.com/file/A4yQe4j4/FTTL655S.html"><br />Source Code</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-53914637770258767952011-03-17T18:51:00.000-07:002011-09-29T00:50:27.364-07:00การสแกน Dot Matrixตัวอย่างใน วีโอ ใช้ col scan จะเห็นได้ว่าข้อมูล ในแต่ละ col<br />จะถูกส่งออกที่ละอัน โดยข้อมูลเป็นของ col segment ไหน<br />ก็ on col segment นั้น ถ้าเราหน่วงเวลาช้าๆ ก็จะเห้นเป็นแค่ไฟวิ่งแค่นั้น<br />แต่ถ้าลองเร็วๆซัก 5ms ก็จะเห็นเป็นตัวอักษรแล้ว...<br /><span style="font-weight: bold;"><br />วีโอเป็น HD นะครับขยายได้ถ้ามองไม่ชัด</span><br /><iframe src="http://www.youtube.com/embed/AHGd3p6RRNY?fs=1" allowfullscreen="" width="425" frameborder="0" height="344"></iframe><br /><br />;//****************************<br />;//* Source Code For AT89c2051<br />;//****************************<br /><br />shift_dat bit p1.0<br />shift_clk bit p1.1<br />col_lat bit p1.2<br />row_lat bit p1.3<br /><br />;data segment<br />dseg at 020h<br />col_dat: ds 1<br />row_dat: ds 1<br /><br />dl_a: ds 1<br />dl_b: ds 1<br />dl_c: ds 1<br /><br />;//***** macro operator *****//;<br />set_col macro ___col_dat<br />mov a,#___col_dat<br />cpl a<br />acall col_shift_dat<br />endm<br /><br />set_row macro ___row_dat<br />mov a,#___row_dat<br />acall row_shift_dat<br />endm<br /><br />clr_col macro<br />acall col_clear_dat<br />endm<br /><br />delay_ms macro ___d_1<br />mov dl_b,#___d_1<br />acall delay<br />endm<br /><br />delay_x macro<br />delay_ms (5)<br />endm<br /><br />;code segment<br />;//***** ap code start *****//;<br />cseg at 0000h<br />ajmp initial<br /><br />cseg at 0050h<br />initial: mov p1,#0ffh<br />mov p3,#0ffh<br />mov sp,#050h<br /><br />;clear internal ram<br />mov r0,#07fh<br />clr a<br />mov @r0,a<br />djnz r0,$-1<br /><br />;shift initial logic<br />clr shift_clk<br />clr col_lat<br />clr row_lat<br /><br />;//***** main program *****//;<br />main: set_row (0ffh) ; set row data col-1<br />set_col (00000001b) ; set col-1 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (011h) ; set row data col-2<br />set_col (00000010b) ; set col-2 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (011h) ; set row data col-3<br />set_col (00000100b) ; set col-3 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (031h) ; set row data col-4<br />set_col (00001000b) ; set col-4 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (051h) ; set row data col-5<br />set_col (00010000b) ; set col-5 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (08eh) ; set row data col-6<br />set_col (00100000b) ; set col-6 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (0h) ; set row data col-7<br />set_col (01000000b) ; set col-7 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />set_row (0h) ; set row data col-8<br />set_col (10000000b) ; set col-8 on<br /><br />delay_x ; delay 200ms<br />clr_col ; clear col data reduct blur<br /><br />ajmp main<br /><br />;//***** delay ms min=1ms max=255ms *****//;<br />delay: mov dl_a,#230<br />delay1: nop<br />djnz dl_a,delay1<br />djnz dl_b,delay<br />ret<br /><br />;//***** col shift data *****//;<br />col_shift_dat: mov b,#8<br />col_shift_dat1: rlc a<br />mov shift_dat,c<br />setb shift_clk<br />nop<br />clr shift_clk<br />djnz b,col_shift_dat1<br />setb col_lat<br />nop<br />clr col_lat<br />ret<br /><br />;//***** row shift data *****//;<br />row_shift_dat: mov b,#8<br />row_shift_dat1: rlc a<br />mov shift_dat,c<br />setb shift_clk<br />nop<br />clr shift_clk<br />djnz b,row_shift_dat1<br />setb row_lat<br />nop<br />clr row_lat<br />ret<br /><br />col_clear_dat: mov b,#8<br />col_clear_dat1: setb shift_dat<br />setb shift_clk<br />nop<br />clr shift_clk<br />djnz b,col_clear_dat1<br />setb col_lat<br />nop<br />clr col_lat<br />ret<br /><br />end<br /><br />ผมใช้การสแกนแบบ col ครับ มันประหยัด ram ดี<br />เริ่มแรกต้องทำความเข้าใจว่า row & col คืออะไร รู้แล้วไม่เป็นไร<br />เอาคนที่ไม่รู้ row คือ แถวในแนวนอน col คือ แถวในแนวตั้ง<br /><br />การสแกนแบบ row คือ<br />1.ส่ง data col register ก็คือ ข้อมูลทาง row นั่นเอง<br />2.สั่ง row segment on<br />3.หน่วงเวลา ประมาณ 5 ms<br />4.เลื่อนข้อมุล data col register กลับไปทำ ข้อ 1<br />วนจนครบ 8 ครั้ง ก็เป็น 8 แถวพอดี<br /><br />การสแกนแบบ col คือ<br />1.ส่ง data row register ก็คือ ข้อมูลทาง col นั่นเอง<br />2.สั่ง col segment on<br />3.หน่วงเวลา ประมาณ 5 ms<br />4.เลื่อนข้อมุล data row register กลับไปทำ ข้อ 1<br />วนจนครบ 8 ครั้ง ก็เป็น 8 แถวพอดีmicrocon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com4tag:blogger.com,1999:blog-7445804107681783656.post-27294002157761939412011-03-09T22:20:00.000-08:002011-09-29T02:14:18.092-07:00LED Dot Matrix Display V2LED Dot Matrix Display V2<br /><br /><iframe src="http://www.youtube.com/embed/tTEgk5_Ft_Y?fs=1" allowfullscreen="" width="425" frameborder="0" height="344"></iframe><br /><br />มาแล้วครับ V2 แก้ bug นิดหน่อยอาจมีเหลือบ้าง ด้วย memory ที่จำกัด<br />ผมใช้วิธี col-scan ครับ row-scan มันเปลือง mem ความสว่างสู่สีกัน<br />source ตัวนี้มี macro ใหม่ 2-3 ตัว<br />เช่น wr_bf เป็นคำสั่งเขียนข้อมูลไปยัง buffer แล้วแต่จะระบุเช่น<br />ds_buf1-4 เป็นตำแหน่ง display buffer เขียนอะไรออกไปก็เห็นเลย.....<br />cg_buf1-4 เป็นตำแหน่ง char buffer ไว้เก็บอักษรที่ต้องการแสดง.....<br /><br />ส่วน PUT_STR_L เป็นคำสั่งใช้ เปิดตาราง เอามาแสดงผลพร้อมกับเลื่อน<br />ไปทางซ้ายเรือยๆจนกว่าจะเจอ byte ปิด 00h<br /><br /><a href="http://www.4shared.com/file/2Pqja7vO/dot_matrix_8x22_v2.html">Source Code v2.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-15301934690254772962011-02-26T23:39:00.000-08:002011-09-29T02:13:24.448-07:00LED Dot Matrix Display V1<iframe src="http://www.youtube.com/embed/E9jQvkyEIQQ?fs=1" allowfullscreen="" width="425" frameborder="0" height="344"></iframe><br /><br />เนื่องจากทุนน้อยครับเอามันแค่นี้ก่อน<br /><br />การเลื่อนตัวอักษรไม่ได้ยากเท่าใดนัก ทั้งหมดสามารถทำผ่าน buffer ได้ง่ายๆ<br />โดยกำหนด buffer ขึ้นมาเท่าจำนวนของ column ในรูปคือ 20 byte<br />ส่วนอีก 5 byte มีไว้ใช้ buffer ข้อมูลจากการเปิดตาราง แล้วเอามา<br />พักไว้ที่นี่ step การเลื่อนข้อความเบื้องต้นคือ<br /><br />1.กำหนดตำแหน่งแรกของ pointer ข้อความ<br />2.กำหนดตำแหน่ง ที่ character buffer<br />3.เปิดตารางตัวอักษรจาก pointer<br />4.นำค่าจากตารางเก็บลง buffer<br />5.scan display ไว้ระยะหนึ่ง<br />6.เลื่อนข้อมูล display buffer ทั้งหมด ไปทางซ้าย 1 ครั้ง<br />แล้วกลับไปข้อ 5. ทำจนครบ 5 ครั้ง<br />7.เพิ่มค่า pointer กลับไปข้อ 2.<br /><br />การ scan display ใช้หลักการคล้ายๆกับ 7 segment<br />คือ กำหนด pointer ที่ตำแหน่งแรก display buffer1 (30H)<br />แล้วนำค่าที่ pointer ชี้ไปส่งให้ Row Shift register<br />เพื่อส่งไปยัง dot matrix จากนั้นให้ column on<br />เพิ่มค่า pointer ทำจนครบ 20 column<br /><br />tip....<br />คือ data เป็นของ column ไหนก็ให้ column นั้น on<br />อย่างวงจรที่ผมใช้ column เป็นลบ ผมก็สั่ง ให้ shift bit<br />นั้นเป็น 0 ครับ... และก่อนจะส่งค่าใดๆทาง row ให้<br />off ทุก column ก่อนเสมอ ช่วยแก้เบลอได้ 100%<br />รายละเอียดหลักๆ น่าจะมีเท่านี้ ถ้าได้อะไรใหม่ๆจะมาเล่าให้ฟังอีกที.....<br /><br />source ตัวนี้ผมทำ buffer ไว้ 24 byte ครับ<br />เวลาเรียกใช้ ให้ใส่ค่า address 1-4 ลง acc<br />โดยเรียกโปรแกรมย่อย setaddress จากนั้น ตามด้วย putchar<br /><br />ตัวอย่าง....<br />mov a,#1<br />acall setaddress ;buffer ตำแหน่งที่1<br />mov a,#"A"<br />acall putchar ;เก็บค่า "A" จากตาราง ลง buffer ตำแหน่งที่1<br /><br />ในส่วนของ scan display เอาค่าที่เก็บจาก buffer ไปใช้ได้เลย<br />โดยมีคำสั่ง shift display ไว้ให้แล้ว<br />ตัวเต็มผม open source เหมือนเดิม แต่คงเอาแค่ อ่านข้อความจาก<br />programmemory เอามาวิ่งแสดงเฉยๆ ที่เหลือไปเขียนต่อกันเอง<br />เพราะเดี๋ยวจะงงกันซะเปล่าๆ video ผมถ่ายชัดสุดได้แค่นี้...<br /><br /><a href="http://www.4shared.com/file/rhfAv1Jn/dot_matrix_v1.html">Source Code v1.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-34851481135525502022011-02-20T04:00:00.000-08:002011-09-29T00:39:57.857-07:007 Segment Thermometer 2 Digitเป็น Temp monitor ที่ผมพยายามทำให้เล็กที่สุดครับซึ่งทำได้เล็กสุดแค่นี้<br /><br /><iframe width="425" height="349" src="http://www.youtube.com/embed/VJVYGCPNTTk" frameborder="0" allowfullscreen></iframe><br /><br />ย่านการวัด อยู่ที่ -9 ถึง +99 องศา ตามหลักของ 7segment<br />ที่เอาแค่หลักสิบไม่มีทศนิยม ถ้าเกินกว่าย่านวัดที่กำหนด จะมีตัว Er กระพริบ<br /><br /><embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5632890851724462529%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCIW5hdvsroXW0AE%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />ตัวแรกผมใช้กับ DS18S20 แต่ผมเห็นราคามันแพง เลยแก้ไปใช้กับ<br />DS18B20แทน ด้านอุปกรณ์ผมออกแบบให้ใช้อุปกรณ์ให้น้อยที่สุด<br />ราคาโดยรวมไม่น่าเกิน 150 บาท (เน้นประหยัด)<br /><br />ปล.อาจมีคนทำเล่นเยอะแล้ว แต่ของmcs-51 หายากที่เห็นๆดูจะใช้อุปกรณ์<br />เยอะไปหน่อยไม่ค่อยถูกใจ<br /><br /><a href="http://www.4shared.com/file/nKaMhbCk/Temp2digit_7segment.html">Source Code v1.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-13647840935082023082011-02-16T23:58:00.000-08:002011-09-29T02:00:46.790-07:00Thermometer Nokia 5110 Lcd<embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5657701654581950065%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCPfml8bb4IS1rQE%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />เห็นมีแต่ของ PIC กับ AVR เยอะ เลยทำของ mcs-51 มั่งการแสดงผล<br />เหมือนกับอันนี้ทุกอย่าง<br /><br /><a href="http://www.ivica-novakovic.from.hr/Nokia%20Lcd%20Termometar-eng.htm">http://www.ivica-novakovic.from.hr</a><br /><br />แกะ hex code อยู่3วัน เพราะไม่เคยเล่น glcd เลย ที่เป็นภาษา c<br />ก็อ่านไม่ค่อยรู้เรื่องไม่รู้ว่าเขา write image พร้อมกับ ตัวเลขยังไง<br />p.m ไปหาพี่.. คนหนึ่งใน e-today ก็เงียบ.. มารู้เอาตอนแกะ code<br />นี่แหละ ตอนแรกเห็นเวบมันมีให้แต่ hex เลยทำตามดู.... มันเจือก<br />ไม่แสดงอะไรเลย ตรวจแล้วตรวจอีกว่าหนู๋ผิดตรงไหน ทำไม่มันไม่ติด<br />เลยแกะ code มันซะเลย... แต่ ไม่ได้ง่ายนัก มางงตรง analog-bar<br />ทั้ง bit flag bit status มั่วไปหมด แถมพี่แกเล่นเอา image table<br />ไปไว้ที่ eeprom ส่วนนึงด้วยเพราะว่า program memory คงไม่พอเก็บ<br />แต่บทจะทำได้ เขียนได้ block เดียว... ที่เหลือเขียนเหมือนกันหมด....<br /><br />มาว่าถึงหลักการ คนที่รู้แล้วไม่เป็นไร เอาคนที่ยังไม่รู้ (เหมือนผม)<br />การแสดง image กับ ตัวเลข พร้อมกันนั้น ตอนแรกผมเข้าใจว่า<br />ต้อง update ทั้งหน้าจอหรือ refresh ทุกๆ ครั้งที่ต้องการแสดงผลทั้งจอ<br />แต่จริงๆ image รวม ผมเรียกว่า main image ที่ไม่มีการเปลี่ยนแปลง<br />รูปแบบการแสดงผลใดๆอีกเลย จะถูกเขียนในตอนแรกครั้งเดียวจากนั้น<br />ข้อมูลที่อยู่ในตำแหน่งต่างๆ ที่มีการแปลี่ยนแปลงเช่นตัวเลข จะถูกเขียน<br />โดยการกำหนด cursor ไปยังตำแหน่งที่ต้องการเขียน แล้วเขียนข้อมูล<br />ทับลงไป...<br /><br />ใน source ผม จะมีคำสั่งของ macro อยู่สองคำสั่งคือ<br /><br />ไปยังตำแหน่งต่างๆของจอ<br />pixxy [ค่าx],[ค่าy]<br /><br />เขียน image จากตาราง<br />wrimg [ตำแหน่งของตาราง],[จำนวนข้อมูล หน่วยเป็นbyte]<br /><br />ที่ใช้บ่อยๆก็จะมี lcdputchar กับ lcdputcmd<br /><br /><a href="http://www.4shared.com/file/zGL-4iQg/Temp_Nok_Clone_version.html">Source code v1.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0tag:blogger.com,1999:blog-7445804107681783656.post-40576808986027987612011-02-16T23:28:00.000-08:002011-09-29T01:40:58.957-07:00Digital clock and Temp Monitor with 7 Segment<embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="425" height="349" flashvars="host=picasaweb.google.com&hl=th&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F103734209642572221176%2Falbumid%2F5657695724926506545%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCOfF7vTWp-K02gE%26hl%3Dth" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><br />เนื่องด้วยผมไปเห็น digital clock ที่ขายในตลาดนัดแถวบ้าน<br />ตัวเลขน่าจะสูง 1.2" มี temp 2 หลักแยกต่างหากผมถามราคาแล้ว ตกใจ<br />แม่ง850บาท...!!! (น่าจะแพงแค่แถวบ้านผม)ที่อื่นราคาไม่น่าเกิน 300<br />แต่ก็ไม่ค่อยเห็นมีขายกันเท่าไรเห็นติดใน รถbus รถตู้ บ้างก็มี.... อยากได้ครับ<br />เลยกลับมาบ้านหาใน google ไม่มีเลยครับ พยายามหาอยู่หลาย keyword<br />นานมากแต่ก็ไม่มีที่ต้องการ...<br /><br />ผมบังเอิญเจอของเก่าที่ตลาดนัดแถวบ้านหลังจาก... น่าจะ 4-5เดือนมั้ง<br />ต่อราคาอยู่พักนึง เขาก็ขายให้ในราคา 70บาท... ตอนแรกเอามาผมคิดว่า<br />มันบอกเวลาได้อย่างเดียว มาลองต่อไฟ ก็ติดปรกติลองตั้งเวลาก็ใช้ได้<br />แต่พอมันเดินไปได้ซักพักมันจะดับพอรีเซตก็ใช้ได้อีก หาสาเหตุอยู่นาน<br />พอดีด้านหลังมันมี connector 3 ขา มันหักหายไป ตอนแรกคิดว่าเป็น<br />switch option หรือ sw อะไรซักอย่างเลยเอาสายไฟไปเขี่ยๆดู<br />ตอนที่display มันดับ ปรากฎว่าdisplay มันติด ขึ้นมา เป็น 88.C<br />เท่านั้นแหละครับ ถึงบางอ้อเลย...<br /><br />ตอนที่ display มันดับนั้น มันติด loop presence ของ ds1820<br />เพราะมันขับแบบ scan มันก็ดับวูบเลยถ้าติด loop โดยมันจะแสดงเวลา<br />20วินาที แสดง อุณหภูมิ 5วินาที สลับกันไปเรื่อยๆซึ่งผมดูแล้วมันเข้าท่าเข้าทาง<br />น่าจะเป็นประโยชน์ กับคนอื่นที่อยากทำเล่นทำขาย<br />(แข่งกะตลาดนัดแถวบ้านผม...) ผมเลยลอก pcb ออกมา<br />รูมันอาจจะไม่ตรงแป๊ะๆ แต่ก็ใกล้เคียง... ส่วน source code<br />ผมเขียนขึ้นมาใหม่หมด เพราะของเดิมน่าจะมี bug<br />เพราะ display มันจะไม่นิ่ง มีอาการแว๊ปๆตลอดทุก2วิ<br /><br />ปล. วงจรขับมันมีข้อเสีย นิส..นึง R มันจะร้อนหน่อยแต่ก็ไม่มาก<br />ผมคิดว่าคงเป็นวิธีที่ดีที่สุดแล้วเมื่อเทียบกับความประหยัดและ<br />จำนวนpart ที่มีไม่มาก..... ลองพิจารณาดูครับ<br /><br /><a href="http://www.4shared.com/file/fWNGXr0u/DigitClockTemp_1_.html">Source Code v1.0</a>microcon99http://www.blogger.com/profile/09181392996946203603noreply@blogger.com0