- การตั้งค่าฮาร์ดแวร์และข้อกำหนด
- แผนภาพวงจรสำหรับการเชื่อมต่อ LED กับ Nuvoton N76E003
- หมุดจับเวลาบน Nuvoton N76E003
- Timer Registers ใน Nuvoton N76E003
- ประเภทของเวลาใน Nuvoton N76E003
- การเขียนโปรแกรมไมโครคอนโทรลเลอร์ Nuvoton N76E003 สำหรับตัวจับเวลา
- รหัสการกระพริบและการตรวจสอบเอาต์พุตสำหรับการทำงานของตัวจับเวลา
ในบทแนะนำเกี่ยวกับไมโครคอนโทรลเลอร์ Nuvoton ก่อนหน้านี้เราใช้โปรแกรมไฟ LED กะพริบพื้นฐานเป็นแนวทางในการเริ่มต้นใช้งานและยังเชื่อมต่อ GPIO เป็นอินพุตเพื่อเชื่อมต่อสวิตช์สัมผัส ด้วยบทช่วยสอนดังกล่าวเราตระหนักดีถึงวิธีกำหนดค่าโครงการ Keil และตั้งค่าสภาพแวดล้อมสำหรับการเขียนโปรแกรมไมโครคอนโทรลเลอร์ N76E003 Nuvoton มันเป็นเวลาที่จะใช้อุปกรณ์ต่อพ่วงภายในของหน่วยไมโครคอนโทรลเลอร์และย้ายไปนิด ๆ หน่อย ๆ ต่อไปโดยใช้นาฬิกาจับเวลา inbuilt ของ N76E003
ในบทช่วยสอนก่อนหน้านี้เราใช้เพียงการหน่วงเวลาของซอฟต์แวร์เพื่อกะพริบ LED ดังนั้นในบทช่วยสอนนี้เราจะเรียนรู้วิธีใช้ฟังก์ชันหน่วงเวลาของตัวจับเวลารวมถึง ISR ของตัวตั้งเวลา (Interrupt Service Routine) และกะพริบ LED สองดวง นอกจากนี้คุณยังสามารถดูบทช่วยสอน Arduino Timer และบทช่วยสอน PIC Timer เพื่อตรวจสอบวิธีใช้ตัวจับเวลากับไมโครคอนโทรลเลอร์อื่น ๆ โดยไม่ต้องเสียเวลามากมาประเมินว่าเราต้องการการตั้งค่าฮาร์ดแวร์ประเภทใด
การตั้งค่าฮาร์ดแวร์และข้อกำหนด
เนื่องจากข้อกำหนดของโครงการนี้คือการเรียนรู้Timer ISR และฟังก์ชั่นการหน่วงเวลาเราจะใช้ LED สองดวงซึ่งจะกะพริบโดยใช้การหน่วงเวลาของตัวจับเวลาในลูปขณะและอีกอันจะกะพริบภายในฟังก์ชัน ISR
เนื่องจาก LED มีอยู่ในบอร์ดพัฒนา N76E003 โครงการนี้จึงต้องใช้ LED เพิ่มเติมหนึ่งดวงและตัวต้านทาน จำกัด กระแสไฟฟ้าเพื่อ จำกัด กระแสไฟ LED ส่วนประกอบที่เราต้องการ -
- LED สีใดก็ได้
- ตัวต้านทาน 100R
ไม่ต้องพูดถึงนอกเหนือจากองค์ประกอบข้างต้นเราต้องN76E003 ไมโครคอนโทรลเลอร์คณะกรรมการพัฒนาการตามเช่นเดียวกับNu-Link โปรแกรมเมอร์ นอกจากนี้ยังต้องใช้เขียงหั่นขนมและสายเชื่อมต่อเพื่อเชื่อมต่อส่วนประกอบทั้งหมด
แผนภาพวงจรสำหรับการเชื่อมต่อ LED กับ Nuvoton N76E003
ดังที่เราเห็นในแผนผังด้านล่าง LED ทดสอบมีอยู่ในบอร์ดพัฒนาและเชื่อมต่อกับพอร์ต 1.4 LED เพิ่มเติมเชื่อมต่อกับพอร์ต 1.5 ตัวต้านทาน R3 ใช้เพื่อ จำกัด กระแสไฟ LED ทางด้านซ้ายสุดจะแสดงการเชื่อมต่ออินเทอร์เฟซการเขียนโปรแกรม
หมุดจับเวลาบน Nuvoton N76E003
แผนภาพขา N76E003สามารถเห็นได้ในด้านล่างอิมเมจเฉพาะบล็อก
อย่างที่เราเห็นแต่ละพินมีคุณสมบัติที่แตกต่างกันและแต่ละพินสามารถใช้เพื่อวัตถุประสงค์ต่างๆได้ อย่างไรก็ตามพิน 1.5 ซึ่งใช้เป็นขาเอาต์พุต LED มันจะสูญเสีย PWM และฟังก์ชันอื่น ๆ แต่นั่นไม่ใช่ปัญหาเนื่องจากไม่จำเป็นต้องใช้ฟังก์ชันอื่นสำหรับโครงการนี้
เหตุผลเบื้องหลังการเลือกพิน 1.5 เป็นเอาต์พุตและพิน 1.6 เป็นอินพุตเนื่องจากพิน GND และ VDD ใกล้เคียงที่สุดสำหรับการเชื่อมต่อที่ง่าย อย่างไรก็ตามในไมโครคอนโทรลเลอร์จาก 20 พินนี้สามารถใช้ 18 พินเป็นพิน GPIO และพิน GPIO อื่น ๆ สามารถใช้สำหรับเอาต์พุตและอินพุทที่เกี่ยวข้องกับการป้อนข้อมูลยกเว้นพิน 2.0 ซึ่งใช้เฉพาะสำหรับรีเซ็ตอินพุตและไม่สามารถใช้เป็น เอาท์พุท สามารถกำหนดค่าพิน GPIO ทั้งหมดได้ในโหมดที่อธิบายไว้ด้านล่าง
ตามแผ่นข้อมูลpxM1.n และ pxM2.nเป็นรีจิสเตอร์สองตัวที่ใช้เพื่อกำหนดการควบคุมการทำงานของพอร์ต I / O เนื่องจากเราใช้ LED และเราต้องการพินเป็นพินเอาต์พุตทั่วไปดังนั้นเราจึงใช้โหมดกึ่งสองทิศทางสำหรับพิน
Timer Registers ใน Nuvoton N76E003
ตัวจับเวลาเป็นสิ่งสำคัญสำหรับหน่วยไมโครคอนโทรลเลอร์ใด ๆ ไมโครคอนโทรลเลอร์มาพร้อมกับอุปกรณ์ต่อพ่วงตัวจับเวลาในตัว N76E003 Nuvoton ยังมาพร้อมกับอุปกรณ์ต่อพ่วงจับเวลา 16 บิต อย่างไรก็ตามตัวจับเวลาแต่ละตัวถูกใช้เพื่อวัตถุประสงค์ที่แตกต่างกันและก่อนที่จะใช้อินเทอร์เฟซตัวจับเวลาสิ่งสำคัญคือต้องรู้เกี่ยวกับตัวจับเวลา
ประเภทของเวลาใน Nuvoton N76E003
ตัวจับเวลา 0 และ 1:
ตัวจับเวลาสองตัวนี้ timer0 และ timer1 เหมือนกันกับตัวจับเวลา 8051 ตัวจับเวลาทั้งสองนี้สามารถใช้เป็นตัวจับเวลาทั่วไปหรือเป็นตัวนับ ตัวจับเวลาทั้งสองนี้ทำงานในสี่โหมด ในโหมด 0ตัวจับเวลาเหล่านั้นจะทำงานในโหมดจับเวลา / ตัวนับ 13 บิต ในโหมด 1บิตความละเอียดของตัวจับเวลาทั้งสองจะเป็น 16 บิต ในโหมด 2ตัวจับเวลาจะถูกกำหนดค่าเป็นโหมดโหลดซ้ำอัตโนมัติด้วยความละเอียด 8 บิต ในโหมด 3ตัวจับเวลา 1 จะหยุดลงและตัวจับเวลา 0 สามารถใช้เป็นตัวนับและตัวจับเวลาได้ในเวลาเดียวกัน
ในสี่โหมดนี้โหมด 1 จะใช้ในกรณีส่วนใหญ่ ตัวจับเวลาทั้งสองนี้สามารถใช้ Fsys (ความถี่ของระบบ) ในโหมดคงที่หรือกำหนดไว้ล่วงหน้า (Fys / 12) นอกจากนี้ยังสามารถตอกบัตรจากแหล่งนาฬิกาภายนอก
จับเวลา 2:
Timer 2 ยังเป็นตัวจับเวลา 16 บิตที่ส่วนใหญ่ใช้สำหรับการจับรูปคลื่น นอกจากนี้ยังใช้นาฬิการะบบและสามารถใช้ในแอพพลิเคชั่นต่าง ๆ ได้โดยแบ่งความถี่สัญญาณนาฬิกาโดยใช้เครื่องชั่งต่างๆ นอกจากนี้ยังสามารถใช้ในโหมดเปรียบเทียบหรือสร้าง PWM
เช่นเดียวกับ Timer 0 และ Timer 1, Timer 2 สามารถใช้ในโหมดโหลดซ้ำอัตโนมัติ
จับเวลา 3:
ตัวจับเวลา 3 ยังใช้เป็นตัวจับเวลา 16 บิตและใช้สำหรับแหล่งสัญญาณนาฬิกาอัตราบอดสำหรับ UART นอกจากนี้ยังมีคุณสมบัติรีโหลดอัตโนมัติ สิ่งสำคัญคือต้องใช้ตัวจับเวลานี้สำหรับการสื่อสารแบบอนุกรม (UART) เท่านั้นหากแอปพลิเคชันต้องการการสื่อสาร UART ไม่แนะนำให้ใช้ตัวจับเวลานี้เพื่อวัตถุประสงค์อื่นในกรณีดังกล่าวเนื่องจากกระบวนการที่ขัดแย้งกันในการตั้งค่าตัวจับเวลา
ตัวจับเวลา Watchdog:
Watchdog Timer สามารถใช้เป็นตัวจับเวลามาตรฐาน 6 บิตได้ แต่ไม่ได้ใช้เพื่อจุดประสงค์นี้ การใช้ตัวจับเวลา Watchdog เป็นตัวจับเวลาที่ใช้งานทั่วไปสามารถใช้ได้กับแอพพลิเคชั่นที่ใช้พลังงานต่ำซึ่งไมโครคอนโทรลเลอร์ส่วนใหญ่จะอยู่ในโหมดไม่ได้ใช้งาน
Watchdog Timer ตามชื่อจะตรวจสอบเสมอว่าไมโครคอนโทรลเลอร์ทำงานอย่างถูกต้องหรือไม่ ในกรณีของไมโครคอนโทรลเลอร์ที่แขวนคอหรือหยุดทำงาน WDT (Watchdog Timer) จะรีเซ็ตไมโครคอนโทรลเลอร์โดยอัตโนมัติเพื่อให้แน่ใจว่าไมโครคอนโทรลเลอร์ทำงานในลำดับรหัสอย่างต่อเนื่องโดยไม่ติดขัดแขวนคอหรือหยุดชะงัก
ตัวตั้งเวลาปลุกด้วยตนเอง:
นี่เป็นอุปกรณ์ต่อพ่วงตัวจับเวลาอีกตัวที่ทำหน้าที่กำหนดเวลาโดยเฉพาะเช่นเดียวกับตัวจับเวลาสุนัขเฝ้าบ้าน ตัวจับเวลานี้จะปลุกระบบเป็นระยะเมื่อไมโครคอนโทรลเลอร์ทำงานในโหมดพลังงานต่ำ
อุปกรณ์ต่อพ่วงตัวจับเวลานี้สามารถใช้ภายในหรือใช้อุปกรณ์ต่อพ่วงภายนอกเพื่อปลุกไมโครคอนโทรลเลอร์จากโหมดสลีป สำหรับโครงการนี้เราจะใช้ Timer 1 และ Timer 2
การเขียนโปรแกรมไมโครคอนโทรลเลอร์ Nuvoton N76E003 สำหรับตัวจับเวลา
การตั้งค่าพินเป็นเอาต์พุต:
เริ่มกันที่ส่วนเอาต์พุตก่อน เรากำลังใช้ LED สองดวงหนึ่งคือ LED ออนบอร์ดชื่อ Test และเชื่อมต่อกับพอร์ต P1.4 และ LED ภายนอกที่เชื่อมต่อด้วยพิน P1.5
ดังนั้นทั้งสองพินจึงถูกกำหนดค่าให้เป็นพินเอาต์พุตเพื่อเชื่อมต่อ LED ทั้งสองโดยใช้ข้อมูลโค้ดด้านล่าง
#define Test_LED P14 #define LED1 P15
หมุดทั้งสองนี้ถูกตั้งค่าเป็นพินกึ่งสองทิศทางในฟังก์ชันการตั้งค่า
การตั้งค่าเป็นโมฆะ (โมฆะ) {P14_Quasi_Mode; P15_Quasi_Mode; }
การตั้งค่าฟังก์ชันจับเวลา:
ในฟังก์ชั่นการตั้งค่าจำเป็นต้องกำหนดเวลา 2 เพื่อให้ได้ผลลัพธ์ที่ต้องการ สำหรับสิ่งนี้เราจะตั้งค่าการลงทะเบียน T2MOD ด้วยตัวประกอบการหาร 1/128 นาฬิกาและใช้ในโหมดหน่วงเวลาโหลดอัตโนมัติ นี่คือภาพรวมของ T2MOD register-
การลงทะเบียน T2MOD ที่ 4,5 และ 6 บิตจะตั้งค่าตัวจับเวลา 2 ตัวแบ่งนาฬิกาและบิตที่ 7 ตั้งค่าโหมดโหลดซ้ำอัตโนมัติ ทำได้โดยใช้บรรทัดด้านล่าง -
TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode;
สองบรรทัดนี้ถูกกำหนดในไฟล์ Function_define.h เป็นไฟล์
# กำหนด TIMER2_DIV_128 T2MOD- = 0x50; T2MOD & = 0xDF # กำหนด TIMER2_Auto_Reload_Delay_Mode T2CON & = ~ SET_BIT0; T2MOD- = SET_BIT7; T2MOD- = SET_BIT3
ตอนนี้เส้นเหล่านี้ตั้งค่าเวลาที่จำเป็นสำหรับ Timer 2 ISR
RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8;
ซึ่งกำหนดเพิ่มเติมในไฟล์ Function_define.h as-
TIMER_DIV128_VALUE_100ms 65536-12500 // 12500 * 128/16000000 = 100 มิลลิวินาที
ดังนั้น 16000000 คือความถี่คริสตัล 16 Mhz ซึ่งตั้งค่าการหน่วงเวลา 100 ms
ด้านล่างสองบรรทัดจะทำให้ไบต์ต่ำและสูงของ Timer 2 ว่างเปล่า
TL2 = 0; TH2 = 0;
ในที่สุดรหัสด้านล่างจะเปิดใช้งานตัวจับเวลา 2 ขัดจังหวะและเริ่มจับเวลา 2
set_ET2; // เปิดใช้งาน Timer2 ขัดจังหวะ set_EA; set_TR2; // Timer2 รัน
ฟังก์ชั่นการตั้งค่าที่สมบูรณ์สามารถดูได้ในรหัสด้านล่าง -
การตั้งค่าเป็นโมฆะ (โมฆะ) { P14_Quasi_Mode; P15_Quasi_Mode; TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode; RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8; TL2 = 0; TH2 = 0; set_ET2; // เปิดใช้งาน Timer2 ขัดจังหวะ set_EA; set_TR2; // Timer2 รัน }
ฟังก์ชัน Timer 2 ISR:
ฟังก์ชัน Timer 2 ISR สามารถดูได้จากโค้ดด้านล่าง
เป็นโมฆะ Timer2_ISR (โมฆะ) ขัดจังหวะ 5 { clr_TF2; // ล้าง Timer2 Interrupt Flag LED1 = ~ LED1; // LED1 สลับเชื่อมต่อใน P1.5; }
รหัสการกระพริบและการตรวจสอบเอาต์พุตสำหรับการทำงานของตัวจับเวลา
รหัส (ระบุด้านล่าง) เมื่อคอมไพล์ส่งคืนคำเตือน 0 และ 0 ข้อผิดพลาดและฉันกะพริบโดยใช้วิธีการกระพริบเริ่มต้นใน Keil หลังจากกระพริบไฟ LED จะกะพริบตามการหน่วงเวลาที่กำหนดไว้ตามที่ตั้งโปรแกรมไว้
ดูวิดีโอด้านล่างเพื่อสาธิตวิธีการทำงานของบอร์ดสำหรับรหัสนี้ หวังว่าคุณจะสนุกกับบทช่วยสอนและเรียนรู้สิ่งที่เป็นประโยชน์หากคุณมีคำถามใด ๆ ทิ้งไว้ในส่วนความคิดเห็นด้านล่าง คุณยังสามารถใช้ฟอรัมของเราเพื่อโพสต์คำถามทางเทคนิคอื่น ๆ