请帮我分析一下Mega48的T1定时940us的程序
程序如下,仿真结果,刚跳入中断程序超出1.25us,后面的中断进入均多出0.12或0.13us,请大侠提供案例程序,谢谢!.equ fosc = 8 ; FOSC=8.0 MHz
.equ t1_940us= 940 ; time for pre_Vpp
.equ t1_940init= (t1_940us-1)*8
.def timer1_count=R19
.INCLUDE "m48def.inc"
.ORG $000 ;精确定时产生秒号
STRT25: RJMP RST25
.ORG $00b ;T1 Capture / CTC mode
RJMP T1_OVFB ;4000133=62*65536-63099=62*$10000-$F67B/故TCC=$F67B
.ORG $01b
RST25:LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
LDI R16,$00 ;000->T/C停止
STS TCCR1B,R16
LDI R16,$02 ;
STS TIMSK1,R16 ;允许T/C1的A匹配中断:
LDI R16,$00
STS TCNT1H,R16 ; C/T1从0开始
STS TCNT1L,R16
LDI R16,HIGH(t1_940init)
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_940init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
;STS TCCR1A, $00 ; COM1A1/COM1A0/COM1B1/COM1B0/-/-/WGM11/WGM10 (默认值:00H)
LDI R16,0b00001001;不分頻
;运行到此处为4.75us
STS TCCR1B,R16 ; ICNC1/ICES1/-/WGM13/WGM12/CS12/CS11/CS10
;WGM13, WGM12, WGM11, WGM10 = 0100 -> CTC模式(MAX=OCR0A)
;CS12,CS11,CS10 = 001 -> Fosc/1 (无分频,000->T/C停止) ;
SEI ;
HH1B: RJMP HH1B ;等待中断
;*************** 中断服务程序区 ***************************
T1_OVFB:LDI R16,HIGH(t1_940init);第一次进入中断为945us(实际定时为946-4.75=941.25us),为什么多出1.25us
;第二次进入中断为1886.13us(实际定时为1886.13-946=940.13us),为什么多了0.13us
;第三、四、....的时间差均为940.13或940.12us,难道就没有精确的定时设置么?
STS OCR1AH,R16 ;写入OCR1A高8位
LDI R16,LOW(t1_940init) ;
STS OCR1AL,R16 ;写入OCR1A低8位
RETI 对了,上述的宏定义如下,仿真结果如上面的解析,我真不知道如何去设置精确定时,请帮忙
.equ t1_940init= t1_940us*8 你自己先介绍一下你的设计理念和计算过程吧,如果你自己讲不清楚,请先仔细学习AVR定时器的使用. 回复:【2楼】 machao 老师--你自己先介绍一下你的设计理念和计算过程吧,如果你自己讲不清楚,请先仔细学习AVR定时器的使用.
本人想输出阶段性的方波(如:1(940us)-> 0(20us) -> 1(1080us) -> 0(50us)-> 1(940us)...,所以需要较精确的定时,请马老师如何对那个T/C1进行初始化?谢谢! 如果采用4M系统时钟(要外接4M晶体),定时器计数脉冲为1分频,那么一个时钟脉冲宽度为0.25us.
T/C1工作在比较匹配触发输出方式,在每次的比较匹配中断中改变比较匹配寄存器的值,顺序如下:
1(3758) -> 0(79) -> 1(4319) -> 0(199) -> 1(3758)......
肯定100%的精确.
如果还不明白,认真学习打基础吧. 谢谢您!马老师
页:
[1]