Sida 1 av 3
Klocka av PIC
Postat: 19 oktober 2007, 16:20:25
av squiz3r
Hej, jag tänkte bygga en klocka med en PIC16F877A som tickar på med 19,17000MHz (extern kristall).
Då är min fundering hur jag ska få den ett gå rätt?? Ett enkelt sätt hade varit om jag kunde få en timer i PIC'en att ge ett interrupt en gång per minute eller möjligen ett per sekund. Jag är inte så bra på timers så jag vet inte vilka tider man kan sätta dem på?
Ett annat alternativ hade varit ett interrupt från en extern timer, typ en 555'a eller liknande, men det är väll svårt att få så exakt?
Jag har även fått förslag på att ta signalen från 50Hz elnätet, men det är jag inte helt förkjust i då jag gärna skulle vilja att den klarar sig genom ett strömavbrott med hjälp av ett batteri..
Några andra tipps och funderingar? Jag vet att det finns färdiga RTC kretsar, men de är ganska dyra och svåra att kommunicera med, och desutom ska jag inte veta datum, bara tid (24h) och veckodag. (Jag skipper skottår m.m.

)
Mvh. Daniel Andersson
Postat: 19 oktober 2007, 16:36:13
av sodjan
> som tickar på med 19,17000MHz
Varför just den ? Om du ändå ska ha en "udda" frekvens, ta en som
är lätt att räkna ner till 1 sek med en jämn potens av 2.
> typ en 555'a eller liknande,
Glöm det !!
> Några andra tipps och funderingar?
Antingen en "bättre" kristall till huvudoscillatorn eller (om det inte går)
en 32 Khz "klock-kristall" till Timer1.
Postat: 19 oktober 2007, 16:40:58
av sodjan
T.ex 18.432 eller 19.6608 Mhz.
Postat: 19 oktober 2007, 16:41:38
av sdujolo2
Här har du en klocka skrivet i C för BoostC
http://www.sourceboost.com
Postat: 19 oktober 2007, 16:42:32
av sodjan
Var är klockan ?
Postat: 19 oktober 2007, 16:58:56
av Marta
Udda frekvenser är inget problem alls, frekvensen är alltid udda även om det står något jämnt på kristallkåpan. Det är jättelätt att göra en räknare i programvara som delar med hur ojämna tal som helst och som kan ge hur hög precicion man än önskar.
Sök på breesenham counter så hittar Du nog det Du söker. Jag kan annars posta kod i assembler som gör denna uppgift.
Den stora finessen är att man kan ställa klockan till att gå rätt genom att helt enkelt mäta felet och sedan beräkna nya konstanter utifrån de gamla. Mycket trevligare än att dribbla med en trimkonding som ju inte är det minsta kalibrerad. En veckas gångtest och sedan räkna nya konstanter så hamnar man mycket rätt.
Postat: 19 oktober 2007, 17:05:35
av sodjan
> Udda frekvenser är inget problem alls, frekvensen är alltid udda även om det står något jämnt på kristallkåpan.
Notera att "udda" och "jämt" inte betyder detsamma decimalt och binärt...

Postat: 19 oktober 2007, 17:10:38
av Marta
sodjan skrev:> Udda frekvenser är inget problem alls, frekvensen är alltid udda även om det står något jämnt på kristallkåpan.
Notera att "udda" och "jämt" inte betyder detsamma decimalt och binärt...

