AtMega8515 4 MHz, timern går fel!
AtMega8515 4 MHz, timern går fel!
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:) )
-
- Inlägg: 516
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
Din AVR kör på 1 MHz. Därför får du ett delay som är fyra gånger större än om AVR:en hade körts på 4 MHz. Du kan som sagt ändra dessa oscillatorinställningar i ditt brännarprogram. Kolla under "System Clock and Clock Options" och "Memory Programming" i databladet för att luska ut vilka fuses som ska ändras. Säg till om det är något du inte förstår.
Jag är nästan säker på att du inte kan ange dessa inställningar direkt i källkoden. Du får istället hacka lite i Makefile:en för projektet om du vill att inställningarna ska knytas till projektet.
Jag är nästan säker på att du inte kan ange dessa inställningar direkt i källkoden. Du får istället hacka lite i Makefile:en för projektet om du vill att inställningarna ska knytas till projektet.
Använd RIKTIG timer
Använd en RIKTIG timer o inget "delaykrafs"...Underlåttar framför allt när man ska räkna ut interupttiden....Räkna så här: (1/(frekvens/prescal))*(FFFF-Timer_value)=tid_för_interupt ... För kod kolla avrbeginners.net
Okej, tack för alla tips!
Nu tror jag att jag hajar ska ställa om avr:en till extern kristall...
Har kollat upp i databladet som jag fick tips på och kom fram till att:
3-8MHz ska CKOPT = 1, CKSEL 3..1 = 111, CKSEL 0 = 0 (om extern kristall)
är det så här jag ska ställa in det då:
Nu Highfuse: D9 = 1101 1001
Mask Highfuse: xxx1 xxxx
Ny Highfuse: D9 = 1101 1001
Nu Lowfuse: E1 = 1110 0001
Mask Lowfuse: xxxx 1110
Ny Lowfuse: EE = 1110 1110
Är det bara till att programmera eller är det fel?
så fort jag har ställt om detta ska jag testa en riktig timer:)))
tack för all hjälp!
Nu tror jag att jag hajar ska ställa om avr:en till extern kristall...
Har kollat upp i databladet som jag fick tips på och kom fram till att:
3-8MHz ska CKOPT = 1, CKSEL 3..1 = 111, CKSEL 0 = 0 (om extern kristall)
är det så här jag ska ställa in det då:
Nu Highfuse: D9 = 1101 1001
Mask Highfuse: xxx1 xxxx
Ny Highfuse: D9 = 1101 1001
Nu Lowfuse: E1 = 1110 0001
Mask Lowfuse: xxxx 1110
Ny Lowfuse: EE = 1110 1110
Är det bara till att programmera eller är det fel?
så fort jag har ställt om detta ska jag testa en riktig timer:)))
tack för all hjälp!
Senast redigerad av Pean 5 september 2005, 21:14:50, redigerad totalt 1 gång.
CKSEL0 ska vara 1 om du har en kristall. Annars stämmer det nog. Du har inte skrivit med SUT1..0 heller. Den ska vara 11.
Så om jag har fått det rätt nu ska "Fuse Low Byte" ha värdet FF (hexadecimalt) (11111111 binärt). "Fuse High Byte" ska du inte ändra på.
Kontrollera så att värdet FF verkar rimligt, det är så lätt att man missar någon bit när man ska lägga ihop allt.
Så om jag har fått det rätt nu ska "Fuse Low Byte" ha värdet FF (hexadecimalt) (11111111 binärt). "Fuse High Byte" ska du inte ändra på.
Kontrollera så att värdet FF verkar rimligt, det är så lätt att man missar någon bit när man ska lägga ihop allt.