Klocka av PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Klocka av PIC

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

T.ex 18.432 eller 19.6608 Mhz.
sdujolo2
Inlägg: 158
Blev medlem: 2 oktober 2007, 13:50:35
Ort: Sundsvall

Inlägg av sdujolo2 »

Här har du en klocka skrivet i C för BoostC http://www.sourceboost.com
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7461
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg 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

Senast redigerad av Marta 19 oktober 2007, 17:22:09, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7461
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg 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?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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?? :oops: (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 :S). 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
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nja... du glömde nog att den räknar på kristallfrekvensen delad med 4... vilket då ger 18,75Hz.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

En annan fördel med 32kHz kristaller är att de är biliga, strömsmåla och finns i mycket små kapslar....
Skriv svar