เมื่อไม่นานมานี้ผมทำเกี่ยวกับ 7segment เยอะก็เลยปิ๊งไอเดียที่จะเอามาทำ
display module แบบสำเร็จรูปคือมี controller chip ในตัวเลย
โดยการใช้งานจะต้องให้ง่ายมากที่สุด มาดูวิดีโอกันก่อน
จะเห็นว่าสามารถควบคุมการทำงานต่างๆได้อย่างง่ายดายโดยมี command บางตัว
ที่ใกล้เคียงกับ LCD ทั่วไป ส่วนที่เหลือยังไม่ได้กำหนดเป็นมาตรฐาน และใน version
ต่อๆไปอาจไม่ได้อ้าง command นี้
จริงๆอุปกรณ์ไม่ได้เยอะขนาดนี้ถ้าผมใช้ 7segment common A เพราะ mcs-51
มันขับแบบซอร์ซไม่ได้อย่างที่เรารู้กัน วงจรก็เลยใหญ่อย่างที่เห็น แต่ก็เอาเหอะอันแรก
เอาอะไรมากชิมิ
มาดู specification กันก่อน
Controller :at89c2051 @11.0592-MHz
Baud :9600-bps
Fifo Buffer :32-byte
Display Data Register :8-byte
Character Gen. Register :n/a
Scan frq. :~500Hz
Support Ascii :0-9
รายละเอียดกลุ่มคำสั่งมีดังนี้
Command pre fix :0xfe
Home Address :0x01
Clear Display :0x02
Display Off :0x03
Display On :0x04
Dot Control :0x09
Define Bin :0x0c
Rotate Display Register Left :0x0d
Rotate Display Register Right :0x0e
CG-Ram Address :0x40 -->> n/a
DD-Ram Address :0x80
Home Address
กำหนดให้ DD-Ram Address ไปอยู่ในตำแหน่ง 0 หรือ Digit1
--ตัวอย่าง--
[0xfe]-[0x01]
Clear All Display Register
เคลียร์ Display Register ทั้ง 8byte พร้อมกับ
กำหนดให้ DD-Ram Address ไปอยู่ในตำแหน่ง 0 หรือ Digit1
--ตัวอย่าง--
[0xfe]-[0x02]
Display Off
ปิดการแสดงผล ไม่มีผลกับ Display Register
--ตัวอย่าง--
[0xfe]-[0x03]
Display On
เปิดการแสดงผล ไม่มีผลกับ Display Register
--ตัวอย่าง--
[0xfe]-[0x04]
Dot Control Page1
ใช้ส่งข้อมูลเฉพาะ Dot-segment ของ Display Register ทั้ง 8-byte
--ตัวอย่าง--
[0xfe]-[0x09]-[xxxxxxxx]
Dot-On x=1
Dot-Off x=0
บิต 0 เป็น Dot ของ Digit1 ไล่ขึ้นไปจนถึง Digit8
Define Bin
ใช้ส่งข้อมูลแบบ Binary เช่นต้องการตัวอักษรแปลกๆ ที่เราสร้างขึ้นเอง
หลังกระทำคำสั่ง DD-Ram Address+1
--ตัวอย่าง--
[0xfe]-[0x0c]-[xxxxxxxx]
Segment-On x=1
Segment-Off x=0
Bit0 = Segment-A
Bit1 = Segment-B
Bit2 = Segment-C
Bit3 = Segment-D
Bit4 = Segment-E
Bit5 = Segment-F
Bit6 = Segment-G
Bit7 = Segment-Dot
Rotate Display Register Left
ใช้หมุนข้อมูล Display Register ไปทาง ซ้ายหนึ่งครั้ง ต่อคำสั่ง ไม่มีผลกับ DD-Ram Address
--ตัวอย่าง--
[0xfe]-[0x0d]
Rotate Display Register Right
ใช้หมุนข้อมูล Display Register ไปทาง ขวาหนึ่งครั้ง ต่อคำสั่ง ไม่มีผลกับ DD-Ram Address
--ตัวอย่าง--
[0xfe]-[0x0e]
DD-Ram Address
ใช้กำหนด DD-Ram Address
--ตัวอย่าง--
[0xfe]-[0x80... thru 0x87]
การใช้งาน
เราสามารถส่งตัวเลข 0-9 ที่เป็นรหัส ascii ไปแสดงผลได้ทันที นอกเหนื่อจากนี้จะไม่มีผล
หรือข้อมูลจะถูกละทิ้งไป ในทุกๆครั้งที่ส่งข้อมูลไปแสดงผล display buffer address จะ
เพิ่มขึ้นเองอัตโนมัติ รวมทั้งคำสั่ง define bin ด้วย ที่เหลือศึกษาได้จาก code ครับ
Source Code v1.0
Microcon99 Open source
Open source Microcontroller Project เจอกันได้อีกหนึ่งช่องทางที่ mcu4fun.blogspot.com
ค้นหาบล็อกนี้
Custom Search
วันพฤหัสบดีที่ 29 กันยายน พ.ศ. 2554
Low Cost Serial LCD Backpack
จริงๆ function เยอะกว่านี้แต่ผมตัดออกเพราะไม่ได้ใช้ แต่เป็น commend อยู่ใน code
เช่น การ เปิด ปิด backlight .... ลองไปแก้ code กันเอานะครับ ตัวนี้เป็น source
ที่สมบูรณ์ที่สุดแล้ว..... สามารถแก้ไปใช้กับ 89LPxxxx รองรับ baud 115k ได้สบายๆ
ส่วน auto baud กับ soft fifo ผมเพิ่งใส่ไป อาจมี bug แต่ผมลองแล้วยังไม่เจอ
ใครใช้แล้วมีปัญหากรุณารายงานผมด้วยครับ.....
คุณสมบัติ
Support Baud 1200,2400,4800,9600,19200,57600
Auto Baud rate function.
Software FIFO 80 byte
Command Prefix 254(0xFE)
Support CLCD 16x1 16x2 20x4 and more...
การ initial (Auto Baud rate function)
กำหนด Baud rate ฝั่งส่งให้เรียบร้อย
รอ 1 วินาที ให้ Serial LCD initial
ส่งค่า 0x20 ไปยัง Serial LCD
หาก ถูกต้อง LCD จะแสดงข้อความ Detect-xxxxx.bps
รอ 2 วินาที
ส่งข้อมูลตามต้องการ
Source code v8.0
เช่น การ เปิด ปิด backlight .... ลองไปแก้ code กันเอานะครับ ตัวนี้เป็น source
ที่สมบูรณ์ที่สุดแล้ว..... สามารถแก้ไปใช้กับ 89LPxxxx รองรับ baud 115k ได้สบายๆ
ส่วน auto baud กับ soft fifo ผมเพิ่งใส่ไป อาจมี bug แต่ผมลองแล้วยังไม่เจอ
ใครใช้แล้วมีปัญหากรุณารายงานผมด้วยครับ.....
คุณสมบัติ
Support Baud 1200,2400,4800,9600,19200,57600
Auto Baud rate function.
Software FIFO 80 byte
Command Prefix 254(0xFE)
Support CLCD 16x1 16x2 20x4 and more...
การ initial (Auto Baud rate function)
กำหนด Baud rate ฝั่งส่งให้เรียบร้อย
รอ 1 วินาที ให้ Serial LCD initial
ส่งค่า 0x20 ไปยัง Serial LCD
หาก ถูกต้อง LCD จะแสดงข้อความ Detect-xxxxx.bps
รอ 2 วินาที
ส่งข้อมูลตามต้องการ
Source code v8.0
วันพุธที่ 22 มิถุนายน พ.ศ. 2554
Countdown Timer 3 Mode with Alarm
เนื่องมาจากที่บ้านผม
มีเครื่องซักผ้าแบบ กึ่ง อัตโนมือ... เวลาปั่นเสร็จมันจะไม่เตื่อนใดๆทั้งสิ้น
ส่วนระหว่างปั่น ผมก็จะมานั่งเล่น internet มันก็จะเพลินจน
เลยเวลาตากผ้าหรือเวลาหมดแดด ก็เลยทำเครื่องเตือนเป็น CountDown
ขึ้นมาจะได้ไม่เล่นเพลินจนลืมตากผ้าดังกล่าว...เห่อๆๆ
ของจริง
รายละเอียดการใช้งาน
CountDown ตัวนี้มีด้วยกันหลักๆ 3 โหมด คือ
1-99 วินาที,1-99 นาที,1-99 ชั่วโมง
แต่ละโหมด จะมีย่อย อีก 4 แบบ คือ ตั้งเวลาปิด,เปิด ให้ alarm หรือไม่ alarm
โดย dot1 หากติดคือเปิด alarm ไม่ติดคือปิด alarm
ส่วน dot2 ถ้าติดคือ การตั้งเวลาเปิด ถ้าไม่ติดคือ การตั้งเวลาปิด
A = sec
b = min
C = hour
ปุ่ม Set ทำงานสองหน้าที่
กดปล่อย = start,stop
กดค้าง = set
การตั้งเวลาทำได้โดยกด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง
หน้าจอจะแสดง mode ให้กด + ตั้งค่า mode ตามต้องการ จากนั้นกด set 1ครั้ง
จะเป็นการตั้งค่าหลัก สิบ กด + เลือก 0-9 จากนั้นกด set 1ครั้ง เป็นการตั้งหลัก
หน่วย กด + เพื่อตั้งค่า กด set 1ครั้ง ตัวเลขจะหยุดกระพริบ กด set 1ครั้ง
จะเห็น dot2 กระพริบแสดงว่าเวลาเริ่มเดินแล้ว ในระหว่างเวลานับถอยหลังอยู่
สามารถหยุดได้โดยกด set 1ครั้งหรือกด set ค้างไว้ประมาน 1วินาที
จะได้ยินเสียง beep 1ครั้ง เป็นการกลับไปตั้งค่าใหม่อีกครั้ง...
เปิด alarm
เมื่อการนับถอยหลังเสร็จสิ้น จะเกิด alarm ประมาณ 30วินาที
จากนั้นจะหยุดไปเอง ถ้าในระหว่างเกิด alarm อยู่แล้วต้องการปิด
ให้กด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง
alarm จะหยุด...
Source Code v1.0
Source Code v1.2 ใส่ alarm relay เพิ่ม...
มีเครื่องซักผ้าแบบ กึ่ง อัตโนมือ... เวลาปั่นเสร็จมันจะไม่เตื่อนใดๆทั้งสิ้น
ส่วนระหว่างปั่น ผมก็จะมานั่งเล่น internet มันก็จะเพลินจน
เลยเวลาตากผ้าหรือเวลาหมดแดด ก็เลยทำเครื่องเตือนเป็น CountDown
ขึ้นมาจะได้ไม่เล่นเพลินจนลืมตากผ้าดังกล่าว...เห่อๆๆ
ของจริง
รายละเอียดการใช้งาน
CountDown ตัวนี้มีด้วยกันหลักๆ 3 โหมด คือ
1-99 วินาที,1-99 นาที,1-99 ชั่วโมง
แต่ละโหมด จะมีย่อย อีก 4 แบบ คือ ตั้งเวลาปิด,เปิด ให้ alarm หรือไม่ alarm
โดย dot1 หากติดคือเปิด alarm ไม่ติดคือปิด alarm
ส่วน dot2 ถ้าติดคือ การตั้งเวลาเปิด ถ้าไม่ติดคือ การตั้งเวลาปิด
A = sec
b = min
C = hour
ปุ่ม Set ทำงานสองหน้าที่
กดปล่อย = start,stop
กดค้าง = set
การตั้งเวลาทำได้โดยกด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง
หน้าจอจะแสดง mode ให้กด + ตั้งค่า mode ตามต้องการ จากนั้นกด set 1ครั้ง
จะเป็นการตั้งค่าหลัก สิบ กด + เลือก 0-9 จากนั้นกด set 1ครั้ง เป็นการตั้งหลัก
หน่วย กด + เพื่อตั้งค่า กด set 1ครั้ง ตัวเลขจะหยุดกระพริบ กด set 1ครั้ง
จะเห็น dot2 กระพริบแสดงว่าเวลาเริ่มเดินแล้ว ในระหว่างเวลานับถอยหลังอยู่
สามารถหยุดได้โดยกด set 1ครั้งหรือกด set ค้างไว้ประมาน 1วินาที
จะได้ยินเสียง beep 1ครั้ง เป็นการกลับไปตั้งค่าใหม่อีกครั้ง...
เปิด alarm
เมื่อการนับถอยหลังเสร็จสิ้น จะเกิด alarm ประมาณ 30วินาที
จากนั้นจะหยุดไปเอง ถ้าในระหว่างเกิด alarm อยู่แล้วต้องการปิด
ให้กด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง
alarm จะหยุด...
Source Code v1.0
Source Code v1.2 ใส่ alarm relay เพิ่ม...
วันอังคารที่ 7 มิถุนายน พ.ศ. 2554
Digital Temprature Controller
เป็น project ที่ไม่ซีเรียสมากแต่เอาไปใช้ได้จริง สามารถคุมได้ทั้งร้อนและเย็น
ตั้งแต่ -55องศา ถึง 125องศาcompare routine สามารถคำนวนและเปรียบเทียบ
ค่าลบได้ด้วย โดยคำนวนร่วมกับ flag tn,th,tl
มาว่ากันเรื่องการคำนวน มีหลักๆก็
TN ค่าอุณหภูมิ ปัจจุบันที่อ่านได้จาก ds18b20
TH ค่าอุณหภูมิ สูงสุดที่เรากำหนด
TL ค่าอุณหภูมิ ต่ำสุดที่เรากำหนด
เริ่มแรกให้คำนวน TH กับ TN ก่อน TNน้อยกว่าTH ??
ผมลองสุ่มค่าดังนี้
tn+15 th+10 = tnมากกว่าth
tn+15 th-10 = tnมากกว่าth
tn+15 th-15 = tnมากกว่าth
tn-15 th-20 = tnมากกว่าth
tn-15 th+15 = tnน้อยกว่าth**
การคำนวนให้คิดเครื่องหมายก่อนถ้าเป็นบวกทั้งคู่ใช้ th-tn
ถ้าเป็นลบทั้งคู่ใช้ tn-th แต่ถ้า tn เป็นบวก th เป็นลบจะคิด
แต่เครื่องหมายเพราะยังไง tn ก็ต้องเยอะกว่าแนนอนอยู่แล้ว
ในทางตรงกันข้าม ถ้า tn เป็นลบ th เป็นบวก tn จะมีค่า
น้อยกว่า ก็ข้ามไปคำนวณ tl ต่อไป
TL กับ TN ก่อน TNน้อยกว่าTL ??
ผมลองสุ่มค่าดังนี้
tl+15 tn+10 = tnน้อยกว่าtl
tl+15 tn-10 = tnน้อยกว่าtl
tl+15 tn-15 = tnน้อยกว่าtl
tl-15 tn-20 = tnน้อยกว่าtl
tl-15 tn+15 = tnมากกว่าtl**
การคำนวนให้คิดเครื่องหมายก่อนเช่นเดียวกับ th แต่คราวนี้
ใช้ tn เป็นตัวตั้งลบด้วย tl หากเป็นค่าบวกทั้งคู่....
ที่เหลื่อก้จะคำนวณคล้ายๆกันแค่สลับตัวตั้งเท่านั้น.....
การทำงานใน Hot mode (คุมร้อน)
เมื่อ TN ต่ำกว่าหรือเท่ากับ TL รีเลย์จะทำงานและจะตัด
การทำงานจนกว่าค่าของ TN จะสูงกว่าหรือเท่ากับ TH
การทำงานใน Cool mode (คุมเย็น)
คล้าย คุมร้อน แต่สลับกัน...
พอมองภาพออกกันมั๊ยครับ (ทั้งหมดนี่จะไม่มีความหมายหากเขียนด้วย ภาษาc)
Source code v2.0f
FIRMWARE 4.0F
รุ่นท้ายสุด... ผมปรับแก้ bug จนหมดแล้วครับ
อีกอย่างคือยัดอะไรไม่ได้แล้ว เต็ม2kแล้วจริงๆ อยากใส่ delay time
ให้ รีเลย์ แต่ยัดไม่ลงครับ ก็เลยเอาเท่าที่ได้...
การตั้งค่า กด set ค้างไว้ 1 วิครับมันจะขึ้น HC_x ซึง x ก็คือ ตัวกระพริบ
ถ้าเป็น C กระพริบก็ Cool คุมเย็น ถ้าเป็น H ก็คือ Hot คุมร้อน
กดปุ่ม inc เพื่อตั้งค่า จากนั้นกด set อีกครั้ง หน้าจอจะแสดง Hi_t
ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิสูง
กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set
เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Lo_t
ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิต่ำ
กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set
เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Succ
เป้นอันเสร็จการตั้งค่า
การ ลบค่าอุณหภูมิที่ตั้งไว้ทั้งหมด ทำได้โดยกด ปุ่ม set กับ inc ค้าง
ไว้ 1วิ หน้าจอจะแสดง CLr เท่านี้ค่าต่างๆก็จะถูกลบออกหมดแล้ว...
4.0F ผมตัด function ที่เกี่ยวกับ EEPROM ทั้งหมดออกนะครับ
อยากได้ต้องไปเพิ่มกันเองครับ เหลือไว้ให้คิดเองบ้างครับ ชีวิตจะได้
มีรสชาติ...อิอิ คงไปต่อยอดกันเองได้ไม่ยากนะ...
ปล. เกี่ยวกับ error msg.
Er_1 = family code ไม่ตรง หรือไม่ใช่ ds18b20 ที่ต่ออยู่
แต่ผมตัดออกเพาระไม่จำเป็น.
Er_2 = Device not Presence ไม่มีการตอบสนอง ต่อการ
reset บน bus 1-wire ซึ่งตัว ds18b20 อาจจะเสียหรือหลุด
หือสายอาจจะขาดก็ว่าไป.
Er_3 = ค่าอุณหภูมิสูง มีค่าที่น้อยกว่า ค่าอุณหภูมิต่ำ.
Er_4 = ค่าอุณหภูมิสูง และหรือ ค่าอุณหภูมิต่ำ มีค่าเกินย่านวัด
คือ -55 ถึง +125 องศา.
Er_5 = อันนี้เกี่ยวกับ EEPROM ทั้งหมด 4.0F จะไม่มี
Source code v4.0f
ตั้งแต่ -55องศา ถึง 125องศาcompare routine สามารถคำนวนและเปรียบเทียบ
ค่าลบได้ด้วย โดยคำนวนร่วมกับ flag tn,th,tl
มาว่ากันเรื่องการคำนวน มีหลักๆก็
TN ค่าอุณหภูมิ ปัจจุบันที่อ่านได้จาก ds18b20
TH ค่าอุณหภูมิ สูงสุดที่เรากำหนด
TL ค่าอุณหภูมิ ต่ำสุดที่เรากำหนด
เริ่มแรกให้คำนวน TH กับ TN ก่อน TNน้อยกว่าTH ??
ผมลองสุ่มค่าดังนี้
tn+15 th+10 = tnมากกว่าth
tn+15 th-10 = tnมากกว่าth
tn+15 th-15 = tnมากกว่าth
tn-15 th-20 = tnมากกว่าth
tn-15 th+15 = tnน้อยกว่าth**
การคำนวนให้คิดเครื่องหมายก่อนถ้าเป็นบวกทั้งคู่ใช้ th-tn
ถ้าเป็นลบทั้งคู่ใช้ tn-th แต่ถ้า tn เป็นบวก th เป็นลบจะคิด
แต่เครื่องหมายเพราะยังไง tn ก็ต้องเยอะกว่าแนนอนอยู่แล้ว
ในทางตรงกันข้าม ถ้า tn เป็นลบ th เป็นบวก tn จะมีค่า
น้อยกว่า ก็ข้ามไปคำนวณ tl ต่อไป
TL กับ TN ก่อน TNน้อยกว่าTL ??
ผมลองสุ่มค่าดังนี้
tl+15 tn+10 = tnน้อยกว่าtl
tl+15 tn-10 = tnน้อยกว่าtl
tl+15 tn-15 = tnน้อยกว่าtl
tl-15 tn-20 = tnน้อยกว่าtl
tl-15 tn+15 = tnมากกว่าtl**
การคำนวนให้คิดเครื่องหมายก่อนเช่นเดียวกับ th แต่คราวนี้
ใช้ tn เป็นตัวตั้งลบด้วย tl หากเป็นค่าบวกทั้งคู่....
ที่เหลื่อก้จะคำนวณคล้ายๆกันแค่สลับตัวตั้งเท่านั้น.....
การทำงานใน Hot mode (คุมร้อน)
เมื่อ TN ต่ำกว่าหรือเท่ากับ TL รีเลย์จะทำงานและจะตัด
การทำงานจนกว่าค่าของ TN จะสูงกว่าหรือเท่ากับ TH
การทำงานใน Cool mode (คุมเย็น)
คล้าย คุมร้อน แต่สลับกัน...
พอมองภาพออกกันมั๊ยครับ (ทั้งหมดนี่จะไม่มีความหมายหากเขียนด้วย ภาษาc)
Source code v2.0f
FIRMWARE 4.0F
รุ่นท้ายสุด... ผมปรับแก้ bug จนหมดแล้วครับ
อีกอย่างคือยัดอะไรไม่ได้แล้ว เต็ม2kแล้วจริงๆ อยากใส่ delay time
ให้ รีเลย์ แต่ยัดไม่ลงครับ ก็เลยเอาเท่าที่ได้...
การตั้งค่า กด set ค้างไว้ 1 วิครับมันจะขึ้น HC_x ซึง x ก็คือ ตัวกระพริบ
ถ้าเป็น C กระพริบก็ Cool คุมเย็น ถ้าเป็น H ก็คือ Hot คุมร้อน
กดปุ่ม inc เพื่อตั้งค่า จากนั้นกด set อีกครั้ง หน้าจอจะแสดง Hi_t
ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิสูง
กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set
เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Lo_t
ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิต่ำ
กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set
เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Succ
เป้นอันเสร็จการตั้งค่า
การ ลบค่าอุณหภูมิที่ตั้งไว้ทั้งหมด ทำได้โดยกด ปุ่ม set กับ inc ค้าง
ไว้ 1วิ หน้าจอจะแสดง CLr เท่านี้ค่าต่างๆก็จะถูกลบออกหมดแล้ว...
4.0F ผมตัด function ที่เกี่ยวกับ EEPROM ทั้งหมดออกนะครับ
อยากได้ต้องไปเพิ่มกันเองครับ เหลือไว้ให้คิดเองบ้างครับ ชีวิตจะได้
มีรสชาติ...อิอิ คงไปต่อยอดกันเองได้ไม่ยากนะ...
ปล. เกี่ยวกับ error msg.
Er_1 = family code ไม่ตรง หรือไม่ใช่ ds18b20 ที่ต่ออยู่
แต่ผมตัดออกเพาระไม่จำเป็น.
Er_2 = Device not Presence ไม่มีการตอบสนอง ต่อการ
reset บน bus 1-wire ซึ่งตัว ds18b20 อาจจะเสียหรือหลุด
หือสายอาจจะขาดก็ว่าไป.
Er_3 = ค่าอุณหภูมิสูง มีค่าที่น้อยกว่า ค่าอุณหภูมิต่ำ.
Er_4 = ค่าอุณหภูมิสูง และหรือ ค่าอุณหภูมิต่ำ มีค่าเกินย่านวัด
คือ -55 ถึง +125 องศา.
Er_5 = อันนี้เกี่ยวกับ EEPROM ทั้งหมด 4.0F จะไม่มี
Source code v4.0f
ป้ายกำกับ:
51,
controller,
Digital,
mcs,
temp,
temperature
วันเสาร์ที่ 21 พฤษภาคม พ.ศ. 2554
Digital Clock & Temp with FTTL-655 Display
FTTL-655 เป็นจอแบบ Duplex LED Display ผมไม่เคยเล่นหรือเจอจอแบบนี้มาก่อน
มันประหลาดดี มันจะมี 2 common แถมแต่ละ sigment พ่วงกันแบบ งงๆ
หา datasheet ก็ไม่มี แต่ไปเจออันนี้เข้า
http://libesz.digitaltrip.hu/digital-clock/
มีที่เดียวจริงๆ แถม Source ดันเป็นภาษา C อีก เลยต้องดำน้ำเอง
มาว่ากันถึงหลักการขับแบบที่ผมคิดเอง
FTTL655S มีตัวเลข 4 หลัก ใช้ pin ในการขับ segment 14pin
มี colon ด้วยก็ 15pin พอดี แบบไม่รวม common และ am-pm ผมไม่ได้ใช้
อันดับแรกผมจะแบ่ง จอออกเป็น 4 ส่วน เพื่อง่ายต่อการมอง
ใช้ข้อมูล 4byte คือ 2byte บน 2byte ล่าง แยกจากกัน
ข้อมูล segment หลัก1-2 ใช้ 2byte คือ 1byte บน 1byte ล่าง
ข้อมูล segment หลัก3-4 ใช้ 2byte คือ 1byte บน 1byte ล่าง
ในข้อมูล 1byte ที่ส่งให้กับ segment จะประกอบด้วย
เลขสองหลัก และในตัวเลขสองหลักจะมี 2common sigment พ่วงกัน
จึงต้องแบ่งแยกข้อมูลออกเป็น 4 ชุดคือ
Table A = digit1บน+digit2บน
Table B = digit1ล่าง+digit2ล่าง
เอาทั้งหมดมารวมกันเป็น 2byte บนกับล่าง (A กับ B) ส่งแล้ว scan ตามลำดับ
เนื่องจากจอเป็นแบบ 2common การ scan จึงทำได้สองครั้ง
ผมก็เอาข้อมูล หลัก1-2 บน กับ หลัก3-4 บน ส่งออกไปยัง port 1-2
ตามลำดับ จากนั้นสั่ง common1 on ต่อไป ก็เอาข้อมูล หลัก1-2 ล่าง
กับ หลัก3-4 ล่าง ส่งออกไปยัง port 1-2 จากนั้นสั่ง common 2 on
การเปิดตาราง (อ้างจาก Code) โปรดดูรูปวงจรของ FTTL655S ประกอบ
ถ้านับหลักซ้ายมือสุดเป็นหลักที่1จะเห็นว่ามีการต่อ segment เหมือนกัน
ในหลักที่ 2 และ 4 สามารถใช้ตารางเดียกันได้ ส่วนหลักที่ 1 และ 3 ต่างกัน
เราก็แยกเป็นสองตาราง รวมทั้งหมด 3 ตาราง โดย table-A ใช้กับหลักที่ 1
table-B ใช้กับหลักที่ 3 และ table-C ใช้กับหลักที่ 2และ4
ต่อไปเป็นการเปิดตารางผมจะเรียกข้อมูลชุดบนว่า A และชุดล่างว่า B
ทุกครั้งที่เปิดตารางของแต่ละหลัก จะได้ข้อมูล 2 ชุด คือ A และ B
ซึ่งก็คือข้อมูลของ Common ซึ่งมีอยู่สองชุดนั่นเอง
แต่ใน 1 byte นั้นมันจะมีตัวเลขอยู่สองหลัก ดังนั้นเมื่อเปิดตารางแล้ว
ก็จะได้ข้อมูลมา 4 ชุดหรือ 4 byte คือ
A หลักที่ 1 และ B หลักที่ 1
A หลักที่ 2 และ B หลักที่ 2
นำข้อมูล A1 กับ A2 มา OR กันเป็น 1 byte
นำข้อมูล B1 กับ B2 มา OR กันเป็น 1 byte
การ scan ทำดังนี้
1.สั่ง Common 1-2 Off
2.เอาข้อมูลที่ได้จาก A1+A2 ส่งออกไปที่ port สั่ง Common 1 On
ค้างไว้ 5ms จากนั้น
3.สั่ง Common 1-2 Off
4.เอาข้อมูลที่ได้จาก B1+B2 ส่งออกไปที่ port สั่ง Common 2 On
ค้างไว้ 5ms กลับไปทำข้อ 1
จบแล้วครับ อาจไม่สมบูรณ์เท่าไร แต่คงพอเป็นแนวทางได้นะครับ
ประกอบไปด้วย Program Driver ตัวอย่าง และ Program นาฬิกา DS1307
และ Temp DS18B20 แก้ไขจาก Digital clock - Temp with 1.8 LED Display
Source Code
มันประหลาดดี มันจะมี 2 common แถมแต่ละ sigment พ่วงกันแบบ งงๆ
หา datasheet ก็ไม่มี แต่ไปเจออันนี้เข้า
http://libesz.digitaltrip.hu/digital-clock/
มีที่เดียวจริงๆ แถม Source ดันเป็นภาษา C อีก เลยต้องดำน้ำเอง
มาว่ากันถึงหลักการขับแบบที่ผมคิดเอง
FTTL655S มีตัวเลข 4 หลัก ใช้ pin ในการขับ segment 14pin
มี colon ด้วยก็ 15pin พอดี แบบไม่รวม common และ am-pm ผมไม่ได้ใช้
อันดับแรกผมจะแบ่ง จอออกเป็น 4 ส่วน เพื่อง่ายต่อการมอง
ใช้ข้อมูล 4byte คือ 2byte บน 2byte ล่าง แยกจากกัน
ข้อมูล segment หลัก1-2 ใช้ 2byte คือ 1byte บน 1byte ล่าง
ข้อมูล segment หลัก3-4 ใช้ 2byte คือ 1byte บน 1byte ล่าง
ในข้อมูล 1byte ที่ส่งให้กับ segment จะประกอบด้วย
เลขสองหลัก และในตัวเลขสองหลักจะมี 2common sigment พ่วงกัน
จึงต้องแบ่งแยกข้อมูลออกเป็น 4 ชุดคือ
Table A = digit1บน+digit2บน
Table B = digit1ล่าง+digit2ล่าง
เอาทั้งหมดมารวมกันเป็น 2byte บนกับล่าง (A กับ B) ส่งแล้ว scan ตามลำดับ
เนื่องจากจอเป็นแบบ 2common การ scan จึงทำได้สองครั้ง
ผมก็เอาข้อมูล หลัก1-2 บน กับ หลัก3-4 บน ส่งออกไปยัง port 1-2
ตามลำดับ จากนั้นสั่ง common1 on ต่อไป ก็เอาข้อมูล หลัก1-2 ล่าง
กับ หลัก3-4 ล่าง ส่งออกไปยัง port 1-2 จากนั้นสั่ง common 2 on
การเปิดตาราง (อ้างจาก Code) โปรดดูรูปวงจรของ FTTL655S ประกอบ
ถ้านับหลักซ้ายมือสุดเป็นหลักที่1จะเห็นว่ามีการต่อ segment เหมือนกัน
ในหลักที่ 2 และ 4 สามารถใช้ตารางเดียกันได้ ส่วนหลักที่ 1 และ 3 ต่างกัน
เราก็แยกเป็นสองตาราง รวมทั้งหมด 3 ตาราง โดย table-A ใช้กับหลักที่ 1
table-B ใช้กับหลักที่ 3 และ table-C ใช้กับหลักที่ 2และ4
ต่อไปเป็นการเปิดตารางผมจะเรียกข้อมูลชุดบนว่า A และชุดล่างว่า B
ทุกครั้งที่เปิดตารางของแต่ละหลัก จะได้ข้อมูล 2 ชุด คือ A และ B
ซึ่งก็คือข้อมูลของ Common ซึ่งมีอยู่สองชุดนั่นเอง
แต่ใน 1 byte นั้นมันจะมีตัวเลขอยู่สองหลัก ดังนั้นเมื่อเปิดตารางแล้ว
ก็จะได้ข้อมูลมา 4 ชุดหรือ 4 byte คือ
A หลักที่ 1 และ B หลักที่ 1
A หลักที่ 2 และ B หลักที่ 2
นำข้อมูล A1 กับ A2 มา OR กันเป็น 1 byte
นำข้อมูล B1 กับ B2 มา OR กันเป็น 1 byte
การ scan ทำดังนี้
1.สั่ง Common 1-2 Off
2.เอาข้อมูลที่ได้จาก A1+A2 ส่งออกไปที่ port สั่ง Common 1 On
ค้างไว้ 5ms จากนั้น
3.สั่ง Common 1-2 Off
4.เอาข้อมูลที่ได้จาก B1+B2 ส่งออกไปที่ port สั่ง Common 2 On
ค้างไว้ 5ms กลับไปทำข้อ 1
จบแล้วครับ อาจไม่สมบูรณ์เท่าไร แต่คงพอเป็นแนวทางได้นะครับ
ประกอบไปด้วย Program Driver ตัวอย่าง และ Program นาฬิกา DS1307
และ Temp DS18B20 แก้ไขจาก Digital clock - Temp with 1.8 LED Display
Source Code
วันพฤหัสบดีที่ 17 มีนาคม พ.ศ. 2554
การสแกน Dot Matrix
ตัวอย่างใน วีโอ ใช้ col scan จะเห็นได้ว่าข้อมูล ในแต่ละ col
จะถูกส่งออกที่ละอัน โดยข้อมูลเป็นของ col segment ไหน
ก็ on col segment นั้น ถ้าเราหน่วงเวลาช้าๆ ก็จะเห้นเป็นแค่ไฟวิ่งแค่นั้น
แต่ถ้าลองเร็วๆซัก 5ms ก็จะเห็นเป็นตัวอักษรแล้ว...
วีโอเป็น HD นะครับขยายได้ถ้ามองไม่ชัด
;//****************************
;//* Source Code For AT89c2051
;//****************************
shift_dat bit p1.0
shift_clk bit p1.1
col_lat bit p1.2
row_lat bit p1.3
;data segment
dseg at 020h
col_dat: ds 1
row_dat: ds 1
dl_a: ds 1
dl_b: ds 1
dl_c: ds 1
;//***** macro operator *****//;
set_col macro ___col_dat
mov a,#___col_dat
cpl a
acall col_shift_dat
endm
set_row macro ___row_dat
mov a,#___row_dat
acall row_shift_dat
endm
clr_col macro
acall col_clear_dat
endm
delay_ms macro ___d_1
mov dl_b,#___d_1
acall delay
endm
delay_x macro
delay_ms (5)
endm
;code segment
;//***** ap code start *****//;
cseg at 0000h
ajmp initial
cseg at 0050h
initial: mov p1,#0ffh
mov p3,#0ffh
mov sp,#050h
;clear internal ram
mov r0,#07fh
clr a
mov @r0,a
djnz r0,$-1
;shift initial logic
clr shift_clk
clr col_lat
clr row_lat
;//***** main program *****//;
main: set_row (0ffh) ; set row data col-1
set_col (00000001b) ; set col-1 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (011h) ; set row data col-2
set_col (00000010b) ; set col-2 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (011h) ; set row data col-3
set_col (00000100b) ; set col-3 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (031h) ; set row data col-4
set_col (00001000b) ; set col-4 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (051h) ; set row data col-5
set_col (00010000b) ; set col-5 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (08eh) ; set row data col-6
set_col (00100000b) ; set col-6 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (0h) ; set row data col-7
set_col (01000000b) ; set col-7 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (0h) ; set row data col-8
set_col (10000000b) ; set col-8 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
ajmp main
;//***** delay ms min=1ms max=255ms *****//;
delay: mov dl_a,#230
delay1: nop
djnz dl_a,delay1
djnz dl_b,delay
ret
;//***** col shift data *****//;
col_shift_dat: mov b,#8
col_shift_dat1: rlc a
mov shift_dat,c
setb shift_clk
nop
clr shift_clk
djnz b,col_shift_dat1
setb col_lat
nop
clr col_lat
ret
;//***** row shift data *****//;
row_shift_dat: mov b,#8
row_shift_dat1: rlc a
mov shift_dat,c
setb shift_clk
nop
clr shift_clk
djnz b,row_shift_dat1
setb row_lat
nop
clr row_lat
ret
col_clear_dat: mov b,#8
col_clear_dat1: setb shift_dat
setb shift_clk
nop
clr shift_clk
djnz b,col_clear_dat1
setb col_lat
nop
clr col_lat
ret
end
ผมใช้การสแกนแบบ col ครับ มันประหยัด ram ดี
เริ่มแรกต้องทำความเข้าใจว่า row & col คืออะไร รู้แล้วไม่เป็นไร
เอาคนที่ไม่รู้ row คือ แถวในแนวนอน col คือ แถวในแนวตั้ง
การสแกนแบบ row คือ
1.ส่ง data col register ก็คือ ข้อมูลทาง row นั่นเอง
2.สั่ง row segment on
3.หน่วงเวลา ประมาณ 5 ms
4.เลื่อนข้อมุล data col register กลับไปทำ ข้อ 1
วนจนครบ 8 ครั้ง ก็เป็น 8 แถวพอดี
การสแกนแบบ col คือ
1.ส่ง data row register ก็คือ ข้อมูลทาง col นั่นเอง
2.สั่ง col segment on
3.หน่วงเวลา ประมาณ 5 ms
4.เลื่อนข้อมุล data row register กลับไปทำ ข้อ 1
วนจนครบ 8 ครั้ง ก็เป็น 8 แถวพอดี
จะถูกส่งออกที่ละอัน โดยข้อมูลเป็นของ col segment ไหน
ก็ on col segment นั้น ถ้าเราหน่วงเวลาช้าๆ ก็จะเห้นเป็นแค่ไฟวิ่งแค่นั้น
แต่ถ้าลองเร็วๆซัก 5ms ก็จะเห็นเป็นตัวอักษรแล้ว...
วีโอเป็น HD นะครับขยายได้ถ้ามองไม่ชัด
;//****************************
;//* Source Code For AT89c2051
;//****************************
shift_dat bit p1.0
shift_clk bit p1.1
col_lat bit p1.2
row_lat bit p1.3
;data segment
dseg at 020h
col_dat: ds 1
row_dat: ds 1
dl_a: ds 1
dl_b: ds 1
dl_c: ds 1
;//***** macro operator *****//;
set_col macro ___col_dat
mov a,#___col_dat
cpl a
acall col_shift_dat
endm
set_row macro ___row_dat
mov a,#___row_dat
acall row_shift_dat
endm
clr_col macro
acall col_clear_dat
endm
delay_ms macro ___d_1
mov dl_b,#___d_1
acall delay
endm
delay_x macro
delay_ms (5)
endm
;code segment
;//***** ap code start *****//;
cseg at 0000h
ajmp initial
cseg at 0050h
initial: mov p1,#0ffh
mov p3,#0ffh
mov sp,#050h
;clear internal ram
mov r0,#07fh
clr a
mov @r0,a
djnz r0,$-1
;shift initial logic
clr shift_clk
clr col_lat
clr row_lat
;//***** main program *****//;
main: set_row (0ffh) ; set row data col-1
set_col (00000001b) ; set col-1 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (011h) ; set row data col-2
set_col (00000010b) ; set col-2 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (011h) ; set row data col-3
set_col (00000100b) ; set col-3 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (031h) ; set row data col-4
set_col (00001000b) ; set col-4 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (051h) ; set row data col-5
set_col (00010000b) ; set col-5 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (08eh) ; set row data col-6
set_col (00100000b) ; set col-6 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (0h) ; set row data col-7
set_col (01000000b) ; set col-7 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
set_row (0h) ; set row data col-8
set_col (10000000b) ; set col-8 on
delay_x ; delay 200ms
clr_col ; clear col data reduct blur
ajmp main
;//***** delay ms min=1ms max=255ms *****//;
delay: mov dl_a,#230
delay1: nop
djnz dl_a,delay1
djnz dl_b,delay
ret
;//***** col shift data *****//;
col_shift_dat: mov b,#8
col_shift_dat1: rlc a
mov shift_dat,c
setb shift_clk
nop
clr shift_clk
djnz b,col_shift_dat1
setb col_lat
nop
clr col_lat
ret
;//***** row shift data *****//;
row_shift_dat: mov b,#8
row_shift_dat1: rlc a
mov shift_dat,c
setb shift_clk
nop
clr shift_clk
djnz b,row_shift_dat1
setb row_lat
nop
clr row_lat
ret
col_clear_dat: mov b,#8
col_clear_dat1: setb shift_dat
setb shift_clk
nop
clr shift_clk
djnz b,col_clear_dat1
setb col_lat
nop
clr col_lat
ret
end
ผมใช้การสแกนแบบ col ครับ มันประหยัด ram ดี
เริ่มแรกต้องทำความเข้าใจว่า row & col คืออะไร รู้แล้วไม่เป็นไร
เอาคนที่ไม่รู้ row คือ แถวในแนวนอน col คือ แถวในแนวตั้ง
การสแกนแบบ row คือ
1.ส่ง data col register ก็คือ ข้อมูลทาง row นั่นเอง
2.สั่ง row segment on
3.หน่วงเวลา ประมาณ 5 ms
4.เลื่อนข้อมุล data col register กลับไปทำ ข้อ 1
วนจนครบ 8 ครั้ง ก็เป็น 8 แถวพอดี
การสแกนแบบ col คือ
1.ส่ง data row register ก็คือ ข้อมูลทาง col นั่นเอง
2.สั่ง col segment on
3.หน่วงเวลา ประมาณ 5 ms
4.เลื่อนข้อมุล data row register กลับไปทำ ข้อ 1
วนจนครบ 8 ครั้ง ก็เป็น 8 แถวพอดี
วันพุธที่ 9 มีนาคม พ.ศ. 2554
LED Dot Matrix Display V2
LED Dot Matrix Display V2
มาแล้วครับ V2 แก้ bug นิดหน่อยอาจมีเหลือบ้าง ด้วย memory ที่จำกัด
ผมใช้วิธี col-scan ครับ row-scan มันเปลือง mem ความสว่างสู่สีกัน
source ตัวนี้มี macro ใหม่ 2-3 ตัว
เช่น wr_bf เป็นคำสั่งเขียนข้อมูลไปยัง buffer แล้วแต่จะระบุเช่น
ds_buf1-4 เป็นตำแหน่ง display buffer เขียนอะไรออกไปก็เห็นเลย.....
cg_buf1-4 เป็นตำแหน่ง char buffer ไว้เก็บอักษรที่ต้องการแสดง.....
ส่วน PUT_STR_L เป็นคำสั่งใช้ เปิดตาราง เอามาแสดงผลพร้อมกับเลื่อน
ไปทางซ้ายเรือยๆจนกว่าจะเจอ byte ปิด 00h
Source Code v2.0
มาแล้วครับ V2 แก้ bug นิดหน่อยอาจมีเหลือบ้าง ด้วย memory ที่จำกัด
ผมใช้วิธี col-scan ครับ row-scan มันเปลือง mem ความสว่างสู่สีกัน
source ตัวนี้มี macro ใหม่ 2-3 ตัว
เช่น wr_bf เป็นคำสั่งเขียนข้อมูลไปยัง buffer แล้วแต่จะระบุเช่น
ds_buf1-4 เป็นตำแหน่ง display buffer เขียนอะไรออกไปก็เห็นเลย.....
cg_buf1-4 เป็นตำแหน่ง char buffer ไว้เก็บอักษรที่ต้องการแสดง.....
ส่วน PUT_STR_L เป็นคำสั่งใช้ เปิดตาราง เอามาแสดงผลพร้อมกับเลื่อน
ไปทางซ้ายเรือยๆจนกว่าจะเจอ byte ปิด 00h
Source Code v2.0
สมัครสมาชิก:
บทความ (Atom)