southtiger 发表于 2008-3-3 22:08:06

请帮我分析一下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

southtiger 发表于 2008-3-3 22:11:25

对了,上述的宏定义如下,仿真结果如上面的解析,我真不知道如何去设置精确定时,请帮忙

.equ    t1_940init= t1_940us*8

machao 发表于 2008-3-4 00:11:24

你自己先介绍一下你的设计理念和计算过程吧,如果你自己讲不清楚,请先仔细学习AVR定时器的使用.

southtiger 发表于 2008-3-5 08:54:06

回复:【2楼】 machao 老师--你自己先介绍一下你的设计理念和计算过程吧,如果你自己讲不清楚,请先仔细学习AVR定时器的使用.
本人想输出阶段性的方波(如:1(940us)-> 0(20us) -> 1(1080us) -> 0(50us)-> 1(940us)...,所以需要较精确的定时,请马老师如何对那个T/C1进行初始化?谢谢!

machao 发表于 2008-3-5 18:03:21

如果采用4M系统时钟(要外接4M晶体),定时器计数脉冲为1分频,那么一个时钟脉冲宽度为0.25us.

T/C1工作在比较匹配触发输出方式,在每次的比较匹配中断中改变比较匹配寄存器的值,顺序如下:

1(3758) -> 0(79) -> 1(4319) -> 0(199) -> 1(3758)......

肯定100%的精确.

如果还不明白,认真学习打基础吧.

southtiger 发表于 2008-3-5 20:55:35

谢谢您!马老师
页: [1]
查看完整版本: 请帮我分析一下Mega48的T1定时940us的程序