Klocka av PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7461
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Principen är densamma, ursprungligen var det för linjer på plotters. De kan ju bara röra sig i fasta inkrement, precis som en heltalsräknare. Då kan man få en noggrannhet som ligger inom steglängden genom att använda en sådan algoritm. I långa loppet blir det helt exakt. Ju längre ju mindre blir det relativa felet i förhållande till helheten.

Angående assembler så är det inte alls svårt att hantera flera instruktionsset. Det är bara olika tabeller för OP's och dekoderrutiner för addressmodes. Hela den "tunga" delen med symbolhantering, beräkningar, inläsning av källkod, filhantering o.s.v. är gemensam. Eftersom det följer samma mall hela tiden så kan det vara på detta sätt. Skulle varit svårare om tillverkarnas OP's skulle ha använts.

Det är just att "normalisera" källkoden mellan processorerna och at få bort onödigt krångel som är avsikten med den. Där finns inga onödiga saker som stökar till det. Dessutom är den blixtsnabb. Över 1M kod för 8088 till färdig binärfil på mindre än 1/10 sekund med en modern dator. Givetvis är det ett kommandoradsprogram skrivet i assembler. Version 0 i TP3 för att komma igång, sedan konvertering så den kan assemblera sig själv.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Marta: Jag börjar bli lite klokare på hur du menar (tror jag :)).

Om jag använder en 19,17MHz kristall så blir det:

19 170 000Hz / 4 = 4 792 500Hz / 65536 = 73,12774658203125Hz

Då ska heltals variabeln vara 73. Ta bort heltalet och multiplicera med 256:
0,12774658203125 * 256 = 32,703125

Då ska undervariabel1 vara 32. Ta bort heltalet och multiplicera igen:
0,703125 * 256 = 180

Då ska undervariabel2 vara 180.

Har jag fattat rätt? Måste läsa på lite mera, men om jag tänker rätt och förstog din förklaring rätt så ska det fungera ungerfär som en delaylop, så varje gång.. Nää.. Nu blir tänker jag fel i alla fall :S Bara att läsa på lite mer.. :)

----

Från databladet
When the Timer1 oscillator is enabled (T1OSCEN is
set), the RC1/T1OSI/CCP2 and RC0/T1OSO/T1CKI
pins become inputs. That is, the TRISC<1:0> value is
ignored and these pins read as ‘0’.
Så jag använder inte samma kristall till timern som jag kör PIC'en på?

--

Kod: Markera allt

bit 1 TMR1CS: Timer1 Clock Source Select bit
1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
0 = Internal clock (FOSC/4)
Aha! Ett ljus tändes precis :D Så det är inte den interna osculatorn de menar med det andra alternativet utan den kristallen som jag kör PIC'en på, och då är det bara en fjärdedel av av kristallens freqvens?? Då blir allt mycket mer sammanhängande :D

Mvh.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Edit: Bara för skojjs skull gjorde jag ett program i C++ där jag skrev in kristallens freqvens (19,17MHz), så räknade den ut att jag kan ta och sätta timern på prescale 1:1 och låta den göra 245760 interrupt innan jag ökar minut variabeln med 4096. Det borde fungera, men en lite hackig klocka som bara uppdateras ungefär var tredje dygn :D
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7461
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Har inte kollat Ditt sista räkneexempel, men det verkar som att Du förstått hur man skall göra delaren när det är en udda frekvens.

Kristallen delas mycket riktigt ned med 4 utan att man kan påverka detta i sitt program. Sedan kan man välja prescaler till 1, 2, 4 eller 8 innan räknaren delar med 65536. Det är olämpligt i en klocka att ställa om räknaren, det kan leda till att man tappar pulser och den går fel. En onödig risk att ta. Speciellt om man även har en snabb interrupt för att t.ex. scanna en display och/eller intensitetsstyra denna.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Marta: Det glädjer mig att du lyckades få någon att bli intresserad av denna enkla metod.

Eftersom din kod är av lite ovanligare karaktär så postar jag mitt typexempel.
Den enda nackdelen med metoden är att sekundpulsen blir lite ojämn om man har ett lågfrekvent interrupt, men till en vanlig klocka fungerar det utmärkt.


Interruptrutin avsedd att exekveras med 65536 cyklers intervall (Pic16)

Kod: Markera allt

      movlw   1   ;Subtrahera 1 till Count3
      subwf   Count3
      btfsc   STATUS,0
      goto   InteMinus   ;Skippa om Count3 inte blev negativ


      movf   Add1,w   ;Addera hela Count med "konstanten" Add
      addwf   Count1
      movf   Add2,w
      btfsc   STATUS,0
      incfsz   Add2,w
      addwf   Count2
      movf   Add3,w
      btfsc   STATUS,0
      incfsz   Add3,w
      addwf   Count3

      incf   Sekund   ;+ en sekund

      movf   Sekund,w   ;Nollställ om den är 60
      xorlw   .60
      btfsc   STATUS,2
      clrf   Sekund
InteMinus:
Skriv svar