Assembly 使用8位定时器的组装延迟
架构:ATmega8535 频率:1兆赫Assembly 使用8位定时器的组装延迟,assembly,timer,atmega,Assembly,Timer,Atmega,架构:ATmega8535 频率:1兆赫 ;Program to sequence LEDs on port C using the 8 bit Timer/Counter0 to generate an interrupt delay ;Stack and Stack Pointer Addresses .equ SPH =$3E ;High Byte Stack Pointer Address .equ SPL =$3D
;Program to sequence LEDs on port C using the 8 bit Timer/Counter0 to generate an interrupt delay
;Stack and Stack Pointer Addresses
.equ SPH =$3E ;High Byte Stack Pointer Address
.equ SPL =$3D ;Low Byte Stack Pointer Address
.equ RAMEND =$25F ;Stack Address
;Interrupt Control Addresses
.equ TIMSK =$39 ;Timer/Counter Interrupt Mask Address
;Timer Addresses for 8 bit Timer/Counter0
.equ TCCR0 =$33 ;Timer/Counter0 Control Register Address
.equ TCNT0 =$32 ;Timer/Counter0 Address
;Port Addresses
.equ PORTC =$15 ;Port C Output Address
.equ DDRC =$14 ;Port C Data Direction Register Address
;Interrupt Vector Addresses
.equ OVF0addr=$009 ;Overflow0 Interrupt Vector Address
;Register Definitions
.def leds =r0 ;Register to store data for LEDs
.def temp =r16 ;Temporary storage register
.def time =r18 ;Timer Counter
;Interrupt service vector
.org $0000
rjmp reset ;Reset vector
;Set interrupt vectors
.org OVF0addr
rjmp OVF0 ;Timer/Counter0 overflow vector
.org $0015 ;Program address
;Program Initialisation
;Set stack pointer to end of memory
reset: ldi temp,high(RAMEND)
out SPH,temp ;Load high byte of end of memory address
ldi temp,low(RAMEND)
out SPL,temp ;Load low byte of end of memory address
;Interrupt Initialisation
ldi temp,$01
out TIMSK,temp ;Timer/Counter0 overflow interrupt enable
;Initialise Timer/Counter0
ldi temp,$04
out TCCR0,temp ;Load Timer/Counter0 pre scalar = clock/256
rcall cntreset ;Set initial start value of counter
;Initialise output ports
ldi temp,$FF
out DDRC,temp ;Set Port C for output by sending $FF to direction register
;Initialise Main Program
sec ;Set carry to 1
clr leds ;Clear LEDs
sei ;Enable interrupts
;Main Program
loop: rjmp loop ;Repeat forever
cntreset:ldi time,$9C ;Start count from 156 to give a delay of 25.344 ms
out TCNT0,time ;Set Timer/Counter0 with start from count
ret
;Timer/Counter0 overflow Interrupt Service Routine
OVF0: rcall cntreset ;Set initial start counter
out PORTC,leds ;Display leds data on port C
rol leds ;Rotate leds left by 1 bit through carry flag
reti ;Return and enable interrupts again
在这段代码中,有一条注释从156开始计数,给出25.344 ms的延迟
我不知道如何计算25.344 TCCR0被设置为$04,因此定时器的预标量值被设置为256。这是8位定时器
如何从上述规范中获得25.344的延迟?您的问题是……?这是一个误算。它当然应该是
25.6ms
,也就是(256-156)*256 uS
。计时器中断发生在计数器溢出到0时,因此如果用255加载它,这是1步,因此用156加载是100步。