การใช้ DS1307 RTC (Real Time Clock) : MIND-TEK.NET

homenewsarticleproductwebboardpaymentdeliverydownloadcontact
 
 

การใช้งาน RTC (Real Time Clock) ด้วย DS1307

ระบบฐานเวลา เป็นสิ่งสำคัญที่สามารถนำไปใช้ในอุปกรณ์อีเล็กโทรนิกส์ได้หลากหลาย ภายในไมโครคอนโทรเลอร์เองก็มีไทเมอร์เพื่อใช้ในการจับเวลา หรือนำไปใช้เป็นฐานเวลาจริงได้เช่นกัน แต่เนื่องจากไมโครคอนโทรเลอร์สามารถทำงานได้ต่อเมื่อมีไฟเลี้ยงเท่านั้น ดังนั้นการใช้ไทเมอร์ของไมโครคอนโทรลเลอร์ สร้างฐานเวลาจริงจึงไม่ เหมาะสมในบางแอปพลิเคชัน

DS1307 เป็น IC ฐานเวลาของดัลลัสเซมิคอนดักเตอร์ (Dallas Semiconductor) มีบัสรับส่งข้อมูลแบบ I2C ซึ่งเป็นแบบ 2 wire สามารถสื่อสารได้ 2 ทิศทาง (bi-direction bus) ฐานเวลาของ DS1307 นั้นสามารถเก็บข้อมูล วินาที, นาที, ชั่วโมง, วัน, วันที่, เดือน และปี ได้ ระบบเวลาสามารถทำงานโหมดรูปแบบ 24 ชั่วโมง หรือ 12 ชั่วโมง AM/PM ก็ได้ ภายมีระบบตรวจจับแหล่งจ่ายไฟ โดยถ้าแหล่งจ่ายไฟหลักถูกตัดไป DS1307 สามารถสวิตซ์ไปใช้ไฟจากแบตเตอรี่ และทำงานต่อไป โดยที่ยังสามารถรักษาข้อมูลไว้ได้ โครงสร้างมีขาทั้งหมด 8 ขาดังแสดงในรูปที่ 1 และมีรายละเอียดการทำงานของขาต่าง ๆ ดังนี้

ไอซี ds1307

รูปที่ 1 ตำแหน่งขาไอซี RTC DS1307

VCC: ใช้ต่อไฟเลี้ยง +5V
GND: ใช้ต่อกราวด์                                                                  
VBAT: ใช้ต่อกับแบตเตอรี่ 3V เพื่อรักษาการทำงาน ในกรณีที่ไม่มีไฟเลี้ยงจ่าย
SDA:  ขารับส่งข้อมูลด้วยระบบบัส I2C
SCL: ขาสัญญาณนาฬิกาสำหรับการรับส่งข้อมูลด้วยระบบบัส I2C
SQW/OUT: ขาเอาต์พุตสัญญาณ Square Wave สามารถเลือกความถี่ได้
X1, X2: ใช้ต่อกับคริสตอลความถี่มาตรฐาน 32.768 kHz เพื่อสร้างฐานเวลาจริงให้กับ IC

ระบบบัสข้อมูลแบบ I2C (Inter-IC Communication) ได้ถูกพัฒนาขึ้นโดยบริษัทฟิลิปส์ (Phillips) การรับส่งข้อมูลใช้สายสัญญาณเพียงแค่ 2 เส้น คือสายสัญญาณข้อมูล SDA (Serial Data line) และสายสัญญาณนาฬิกา SCL (Serial Clock line) มีการทำงานเป็นแบบ Master, Slave โดยอุปกรณ์ที่ทำหน้าที่เป็น Master (ไมโครคอนโทรลเลอร์) จะควบคุมการรับส่งข้อมูล และควบคุมสัญญาณนาฬิกาบน SCL ส่วนอุปกรณ์ Slave (DS1307) นั้นจะทำงานภายใต้การควบคุมของอุปกรณ์ Master

