也是关天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模式,问题就是上面写的那一步啊,不知什么原因总是到那一步就复位啊,期望马老师指导一下 还补充一下:JTAGICEmkII 的在线调试debug wire 方式,不知与这有没有关系啊 不好意思,大家,这个问题解决了,是看门狗造成的复位。
在等待延时的时候可以用WDR复位看门狗计数器,也可以在熔丝位设定时禁止看门狗!
多谢大家关心!
页:
[1]