ZDS2430A.TXT - โปรแกรมทำ Ram Backup เสมือนโดยใช้ EEprom DS2430A (เมษายน 2548 โดย เกรียงศักดิ์ บุญเสริมสุวงศ์) DS2430A คือ EEprom ขนาดเล็ก 32 Byte รูปร่างแบบ T0-92 จำนวน 3 ขา สื่อสารกับ MCU ใน แบบ 1-Wire Protocal คือใช้เพียงบิทเดียวในการอ่านและเขียนข้อมูล ทำให้ประหยัดทั้งพื้นที่และ ขา I/O ที่ใช้ ไม่ต้องใช้ไฟเลี้ยงใด ๆ ในการ Backup เหมาะสำหรับการเก็บข้อมูลจำนวนไม่มากนัก อย่างไรก็ตาม EEprom จะมีข้อจำกัดของจำนวนครั้งในการ Write ตาม Spec คือเขียนได้ 100,000 ครั้งเป็นอย่างน้อย (แต่เคยทดลองจริงได้ถึง 3,000,000 ครั้งโน้น เป็นงงเหมือนกันครับ) ซึ่งแตกต่างจาก Ram ที่ไม่มีข้อจำกัดในเรื่องนี้ เพราะฉะนั้น ถ้าใช้ DS2430A สำหรับการเก็บข้อมูลที่ต้องมีการเปลี่ยน แปลงอยู่เสมอ ก็อาจจะพบกับข้อจำกัดอันนี้ได้ เพื่อแก้ปัญหานี้ โปรแกรมตัวอย่างนี้จะผสมผสาน 2 เรื่องเข้าด้วยกัน คือ การอ่านและเขียนข้อมูลกับ DS2430A และการทำระบบ Ram Backup เสมือน โดยใช้หลักการคือ เมื่อเปิดเครื่อง (Power Up) โปรแกรมจะอ่านข้อมูลจาก DS2430A มาเก็บไว้ใน Internal-Ram ของตัว MCU และเมื่อปิดเครื่อง (Power down) โปรแกรมจะรับสัญญาน Interrupt ก่อนล่วงหน้าเล็กน้อย จากตัวชิพ DS1233D และจะนำข้อมูลจาก Internal-Ram มาเขียนกลับลงไปใน DS2430A ... ด้วยหลักการนี้ ผู้ใช้งาน จะเสมือนว่ามองเห็นส่วนหนึ่งของ Internal-Ram (32 Byte) ของตัว MCU เป็น Ram Backup ที่เก็บข้อมูลได้เสมอ แม้ว่าไม่ได้จ่ายไฟเลี้ยง เป็นการแก้ไขข้อจำกัดเรื่องจำนวนครั้งในการ Write เพราะหลักการนี้จะมีการ Write เฉพาะเมื่อปิดไฟเลี้ยงเท่านั้น เมื่อคำนวนโดยสมมุติว่ามีการเปิดปิด ไฟเลี้ยง 20 ครั้งต่อวัน ก็ยังมีอายุการใช้งานได้ถึง 13 ปีทีเดียว วงจรทดลองของโปรแกรมนี้ต่อบนบอร์ด SLAB-51 โดยชิพ DS2430A มีอยู่ 2 ขาเท่านั้น คือ DATA ต่อกับขา I/O P1.1 และขา GND ต่อกับ GND ของบอร์ด ส่วนชิพ DS1233D ปกติคือ ชิพวงจร /Reset (Active Low) จะนำมาประยุกต์เป็นตัวจับระดับไฟเลี้ยง โดยจะใช้ไฟก่อนเข้า Regulator 7805 โดยมี R 1K 2 ตัวต่ออนุกรมเป็น Divider แล้วนำจุดกลางมาต่อกับขา VCC ส่วนขา GND ก็ต่อเข้ากับ GND ของบอร์ด และขา /RESET ต่อเข้ากับขา I/O INT0 (P3.2) โดยขานี้จะเป็น Low ก็ต่อเมื่อไฟเลี้ยงก่อนเข้า 7805 เท่ากับหรือต่ำกว่า 9.5 Volt ซึ่งในที่นี้ถือ ว่าเป็นช่วงขณะไฟกำลังปิด ... นอกจากวงจรเหล่านี้แล้ว โปรแกรมนี้ยังอาศัย LED ที่ขา P1.0 เป็นตัวแสดงการทำงานของโปรแกรมช่วง Power down ด้วย โปรแกรมจะเริ่มต้นด้วยการกำหนดคุณสมบัติต่าง ๆ ของ RS232 เพื่อแสดงผลการทำงาน (บนจอของ เครื่อง PC) และกำหนดคุณสมบัติการ Interrupt ของ INT0 ให้เป็น Enable และทำงานที่ขอบขาลง จากนั้นจะอ่านข้อมูลจาก DS2430A มาไว้ที่ตัวแปร MEMBUF[32] ซึ่งกำหนดให้ 2 Byte แรกเป็น Counter นับจำนวนครั้งการเปิดปิด และที่เหลือเป็นส่วนเก็บข้อมูล โดยนำ Byte ต่ำ (LSB) ของค่า Counter มาเป็นตัวเริ่มต้นข้อมูล และบวกค่าไปเรื่อย ๆ จนครบ โปรแกรมจะแสดงค่า Counter และข้อมูลที่เหลือ แล้วตรวจสอบว่า OK หรือ Error จากนั้นก็จะเพิ่มค่า Counter และข้อมูลที่อยู่ใน ตัวแปร MEMBUF[32] ... ถ้ามีการกดปุ่ม INT1 บนบอร์ด ก็จะถือเป็นการ Clear ค่า Counter ให้ เริ่มต้นใหม่ ... เมื่อปิดไฟเลี้ยง โปรแกรมจะถูก Interrupt ให้มาทำงานใน powerdown function ซึ่งก็ทำการ write ข้อมูลจาก MEMBUF[32] ไปที่ DS2430A พร้อมทั้งกระพริบ LED ที่ P1.0 เพื่อแสดงให้รับทราบด้วย ในที่นี้จะให้คำอธิบายพอสังเขปสำหรับ Function ต่าง ๆ ในโปรแกรมดังนี้ ... dmsec ... หน่วงเวลาระดับ msec tmreset ... ส่งสัญญาน Reset ไปยัง DS2430A tmpre ... รอสัญญาน Presence จาก DS2430A tmrbit ... อ่านข้อมูล 1 บิทจาก DS2430A tmrbyte ... อ่านข้อมูล 1 ไบต์จาก DS2430A tmwbyte ... เขียนข้อมูล 1 ไบต์ไปยัง DS2430A tmrrom ... อ่านค่า Rom ID จาก DS2430A (function นี้ไม่ได้ใช้ในโปรแกรมนี้) tmreep ... อ่านข้อมูลทั้ง 32 ไบต์จาก DS2430A tmweep ... เขียนข้อมูลทั้ง 32 ไบต์ไปยัง DS2430A start ... กำหนดคุณสมบัติเริ่มต้นของ RS232 และการทำ Interrupt powerdown ... ทำงานด้วย interrupt จาก INT0 (รายละเอียดของ 1-Wire Protocal ขอให้อ่านได้จาก Data Sheet ของ DS2430A อีกที) ข้อควรระวังของ Ram Backup แบบเสมือนนี้ คือวงจรภาคจ่ายไฟจะต้องมีเสถียรภาพดี และมี C ค่ามากพอที่จะเลี้ยงการทำงานได้ชั่วขณะหนึ่ง หลังจากไฟเลี้ยงดับไปแล้ว จากการทดลองบนบอร์ด SLAB-51 จะมีช่วงเวลาทำงานหลังจากไฟเลี้ยงดับได้ประมาณ 100 msec (1/10 วินาที) ซึ่งถือว่า นานพอสำหรับงานแบบนี้ และต้องแน่ใจด้วยว่า การปิดไฟเลี้ยงเป็นการตัดไป AC ก่อนเข้า Adapter เสมอ เพราะถ้าไปตัดไฟ DC ก่อนเข้า 7805 เลย ก็จะทำให้มีเวลาไม่พอ และส่งผลให้โปรแกรมทำงาน ไม่สมบูรณ์ ... และการทำ Ram Backup แบบเสมือนนี้ จะต้องคำนึงเสมอว่า การกด Reset กับการ เปิดปิดไฟเลี้ยง จะให้ผลการทำงานไม่เหมือนกัน เพราะการกด Reset จะทำให้ไม่พบการทำงานของ วงจร Power down เลย โปรแกรมนี้ทดลองจริงแล้ว ... Work ดีมากเลย นำไปประยุกต์กันได้ตามสะดวก ขา I/O เพียง 2 ขา กับ DS2430A และ DS1233D กับวงจร R เล็กน้อย ... ก็ได้ Ram Backup เสมือนขนาด 32 ไบต์ แล้ว คุ้มยิ่งกว่าคุ้ม คุ้มจริง ๆ