การต่อใช้งานร่วมกับไมโครคอนโทรลเลอร์ด้วยระบบบัส I2C นั้นสามารถทำได้โดยต่อตัวต้านทาน Pull up ดังแสดงในรูปที่ 2 ในกรณีที่ต้องการต่อร่วมกับอุปกรณ์ Slave หลายตัว ก็สามารถทำได้โดยต่ออุปกรณ์ Slaveขนานกันไป การติดต่อสื่อสารระหว่างอุปกรณ์ Master กับ Slave แต่ละตัวนั้น จะถูกแยกโดย Address ของอุปกรณ์ Slave ซึ่งจะถูกส่งจากอุปกรณ์ Master ไปยังอุปกรณ์ Slave ก่อนเริ่มการรับส่งข้อมูล

วงจร ds1307

รูปที่ 2 การเชื่อมต่อ DS1307 เข้ากับไมโครคอนโทรลเลอร์ด้วยระบบบัสแบบ I2C

การรับส่งข้อมูลแบบ I2C นั้นมีข้อกำหนดอยู่ 2 ประการด้วยกันคือ

  1. การรับส่งข้อมูลจะเริ่มขึ้นได้เมื่อบัสมีสถานะว่างเท่านั้น
  2. ในช่วงที่ทำการรับส่งข้อมูลอยู่ สายสัญญาณ SDA ต้องไม่เปลี่ยนสถานะในช่วงที่ SCL มีสถานะเป็นลอจิก “1”  ถ้า SDA มีการเปลี่ยนสถานะในช่วงที่ SCL เป็นลอจิก “1” จะถือว่าเป็นสัญญาณควบคุมการรับส่งข้อมูล

สถานะของการรับส่งข้อมูลแบบ I2C สามารถแบ่งออกได้เป็น 5 สถานะด้วยกันดังแสดงในรูปที่ 3 และมีรายละเอียดดังนี้

  1. สถานะว่าง (Bus not busy): สัญญาณ SDA และ SCL มีระดับสัญญาณเป็น High
  2. เริ่มส่งข้อมูล (Start data transfer): มีการเปลี่ยนระดับสัญญาณของ SDA จาก High เป็น Low ในขณะที่ SCL มีระดับสัญญาณเป็น High ค้างไว้
  3. หยุดส่งข้อมูล (Stop data transfer): มีการเปลี่ยนระดับสัญญาณของ SDA จาก Low เป็น High ในขณะที่ SCL มีระดับสัญญาณเป็น High ค้างไว้
  4. รับส่งข้อมูล (Data valid): มีการรับส่งข้อมูลผ่านสายสัญญาณ SDA โดยข้อมูลแต่ละบิตจะถูกส่งในช่วงที่ SCL มีระดับเป็น High โดยในช่วงที่ SCL มีสถานะเป็น High อยู่นั้น SDA จะต้องไม่เกิดการเปลี่ยนระดับสัญญาณ

SDA จะเปลี่ยนระดับของสัญญาณ ในช่วงที่ SCL มีระดับสัญญาณเป็น Low เท่านั้น ตามมาตรฐานการส่งข้อมูล แบบ I2C นี้สามารถส่งข้อมูลด้วยความถี่สัญญาณนาฬิกาสูงสุด 100 kHz ที่โหมดการทำงานธรรมดา และ 400 kHz ที่โหมดการทำงานแบบเร็ว แต่สำหรับ DS1307 สามารถทำงานได้ในโหมดธรรมดาเท่านั้น

ตอบรับ (Acknowledge): เกิดขึ้นหลังจากที่มีการรับส่งข้อมูลครบแล้ว โดยอุปกรณ์ Master ต้องสร้างสัญญาณ Clock บน SCL เพิ่มอีกลูก อุปกรณ์ที่เป็นตัวรับข้อมูลจะดึงระดับสัญญาณบน SDA ให้เป็น Low เพื่อให้ตัวส่งรับรู้ว่าตัวรับได้รับข้อมูลครบแล้ว

บัส i2c

รูปที่ 3 การรับส่งข้อมูลผ่านบัส I2C

ในการรับส่งข้อมูลผ่านบัส I2C อุปกรณ์ Master จะเป็นผู้สร้างสัญญาณ Clock บน SDA และเป็นตัวควบคุมสถานะ Start และ Stop เพื่อควบคุมการรับส่งข้อมูลทั้งหมด

