Hallo allen,

Ik heb een vraagje i.v.m. de DCF schakeling van Frits.
(zonder gong) http://www.picbasic.nl/frameload.htm?http://www.picbasic.nl/elektronic…

Zit er daar een RTC in verwerkt? (in de code) en mocht dit niet zo zijn, hoe zou je deze kunnen uitbreiden? via code en/of echt toevoegen van bijv.: pcf8583 die I2C gestuurd wordt?

Hoe zou je dat dan praktisch (schema) doen en hoe ziet dan de code eruit?
Ik zou eigenlijk willen dat de tijd (2x16 met sec.) wordt afgebeeld en als de ontvangst uitvalt het wordt overgenomen door de RTC.

Zou iemand een ideetje hebben?

Alvast bedankt!!

Dimi

Als je er van uitgaat dat de DCF de juiste informatie verstrekt, gegeven dat het signaal correct is, dan kun je de RTC daar op synchroniseren.

Meestal doe je dat niet elke minuut, maar bijvoorbeeld 1x per dag. De nauwkeurigheid van een losse RTC is namelijk dermate hoog dat dat echt niet vaker hoeft.
Je zou dus, bijvoorbeeld, vanaf 1 uur 's nachts kunnen gaan wachten tot er een "goed" signaal op je DCF staat.
Vervolgens kijk je of de RTC dezelfde informatie geeft, zoniet, dan pas je de RTC gegevens aan.
De output op je display laat je dan van je RTC komen.

Uiteraard is het initialiseren van de RTC vergelijkbaar: wacht tot je een goede DCF waarde hebt en prop dat in de RTC.

Het is op zich een handige manier om de (over)gevoeligheid van de DCF ontvanger te omzeilen.

In de code van het DCF77 project zit geen RTC bij in geprogrammeerd.

Thuis heb ik het volgende:
Een RTC IC, de PCF8583, houdt de tijd bij, die de PIC op het display toont en daarmee de timerschakelingen (verwarming, ramen open/dicht, mijzelf 's morgens wekken, bad vullen, transistorradio aanzetten, gong laten klinken, enz.)
's Nachts om 04:01 wordt de DCF77 tijd (door het DCF77 PIC project) doorgegeven aan de master PIC, waaraan de PCF8583 dus zit.
Deze vergelijkt nu alleen de weekdag, de datum, de maand en het jaar.
Zijn deze vier waarden gelijk aan elkaar, en zijn ook de DCF77 pariteitsbits goed, dan wordt ervan uitgegaan dat de DCF77 tijd van dat moment goed is en wordt de PCF8583 weer op de seconde gelijk gezet (hierdoor wordt ook de zomer/wintertijd en schrikkelseconden van de PCF8583 automatisch aangepast).

Zijn één (of meer) van deze vier waarden niet gelijk aan elkaar, dan volgt er geen update en wordt er pas de volgende nacht weer vergeleken.

Meer info hierover staat in het automatisch huis project.

1) Frits,

Heeft u van de die RTC gekoppeld aan de DCF een schema? en wat moet dan juist veranderd worden aan de code van de dcf?
Ik heb hier I2C code (ook van circuit online) die in de PCF 8583 moet komen maar moet wel nog gelinkt worden aan de DCF.

sub procedure tijd_lezen
I2C_Start
  I2C_Wr_cs(RTC_Write)    ' Adres van de RTC voor schrijven
  I2C_Wr_cs(0x01)            ' starten vanaf register
I2C_Repeated_Start' nu gaan we beginnen lezen
  I2C_Wr_cs(RTC_Read)     ' Adres van de RTC voor lezen
  Mini = I2C_Rd(1)       ' byte minuten inlezen
  cs
  Hr = I2C_Rd(0)       ' byte uren inlezen
  cs
I2C_Stop
end sub

  I2C_Start
  I2C_Wr_cs(RTC_Write)    ' Adres van de RTC voor schrijven
  I2C_Wr_cs(1)            ' starten vanaf register 1
  I2C_Wr_cs(Mini)
  I2C_Wr_cs(Hr)
  I2C_Stop

2) Weet er iemand hoe je met "Proton IDE Lite" een *.hex aan maakt? als ik compile (F9) maakt hij een *.PRP (0 kb) aan maar geen hex-file

alvast bedankt!

Groeten
Dimi

Op 4 maart 2009 18:11:37 schreef DenDimi:
2) Weet er iemand hoe je met "Proton IDE Lite" een *.hex aan maakt? als ik compile (F9) maakt hij een *.PRP (0 kb) aan maar geen hex-file

Met F9, compiler wel ingesteld?

Henry,

Mijn programmer staat eigenlijk op een andere PC moet deze ingesteld zijn? nu staat hij op MicroCode Loader en mijn compiler staat op c:\program files\crownhill\pdslite

