/*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);
|