Är 9.536743164Hz nominell frekvens tillräckligt udda? Den får man från 20MHz kristall och att låta T1 räkna fritt med /8 prescaler. I verligheen blir det andra decimaler eftersom kristallen inte stämmer exakt, men det är bara att justera konstanterna därefter. Med tre bytes "uddadel" så har man en precicion som motsvarar <2 sekunder per år. Det räcker och blir över för de bästa av kristaller. Har man en rubidiumnormal är det lätt att lägga till räknarsteg hur långt som helst. Det handlar bara om vanlig addition.
Edit: Breesenham-counter i min assembler.... Denna kod är för PIC16
Kod: Markera allt
* DO BREESENHAM DOUNTER
DSZ BCNTER.0CNT COUNT DOWN WHOLE NUMBER
RTS NO COUNTOUT-DONE
* RELOAD BY ADDING IN FRACTIONAL COUNT VALUE
LOD A,BCNTER.3LOAD GET 3:RD FRACTION
ADD BCNTER.3CNT,A ADD IT IN
LOD A,BCNTER.2LOAD GET 2:ND FRACTION
SFC CY WAS THERE A CARRY?
ISZ A=BCNTER.2LOAD YES-GET VALUE INCREMENTED BY ONE
ADD BCNTER.2CNT,A ADD IN, BUT ONLY IF NO NEW CARRY
LOD A,BCNTER.1LOAD GET 1:ST FRACTION
SFC CY WAS THERE A CARRY?
ISZ A=BCNTER.1LOAD YES-GET VALUE INCREMENTED BY ONE
ADD BCNTER.1CNT,A ADD IN, BUT ONLY IF NO NEW CARRY
LOD A,BCNTER.0LOAD GET WHOLE NUMBER
SFC CY WAS THERE A CARRY?
ISZ A=BCNTER.0LOAD YES-GET VALUE INCREMENTED BY ONE
ADD BCNTER.0CNT,A ADD IN, BUT ONLY IF NO NEW CARRY
* COMES HERE ONCE EVERY SECOND
Postat: 19 oktober 2007, 17:20:11
av sodjan
Men enklast är en kristall som är "jämn" *binärt* sett.
T.ex 19.6608 Mhz som kan delas ner med 65536*4
(timer1 free-running direkt på Fosc) till 75 Hz, som sedan
enkelt kan räknas ner till 1 sek i en timer-ISR.
Just det är den enda anledningen till att dessa kristaller
med "konstiga" frekvenser existerar alls...
Postat: 19 oktober 2007, 17:37:35
av Marta
Jovisst, men noggrannheten räcker inte fren klocka. Det är jobbigt att kalibrera kristallen om man jämför med att ändra värden i processorns EEPROM med ett antal snäpp som kan räknas ut exakt efter att ha mätt hur mycket fel klockan har gått under t.ex. först ett dygn och sedan en vecka eller ännu längre.
Vad är fördelen med att vrida trimkonding och prova sig fram massor av gånger innan det blir någorlunda rätt när man kan mäta in det exakt mycket enklare med hjälp av ett tämligen ekelt program?
Postat: 19 oktober 2007, 17:44:11
av squiz3r
Det var mycket som har hänt här
19,17MHz är inget abselut nödvändigt men jag har en bunte sånna kristaller hemma, så det hade varit bra om jag kan använda dem.
"ta en som är lätt att räkna ner till 1 sek med en jämn potens av 2."
Vad menas med jämn potens av 2??

(potens är väll den sifran som sitter där uppe när man räknar upphöjt till??)
"T.ex 19.6608 Mhz som kan delas ner med 65536*4
(timer1 free-running direkt på Fosc) till 75 Hz, som sedan
enkelt kan räknas ner till 1 sek i en timer-ISR."
Jag hängde inte riktigt med på hur det blev "65536*4"?
Marta: Jag testade söka på det men hittade inte något som handlade om rätt sak (tror jag

). Du har inte lust att förklara lite groft hur en sån fungerar så får jag nog lite lättare att förstå din kod (nu förstår jag typ inget)?
Mvh
Postat: 19 oktober 2007, 18:32:00
av Icecap
Ska du ha en riktig noga klocka har Dallas några TCXO som fungerar bra, t.ex. en 8MHz som ger en noggrannhet på ±1 minut/år utan trimning.
Eller bättre upp: koppla in en DCF77-mottagare (t.ex.
www.conrad.de) och låt den ställa klockan, då har du en "atomklocka".
Timerna: Timer1 i PIC är en 16-bitars räknare och den kan bl.a. räkna på kristallfrekvensen/4, OK?
Jämn potens av 2 är:
2^1
2^2
2^3
2^4
2^5
2^6
2^7
2^8
2^9
2^10
osv osv.
Timer1 har 2^16, så enkelt är det.
Postat: 19 oktober 2007, 19:18:42
av squiz3r
Okej, nu börjar det gå upp ett ljus!
Så sodjan, du menar att jag kan köra med en kristall på 4,91520MHz och sen sätta på timer1 på prescale 1:1 så kommer jag få 75 interrupt per sekund om jag har räknat rätt, och då kan jag sätta en variabel som ökar med ett varje gång, och när den har kommit till 75 så nollställs den och ökar sekundvariabeln med 1? Har jag fattat rätt??
(4915200Hz / 65536 (antalet gånger timer1 räknar innan den nollställs och ger ett interrupt) = 75 interrupt per sekund)
Hur exakt skulla man kunna få detta då?
Mvh.
Postat: 19 oktober 2007, 19:47:10
av Icecap
Nja... du glömde nog att den räknar på kristallfrekvensen delad med 4... vilket då ger 18,75Hz.
Postat: 19 oktober 2007, 20:04:05
av bengt-re
En annan fördel med 32kHz kristaller är att de är biliga, strömsmåla och finns i mycket små kapslar....