När jag sitter vid terminalpogrammet och klockar 20 st "x" så får jag ~17,5 sekunder istället för 20 som det borde vara! Såvitt jag förstått ska man få overflow 72000 ggr i sekunden @ 20MHz Är den siffran fel? Det är ju ändå hela 12,5% fel (vilket ger 81000Hz).
Skall det vara en klocka? Behöver Du bara en sekunds upplösning och det inte gör något med lite gitter så dra ner interruptfrekvensen till c:a 5/s. Du bränner av massor av CPU på ingenting, speciellt som det är s.k. högnivåspråk Du använder. Du kan få hur hög precision som helst även vid denna låga frekvens.
Um, ja så blir det förstås. Iom att du använder overflow-interruptet får du automagiskt division med 256 (8-bitars timer), men uträkningen är fel iaf. ska vara 78.... som jag skrev.
Annars tycker jag du ska göra såhär:
Använd timer1 och aktivera compare match-interruptet. Ställ in prescalern på 512 eller 1024 (beroende på vad som finns, kommer inte ihåg om 512 finns) och ladda compare-registret med 19531. Du får då en match ungefär varje sekund. Felet blir nånstans i storleksordningen 1,3 sekunder per 28 timmar. Räcker den noggrannheten blir det bra, annars får du ta till andra lösningar, typ mata in korrektion i overflow-interruptet (+1 var fjärde varv)
Dela ner så du matchar i typ 5000 Hz eller så då, (prescaler 1 värde 4000) så får du compare match i 5000 Hz och då kan du köra varannan så blir det 2500 Hz och var tionde för 500 Hz. Då blir det dessutom exakt.
Koden i ditt första inlägg kan vara dålig, inte så konstigt om tajmingen int stämmer. Hur är funktionen " USART_Transmit()" konstruerad? Om funktionen tar mer än, låt säga 150 instruktioner, så kan interrupten ta längre tid än timern tar på sig att räkna ner. På så sätt kan du lätt missa massa räknande på countern.
JBV skrev:Aha, då är det "AVR App" som driver med mig hehe. Jag har valt prescaler 1 och får: TCCR2B |= _BV(CS20); och overflow freq: 72000.00 Hz för 20Mhz
Gäller väl att klura ut hur man ställer in prescale korrekt då!
Med "AVR App" syftar du då på mitt program "AVR Wizard"?