手册上说CCU timer 可以随时读写,写入的值在预分频器溢出后有效。 并且写入时先TH2,后TL2 ,读取时先TL2后TH2. 写了一个验证程序,先向TH2,TL2写入一个值,再读出验证,通过串口打印出来 在KEIL下仿真,一切正常.实际烧片测试,发现TH2,TL2经常不能更新。
代码摘录如下 #include <Philips
eg932.h> #include <stdio.h> #pragma ot(0) //取消任何优化
void CCUCaptureInt(void);
void CCUInt(void) interrupt 11 //CCU工作在普通模式(捕获有效) { unsigned char inttype; inttype=TISE2; if(inttype==CAPTUREA_INT) //捕获中断 CCUCaptureInt(); TIFR2=0x00; //清除中断标志 }
void CCUCaptureInt(void) { unsigned char i,tl,th; TH2=0x00; TL2=0x00; for(i=0;i<100;i++); //稍做延时 TIMER2溢出时间为53ms //经过这个延时 Timer2的计数值理论上不会超过0x6000 tl=TL2; //读出以便验证 th=TH2; printf("
th:%bu,tl:%bu",th,tl); while(1); //终止程序 }
void main(void) { P2M1=0x00; //端口配置 P2M2=0x00; P1M1=0x00; P1M2=0xf1; TPCR2H=0; //CCU分频器配置,内部RC振荡器计时周期为53ms TPCR2L=2; CCCRA=0x08; //CCU捕获置为下降沿触发 TCR20=0x01; //CCU开始计数 ECCU=1; //使能ECCU中断 TICR2=0x01; //使能捕获通道A中断 BRGR0=48; //7.373MHZ 约115200Bps BRGR1=0; BRGCON=0x03; //打开波特率发生器并连接 SCON=0x52; EA=1; P2=0xff; while(1); }
|