kan ik dit niet met deze? het is toch maar een Hex- file aanmaken?

Groeten
Dimi

Herny,

Ik heb eens de compiler ingesteld, maar doet juist het zelfde.. Niets...

LabProg+ van ELNEC
C:\Program Files\Elnec_sw\Programmer\pg4uw.exe
dus bij view - Compile and Program Options... -
--> (compiler) c:\program files\crownhill\pdslite
--> (Programmer) - Instal New Programmer - ELNEC Device Programmer - pg4uw.exe - C:\Program Files\Elnec_sw\Programmer - Parameters: PIC"$target-divice$" $long-hex-filename$ (ben ik niet aangeweest)

vriendelijke groet
Dimi

(Er staat target divice i.p.v. device.)

Je hebt PIC Basic LITE blijkbaar niet geheel goed geïnstalleerd, F9 behoort een HEX file op te leveren.
Maar jij hebt het ook over SUB PROCEDURE, iets dat Proton PIC Basic niet kent, dus vraag ik me af of je wel de goede compiler hebt.

ik heb eens dat programma opnieuw geïnstalleerd, maar het blijft hetzelfde.
ik an het met een ander programma de code direct inlezen. zo heb ik geen HEX file nodig. dat programma (PG4UW van ELNEC) doet dit vanzelf.

@Frits, heeft u al eens gekeken als u een schema liggen hebt van de RTC (PCF8583) aan de DCF (zonder gong)?

Daar is geen schema van.

Het is simpel:
In het standaard DCF77 programma van picbasic.nl heb ik een paar programmaregels ingevoegd die ervoor zorgen dat als het 04:01 DCF77 tijd is (ook al zou deze datum en/of tijd door slechte ontvangst niet kloppen), dat de DCF77 PIC de volledige DCF77 tijd en datum naar de master PIC stuurt via een seriële verbinding(1-draads, een uitgang v.d. DCF77 PIC naar een ingang van de master).
Aan de master zit ook de PCF8583, die de tijd van het huis bij houdt en dus ook op het display weergeeft.
Als de master een DCF77 tijd ontvangt, gaat hij deze vergelijken met de tijd die de PCF8583 heeft.
Alleen als de weekdag, de datum, de maand en het jaar gelijk zijn aan elkaar, wordt de PCF8583 weer op de seconde gelijk gezet met de DCF77 tijd van die dag (nacht).

Frits,

Heeft u de code waarbij alleen de tijd rechts boven wordt afgebeeld? zonder de initialisatie etc..
door die lite versie van proton IDE kan ik niet veel doen..
en voor 1 project die software kopen is ook dubieus..

of weet u een andere oplossing.. In Microbasic heeft het programma errors omdat het niet op "zijn" manier geschreven is.

MVG

Dimi

Ik heb nu de real time klok. maar deze blijft op de ingestelde tijd staan.
hoe kan ik deze nu laten lopen en op bepaalde tijdstippen laten synchroniseren (juist zetten) op de DCF klok?
(zonder met datum, ... te werken)
dan zou ik de DCF als instelwaarde moeten nemen..(?)

klop het dan dat bijv.:

BusOut %10100010, $00, [$00, $00, $01, $00, $04]

moet vervangen worden door de DCF waarde? bijv.:

BusOut %10100010, $00, [$00, $00, DCFsec, DCFmin, DCFuur]

kan iemand mij helpen?

Groeten
Dimi

Beste,

mijn bedoeling van de DCF is in samenwerking met de RTC.
maar dat werkt nog niet zo goed.

Ik zou willen dat wanneer de spanning aan is dat de RTC functioneert en op de achtergrond zoekt naar signaal. en vanaf er DCF signaal is dat hij deze uitleest + RTC constant update.

Ik heb hier code samen gevoed van Dhr. Frits (www.picbasic.nl)

ErrorOntvangst:
;*** RTC ***
  Cls                           ;Wis scherm en zet cursor links bovenaan 
  BusOut %10100010, $00, [$00, $00, $00, $30, $12] ;Schrijf (write) insteltijd naar de PCF8583

While 1=1
  BusIn %10100011, $02, [Seconden, Minuten, Uren] ;Lees (read) tijd in vanuit de PCF8583

  ;Zet de BCD waarden van de seconden, minuten en uren om in decimale waarden
  Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
  Minuten  = ((Minuten  >> 4) * 10) + (Minuten  & 15)
  Uren     = ((Uren     >> 4) * 10) + (Uren     & 15)

  ;Plaats nu de decimale waarden (de tijd dus) op het display
  Print At 1, 1,  @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "
  ;If UurLCD < 10 Then Print " " ;Wis de eerste nul (08:00:00 --> 8:00:00) (Nul onderdrukking)
  ;Print Dec Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " " ;Zet elke minuut de actuele tijd op het LCD
