/* * 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 灯的方式有何区别
时间: 2024-03-19 09:40:12 浏览: 74
根据程序中的配置参数,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 * * 创建: 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));DD RE |= _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(); } }在SMCR |= (0x00<<SM0),SMCR |= (0x03<<SM0),SMCR |= (0x02<<SM0)三种情况下的运行结果
这是一段 AVR 微控制器的代码,主要是对定时器进行初始化和配置。其中,timer1_init() 初始化了 Timer 1,timer2_init() 初始化了 Timer 2,timer3_init() 初始化了 Timer 3。在 main() 函数中,通过调用 device_init() 函数对设备(端口)进行初始化,并通过调用 sleep_mode() 函数将微控制器设置为睡眠模式,以降低功耗。
在 SMCR |= (0x00<<SM0)的情况下,微控制器进入睡眠模式,但不会自动唤醒,需要外部中断或者复位才能唤醒。
在 SMCR |= (0x03<<SM0)的情况下,微控制器进入 Power-down 模式,此时除了引脚外的所有模块都被关闭,可以通过外部中断或者复位唤醒。
在 SMCR |= (0x02<<SM0)的情况下,微控制器进入 Idle 模式,此时只有 CPU 被关闭,其他模块继续运行,可以通过外部中断或者硬件定时器唤醒。
需要注意的是,该代码的运行结果和具体硬件平台相关,不能一概而论。
/* * 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(); } }在SMCR |= (0x00<<SM0),SMCR |= (0x00<<SM0),SMCR |= (0x02<<SM0)三种情况下的运行结果
在 SMCR |= (0x00<<SM0)的情况下,MCU 进入 Power-save 模式,此时所有定时器正常工作,LED 灯的亮灭由程序控制。由于程序中没有设定 LED 灯的状态,因此 LED 灯可能会一直亮着或熄灭,具体状态不确定。
在 SMCR |= (0x00<<SM0)的情况下,MCU 仍然进入 Power-save 模式,定时器 T1 和 T3 仍然正常工作,LED 灯的亮灭由定时器控制。定时器 T2 停止工作,LED 灯将保持上一次的状态。由于程序中没有设定 LED 灯的初始状态,因此 LED 灯可能会一直亮着或熄灭,具体状态不确定。
在 SMCR |= (0x02<<SM0)的情况下,MCU 进入 Idle 模式,定时器 T1 和 T3 仍然正常工作,LED 灯的亮灭由定时器控制。定时器 T2 停止工作,LED 灯将保持上一次的状态。由于 MCU 进入 Idle 模式,处理器将停止工作,直到下一个中断出现。因此程序中的 while(1) 循环将不再执行,程序将停留在 sleep_mode() 语句处,直到下一个中断出现。在该模式下,MCU 的功耗比 Power-save 模式低,但是定时器 T2 停止工作,可能会影响系统的实时性能。
阅读全文