|
我在学习使用定时器的时候遇到一些问题,希望大家能够指点一下。
我原意是设计一个PWM控制的渐灭的LED。下面是我写的代码。
我发现,我使用外部中断的时候可以实现这个功能。
但是我使用定时器就没有办法时间,无论我怎么设置,OCR都不变。
是否有什么要点我没有注意到,麻烦各位朋友能够指点一下。
下面是我的源代码:
/*********************************************
File name : demo_8_6.c
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include <mega16.h>
#include <delay.h>
int i;
int time_counter=0;
//INT0中断服务程序
/*
interrupt [EXT_INT0] void ext0_isr(void)
{
if(++time_counter >= 0x05)
{
time_counter = 0;
if (++i>=0xff) i=0X00;
}
}
*/
// T/C0 溢出中断服务
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
OCR0=i;
}
// T/C2 比较匹配中断服务
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
if(++time_counter >= 0x10)
{
time_counter = 0;
if (++i>=0xff) i=0X00;
}
}
//T/C1 溢出中断服务
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
OCR1A = i ;
OCR1B = i ;
}
void main(void)
{
DDRB=0x08; // PB3输出方式,作为OC0输出PWM波
PORTD=0x00;
DDRD=0x30;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000.000 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x69;
// TCNT0=0x00;
OCR0=128;
TIMSK=0x85; // 允许T/C0 T/C1 溢出中断
//T2 初始化
TCCR2=0x0B;
TCNT2=0X00;
OCR2=0X7C;
//T1 允许T/C1溢出中断
TCCR1A=0xA1;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GICR |= 0XC0; //使能 int0,INT1中断
MCUCR =0X0A;
GIFR = 0XC0;
#asm("sei") // 开放全局中断
while (1)
{
};
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|