/*AVR定时器1CTC模式A实验 天津第四项目部宿舍 */
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b) a|=(1<<b)
#define clr_bit(a,b) a&=(1<<b)
#define get_bit(a,b) a&(1<<b)
uint i;
#pragma interrupt_handler time1ctc_a_isr:7
void time1ctc_a_isr()//定时计数器1CTC中断A通道
{
PORTC^=0x20;//输出方波T=8*2=16毫秒
}
#pragma interrupt_handler time1ctc_b_isr:8
void time1ctc_b_isr()//定时计数器1CTC中断B通道
{
PORTC^=0x04;//输出方波T=8*2=16毫秒
}
void int_time1ctc_a_b()//定时器1设置初始化
{
SREG=0x80;//开启全局中断
TCNT1=0;//这里我采用RC震荡8M时钟,1024分频,一个数是7.8125微秒
TCCR1A=0x40;//工作在CTC模式,开启A通道,关闭B通道,在外部引脚OC1A/OC1B体现为取反事件,
TCCR1B=0x0D;//CTC模式,内部8M1024分频,
OCR1A=6000;//CTC精度A通道
/*在这里一定要注意A通道和B通道不能同时开启,否则有两种情况,第一OCR1A>OCR1B时出现很不正常的现象,两个中断好像都发生了*/
/*怎么可能呢,当TCNT1=OCR1A时就会吧TCNT1清零,也就是说OCR1B永远不会触发中断,但是他的引脚确实是动了,而且与A通道的正好相反,*/
/*是什么原因?我分析过,但是无果,所以要注意AB通道同时开启的后果是不可知的,还有一种情况就是OCR1A<OCR1B,这种情况就和我分析的*/
/*一样了,OCR1A中的中断永远不会执行,只会执行OCR1B的中断,因为他要比前者小,还有几次输出为高电平,所以我认为在同时开启AB通道时是不稳定的,*/
/*第一种原因真是令人费解!!!!!!20110418 */
TIMSK=0x10;//开启定时器比较匹配输出A通道中断
}
void main()
{
DDRD=0xff;
DDRC=0xff;
PORTC=0;
int_time1ctc_a_b();
while(1);
|