Med denna kod var tanken att få ett interrupt varje 100us. Dock så ger den interrupt om 500us. Värdet som sätts i set_timer0() spelar inte heller någon roll för interrupt tiden, så något är inte riktigt som det borde...
Nu vet jag inte alls vad dessa C-funktioner du anropar gör, men om jag gissar lite så tycker jag det ser ut som du bara laddar in värdet 220 en gång i timern. Så första timer-interruptet borde komma efter 35 cykler och resten med 255 cycklers mellanrum.
255 cykler med 4MHz klocka är 255us, så det stämmer inte riktigt heller.
Testa att ha set_timer0(155) i clock()
Du måste alltså ladda in ett värde i timer0 efter varje interrupt om du vill ha en annan period än 255 på timern. Om nu inte kompilatorn gör det åt dig eller så förstås...
Med denna kod får jag nu interrupter efter 100us. Men det är efter att jag har testat mig fram till vilket värde man ska ha i set_timer0(). Med 192 så blev det perfekt. Men det borde ju bli 156 om man räknar på det:
Kanske helt enkelt för att nästa interrupt kommer X cykler efter du laddat värdet i timer-registert, *inte* X cyckler efter det förra interruptet.
Har du titta på assembler-koden som din kompilator genererar? Förmodligen har den så mycket overhead att det tar ~36 cykler från att interruptet kommer tills värdet (192) skrivs in i timer-registret.
Klart, även om man skriver i assembler så tar det några cykler som man får kompensera för, timern fortsätter ju att ticka på 0,1,2,3... osv Bäst är helt enkelt att *addera* det värdet man vill lägga in istället.
Alltså har man ADDWF TMR0 istället för MOVWF TMR0 i sin kod!
Det finns inte någon add_timer0() funktion eller så?
Har nu även provat med timer1 och den ger snarlika fel som man får kompensera för genom att prova sig fram. Det blev ett fel på 41 tick (För 100us ville timer1 ha 65476 istället för 65435 som miniräknaren ville ha).
Antar att det är som cyr säger att det går åt lite instruktioner för att gå in i interruptet. Att titta på assembler koden säger mig inte mycket, tyvärr
Nån add_timer finns ej.
Tur man har oscilloskop för att kontrollera timern annars hade det blivi klurigt...