Advanced Arduino: direct use of ATmega counter/timers
What are the counter/timers
The Arduino platform consists of a set of software libraries that run on a group of micro-controller chips. Currently the supported micro-controllers are the AVR ATmega168, ATmega328, and the more featureful ATmega1280 and ATmega2560 used in the Arduino Mega. Also smaller chips like the ATtiny are useable if you are prepared to do some more homework.
Currently the Arduino platform uses the ATmega series but the software is not strongly tied to any one architecture (in principle).
These notes are, however, firmly tied to the ATmega architecture and the ATmega168 and ATmega328 chips of the standard Arduinos. The ATmega1280 and 2560 are very similar however (but with more counter/timers).
Where to find things out
All things Arduino can be found at or from the Arduino wesbite. Google naturally is very useful for locating more resources. The chip datasheets can be located in numerous places but Atmel's website has them at their ATmega328p doc page.
Existing use/support of counter/timers in Arduino libraries
The millis() and micros() functions use timer0 to keep track of the time since last reset.
The Tone library uses whichever timer(s) are needed for the pin(s) involved - see the pin/timer map below.
analogWrite() function uses whichever timer is needed for the pin involved.
The Servo library uses timer1 to provide interrupt-driven servo-signal generation.
The standard Arduino has 3 timers, timer0 is 8 bit and used for the millis() and micros() functions. Timer1 is 16 bit and not used by default, timer2 is another 8 bit timer like timer0 but not used by default.
timer bits channel Arduino pin Mega pin
timer0 8 A 6 13
timer0 8 B 5 4
timer1 16 A 9 11
timer1 16 B 10 12
timer2 8 A 11 10
timer2 8 B 3 9
timer3 16 A - 5
timer3 16 B - 2
timer3 16 C - 3
timer4 16 A - 6
timer4 16 B - 7
timer4 16 C - 8
timer5 16 A - 44
timer5 16 B - 45
timer5 16 C - 46
At restart the Arduino bootloader sets up the timers ready for analogWrite() PWM use. The timer/counters are set to phase-correct 8-bit PWM mode and with clock prescaled to system clock divided by 64. However timer0 is set to fast PWM mode for use with the millis()/micros() code.
For standard Arduinos the system clock is 16MHz so that the timers are clocking at 250kHz by default. Phase correct 8-bit PWM mode takes 510 clocks to cycle and fast 8-bit PWM mode takes 256. This means a frequency of 490Hz for pins 5 and 6 and 977Hz for pins 3, 9, 10, 11 when used with analogWrite(). It is possible to change the clock prescaling to change these default PWM frequencies.
ATmega counter-timer basics
The counter/timer hardware modules are very flexible and consist of a set of registers to control the behaviour as well as the counter/timer register itself. 16 bit timers have mainly 16-bit registers (although the control registers are 2 separate 8-bit ones in all timers).
In the following description I shall use timer1's register names, but the naming is systematic and replacing the '1' by another number you get the corresponding names. TCCR1A and TCCR1B are the two 8-bit control registers. These set up the clock prescale ratio, set the mode for the counter/timer and set the output control for the PWM pins. TCNT1 is the 16 bit (for timer1) counter value itself. At the assembly language level this register has to be written or read as two 8-bit half-registers and in a certain order. The GCC AVR compiler used by the Arduino software automatically generates the two accesses as if this was a single 16 bit transfer. However if you have an interrupt handler that also accesses 16 bit registers in the same timer you must protect accesses by disabling interrupts across the access.
Each timer has 2 or 3 channels which control a dedicated pin if the relevant output mode is set and that pin is enabled as an output. The OCR1A and OCR1B are the 16 bit Output Compare Registers that apply to the two channels (A and B) that timer1 has. The Mega has timers 3 4 and 5 that each have 3 channels, A, B and C. The same considerations about 16 bit transfers as for the TCNT1 register of course.
The Input Capture Register ICR1 is a 16 bit register used to record the value of TCNT1 when an external event happens - typically a change on the ICP1 pin (Arduino pin 8). Only 16 bit timers have input capture.
The basic operation of the unit, common to most modes is for the counter register TCNT1 to count up and/or down between values BOTTOM (which is zero) and TOP. In some modes TOP is provided by a register such as OCR1A or ICR1, in other modes it is fixed at 0xFF or 0x1FF or 0x3FF or 0xFFFF (MAX). Many modes compare the OCR1A and OCR1B values to the TCNT1 at each clock and may change the output pins for those channels. In phase-correct PWM mode the counter reverses direction when getting to BOTTOM or TOP thus ramping both up and down. In other modes the counter just counts up and resets to BOTTOM (usually zero) upon reach
ขั้นสูง Arduino: ใช้โดยตรงของ ATMEGA เคาน์เตอร์ / ตัวจับเวลาอะไรคือเคาน์เตอร์ / ตัวจับเวลาแพลตฟอร์ม Arduino ประกอบด้วยชุดของห้องสมุดซอฟต์แวร์ที่ทำงานบนกลุ่มของชิปไมโครคอนโทรลเลอร์ ขณะนี้ได้รับการสนับสนุนไมโครคอนโทรลเลอร์เป็น AVR ATmega168, ATmega328 และ featureful เพิ่มเติม ATmega1280 และ ATmega2560 ใช้ใน Arduino เมกะ นอกจากนี้ยังมีชิปที่มีขนาดเล็กเช่น ATtiny เป็นใช้ได้ถ้าคุณกำลังเตรียมที่จะทำบางบ้านมากขึ้น. ปัจจุบันแพลตฟอร์ม Arduino ใช้ชุด ATMEGA แต่ซอฟต์แวร์ที่ไม่ได้เชื่อมโยงอย่างยิ่งกับคนใดคนหนึ่งสถาปัตยกรรม (ในหลักการ). บันทึกเหล่านี้มี แต่ผูกให้แน่น สถาปัตยกรรม ATMEGA และ ATmega168 และ ATmega328 ชิปของ Arduinos มาตรฐาน ATmega1280 และ 2560 จะคล้ายกันมาก แต่ ( แต่กับเคาน์เตอร์มากขึ้น / ตัวจับเวลา). การที่จะหาสิ่งที่ออกทุกสิ่ง Arduino สามารถพบได้ที่หรือจาก wesbite Arduino Google ธรรมชาติเป็นประโยชน์อย่างมากสำหรับตำแหน่งทรัพยากรมากขึ้น เอกสารข้อมูลทางเทคนิคชิปสามารถตั้งอยู่ในสถานที่ต่าง ๆ นานา แต่เว็บไซต์ Atmel มีพวกเขาในหน้าเอกสารของพวกเขา ATmega328p. ที่มีอยู่ใช้งาน / การสนับสนุนของเคาน์เตอร์ / ตัวจับเวลาใน Arduino ห้องสมุดมิลลิวินาที () และไมโคร () ฟังก์ชั่นใช้ timer0 ในการติดตามของเวลาตั้งแต่เดือน . รีเซ็ตรายงานการใช้ห้องสมุดโทนแล้วแต่จำนวนใดจับเวลา (s) มีความจำเป็นสำหรับขา (s) มีส่วนร่วม -. ดูแผนที่ Pin / จับเวลาดังต่อไปนี้. analogWrite () ฟังก์ชันใช้แล้วแต่จำนวนใดจับเวลาเป็นสิ่งจำเป็นสำหรับขาที่เกี่ยวข้องกับห้องสมุด Servo ใช้ Timer1 เพื่อให้ ขัดขวางการขับเคลื่อนเซอร์โวรุ่นสัญญาณ. มาตรฐาน Arduino มี 3 ตัวนับ timer0 คือ 8 บิตและใช้สำหรับมิลลิวินาที () และไมโคร () ฟังก์ชั่น Timer1 คือ 16 บิตและไม่ได้ใช้โดยค่าเริ่มต้น timer2 เป็นอีกหนึ่งจับเวลา 8 บิตเช่น timer0 แต่ไม่ใช้โดยเริ่มต้น. จับเวลาบิตช่อง Arduino ขาร็อคขาtimer0 8 6 13 timer0 8 B 5 4 Timer1 16 9 11 Timer1 16 B 10 12 timer2 8 11 10 timer2 8 B 3 9 timer3 16 - 5 timer3 16 B - 2 timer3 16 C - 3 timer4 16 - 6 timer4 16 B - 7 timer4 16 C - 8 timer5 16 - 44 timer5 16 B - 45 timer5 16 C - 46 ในการรีสตาร์ท bootloader Arduino ตั้งค่าตัวจับเวลาพร้อมสำหรับ analogWrite () ใช้ PWM จับเวลา / เคาน์เตอร์มีการกำหนดให้เฟสที่ถูกต้องโหมด PWM 8 บิตและมีนาฬิกา prescaled นาฬิการะบบหารด้วย 64 แต่ timer0 จะทำงานในโหมด PWM ได้อย่างรวดเร็วสำหรับการใช้งานกับมิลลิวินาที () / Micros () รหัส. สำหรับ Arduinos มาตรฐาน นาฬิการะบบคือ 16MHz เพื่อให้ตัวนับที่มีการตอกบัตรที่ 250kHz โดยค่าเริ่มต้น ขั้นตอนที่ถูกต้องโหมด PWM 8 บิตจะใช้เวลา 510 นาฬิกาเพื่อวงจรและรวดเร็วโหมด PWM 8 บิตจะใช้เวลา 256 ซึ่งหมายความว่าความถี่ของ 490Hz พินที่ 5 และ 6 และ 977Hz พิน 3, 9, 10, 11 เมื่อใช้กับ analogWrite () . มันเป็นไปได้ที่จะเปลี่ยนนาฬิกา prescaling การเปลี่ยนแปลงเหล่านี้ความถี่ PWM เริ่มต้น. ATMEGA พื้นฐานเคาน์เตอร์จับเวลาโมดูลฮาร์ดแวร์เคาน์เตอร์ / จับเวลาที่มีความยืดหยุ่นมากและประกอบด้วยชุดของการลงทะเบียนเพื่อควบคุมพฤติกรรมเช่นเดียวกับเคาน์เตอร์ / จับเวลาลงทะเบียนตัวเอง 16 bit จับเวลามีส่วนใหญ่ลงทะเบียน 16 บิต (แม้ว่าการลงทะเบียนควบคุม 2 แยกต่างหาก 8 บิตคนในตัวนับทั้งหมด). ในรายละเอียดต่อไปนี้ฉันจะต้องใช้ Timer1 ของชื่อลงทะเบียน แต่การตั้งชื่อเป็นระบบและเปลี่ยน '1' อีก หมายเลขที่คุณได้รับชื่อที่สอดคล้องกัน TCCR1A และ TCCR1B เป็นสอง 8 บิตลงทะเบียนควบคุม เหล่านี้ตั้งค่าอัตราส่วนนาฬิกา prescale ตั้งโหมดสำหรับเคาน์เตอร์ / จับเวลาและการตั้งค่าการควบคุมการส่งออกสำหรับหมุด PWM TCNT1 เป็น 16 บิต (สำหรับ Timer1) ค่าตัวนับตัวเอง ในระดับภาษาประกอบการลงทะเบียนนี้จะต้องมีการเขียนหรืออ่านเป็นสอง 8 บิตครึ่งลงทะเบียนและในลำดับที่แน่นอน คอมไพเลอร์ GCC AVR ใช้โดยซอฟต์แวร์ Arduino สร้างโดยอัตโนมัติทั้งสองเข้าถึงราวกับว่านี่คือการถ่ายโอน 16 บิตเดียว แต่ถ้าคุณมีการจัดการการขัดจังหวะที่ยังเข้าถึง 16 ลงทะเบียนบิตในการตั้งเวลาเดียวกับที่คุณจะต้องปกป้องการเข้าถึงโดยการปิดการขัดจังหวะทั่วเข้าถึง. จับเวลาแต่ละคนมี 2 หรือ 3 ช่องที่ควบคุมขาโดยเฉพาะถ้าอยู่ในโหมดการส่งออกที่เกี่ยวข้องมีการตั้งค่าและขาที่ ถูกเปิดใช้งานในขณะที่การส่งออก OCR1A และ OCR1B เป็น 16 bit เอาท์พุทรีจีเปรียบเทียบที่นำไปใช้ทั้งสองช่อง (A และ B) Timer1 ที่มี เมกะมีตัวจับเวลา 3 4 และ 5 ที่แต่ละคนมี 3 ช่อง, A, B และ C คำนึงเดียวกันเกี่ยวกับการถ่ายโอน 16 บิตเป็นสำหรับการลงทะเบียน TCNT1 แน่นอน. อินพุตจับสมัครสมาชิก ICR1 เป็น 16 bit ลงทะเบียนใช้ในการบันทึกค่า ของ TCNT1 เมื่อมีเหตุการณ์เกิดขึ้นภายนอก - โดยปกติจะมีการเปลี่ยนแปลงในขา ICP1 ที่ (Arduino ขา 8) เพียง 16 บิตจับเวลามีการจับภาพการป้อนข้อมูล. พื้นฐานการทำงานของหน่วยร่วมกันมากที่สุดคือโหมดสำหรับเคาน์เตอร์ลงทะเบียน TCNT1 นับขึ้นและ / หรือลงระหว่างค่า BOTTOM (ซึ่งเป็นศูนย์) และ TOP ในบางโหมด TOP ให้บริการโดยการลงทะเบียนเช่น OCR1A หรือ ICR1 ในโหมดอื่น ๆ มันเป็นแบบคงที่หรือ 0xFF 0x1FF หรือ 0x3FF หรือ 0xFFFF (สูงสุด) โหมดหลายเปรียบเทียบ OCR1A และ OCR1B ค่ากับ TCNT1 ในแต่ละนาฬิกาและอาจมีการเปลี่ยนแปลงหมุดผลลัพธ์สำหรับช่องทางเหล่านั้น ในโหมด PWM ขั้นตอนที่ถูกต้องเคาน์เตอร์ฝืนทิศทางเมื่อได้รับไปที่ด้านล่างหรือด้านบนจึงกระโจนทั้งขึ้นและลง ในโหมดอื่น ๆ ที่เคาน์เตอร์เพียงนับขึ้นและรีเซ็ตไปที่ด้านล่าง (มักจะเป็นศูนย์) เมื่อเข้าถึง
การแปล กรุณารอสักครู่..