Skumt problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Knoen
Inlägg: 103
Blev medlem: 11 oktober 2006, 08:50:57
Ort: Örebro

Skumt problem

Inlägg av Knoen »

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é?
DragonOrb
Inlägg: 381
Blev medlem: 16 oktober 2003, 21:57:19
Ort: Flen

Inlägg av DragonOrb »

Hur har du det med kondensatorer på matningsspänningen ?
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Kan du visa/beskriva mer ingående hur din inkoppling ser ut. Typ av strömförsörjning, typ av oscillator, kopplingsdäck, kod m.m.
Knoen
Inlägg: 103
Blev medlem: 11 oktober 2006, 08:50:57
Ort: Örebro

Inlägg av Knoen »

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?
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

> Har ingen kondensator på matspänningen. Är det rekomenderat att ha det?

Absolut, sätt en 100nF keramisk så nära VCC/GND-benen som möjligt!
Knoen
Inlägg: 103
Blev medlem: 11 oktober 2006, 08:50:57
Ort: Örebro

Inlägg av Knoen »

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
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

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*
Knoen
Inlägg: 103
Blev medlem: 11 oktober 2006, 08:50:57
Ort: Örebro

Inlägg av Knoen »

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 :(
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

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.
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
Inlägg: 103
Blev medlem: 11 oktober 2006, 08:50:57
Ort: Örebro

Inlägg av Knoen »

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?
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Jo, om osccal är korrekt och clkdiv inte är satt så.

Kan du ta och kommentera bort alla timrar och all kod. Sedan bara skriva en evighetsloop som bara togglar en I/O, och kolla på den mha ett oscilloskåp.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Går ju enkelt att köra i simulatorn och kolla hur lång tid det tar om man är osäker.
Knoen
Inlägg: 103
Blev medlem: 11 oktober 2006, 08:50:57
Ort: Örebro

Inlägg av Knoen »

Har tyvärr inget oscilloskåp :wall:.

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.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

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 ^^
Skriv svar