บล็อกของโนอาห์ Stahl มีตัวอย่างของการกระพริบไฟ LED กับ Timer2 ด้วยสิ่งนั้นและแผ่นข้อมูลคุณควรจะสามารถปรับให้เข้ากับสิ่งที่คุณต้องการใช้ขัดจังหวะ - นั่นคือการขัดจังหวะที่มีฟังก์ชั่นปกติที่คุณสามารถยอมแพ้หรือเต็มใจที่จะปรับเปลี่ยน โดยปกติแล้ว Timer2 จะใช้สำหรับฟังก์ชั่น PWM บางอย่าง
ตัวอย่างของเขาอ้างถึง ATmega2560; ฉันสามารถยืนยันได้ว่ามันทำงานได้กับ ATmega328p เช่นกัน ดูรอบ ๆ เว็บไซต์ของเขาเพื่อดูตัวอย่างการขัดจังหวะ Arduino ที่มีประโยชน์มากกว่า
แก้ไข:
นี่คือการแก้ไขเล็กน้อยของฉัน - ส่วนใหญ่อยู่ในความคิดเห็น - รหัสของโนอาห์ โทร Timer2init () จากฟังก์ชั่นการตั้งค่า Arduino () หลังจากที่คุณเริ่มต้นโครงสร้างข้อมูลหรือฮาร์ดแวร์ใด ๆ ที่เกี่ยวข้องเนื่องจากเวลา - และการขัดจังหวะ - จะเริ่มขึ้นเมื่อคุณทำ
F / ex ฉันใช้เพื่อมัลติเพล็กซ์จอแสดงผล 7 ส่วน 3 หลักดังนั้นฉันก่อนที่จะเริ่มการจับเวลาฉันเริ่มต้นการลงทะเบียน I / O ของจอแสดงผลและลบข้อมูลการแสดงผลในสถานที่ที่ ISR จะมองหา
มีตารางในความคิดเห็นของข้อมูลเวลาที่มีประโยชน์บางอย่างจากแผ่นข้อมูลและการคำนวณของฉันเองสำหรับการอ้างอิงเพื่อตั้งค่ารูปแบบเวลาอื่น
มาโคร ISR () ดูแลการสร้างรายการอินเตอร์รัปต์และโค้ดออกสำหรับ ISR แทนการเข้าและออกของฟังก์ชั่นปกติและเชื่อมโยงกับอินเทอร์รัปต์เวกเตอร์ที่เหมาะสม ส่วนที่เหลือของฟังก์ชั่นนั้นคือ 1) รหัสที่จะใช้ในการขัดจังหวะแต่ละครั้งและ 2) รหัสรหัสเพื่อรีเซ็ตตัวจับเวลาสำหรับการขัดจังหวะครั้งต่อไป
ตามที่เขียนไว้สิ่งนี้ควรอยู่ในไฟล์. pde หรือ. inino (หรือไฟล์. cpp หากคุณใช้ eclipse, f / ex) ร่างต้อง #define LEDPIN และการตั้งค่า () ต้องเรียก Timer2init () ฟังก์ชันลูปอาจว่างเปล่าหรือไม่ LED ควรเริ่มกระพริบเมื่อดาวน์โหลด (อย่างแท้จริงหลังจาก Timer2init () ถูกเรียก)
/*
* From sample interrupt code published by Noah Stahl on his blog, at:
* http://arduinomega.blogspot.com/p/arduino-code.html
*
*/
/*** FUNC
Name: Timer2init
Function: Init timer 2 to interrupt periodically. Call this from
the Arduino setup() function.
Description: The pre-scaler and the timer count divide the timer-counter
clock frequency to give a timer overflow interrupt rate:
Interrupt rate = 16MHz / (prescaler * (255 - TCNT2))
TCCR2B[b2:0] Prescaler Freq [KHz], Period [usec] after prescale
0x0 (TC stopped) 0 0
0x1 1 16000. 0.0625
0x2 8 2000. 0.500
0x3 32 500. 2.000
0x4 64 250. 4.000
0x5 128 125. 8.000
0x6 256 62.5 16.000
0x7 1024 15.625 64.000
Parameters: void
Returns: void
FUNC ***/
void Timer2init() {
// Setup Timer2 overflow to fire every 8ms (125Hz)
// period [sec] = (1 / f_clock [sec]) * prescale * (255-count)
// (1/16000000) * 1024 * (255-130) = .008 sec
TCCR2B = 0x00; // Disable Timer2 while we set it up
TCNT2 = 130; // Reset Timer Count (255-130) = execute ev 125-th T/C clock
TIFR2 = 0x00; // Timer2 INT Flag Reg: Clear Timer Overflow Flag
TIMSK2 = 0x01; // Timer2 INT Reg: Timer2 Overflow Interrupt Enable
TCCR2A = 0x00; // Timer2 Control Reg A: Wave Gen Mode normal
TCCR2B = 0x07; // Timer2 Control Reg B: Timer Prescaler set to 1024
}
/*** FUNC
Name: Timer2 ISR
Function: Handles the Timer2-overflow interrupt
Description: Maintains the 7-segment display
Parameters: void
Returns: void
FUNC ***/
ISR(TIMER2_OVF_vect) {
static unsigned int led_state = 0; // LED state
led_state = !led_state; // toggles the LED state
digitalWrite(TOGGLE_PIN, led_state);
TCNT2 = 130; // reset timer ct to 130 out of 255
TIFR2 = 0x00; // timer2 int flag reg: clear timer overflow flag
};