yang52523 发表于 2007-8-28 18:46:51

也是关天AVR定时器的问题---ATmega88的定时器T/C1

.include "m88def.inc"

.def count      = r18   ;循环计数单元

.def temp       = r19   ;临时变量

.def temp1      = r20   ;临时变量

.def temp_int   = r21   ;临时变量(中断使用)



.CSEG

.ORG $000

          RJMP RESET

.ORG $00B

      RJMP TIM1_COMPA

.ORG $01A

RESET:LDI R16,0x02;HIGH(RAMEND)   ;设置堆栈

      OUT SPH,R16

                LDI R16,0xFF;LOW(RAMEND)

                OUT SPL,R16

      

WDT_OFF:LDI TEMP,(0<<WDRF)

      OUT MCUSR,TEMP

                LDI TEMP,(1<<WDCE)|(1<<WDE)

                STS WDTCSR,TEMP

                LDI TEMP,(0<<WDE)

                STS WDTCSR,TEMP



MOVE_INTERRUPTS:

                LDI TEMP,(1<<IVCE)

                OUT MCUCR,TEMP

                LDI TEMP,(1<<IVSEL)

                OUT MCUCR,TEMP

   

RE:                SBIS PIND,5

                RJMP LOOP1

                SBIS PIND,6

                RJMP LOOP2

                SBIS PIND,7

                RJMP LOOP3

                SBIS PINB,0

                RJMP LOOP4

                SBIS PINB,1

                RJMP LOOP5

                SBIS PINB,2

                RJMP LOOP6

                SBIS PINB,3

                RJMP LOOP7

                SBIS PINB,4

                RJMP LOOP8

                SBIS PINB,5

                RJMP LOOP9

                SBIS PINC,0

                RJMP LOOP10

                SBIS PINC,1

                RJMP LOOP11

                SBIS PINC,2

                RJMP LOOP12

                SBIS PINC,3

                RJMP LOOP13

                SBIS PINC,4

                RJMP LOOP14

                SBIS PINC,5

                RJMP LOOP15

                RJMP RE                        

;主程序

MAIN:                   CLI

                CLR TEMP1

                LDI TEMP,0x01       

                STS OCR1AH,TEMP

                LDI TEMP,0x86

                STS OCR1AL,TEMP

                CLR TEMP

                STS TCCR1A,TEMP

                LDI TEMP,0x0D

                STS TCCR1B,TEMP       ;分频比1/1024

                LDI TEMP,0x02

                STS TIMSK1,TEMP

                     SEI

               

                   SBI DDRD,4

                   SBI PORTD,4   我完成的是一个15个按键的LED灯的闪烁,按键1闪烁一下;

LED1:            CPI TEMP1,0x02    依此类推,亮200ms,灭300ms

                   BRNE LED1      ;问题就出在这里啊,就在这里等待延时的时候程序总是复位

                CBI PORTD,4       不知是什么原因啦

LED0:   CPI TEMP1,0x05

      BRNE LED0               

                DEC COUNT

                BRMI RE

                RJMP MAIN

                                       

LOOP1:LDI COUNT,0

                RJMP MAIN

LOOP2:LDI COUNT,1

                RJMP MAIN

LOOP3:        LDI COUNT,2

                RJMP MAIN

LOOP4:        LDI COUNT,3

                RJMP MAIN

LOOP5:        LDI COUNT,4

                RJMP MAIN

LOOP6:        LDI COUNT,5

                RJMP MAIN

LOOP7:        LDI COUNT,6

                RJMP MAIN       

LOOP8:        LDI COUNT,7

                RJMP MAIN

LOOP9:        LDI COUNT,8

                RJMP MAIN

LOOP10:        LDI COUNT,9

                RJMP MAIN

LOOP11:        LDI COUNT,10

                RJMP MAIN

LOOP12:        LDI COUNT,11

                RJMP MAIN

LOOP13:        LDI COUNT,12

                RJMP MAIN

LOOP14:        LDI COUNT,13

                RJMP MAIN

LOOP15:        LDI COUNT,14

                RJMP MAIN





;T1时钟中断服务

TIM1_COMPA:

      in temp_int,sreg

      push temp_int         ;保护状态寄存器

   

      ldi r16,0x00          ;T1初始值设定,100ms中断一次

      ldi r17,0x00

      sts tcnt1h,r17

      sts tcnt1l,r16

   

      inc temp1         ;100ms计数器加一



      pop temp_int

      out sreg,temp_int   ;恢复状态寄存器

      reti                     ;中断返回



用的是M88的定时器1的CTC模式,问题就是上面写的那一步啊,不知什么原因总是到那一步就复位啊,期望马老师指导一下

yang52523 发表于 2007-8-28 18:51:10

还补充一下:JTAGICEmkII 的在线调试debug wire 方式,不知与这有没有关系啊

yang52523 发表于 2007-8-29 11:38:54

不好意思,大家,这个问题解决了,是看门狗造成的复位。



在等待延时的时候可以用WDR复位看门狗计数器,也可以在熔丝位设定时禁止看门狗!



多谢大家关心!
页: [1]
查看完整版本: 也是关天AVR定时器的问题---ATmega88的定时器T/C1