atmega128的多个定时不能同时工作吗???
最经想写一个程序就是要把所有的128的定时器用上,但是发现8位定时器和16位定时器无法同时工作,这是什么原因,其代码如下:#include<avr/io.h>
#include<avr/interrupt.h>
#ifndef uchar
#define uchar unsigned char
#endif
#define PWM_ddr DDRB
#define PWM_port PORTB
#ifndef uint
#define uint unsigned int
#endif
#define true 1
#define false0
volatile uint a=0,b=0,c=0;
#define LED_port PORTC
#define LED_ddr DDRC
#define LED_pin PINC
//输出波形
void TIMER1_init()
{
TIMSK = 0X00;
TCNT1H = 0x00;
TCNT1L = 0x00;
TCCR1A = 0xab;
TCCR1B = 0x09; //
TCCR1C=0X00;
OCR1A=0x0300; //OC1A 输出 75%占空比
OCR1B=0x0300; //OC1B 输出 75%占空比
OCR1C=0x0300;
}
//工作在定时方式
void TIMER3_init()
{
TCNT3H = 0x02; //定时溢满值是500US
TCNT3L = 0x0c; //所需值为524
TCCR3A = 0x00;
TCCR3B = 0x01;//1分频
TCCR3C = 0X00;
ETIMSK=0X04;
// ETIMSK |= (1<<TOIE3); //使能定时器3中断
}
//工作在定时方式
void TIMER0_init()
{
TCCR0=0x01;
TCNT0=0X7c; //定时溢出事件为100us
// ASSR=0x08; //外部TOSC1触发
TIMSK|=(1<<TOIE0);
}
//测速计数
void TIMER2_init()
{
TCNT2=0x00;
TCCR2=0x07; //外部时钟,上升沿
}
//测速计数
void INT0_init()
{
EICRA=0X03; //上升沿产生中断
EIMSK=0X01; //外部中断使能
}
void IO_init()
{
LED_ddr=0xFF;
LED_port=0xFF;
//DDRB=0XFF;
PWM_ddr|=(1<<PB5)|(1<<PB6)|(1<<PB7);
}
int main()
{
TIMER0_init();
TIMER1_init();
TIMER2_init();
TIMER3_init();
INT0_init();
IO_init();
sei();
while(1)
{
if(TCNT2==100)
{
TCNT2=0;
LED_port|=(1<<PC2);
}
if(c==100)
{
LED_port|=(1<<PC3);
c=0;
}
}
}
SIGNAL (TIMER3_OVF_vect)////定时溢满值是500US
{
cli();
TCNT3H=0X02;
TCNT3L=0X0c;
a++;
if(a==1000)
{
LED_port|=(1<<PC0);
}
else if(a==2000)
{
a=0;
LED_port&=~(1<<PC0);
}
sei();
}
SIGNAL (TIMER0_OVF_vect) ////定时溢出事件为100us
{
cli();
TCNT0=0X7C;
b++;
if(b==1000)
{
LED_port&=~(1<<PC1);
}
else if(b==2000)
{
b=0;
LED_port|=(1<<PC1);
//LED_port|=(1<<PC1);
}
sei();
}
SIGNAL (SIG_INTERRUPT0)
{
cli();
c++;
sei();
}
解释有问题,请高手回答!!!!!! AVR的各定时器之间呢都是独立的模块,都可以独立的工作,请查看相应的数据手册,查看是否配置错误。 squall45 发表于 2014-6-5 17:10
AVR的各定时器之间呢都是独立的模块,都可以独立的工作,请查看相应的数据手册,查看是否配置错误。 ...
thanks ,我在看一下!!!!
页:
[1]