การส่งข้อมูลไปยังอุปกรณ์ DS1307 ดังแสดงในรูปที่ 4 ไมโครคอนโทรลเลอร์ต้องสร้างสภาวะ Start ก่อน จากนั้นต้องส่ง Address ของDS1307 ขนาด 7 บิตซึ่งมีค่าเป็น 1101000 และตามด้วยบิตระบุทิศทางของข้อมูล ในกรณีที่เป็นการเขียนข้อมูลลง DS1307 จะต้องเป็น “0” จากนั้นไมโครคอนโทรเลอร์จะต้องส่งตำแหน่ง Address ภายในรีจิสเตอร์ของ DS1307 ที่ต้องการเขียนข้อมูลลง แล้วจึงค่อยเขียนข้อมูลลง โดยในการส่งข้อมูลแต่ละไบต์จะต้องรอบิต Ack จาก DS1307 ทุกไบต์ เมื่อส่งจนครบแล้ว ถึงจะสร้างสภาวะ Stop เพื่อกลับสู่สถานะว่าง

การเขียน i2c

รูปที่ 4 การเขียนข้อมูลอุปกรณ์ Slave ผ่านบัส I2C

การรับข้อมูลจากอุปกรณ์ Slave ดังแสดงในรูปที่ 5 เริ่มแรกไมโครคอนโทรลเลอร์ต้องสร้างสภาวะ Start ก่อน จากนั้นต้องส่ง Address ของ DS1307 ขนาด 7 บิตซึ่งมีค่าเป็น 1101000 และตามด้วยบิตระทิศทางของข้อมูล ในกรณีที่เป็นการอ่านข้อมูลจาก DS1307 จะต้องเป็น “1” จากนั้นจึงค่อยรับข้อมูลจากอุปกรณ์ Slave ทีละไบต์ โดยตำแหน่งที่อ่านเข้ามาจะขึ้นอยู่กับตำแหน่งรีจิสเตอร์พอยท์เตอร์ ซึ่งจะเป็นตำแหน่งท้ายสุดที่ได้ทำการเขียนข้อมูลไว้ เมื่ออ่านข้อมูลครบแต่ละไบต์อุปกรณ์ Master ต้องส่ง Acknowledge บิตกลับไปให้อุปกรณ์ Slave ด้วย ในกรณีที่เป็นไบต์สุดท้าย อุปกรณ์ Master ต้องส่ง “not acknowledge” กลับไป

การอ่าน i2c

รูปที่ 5 การอ่านข้อมูลจากอุปกรณ์ Slave ผ่านบัส I2C

ภายใน DS1307 มีรีจิสเตอร์ภายในใช้เก็บข้อมูลเวลาขนาด 7 ไบต์ 00H-06H ดังแสดงในรูปที่ ข้อมูลค่าเวลา และวันที่จะถูกเก็บอยู่ในรูปของเลขฐาน 10 สามารถเลือกได้ว่าให้ทำงานแบบ 12 ชั่วโมง หรือ 24 ชั่วโมง โดยกำหนดที่บิตที่ 6 ที่แอดเดรส 02H โดยถ้าเป็น “1” จะเป็นการทำงานในโหมด 12 ชั่วโมง และเมื่อเลือกแบบ 12 ชั่วโมง ที่บิต 5 ในแอดเดรส 02H นั้นจะใช้แสดงค่า AM/PM โดยถ้าบิตนี้เป็น “1” จะเป็น PM ในกรณีที่แสดงแบบ 24 ชั่วโมง บิตนี้จะใช้ในการแสดงค่าของหลักสิบในของหน่วยชั่วโมงด้วย  

รีจิสเตอร์ DS1307

รูปที่ 6 รีจิสเตอร์ภายในไอซีฐานเวลา DS1307

ที่แอดเดรส 07H เป็นรีจิสเตอร์ควบคุมการทำงานของ SQW/OUT โดยมีรายละเอียดดังนี้
OUT (Out control): ใช้ควบคุมเอาต์พุต
SQWE (Square Wave Enable): ใช้ควบคุมออสซิลเลเตอร์ภายใน DS1307 โดยถ้าบิตนี้เป็น “1” จะเป็นการเปิดออสซิลเลเตอร์
RS (Rate Select): ใช้ควบคุมความถี่ของ Square Wave เมื่อเปิดการทำงานของออสซิเลเตอร์ โดยสามารถปรับเปลี่ยนความถี่ได้ 4 ความถี่ด้วยกันดังแสดงในตารางที่ 1

