Skumt problem
Skumt problem
Jag har ett "lite" skumt problem. Har micklat med Timer0 på en Tiny15. Jag ville ha en lampa blinkande och det har jag fått...ibland.
Det verkar vara helt slumpmässigt om det fungerar eller inte. Om jag har den igång och sedan stänger av min transformator som lämnar ström till kretsen och sedan startar den igen. Så kan led:en blinka mycket snabbare nästa ggn. Eller så lyser den med fast sken. Stänger jag av igen och sedan startar så kan det vara normal hastighet. Varje gång jag stänger av transformatorn till kretsen så ändrar den "karaktär". Kan detta ha med att göra att den långsamt stryper strömmen?
Det verkar nämligen inte bli samma problem om jag helt enkelt drar ut kontakten ur kretsen så strömmen bryts omedelbart.
Någon idé?
Det verkar vara helt slumpmässigt om det fungerar eller inte. Om jag har den igång och sedan stänger av min transformator som lämnar ström till kretsen och sedan startar den igen. Så kan led:en blinka mycket snabbare nästa ggn. Eller så lyser den med fast sken. Stänger jag av igen och sedan startar så kan det vara normal hastighet. Varje gång jag stänger av transformatorn till kretsen så ändrar den "karaktär". Kan detta ha med att göra att den långsamt stryper strömmen?
Det verkar nämligen inte bli samma problem om jag helt enkelt drar ut kontakten ur kretsen så strömmen bryts omedelbart.
Någon idé?
Oscillator används den interna, alltså ingen extern alls. Reset är kopplad till +5v med en 100k resistor mellan.
har läst någonstans att det behövs en Reset-on start efter att spänningskällan stabiliserat sig lite. Kanske har det med att göra?
Har ingen kondensator på matspänningen. Är det rekomenderat att ha det?
har läst någonstans att det behövs en Reset-on start efter att spänningskällan stabiliserat sig lite. Kanske har det med att göra?
Har ingen kondensator på matspänningen. Är det rekomenderat att ha det?
Ok då ska jag fixa till det. Jag verkar ha löst problemet med att det blir olika resultat i alla fall. Det var brown out detection som inte var aktiverat.
Nu verkar det dock som om jag inte kan köra klockan i något annat läge än full fart. Om jag sätter en prescale på 1024 så lyser den konstant och om jag kör snabbaste läget så blinkar den som den ska.
Meningen är att den ska blinka när jag kör i 1024-läge. Jag har satt prescale till 1024 samt satt två register att räkna från noll till 1562 vilket borde bli en sekund med 1,6Mhz. Stämmer?
Det borde innebära att om jag kör den för fullt dvs 1,6 miljoner tics på en sekund borde räknaren nå 1562 på bara 9,8*10^(-4) sekunder är förmodligen för snabbt för att lampan ska hinna skifta läge?
Vad har jag gjort för fel? Jag postar lite av koden här. Hoppas någon kan se min tabbe
; PREscale 1024
LDI R16, 0b00000101
OUT TCCR0, R16
; Använd timer0
LDI R16, 2
OUT TIMSK, R16
; Portb as output
LDI R16, 0xFF
OUT DDRB, R16
; PIN2 on PORTB on
LDI R16, 0b00000010
OUT PORTB, R16
SEI
ISR:
LDI R23,0xFF
CP R20, R23 ;IF R20 = 256 then -> goto INC highcount
BREQ HiCount
INC R20
RJMP Compare;
;00000110 HI ; hi + low = 1562 = one second when prescale = 1024 @ 1,6Mhz
;00011010 LOW
HiCount:
INC R21 ; Öka R21, ingen overflow koll behövs. Denna ska aldrig vara i närheten att slå runt
LDI R20, 0x00
Compare:
LDI R23,0b00000110
CP R21, R23
BRNE EXIT
LDI R23,0b00011010
CP R20, R23
BREQ Lights ; till att tända eller släck lampor
Nu verkar det dock som om jag inte kan köra klockan i något annat läge än full fart. Om jag sätter en prescale på 1024 så lyser den konstant och om jag kör snabbaste läget så blinkar den som den ska.
Meningen är att den ska blinka när jag kör i 1024-läge. Jag har satt prescale till 1024 samt satt två register att räkna från noll till 1562 vilket borde bli en sekund med 1,6Mhz. Stämmer?
Det borde innebära att om jag kör den för fullt dvs 1,6 miljoner tics på en sekund borde räknaren nå 1562 på bara 9,8*10^(-4) sekunder är förmodligen för snabbt för att lampan ska hinna skifta läge?
Vad har jag gjort för fel? Jag postar lite av koden här. Hoppas någon kan se min tabbe

