说明:T0的相位修正PWM模式,采取1024分频,比较匹配时OC0置位,计数到TOP时清零,这个模式有两个中断,一个是比较匹配的中断(产生后不将TCNT0的值清零),继续继续加到255(T0的MAX),产生一个溢出中断(TCNT0自动清零)。此例将两个中断使能全部打开,并且中断发生后执行相应的中断服务程序。
#include <iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
uchar num=0;
void port_init(void)
{
PORTE |= BIT(PE2); //打开LED灯的锁存器使能
DDRE |= BIT(PE2);
DDRA = 0XFF; //A口全部输出
}
void pwm0_init(void)
{
DDRB |= BIT(PB4); //将OC0(PB4)设置为输出
TCCR0 = 0X00;
OCR0 = 0X7F; //8位的定时计数比较器的初值设定为0x7f
TCNT0 = 0; //计数器
TCCR0 = 0X77; //设置为相位修正PWM模式,采取1024分频,比较匹配时OC0置位,计数到TOP时清零
}
void main(void)
{
CLI(); //禁止所有中断
pwm0_init();
port_init();
TIMSK = 0X03; //T0的比较溢出中断和溢出使能
SEI(); //开启所中断使能
while(1); //等待比较中断
}
#pragma interrupt_handler timer0_comp_isr:16
void timer0_comp_isr(void)
{
PORTA = num++;
}
#pragma interrupt_handler timer0_vof_isr:17
void timer0_vof_isr(void)
{
PORTA = num++;
}
疑问:为什么我将溢出的中断服务程序屏蔽后没有灯和PB4口都没有反应了?但是我将比较匹配的中断服务程序屏蔽后依然可以看靠一样的结果?
编译环境:ICCAVR
文章评论(0条评论)
登录后参与讨论