ตารางที่ 1 การควบคุมความถี่ออสซิลเลเตอร์ด้วยการเซตบิต RS1, RS0

RS1

RS0

SQW OUTPUT FREQUENCY

0

0

1 Hz

0

1

4.096 kHz

1

0

8.192 kHz

1

1

32.768 kHz

ในการทดลองได้ต่อ DS1307 กับไมโครคอนโทรลเลอร์ P89V51RD2 โดยใช้พอร์ต P2.5 และ P2.6 ของไมโครคอนโทรเลอร์เป็นบัส I2C ต่อกับ SCL และ SDA ของ DS1307 ดังแสดงในรูปที่ 7 ส่วนขาสัญญาณ SQW/OUT นั้นไม่ได้ใช้สร้างสัญญาณให้ไมโครคอนโทรลเลอร์ แต่ใช้การวนลูปคอยตรวจสอบค่าภายในรีจิสเตอร์ของ DS1307 แทน

 ในการควบคุมการทำงานของโปรแกรม และแสดงผล ได้ใช้โปรแกรม HyperTerminal เป็นโปรแกรมติดต่อผ่านพอร์ตอนุกรมด้วยอัตราข้อมูล 9600 bps ดังแสดงในรูปที่ 7

วงจร ds1307

รูปที่ 7 วงจรใช้งาน DS1307 ที่ใช้ในการทดลอง

ในส่วนโปรแกรมที่ใช้ในการทดสอบ ได้เขียนให้ไมโครคอนโทรลเลอร์คอยตรวจสอบพอร์ตอนุกรม และรีจิสเตอร์ภายใน DS1307 ในกรณีที่มีข้อมูล “r” เข้ามาทางพอร์ตอนุกรมไมโครคอนโทรลเลอร์จะเขียนข้อมูลเวลา, วันที่, เดือน และปี ที่เก็บอยู่ใน Flash memory ลงในรีจิสเตอร์ของ DS1307 รวมทั้งตั้งให้ DS1307 ทำงานในโหมด 24 ชั่วโมง ส่วนในกรณีที่มีข้อมูล “s” เข้ามาทางพอร์ตอนุกรม ไมโครคอนโทรลเลอร์จะแสดงข้อมูลเวลา, วันที่, เดือน และปี ออกมาทางพอร์ตอนุกรมดังแสดงในรูปที่ 8

ไมโครคอนโทรลเลอร์จะคอยวนตรวจสอบรีจิสเตอร์ภายใน DS1307 ที่ตำแหน่ง 01H ซึ่งใช้เก็บค่าเวลาหน่วยนาที เมื่อค่าภายในรีจิสเตอร์นี้เปลี่ยนไป ไมโครคอนโทรลเลอร์จะอ่านข้อมูลเวลา ชั่วโมง และนาที ภายในรีจิสเตอร์ของ DS1307 ขณะนั้นออกมา และส่งข้อมูลนั้นออกมาแสดงผลทางพอร์ตอนุกรมดังแสดงในรูปที่ 8

ไฮเปอร์เทอร์มินอล ds1307

รูปที่ 8 การทดสอบการใช้งาน DS1307 ผ่านบัส I2C

ไฟล์โค๊ดภาษา C สามารถดาวน์โหลดได้ที่ http://www.mind-tek.net/c/DS1307.c หรือดาวน์โหลดไฟล์ hex ไปทดสอบกันได้ที่ http://www.mind-tek.net/hex/DS1307.hex นะครับ ท้ายสุดนี้ หวังว่าผู้อ่านจะได้รับความรู้ ไม่มากก็น้อย และสามารถนำไปประยุกต์ใช้กับงานต่าง ๆ ได้นะครับ
 
 

73/206 Ratchathanee Paholyothin Rd. Klonghnung Klonghloung Pathumthanee 12120 Tel: 66-02516-5999 Fax:66-02516-8484 Email:webmaster@mind-tek.net