ในโครงการนี้เราจะไปออกแบบนาฬิกาปลุกง่ายใช้ ATMEGA32 จับเวลา ไมโครคอนโทรลเลอร์ ATmega32A มีตัวจับเวลา 16 บิตและเราจะใช้ตัวจับเวลานั้นเพื่อนับวินาทีและพัฒนานาฬิกาดิจิตอล
นาฬิกาดิจิตอลทั้งหมดมีคริสตัลอยู่ภายในซึ่งเป็นหัวใจของนาฬิกา คริสตัลนี้ไม่เพียง แต่มีอยู่ในนาฬิกาเท่านั้น แต่ยังมีอยู่ในระบบเรียลไทม์ของคอมพิวเตอร์ทั้งหมด คริสตัลนี้สร้างพัลส์นาฬิกาซึ่งจำเป็นสำหรับการคำนวณเวลา แม้ว่าจะมีวิธีอื่นในการรับสัญญาณนาฬิกา แต่เพื่อความแม่นยำและความถี่ที่สูงขึ้นส่วนใหญ่ชอบนาฬิกาแบบคริสตัล เราจะเชื่อมต่อคริสตัลกับ ATMEGA32 เพื่อรับนาฬิกาที่แม่นยำ
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์:ไมโครคอนโทรลเลอร์ ATmega32, คริสตัล 11.0592MHz, 22pF Capacitor (2 ชิ้น), แหล่งจ่ายไฟ (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), ตัวเก็บประจุ 100uF (เชื่อมต่อกับแหล่งจ่ายไฟ), ปุ่ม (สี่ชิ้น), ตัวต้านทาน10KΩ (หกชิ้น), 100nF capacito r (สี่ชิ้น), สวิตช์สามพิน (2 ชิ้น), ทรานซิสเตอร์ 2N2222, Buzzer, ตัวต้านทาน200Ω
ซอฟต์แวร์: Atmel studio 6.1, progisp หรือ flash magic
แผนภาพวงจรและคำอธิบายการทำงาน
เพื่อการจับเวลาที่แม่นยำเราได้เชื่อมต่อคริสตัล 11.0592MHz สำหรับนาฬิกา ตอนนี้สำหรับการปิดใช้งานนาฬิกาภายในของ ATMEGA เราต้องเปลี่ยน LOW FUSE BITS โปรดจำไว้ว่าเราไม่ได้สัมผัสบิตฟิวส์สูงดังนั้นการสื่อสาร JTAG จะยังคงเปิดใช้งานอยู่
สำหรับการบอกให้ ATMEGA ปิดการใช้งานนาฬิกาภายในและทำงานกับภายนอกเราต้องตั้งค่า:
ใช้ไบต์ต่ำ = 0xFF หรือ 0b11111111
ในวงจร PORTB ของ ATMEGA32 เชื่อมต่อกับพอร์ตข้อมูล LCD ที่นี่อย่าลืมปิดการสื่อสาร JTAG ใน PORTC ของ ATMEGA โดยการเปลี่ยนไบต์ฟิวส์สูงหากต้องการใช้ PORTC เป็นพอร์ตการสื่อสารปกติ ใน LCD 16x2 จะมี 16 พินทั้งหมดหากมีแสงสีดำถ้าไม่มีไฟด้านหลังจะมี 14 พิน หนึ่งสามารถจ่ายไฟหรือปล่อยหมุดไฟด้านหลัง ตอนนี้ใน 14 พินมีพินข้อมูล 8 พิน (7-14 หรือ D0-D7), พินแหล่งจ่ายไฟ 2 พิน (1 & 2 หรือ VSS & VDD หรือ gnd & + 5v), พิน3 rdสำหรับควบคุมคอนทราสต์ (VEE- ควบคุมความหนาของตัวอักษร แสดง) และ 3 พินควบคุม (RS & RW & E)
ในวงจรคุณสามารถสังเกตได้ว่าฉันใช้หมุดควบคุมเพียงสองตัว สิ่งนี้ทำให้เกิดความยืดหยุ่นในการทำความเข้าใจที่ดีขึ้นไม่ได้ใช้บิตคอนทราสต์และ READ / WRITE บ่อยครั้งดังนั้นจึงสามารถย่อให้สั้นลงได้ ทำให้ LCD มีคอนทราสต์สูงสุดและโหมดอ่าน เราต้องควบคุมพิน ENABLE และ RS เพื่อส่งอักขระและข้อมูลตามนั้น
การเชื่อมต่อที่ทำกับ LCD มีดังต่อไปนี้:
PIN1 หรือ VSS ลงกราวด์
PIN2 หรือ VDD หรือ VCC ถึง + 5v
PIN3 หรือ VEE กับพื้น (ให้ความเปรียบต่างสูงสุดที่ดีที่สุดสำหรับผู้เริ่มต้น)
PIN4 หรือ RS (Register Selection) ถึง PD6 ของ uC
PIN5 หรือ RW (อ่าน / เขียน) ลงกราวด์ (ทำให้ LCD อยู่ในโหมดอ่านช่วยให้การสื่อสารสำหรับผู้ใช้ง่ายขึ้น)
PIN6 หรือ E (เปิดใช้งาน) ถึง PD5 ของ uC
PIN7 หรือ D0 ถึง PB0 ของ uC
PIN8 หรือ D1 ถึง PB1 ของ uC
PIN9 หรือ D2 ถึง PB2 ของ uC
PIN10 หรือ D3 ถึง PB3 ของ uC
PIN11 หรือ D4 ถึง PB4 ของ uC
PIN12 หรือ D5 ถึง PB5 ของ uC
PIN13 หรือ D6 ถึง PB6 ของ uC
PIN14 หรือ D7 ถึง PB7 ของ uC
ในวงจรคุณจะเห็นว่าเราใช้การสื่อสาร 8 บิต (D0-D7) แต่นี่ไม่ใช่ภาคบังคับเราสามารถใช้การสื่อสาร 4 บิต (D4-D7) ได้ แต่ด้วยโปรแกรมการสื่อสาร 4 บิตจะซับซ้อนเล็กน้อย ดังที่แสดงในตารางด้านบนเรากำลังเชื่อมต่อ 10 พินของ LCD เข้ากับคอนโทรลเลอร์ซึ่ง 8 พินเป็นพินข้อมูลและ 2 พินสำหรับควบคุม
สวิตช์หนึ่งใช้สำหรับเปิดใช้งานคุณสมบัติการปรับระหว่างการเตือนและเวลา หากขาอยู่ต่ำเราสามารถปรับเวลาปลุกได้โดยกดปุ่ม หากปุ่มสูงมีไว้สำหรับปรับเพียง TIME มีปุ่มสี่ปุ่มปรากฏอยู่ที่นี่อันดับแรกคือเพิ่มขึ้น MINUTES ในการปลุกหรือเวลา ประการที่สองคือ MINUTES ที่ลดลงในการปลุกหรือเวลา ประการที่สามคือการเพิ่มชั่วโมงในการปลุกหรือเวลา FOURTH เป็นชั่วโมงที่ลดลงตามเวลาปลุกหรือเวลา
ตัวเก็บประจุที่มีอยู่ที่นี่มีไว้สำหรับลบล้างเอฟเฟกต์การตีกลับของปุ่ม หากถูกถอดออกคอนโทรลเลอร์อาจนับมากกว่าหนึ่งครั้งในแต่ละครั้งที่กดปุ่ม ตัวต้านทานที่เชื่อมต่อกับพินมีไว้สำหรับ จำกัด กระแสเมื่อกดปุ่มเพื่อดึงพินลงมาที่พื้น
เมื่อใดก็ตามที่กดปุ่มพินของคอนโทรลเลอร์ที่เกี่ยวข้องจะถูกดึงลงมาที่พื้นดังนั้นคอนโทรลเลอร์จะรับรู้ว่ามีการกดปุ่มบางปุ่มและมีการดำเนินการที่เกี่ยวข้อง
ก่อนอื่นนาฬิกาที่เราเลือกคือ 11059200 Hz หารด้วย 1024 จะให้ 10800 ดังนั้นทุก ๆ วินาทีเราจะได้ 10800 พัลส์ ดังนั้นเราจะเริ่มตัวนับด้วย 1024 prescaler เพื่อให้ได้นาฬิกานับเป็น 10800 Hz อย่างที่สองเราจะใช้โหมด CTC (Clear Timer Counter) ของ ATMEGA จะมีการลงทะเบียน 16 บิตที่เราสามารถจัดเก็บค่า (เปรียบเทียบมูลค่า) เมื่อตัวนับนับถึงค่าเปรียบเทียบจะมีการตั้งค่าการขัดจังหวะเพื่อสร้าง
เราจะกำหนดค่าเปรียบเทียบเป็น 10800 ดังนั้นโดยพื้นฐานแล้วเราจะมี ISR (Interrupt Service Routine ในทุกการเปรียบเทียบ) ทุก ๆ วินาที ดังนั้นเราจะใช้กิจวัตรที่ทันเวลานี้เพื่อให้ได้นาฬิกาที่เราต้องการ
BROWN (WGM10-WGM13): บิตเหล่านี้ใช้สำหรับเลือกโหมดการทำงานสำหรับตัวจับเวลา
ตอนนี้เนื่องจากเราต้องการโหมด CTC ที่มีค่าเปรียบเทียบใน OCR1A ไบต์เราจึงต้องตั้งค่า WGM12 เป็นหนึ่งส่วนที่เหลือจะถูกปล่อยทิ้งไว้เนื่องจากเป็นศูนย์ตามค่าเริ่มต้น
สีแดง (CS10, CS11, CS12): บิตทั้งสามนี้ใช้สำหรับการเลือก prescalar และเพื่อให้ได้นาฬิกาเคาน์เตอร์ที่เหมาะสม
เนื่องจากเราต้องการ 1024 เป็น prescaling เราจึงต้องตั้งค่าทั้ง CS12 และ CS10
ตอนนี้มีทะเบียนอื่นที่เราควรพิจารณา:
สีเขียว (OCIE1A): บิตนี้ต้องตั้งค่าสำหรับการขัดจังหวะในการเปรียบเทียบการจับคู่ระหว่างค่าตัวนับและค่า OCR1A (10800) ที่เราตั้งไว้
ค่า OCR1A (ค่าเปรียบเทียบตัวนับ) เขียนไว้ในทะเบียนด้านบน
คำอธิบายการเขียนโปรแกรม
อธิบายการทำงานของนาฬิกาปลุกทีละขั้นตอนในรหัสด้านล่าง:
#include // header เพื่อเปิดใช้งานการควบคุมการไหลของข้อมูลบนพิน #define F_CPU 1000000 // บอกความถี่คริสตัลคอนโทรลเลอร์ที่แนบมา #include