void timer(void)//T/C0定时计数器的初始化配置 { TCCR0 = 0x0B;//ctc模式 64分频 TCNT0 = 0x00; OCR0 = 62; TIMSK|= 0x02;//使能T/C0比较比配中断 }
时间: 2023-11-18 18:03:45 浏览: 35
这段代码是用来实现一个定时器的初始化配置,使用了 ATmega16/32 的 Timer/Counter 0 (T/C0) 模块。具体来说,它配置了 T/C0 为 CTC (Clear Timer on Compare Match) 模式,使用了 64 分频器(prescaler),并设置了比较值 OCR0 为 62。最后,它使能了 T/C0 的比较匹配中断。这个定时器的工作方式是:每当 T/C0 的计数器值与 OCR0 相等时,就会触发一次比较匹配中断。所以,可以通过调整 OCR0 的值来改变定时器的计数周期。
相关问题
/* * T1_T2_T3_2023_1.c * * 创建: 2023/5/30 22:49:53 * 作者 : XY */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> void device_init(void) { DDRD |= 0xf0;端口 &= 0x0f;DDRB |= (_BV(PB4)|_BV(PB6));DDRE |= _BV(PE7);} void timer1_init(void) { TCCR1B = 0x00; //stop OCR1AH = 0x3D; //TOP of T1 OCR1AL = 0x08;OCR1BH = 0x3D;OCR1BL = 0x08;TCCR1A = 0x10;TCCR1C = 0x00;TCCR1B = 0x0B;启动计时器 } void timer2_init(void) { TCCR2B = 0x00; //stop ASSR = 0x20; //设置异步模式 OCR2A = 0x80;TCCR2A = 0x42;TCCR2B = 0x06;start } void timer3_init(void) { TCCR3B = 0x00; //stop OCR3AH = 0x3D;OCR3AL = 0x08;TCCR3A = 0x00;TCCR3C = 0x00;TCCR3B = 0x0B;start Timer } ISR(TIMER3_COMPA_vect) { PORTE ^= _BV(PE7); } int main(void) { device_init(); timer1_init(); timer2_init(); timer3_init();TIMSK3 = 0x02;SEI();而 (1) { SMCR |= (0x00<<SM0); sleep_mode(); } }根据程序中 T1、T2、T3 的配置参数(包括工作模式、分频系数、初值),通过更改SMCR |= (0x00<<SM0)为SMCR |= (0x03<<SM0)和SMCR |= (0x02<<SM0)来分析三个定时器驱动 LED 灯的方式有何区别
根据程序中的配置参数,T1、T2、T3 分别使用不同的定时器模式和分频系数驱动 LED 灯。具体来说:
- T1 使用 CTC 模式(TCCR1A = 0x10)和 64 分频(TCCR1B = 0x0B),计时器初值为 15624(OCR1A = 0x3D08),即每 1 秒产生一个中断,LED 灯的亮灭由程序控制。
- T2 使用 CTC 模式(TCCR2A = 0x42)和 1024 分频(TCCR2B = 0x06),计时器初值为 128(OCR2A = 0x80),即每 8 毫秒产生一个中断,LED 灯的亮灭由程序控制。
- T3 使用 CTC 模式(TCCR3A = 0x00)和 64 分频(TCCR3B = 0x0B),计时器初值为 15624(OCR3A = 0x3D08),即每 1 秒产生一个中断,LED 灯的亮灭由定时器的输出比较通道 A 控制,每次中断时将 PE7 引脚取反,从而控制 LED 灯的亮灭。
当更改 SMCR 寄存器的值为 SMCR |= (0x03<<SM0)时,MCU 进入 Power-down 模式,此时所有定时器停止工作,LED 灯也将熄灭。当更改 SMCR 寄存器的值为 SMCR |= (0x02<<SM0)时,MCU 进入 Idle 模式,此时仅有 T1 和 T3 继续工作,LED 灯的亮灭由定时器控制,而 T2 停止工作,LED 灯将保持上一次的状态。
/* * T1_T2_T3_2023_1.c * * Created: 2023/5/30 22:49:53 * Author : XY */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> void device_init(void) { DDRD |= 0xf0; PORTD &= 0x0f; DDRB |= (_BV(PB4)|_BV(PB6)); DDRE |= _BV(PE7); } void timer1_init(void) { TCCR1B = 0x00; //stop OCR1AH = 0x3D; //TOP of T1 OCR1AL = 0x08; OCR1BH = 0x3D; OCR1BL = 0x08; TCCR1A = 0x10; TCCR1C = 0x00; TCCR1B = 0x0B; //start Timer } void timer2_init(void) { TCCR2B = 0x00; //stop ASSR = 0x20; //set async mode OCR2A = 0x80; TCCR2A = 0x42; TCCR2B = 0x06; //start } void timer3_init(void) { TCCR3B = 0x00; //stop OCR3AH = 0x3D; OCR3AL = 0x08; TCCR3A = 0x00; TCCR3C = 0x00; TCCR3B = 0x0B; //start Timer } ISR(TIMER3_COMPA_vect) { PORTE ^= _BV(PE7); } int main(void) { device_init(); timer1_init(); timer2_init(); timer3_init(); TIMSK3 = 0x02; sei(); while (1) { SMCR |= (0x00<<SM0); sleep_mode(); } } 根据程序中 T1、T2、T3 的配置参数(包括工作模式、分频系数、初值),通过更改SMCR |= (0x00<<SM0)为SMCR |= (0x03<<SM0)和SMCR |= (0x03<<SM0)来分析三个定时器驱动 LED 灯的方式有何区别
根据程序中 T1、T2、T3 的配置参数,三个定时器的工作模式、分频系数、初值均不同,因此驱动 LED 灯的方式也有所区别。
在SMCR |= (0x00<<SM0)的情况下,MCU处于睡眠模式,当定时器中断被触发时,会执行ISR(TIMER3_COMPA_vect)中的代码,即让PE7引脚取反,从而驱动LED灯。
在SMCR |= (0x03<<SM0)的情况下,MCU进入睡眠模式,但是会保持定时器的工作。对于T1,其工作模式为PWM相位正确模式,分频系数为64,初值为0x0800,当计数器计数到OCRA的值时,会触发比较匹配中断,执行ISR(TIMER1_COMPA_vect)中的代码,即让PD7引脚取反,从而驱动LED灯。对于T2,其工作模式为CTC模式,分频系数为256,初值为0x80,当计数器计数到OCR2A的值时,会触发比较匹配中断,执行ISR(TIMER2_COMPA_vect)中的代码,即让PB4引脚取反,从而驱动LED灯。对于T3,其工作模式为PWM相位正确模式,分频系数为64,初值为0x0800,当计数器计数到OCRA的值时,会触发比较匹配中断,执行ISR(TIMER3_COMPA_vect)中的代码,即让PE7引脚取反,从而驱动LED灯。
因此,当SMCR |= (0x03<<SM0)时,T1、T2、T3驱动LED灯的方式与SMCR |= (0x00<<SM0)时不同。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)