Jag har mina synk-pulser, de kommer med 100Hz som de ska och jag har startat Timer 1 & 3. Timer 3 är tänkt som mättimer, den används till att hålla reda på tiden mellan Synk-pulserna, därmed kompenseras för den interna oscillators drift. Jag använder den oversampling-rutin som jag lärde här och den fungerar skitbra!
Count mellan pulserna hamnar på 40k och varierar lite med temperaturen på kretsen, helt OK med andra ord.
Detta värde använder jag sedan till all annan timing och där kommer problemet. Jag delar först Count med 3 för att dela upp i de 3 faser, det ger alltså ett värde runt 13360 och varierar med det exakta Count.
Sedan räknar jag ut vad värdet för den givna procentsats för fördröjningen är.
Dessa värden sparas i minnet som 16 bitars unsigned.
Sedan laddar jag Timer 1 med värdet som anger fördröjningen när det kommer en Sync-puls. När Timer 1 overflower ger den en interrupt vilket laddar den med värdet för fasförskjutningen osv.
För tillfället ger den enbart en interrupt första gången efter en Synk-laddning, det gör det enklare och tydligare att se på oscilloskopet.
Jag skriver ut värden via serieporten, fungerar perfekt. MEN delayen fungerar dåligt! Alltså får man kolla mer noga och nu har jag sett att det inte fungerar att skriva till Timer 1!
Det jag gör är:
Kod: Markera allt
ISR:
...
TMR1 = Delay_Start;
... (ett par instruktioner)
Read = TMR1;
'Read' använder jag för att kontrollera värdet som TMR1 har och nu kommer problemet: Timer 1 får bara lägsta byten! MSB är konsekvent 0!
Initieringen då?
Kod: Markera allt
void Initiate_Timers(void)
{
TMR1MD = false; // Timer 1 power on
T1CON = 0x03; // Fosc/4, 1:1, 16-bit RW, Run
TMR1 = 0;
TMR1IF = false; // Kill any residual interrupt
TMR1IP = true; // High interrupt priority
TMR1IE = true; // Enable interrupt
TMR3MD = false; // Timer 1 power on
T3CON = 0x03; // Fosc/4, 1:1, 16-bit RW, Run
TMR3 = 0;
TMR3IF = false; // Kill any residual interrupt
TMR1IP = false; // High interrupt priority
TMR1IE = false; // Do not allow for interrupt
}
Men själva timern fungerar och räknar runt med rätt intervall så MSB fungerar som sådan, bara inte när jag ska ladda den med ett värde.
Och värdet på MSB är verkligen 0x00 när jag har skrivit till den, det syns på fördröjningen.
Jag har testat att stoppa Timer 1, skriva värdet och sedan starta den igen - men det fungerar inte!
Så vad tusan har jag översett?
PIC'en har inte varit använd till annat än detta, den har inte varit utsatt för några otrevligheter och allt anat fungerar bra.