; PREscale 1024
LDI R16, 0b00000101
OUT TCCR0, R16
; Använd timer0
LDI R16, 2
OUT TIMSK, R16
; Portb as output
LDI R16, 0xFF
OUT DDRB, R16
; PIN2 on PORTB on
LDI R16, 0b00000010
OUT PORTB, R16
SEI
ISR:
LDI R23,0xFF
CP R20, R23 ;IF R20 = 256 then -> goto INC highcount
BREQ HiCount
INC R20
RJMP Compare;
;00000110 HI ; hi + low = 1562 = one second when prescale = 1024 @ 1,6Mhz
;00011010 LOW
HiCount:
INC R21 ; Öka R21, ingen overflow koll behövs. Denna ska aldrig vara i närheten att slå runt
LDI R20, 0x00
Compare:
LDI R23,0b00000110
CP R21, R23
BRNE EXIT
LDI R23,0b00011010
CP R20, R23
BREQ Lights ; till att tända eller släck lampor
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
Knoen: Lite att läsa:
http://www.atmel.com/dyn/resources/prod ... oc1619.pdf
http://www.atmel.com/dyn/resources/prod ... oc2521.pdf
Lycka till!!
http://www.atmel.com/dyn/resources/prod ... oc1619.pdf
http://www.atmel.com/dyn/resources/prod ... oc2521.pdf
Lycka till!!
Ska lysdioden vara tänd 1s, släkt 1s....?
Togglar du utgången vid matchning?
Använder du interrupt?
Jag tänkte om det var så att den tänds när räknaren börjar från 0, och släcks när räknaren matchar compareregistret men att den samtidigt börjar om från 0(vilket tänder den). *Suck, jag borde verkligen lära mig asm*
Togglar du utgången vid matchning?
Använder du interrupt?
Jag tänkte om det var så att den tänds när räknaren börjar från 0, och släcks när räknaren matchar compareregistret men att den samtidigt börjar om från 0(vilket tänder den). *Suck, jag borde verkligen lära mig asm*
MicaelKarlsson -> Tack det verkar finnas mycket nyttigt att läsa där. Jag ska ge mig på det 
Stinrew -> Japp så är det tänkt. Jag använder timer0 overflow interupt för att öka två register som jag hanterar själv (R20, R21). Dvs när det sker ett interupt för overflow så kollar jag av R20 om den är lika med 0xFF om inte så räkas den upp.
Skulle den vara 0xFF så sätter jag den till noll och ökar R21 istället. Efter det så kollar jag båda registren om de tillsammans är 1562.
Om de är det så hoppar den till Lights: och kör koden där.
Det verkar inte som om det är det som är felet dock. Jag har låtit processen köra i flera minuter och det verkar som om den är korrekt bara det att det tar evigheter i stället för en sekund

Stinrew -> Japp så är det tänkt. Jag använder timer0 overflow interupt för att öka två register som jag hanterar själv (R20, R21). Dvs när det sker ett interupt för overflow så kollar jag av R20 om den är lika med 0xFF om inte så räkas den upp.
Skulle den vara 0xFF så sätter jag den till noll och ökar R21 istället. Efter det så kollar jag båda registren om de tillsammans är 1562.
Om de är det så hoppar den till Lights: och kör koden där.
Det verkar inte som om det är det som är felet dock. Jag har låtit processen köra i flera minuter och det verkar som om den är korrekt bara det att det tar evigheter i stället för en sekund

Fråga? Med vilken frekvens blinkar den med prescalern satt till 1? Om du kan se att den blinkar då borde den väl blinka <20hz(bara en gissning), om du då med alla andra parametrar konstanta ändrar prescalern till /1024 då kommer den ju att blinka 1024ggr långsammare. 1024/20=51.2. Alltså det kommer att ta dryga 50 sekunder innan du ser någon växling. Är det något jag har missat??Knoen skrev:Om jag sätter en prescale på 1024 så lyser den konstant och om jag kör snabbaste läget så blinkar den som den ska.
Nej du har helt rätt det är bara det att det snabbaste läget borde vara så snabbt att det är omöjligt att få lampan att hinna reagera. Om jag räknar från 0 till 1562 när vi kör i 1,6Mhz och prescale till noll borde inte hela förloppet gå enormt fort då? 1562/1600000 sekunder.
Men om jag sätter prescale till 1024 då borde processorn i stället för att räkna varje klockcykel bara räkna var 1024:e. Och då borde lampan blinka en gång varje sekund om jag räknat rätt.
Det som förbryllar mig är att det snabbaste läget är så långtsamt. Jag måste ha gjort en rejäl tabbe någonstans
Eller resonerar jag helt fel nu?
Men om jag sätter prescale till 1024 då borde processorn i stället för att räkna varje klockcykel bara räkna var 1024:e. Och då borde lampan blinka en gång varje sekund om jag räknat rätt.
Det som förbryllar mig är att det snabbaste läget är så långtsamt. Jag måste ha gjort en rejäl tabbe någonstans

Eller resonerar jag helt fel nu?
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Har tyvärr inget oscilloskåp
.
Har provat att köra det i simulatorn men har hört att resultatet inte är tillförlitligt eftersom AVR Studio har bekymmer med att simulera timers. Eller har jag fattat det hela fel? Där sätter den dock alla bitar rätt. Men det tar tid där också.
clkdiv? vart kan man hitta det? hittar inget om det i databladet för Tiny15.

Har provat att köra det i simulatorn men har hört att resultatet inte är tillförlitligt eftersom AVR Studio har bekymmer med att simulera timers. Eller har jag fattat det hela fel? Där sätter den dock alla bitar rätt. Men det tar tid där också.
clkdiv? vart kan man hitta det? hittar inget om det i databladet för Tiny15.
Det är bara 16bits timmers som har problem med AVR studio, efter som tiny15 bara har 8bitars timmer så är det inget problem.
Men det jag undrar är om du har BOR aktiverat.
Och varför bara posta lite av koden?
Exempel du saknar hoppet till interupt vektorn. och vad den gör i huvud loopen..
koden känns ganska ofullständigt. vilket gör det lite svårt att fel söka.
Så om du postar koden (gärna med [code] [/code] tagarna för att den ska vara lättare att läsa) kannse jag kan ge ett bättre svar ^^
Men det jag undrar är om du har BOR aktiverat.
Och varför bara posta lite av koden?
Exempel du saknar hoppet till interupt vektorn. och vad den gör i huvud loopen..
koden känns ganska ofullständigt. vilket gör det lite svårt att fel söka.
Så om du postar koden (gärna med [code] [/code] tagarna för att den ska vara lättare att läsa) kannse jag kan ge ett bättre svar ^^