AtMega8515 4 MHz, timern går fel!
Postat: 4 september 2005, 14:40:24
Hej!
Jag har precis börjat med Avr och har lite problem med en timer... lite newbie kod:)
Jag hade tänkt att att lysdioden på Pin01 ska blinka med ca en 1000 ms. Jag har kopplat en extern kristall med 4MHz till avr:en
använder följade kod i AVRStudio4:
include "m8515def.inc" ;Includes the 8515 definitions file
.def Stack = R16
.def On = R17 ;Defines On
.def Off = R18 ;Defines Off
.equ TIME = $2710 ;10 000ggr i ytter loop
.org 0x0000 ;Places the following code from address 0x0000
rjmp RESET ;Take a Relative Jump to the RESET Label
RESET: ;Reset Label
ldi Stack,high(RAMEND) ;init the stack
out SPH, Stack
ldi Stack,low(RAMEND)
out SPL, Stack
ldi On, 0xFF
out DDRB, On
ldi On, 0x01
ldi Off, 0x00
Loop:
out PORTB, On ;Writes pin1 high to PORTB
rcall Delay ;Goto subroutine Delay
out PORTB, Off
rcall Delay
rjmp Loop
;Delay in 1sec
Delay:
ldi ZH,HIGH(TIME)
ldi ZL,LOW(TIME)
rjmp Delay_ytter
Delay_inner:
nop
dec r20
brne Delay_inner
Delay_ytter:
ldi r20,0x64
sbiw ZL,1
brne Delay_inner
ret
-------------------------------------------
Enligt mej så ska ju detta delay ta ca 1,00490275 s men inte i verkligheten...
Lysdioden blinkar men med ca 3-4 sekunders intervall istället för 1 sekunders intervall
Vad har jag gjort för fel? (Har funderat på detta i två dar nu:) )
Jag har precis börjat med Avr och har lite problem med en timer... lite newbie kod:)
Jag hade tänkt att att lysdioden på Pin01 ska blinka med ca en 1000 ms. Jag har kopplat en extern kristall med 4MHz till avr:en
använder följade kod i AVRStudio4:
include "m8515def.inc" ;Includes the 8515 definitions file
.def Stack = R16
.def On = R17 ;Defines On
.def Off = R18 ;Defines Off
.equ TIME = $2710 ;10 000ggr i ytter loop
.org 0x0000 ;Places the following code from address 0x0000
rjmp RESET ;Take a Relative Jump to the RESET Label
RESET: ;Reset Label
ldi Stack,high(RAMEND) ;init the stack
out SPH, Stack
ldi Stack,low(RAMEND)
out SPL, Stack
ldi On, 0xFF
out DDRB, On
ldi On, 0x01
ldi Off, 0x00
Loop:
out PORTB, On ;Writes pin1 high to PORTB
rcall Delay ;Goto subroutine Delay
out PORTB, Off
rcall Delay
rjmp Loop
;Delay in 1sec
Delay:
ldi ZH,HIGH(TIME)
ldi ZL,LOW(TIME)
rjmp Delay_ytter
Delay_inner:
nop
dec r20
brne Delay_inner
Delay_ytter:
ldi r20,0x64
sbiw ZL,1
brne Delay_inner
ret
-------------------------------------------
Enligt mej så ska ju detta delay ta ca 1,00490275 s men inte i verkligheten...
Lysdioden blinkar men med ca 3-4 sekunders intervall istället för 1 sekunders intervall
Vad har jag gjort för fel? (Har funderat på detta i två dar nu:) )