AtMega8515 4 MHz, timern går fel!

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Pean
Inlägg: 36
Blev medlem: 31 juli 2005, 16:04:13
Ort: Göteborg

AtMega8515 4 MHz, timern går fel!

Inlägg av Pean »

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:) )
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Har du valt att den ska köra på den extärna oscillatorn? (väljs när man programmerar kretsen). (minns inte ens om den har intärn oscillator, men är ju vanligt numera)
Användarvisningsbild
Pean
Inlägg: 36
Blev medlem: 31 juli 2005, 16:04:13
Ort: Göteborg

Inlägg av Pean »

går det göra som pic att man skriver lite i början av programmet...

jag har avrdude och en stk200 klon e lite osäker hur man gör.
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

I de program jag använt ska man göra det vid bränningen, alltså inte via koden, men det kanske kan går det med, säkert någon som vet här på forumet...
henkebenke
Inlägg: 516
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

För det första så använder du ingen timer. För det andra, hur har du räknat ut tiden? Instruktioner som rjmp, ret och brne tar mer än en klockcykel.
Användarvisningsbild
Pean
Inlägg: 36
Blev medlem: 31 juli 2005, 16:04:13
Ort: Göteborg

Inlägg av Pean »

timer har ju prescaler men det e nästa steg en sak i taget:)
ja jag vet att de tar mer än en klockcykel rcall tar väl 4, ret tar 4, rjmp tar 2 klokcykler det är det jag har räknat med.

timer eller delay du fattar ju vad jag menar...

tala om hur man gör istället:)
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

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.
Oscar
Inlägg: 29
Blev medlem: 12 april 2005, 23:16:49
Ort: Finnerödja

Använd RIKTIG timer

Inlägg av Oscar »

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
Användarvisningsbild
Pean
Inlägg: 36
Blev medlem: 31 juli 2005, 16:04:13
Ort: Göteborg

Inlägg av Pean »

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!
Senast redigerad av Pean 5 september 2005, 21:14:50, redigerad totalt 1 gång.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

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.
Användarvisningsbild
Pean
Inlägg: 36
Blev medlem: 31 juli 2005, 16:04:13
Ort: Göteborg

Inlägg av Pean »

ja det verka stämma men vad är skillnaden mellan SUT 11 och SUT 10

blir det stabilare start om jag tar det 65ms istället för 4.1ms

nu ska jag testa att bränna...

Bränt nu, ser man på det funkar!!!
Tack för hjälpen än en gång!
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Jag antar att vissa kristaller tar längre tid på sig att börja svänga än andra. Någon annan här vet säkert mer om det.
DupeS
Inlägg: 90
Blev medlem: 30 september 2003, 18:27:39
Ort: Linköping

Inlägg av DupeS »

man kan använda 65ms så vet man att kristallen hinner stabilisera sig samt att spänningen hinner upp till den nivå som ska vara, beror lite på vad man använder för kretsar.
Jag brukar köra med 65ms. det gäller ju bara uppstarten.
Skriv svar