Wend
;*** RTC *** 
 
 ;Cls
 ;Print "Geen signaal"         ;Startbit niet gevonden of geen signaal?
       
     Repeat
       Clear                      ;Wis alle RAM
       ID1 = DCF_Signaal
       While DCF_Signaal = ID1    ;Wacht op signaal verandering
         Inc SignaalCheck
         DelayMS 1
       Wend
       ID1 = ID1 ^ 1
       While DCF_Signaal = ID1    ;Wacht op signaal verandering
         Inc SignaalCheck
         DelayMS 1
       Wend
     Until SignaalCheck < 990
       
 Initialiseren = TRUE         ;Na een error moet er weer worden geinitialiseerd
GoTo HoofdLus

Het probleem is nu dat hij als er geen ontvangst is de RTC geeft maar hij kan niet meer uit de while lus... dus zoekt hij niet meer naar de DCF.

Ook word de RTC nog niet ge-update.

Kan iemand mij helpen?

Groeten
Dimi

Op 12 maart 2009 10:29:17 schreef DenDimi:
Ik heb nu de real time klok. maar deze blijft op de ingestelde tijd staan.
hoe kan ik deze nu laten lopen en op bepaalde tijdstippen laten synchroniseren (juist zetten) op de DCF klok?
(zonder met datum, ... te werken)

Als je de datasheet leest van de PCF8583 RTC moet er ergens nog een bit zijn dat geset moet worden zodat de klok begint te lopen (ik weet zo uit m'n hoofd niet welke).

Waarom doe je het niet op de manier zoals ik het doe (wat ik eerder schreef).
Dus 1x per dag de RTC synchroniseren met DCF77 is meer dan genoeg.
Als je datum enzo niet vergelijkt, loop je natuurlijk wel de kans dat bij slecht ontvangst van de DCF77, je RTC ook op de verkeerde tijd wordt ingesteld.

Op bepaalde tijdstippen synchronizeren is toch makkelijk, bijvoorbeeld:
IF DCFuur = 04 AND DCFmin = 00 THEN BUSOUT %10100010, $00, [$00, $00, DCFsec, DCFmin, DCFuur]
Er natuurlijk wel voor zorgen dat bovenstaande regel maar 1x per minuut wordt doorlopen, anders staat ie om 4:00 's nachts een minuut lang naar je RTC te schrijven.

Je moet je projecten overigens eerst beetje voor beetje programmeren en uittesten.
Niet ineens een groot programma maken.
Dus probeer eerst die PCF8583 klok goed te kennen door de datasheet uit te werken in je PICBasic programma.

Overigens lijkt het me ondoenlijk om zoiets met de LITE versie klaar te krijgen.


RTC:
  Cls                           ;Wis scherm en zet cursor links bovenaan 
  If UurDCF = 12 And MinuutDCF = 00 Then
    BusOut %10100010, $00, [$00, $00, Seconde, MinuutDCF, UurDCF] ;Schrijf (write) insteltijd naar de PCF8583
  EndIf
While 1=1

    BusIn %10100011, $02, [Seconden, Minuten, Uren] ;Lees (read) tijd in vanuit de PCF8583

  ;Zet de BCD waarden van de seconden, minuten en uren om in decimale waarden
    Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
    Minuten  = ((Minuten  >> 4) * 10) + (Minuten  & 15)
    Uren     = ((Uren     >> 4) * 10) + (Uren     & 15)

  ;Plaats nu de decimale waarden (de tijd dus) op het display
    Print At 1, 1,  @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "

Wend

Het probleem is dat ik niet uit die oneindige lus geraak om te controleren als ik DCF ontvangst heb...
en daarmee de RTC up te daten..

Kun je deze regel niet in de While lus opnemen:

If UurDCF = 12 And MinuutDCF = 00 Then
    BusOut %10100010, $00, [$00, $00, Seconde, MinuutDCF, UurDCF] ;Schrijf (write) insteltijd naar de PCF8583
  EndIf

Lammert

zou ik kunnen doen, maar dan moet ik volgens mij er toch nog uit gaan om de waarde van UurDCF en MinuutDCF te weten. en alles in deze while verwerken is ook geen optie want dan gaan mijn seconden niet per seconde maar loopt hij telkens de lus af en dan toont hij de volgende..

toch bedankt!

Je hebt gelijk, maar zo ff uit de losse pols:

als je aan de if regel voldoet dan kun je toch vanuit je while lus springen naar de lus waaruit je de DCF aanroept?
Je hebt dan je gegevens die je hebben moet en dan spring je automatisch terug in de while lus met de juiste gegevens die je dan in je If regle kunt gebruiken.

Zo zou ik het doen, of het werkt dat weet ik niet...

Lammert


RTC:
  
While 1=1

Cls                           ;Wis scherm en zet cursor links bovenaan 
  If UurDCF = 12 And MinuutDCF = 00 Then
    BusOut %10100010, $00, [$00, $00, Seconde, MinuutDCF, UurDCF] ;Schrijf (write) insteltijd naar de PCF8583
    Goto DCFzoeken
  EndIf
    
BusIn %10100011, $02, [Seconden, Minuten, Uren] ;Lees (read) tijd in vanuit de PCF8583

  ;Zet de BCD waarden van de seconden, minuten en uren om in decimale waarden
    Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
    Minuten  = ((Minuten  >> 4) * 10) + (Minuten  & 15)
    Uren     = ((Uren     >> 4) * 10) + (Uren     & 15)

  ;Plaats nu de decimale waarden (de tijd dus) op het display
    Print At 1, 1,  @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "

Wend

zo bedoel je?
maar dan weet je volgens mij niet wat je UurDCF en MinuutDCF is, dus kan je het moeilijk vergelijken.

het beste zou zijn een manier te vinden die
1) je RTC constant uitleest
2) op de achtergrond kijkt als er DCF is, zoja update de RTC

maar het probleem is als je uit de while gaat dat de RTC niet meer per seconde uitleest op de display..

of ben ik verkeerd?

Ik weet wat je bedoelt, was ook zo even een eerste gedachte.
Zelf ben ik ook net bezig met een RTC.
Ook ik wil de tijd goedzetten met een DCF module.
jij bent alleen net even verder dan ik.
Ik ben namelijk nog maar net bezig met de RTC.
Ik zal eerdaags ff kijken of het mij lukt.

Tenzij iemand anders tips heeft.

ah, ok dan zijn we met 2

deze code werkt perfect voor een RTC met instelwaarde van 12:30:00. (kan je zelf kiezen) dit komt van Frits (www.picbsic.nl)
het is I2C naar een bekend klok ic-tje (PCF8583)
http://www.circuitsonline.net/forum/view/61994/1/pcF8583



DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Poortnamen
DECLARE SCL_PIN     = PORTA.3 ;Serial Clock pin met PORTA.3 verbinden
DECLARE SDA_PIN     = PORTA.4 ;Serial Data  pin met PORTA.4 verbinden

;Variabelen declareren
DIM Minuten         AS BYTE   ;Bevat de minuten
DIM Seconden        AS BYTE   ;Bevat de seconden 
DIM Uren            AS BYTE   ;Bevat de uren 

DELAYMS 500                   ;LCD stabilisering


;Hoofdprogramma
CLS                           ;Wis scherm en zet cursor links bovenaan 
BUSOUT %10100010, $00, [$00, $00, $00, $30, $12] ;Schrijf (write) insteltijd naar de PCF8583

WHILE 1 = 1
  BUSIN %10100011, $02, [Seconden, Minuten, Uren] ;Lees (read) tijd in vanuit de PCF8583

  ;Zet de BCD waarden van de seconden, minuten en uren om in decimale waarden
  Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
  Minuten  = ((Minuten  >> 4) * 10) + (Minuten  & 15)
  Uren     = ((Uren     >> 4) * 10) + (Uren     & 15)

  ;Plaats nu de decimale waarden (de tijd dus) op het display
  PRINT AT 1, 1, "Tijd: ", @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "
WEND                          ;Terug naar WHILE

Ja klopt,

In de onderstaande post staat mijn code, deze is voor een 18F452
http://www.circuitsonline.net/forum/view/71549

Lammert

DenDimi ik snap niet helemaal wat je nu wilt.

Heb je DCF77 in een aparte PIC zitten (zoals ik thuis ook heb, een 16F628A bevat het DCF77 project van picbasic.nl)

Of heb je DCF77 en de RTC beide aan één PIC zitten?

Frits,

Ik heb 1 PIC, de 16F628A, en daar wil ik de DCF en RTC mee sturen.

mijn doel:
vanaf de voeding aan ligt --> wordt de RTC getoont
vanaf er signaal is van de DCF --> moet de RTC geupdate worden...

Je moet continu DCF77 uitlezen.
Ergens in het DCF77 programma wacht het een halve seconde (of 800mSec, het is al jaren geleden dat ik het programma gemaakt heb) waar je mooi de tijd hebt om de PCF8583 RTC uit kunt lezen en op het display kan weergeven.
DCF77 laat je nooit zien, maar draait dan op de achtergrond mee.

Het updaten moet je wel doen met behulp van de pariteitsbits én vergelijking van datum.
Anders zal bij slechte ontvangst van DCF77, je RTC geupdate worden met een DCF77 tijd die nergens op slaat.