PIC 16F877A middels I2C protocol laten praten met een RTC

Arco

Special Member

Debuggen met een lcd display is meestal onhandig, omdat je steeds moet wachten. (je moet tenslotte de tijd hebben om te lezen wat er staat voor het weer verdwijnt)
Voor zomer en wintertijd heb je geen tabel nodig, kun je simpel berekenen. Deze Mikrobasic functie geeft '1' terug bij DST (zomertijd), anders '0'.
De TS2 structure heeft de huidige tijd en datum.

pic basic code:


  Structure TimeStruct
     dim ss as byte     ' seconds
     dim mn as byte     ' minutes
     dim hh as byte     ' hours
     dim md as byte     ' day in month, from 1 to 31
     dim wd as byte     ' day in week, monday=0, tuesday=1, .... sunday=6
     dim mo as byte     ' month number, from 1 to 12 (and not from 0 to 11 as with unix C time !)
     dim yy as word     ' year Y2K compliant, from 1892 to 2038
  End structure

'==================================================================================================
Sub Function Is_DST() As Byte                                   'Tests if it is DST now
'==================================================================================================
  Dim TS2       As TimeStruct
  Dim DST_Begin As Byte
  Dim DST_End   As Byte

  Result = 0
  DST_Begin = ((TS2.yy-2001) + (TS2.yy-2001) /4) Mod 7          'Calculate begin and enddate of DST
  DST_Begin = (7-DST_Begin) + 25                                '
  If TS2.yy Mod 4 = 0 Then Dec(DST_Begin) End If             'Leap Year correction
  DST_End   = DST_Begin - 4                                        '
  If DST_End < 25 Then DST_End = DST_End + 7 End If             '
  If ((TS2.mo > 3) And (TS2.mo < 10)) Or                        'See if DST applicable
     ((TS2.mo = 3) And (TS2.md >= DST_Begin)) Or                '
     ((TS2.mo =10) And (TS2.md < DST_End)) Then                 '
     Result = 1
  End If
End Sub
'==================================================================================================

[edit]
LeapYear aangepast, veranderd in: If TS2.yy Mod 4 = 0 Then Dec(DST_Begin) End If.
Met dank aan @hadv voor zijn correctie...
[/edit]

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 14 januari 2015 00:51:44 schreef hadv:

@Fantomaz: je zou toch echt eens wat vaker in het manual moeten kijken, dan zou je sommige vragen niet stellen.
In het manual staat notabene een schema in hoe je de boel moet aansluiten. Weliswaar wat verouderd, want met een MAX232 ipv een USB<>TTL converter, maar toch.

Welke manual hadv?

Mag ik zo vrij zijn je aan te raden om, in plaats van met een concreet project bezig te zijn, af en toe eens een onderwerp uit het manual te bestuderen, de voorbeelden uit te proberen en aan te passen. Daar leer je behoorlijk veel van.

Debuggen/monitoren zoals Arco beschrijft is een schier onmisbaar hulpmiddel bij het ontwikkelen van firmware. En je kunt het HSerIn commando gebruiken om kritische variabelen tijdens de executie aan te passen en zo te kijken wat er dan gebeurt.

Ik neem je kritiek ter harte hadv :-)

Echter heb ik vaak grote droomprojecten waar ik in door ga tot ik intern of extern vastloop.
Met picbasic zijn de mogelijkheden nagenoeg onbeperkt.
Mijn valkuil is dan ook vaak dat ik tijdens het programmeren lumineuze ideeen krijg van kleine, fancy add-ons, die ik er weer tussen programmeer.
Sommige toevoegingen zijn nog wel eens te hoog gegrepen waardoor ik extern info vraag of zoek.
DCF module of RTC... Is RTC geworden... Maar dan? Hoe die te programmeren? I2C... Veel van gehoord maar verre van gehouden. Nu moet ik er vaan geloven. Ik zoek en vind info in de vorm van stukjes code die ik probeer te doorgronden adv de remarks. Echter zijn soms de randinstructies er omheen al onbekend voor me en moet ik me daar eerst weer in gaan vastbijten. Dan dwaal ik almsnel af van de essentie. ;-)

Wat debuggen betreft... Ik print wel eens resultaten van berekeningen VAR waarden etc. op het display om zo zaken te monitoren. Daarmee ondervang ik al veel.
Om dit via de pc te doen zal zeker een meerwaarde zijn, als ik maar weet wat te doen.

Ik zit hier met Proton manual en tablet op schoot... Lerende... :-p

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

@Arco: dankjewel, heel handig!
@Fantomaz: welk manual? dat je blijkbaar op je schoot hebt liggen!

Just find out what you like and let it kill you
Arco

Special Member

@hadv: Test op zomer/wintertijd test kijkt alleen naar de dag. Dus hanteert feitelijk 00:00 uur, i.p.v. 02:00 en 03:00 uur.
(Was voor een apparaat dat 's-nachts toch niets deed, dus exacte omschakeltijd boeide niet zo erg)
Als je dat wel exact wilt, moet de test daarmee worden uitgebreid...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 15 januari 2015 18:06:20 schreef hadv:
@Fantomaz: welk manual? dat je blijkbaar op je schoot hebt liggen!

Ah, duidelijk!
Ik dacht dat je mogelijk de handleidingen van de (met I2C)aangesloten componenten bedoelde.
Ik ben onder de hoofdstukken Bus- (in, out, stop, etc.) nog geen schema's tegengekomen.

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

@Arco: weet ik, dat doe ik nu met m'n tabel ook.

@Fantomaz: Als je PIC met een PC wilt laten communiceren gebruik je de UART, dan heb je niet veel aan I2C of SPI.
In het PDS manual dat ik hier heb (3.5, 03-05-2014) staat op pag 29 een schema met een MAX232, op pag 241 staat datzelfde schema en één met transistoren, op pag 373 staat het schema met de MAX232 nog een keer en een schema voor een directe aansluiting. Dat laatste zou ik niet willen aanbevelen.

Maar aangezien veel moderne computers, en zeker laptops, geen seriële poort hebben zul je tussen de PIC en de PC een USB<>TTL converter moeten hangen, bv op basis van een FTDI232.
Dit komt in plaats van de Max232.

PIC TTL TX-->--Converter RX-->--PC
PIC TTL RX--<--Converter TX--<--PC
PIC Vss--------Converter GND

Just find out what you like and let it kill you

Oh Sorry.,... De pagina kan ik niet voor de geest halen, maar ik heb iets gezien met die MAX232 in de handleiding.
Ik informeer even of ik een externe kaart kan krijgen in mijn PC waar een seriele poort op zit.

Ik zat te zoeken naar een I2C schema. :-)

Tx zover.

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

hier gaat iets gruwelijk fout...
Ik ben kwijt wat hier stond door een foutje in een quote

[Bericht gewijzigd door Fantomaz op zaterdag 24 januari 2015 21:26:07 (93%)

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

En zo kom ik toch steeds wat verder.
Mijn hersenen staan volledig open source en wat in mijn hoofd afspeelt aangaande dit I2C project, probeer ik volledig uiteen te zetten.
Het feit dat ik extreem veel moeite moet doen om de juiste uitleg te vinden... Laat ik dan wát ik weet, ook verklaren.
As Muhammed niet naar de berg komp, komp de berg wel naar Muhammed.
Zonder enige politieke, aanstootgevende meningen overigens...

code:

                                   
 
    dummy=Seconden/10     ;dummy is tientallen van Seconden
    dummy=dummy*16        ;waarde doorschuiven naar de vier MSB
    secs=Seconden//10     ;secs is eenheden van Seconden 
    secs=secs | dummy     ;Bitwise OR combineert beide waarden in een byte

Wat hier gebeurd is het overzetten van een 2 cijferig Decimaal getal, opgesplitst en omgezet naar 2 waarden BCD.

-In de eerste stap wordt van de variabele "Seconden" de tientallen geladen in variabele "dummy". (hoevaak komt de 10 voor in variabele "Seconden")
Deze "dummy" wordt, door deze met 16 te vermenigvuldigen, 4 posities naar links geschoven.
Deze 4 bits geven dus in binaire code de tientallen van het 2 cijferige decimale getal weer.
Omdat het een getal is, wat niet hoger zal zijn dan 10, is de Binaire code gelijk aan de BCD code.

-In de tweede stap wordt de variabele "Seconden" die nog onveranderd is, wederom enkele malen gestript door er telkens 10 vanaf te halen. (dat is Fantomaz Taal voor delen door 10) Met dien verstande, dat er een restgetal over blijft. Dit restgetal komt in de variabele "secs" te staan.

-In de laatste stap worden de 2 binaire codes, samen gevoegd.
Omdat bij variabele "secs" er geen gebruik wordt gemaakt van de 4 hoogste bits, en bij variabele "dummy" niets wordt gedaan met de 4 laagste bits, komt daar een byte uit gerold, die bestaat uit 2 BCD getallen.

Voorbeeldje
Het getal 27
Stap 1) hoevaak komt "10" voor in het getal 27?
Antwoord = 2, ofwel %00000010. Variabele "dummy"
Vermenigvuldig dit getal met 16 = 32, wat neer komt op %00100000. Laat dat nou precies 4 stappen naar links zijn.

Stap 2) hoeveel blijft er over van het getal, wanneer er een maximaal aantal keren 10 vanaf wordt getrokken, Het "restgetal"?
Antwoord = 7, ofwel %00000111. Variabele "secs"

Stap 3) het samen voegen van 2 bytes.
%00100000 (dummy)
%00000111 (secs)
%00100111 wat met een andere (BCD)blik gezien kan worden als 0010 0111, ofwel 2 7

* Fantomaz komt er wel.

Alleen soms wat langzamer

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

En als ik dan toch de werking van een deel van de code verklaar, laat ik dan ook een andere stukje verklaren.
Namelijk de omzetting van 2xBCD naar een 2 cijferige decimale waarde.

code:

                                   
    HBusIn %10100000, $02, [secs, mins, hrs,YearDays,WeekDayMonths] ;haal tijd op vanuit de PCF8583
    HBusIn %10100000, $10, [ JaarDev4 , jaar3]                      ;haal jaar op (-2000 / 4) 
 
    Seconden = ((secs >> 4) * 10) + (secs & 15)                   
    Minuten  = ((mins  >> 4) * 10) + (mins  & 15)
    Uren     = ((hrs     >> 4) * 10) + (hrs     & 15)
    Dag      = (((YearDays >> 4 ) & 3 ) * 10) + (YearDays  & 15)
    Maand    = (((WeekDayMonths >> 4) & 1 ) * 10) + (WeekDayMonths  & 15)
    JaarVier = (YearDays     >> 6)
    Weekdag  = (WeekDayMonths  >> 5)

Een Byte, die de BCD codes bevat van de "secs" wordt gestript.
-In de eerste stap wordt het eerste stukje van 4 Bits BCD code, die de tientallen van de seconden bevat, 4 positities opgeschoven. Omdat alles rechts van deze nible (= halve byte) verdwijnt, en er links alleen maar 0000 bij komt, bestaat het hele stukje code uitsluitend de tientallen.
Deze worden vermenigvuldigd met 10.

-In de tweede stap wordt van de oorspronkelijke waarde "secs" door hier met een bitwise AND code 15 bij te voegen, alleen de laagste 4 bits (de BCD code van de eenheden) uitgefilterd en toegevoegd aan de eerder gevonden tientallen.

voorbeeld
een Byte met deze waarde komt voorbij: %00111001

-Stap 1
4 posities opschuiven naar rechts.
%00111001 wordt dan %00000011. De rechter 4 bits vervallen, links wordt het aangevuld met nullen.
%00000011 staat gelijk aan 3 decimaal.
Vervolgens wordt deze 3 met 10 vermenigvuldigd. = 30

-Stap 2
Wederom dezelfde waarde %00111001
Deze wordt met de decimale waarde 15, wat gelijk is aan binair %00001111, in een AND poort gedrukt.
%00111001
%00001111 AND
%00001001

%00001001 staat gelijk aan 9
Opgeteld bij de 30 uit stap 1 is dat 39.

Dat zal zo ook opgaan voor de minuten en de uren.

En nu voor ik mijzelf ga vastbijten in de "YearDays" en de "WeekDayMonths", wil ik me eerst het volgende afvragen:

Ik zie in alle voorbeelden steeds dat de waarden gehaald en gezet worden in de geheugenposities $02 en $10.
Zijn dit gewezen geheugenposities? Waar de RTC zelf de waarden ook laat oplopen?
Ik kan daar niets over terugvinden in de Datasheet.
Ik had al wel eens ergens gelezen hoe een bitreeks van ? aantal bits/bytes is opgebouwd tbv uitlezen, maar waar en hoe weet ik niet.
Iemand die me daar nog wat over kan informeren?

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Arco

Special Member

Staat toch duidelijk in de datasheet wat alle registers doen:

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 24 januari 2015 22:36:53 schreef Arco:
Staat toch duidelijk in de datasheet wat alle registers doen:

[bijlage]

Mee eens, Arco.
Dat had ik ook allemaal gezien.
Dan begrijp ik waarschijnlijk het volgende niet:

code:

                                   
    HBusIn %10100000, $02, [secs, mins, hrs,YearDays,WeekDayMonths] ;haal tijd op vanuit de PCF8583
   

Hier lijkt toch echt uitsluitend de data uit $02 (ik neem aan dat dit toch 02h is??) komt.
Dat is de byte(?) die alleen de seconden weergeeft, toch?

[aanvulling]
Ik heb nog even gekeken of er ergens een array zit die alle bytes eruit vist, maar dat is niet zo.
MAar met dat ik er dieper naar kijk, denk ik dat $02 dus niet specifiek 02h uit het register betekent.

Dan stel ik de vraag:
Worden bij het ophalen van de tijd álle registers gekopieerd naar een zekere geheugenpositie? Ofwel, naar een reeks van Bytes?

code:


[secs, mins, hrs,YearDays,WeekDayMonths]

En wat heeft dat te doen met $02? Kan het zijn dat de registers vanaf 02h worden gekopieerd?
En hoe weet de PIC, het I2C commando of de RTC dat het om slechts 5 bytes gaat?

Sorry voor mijn vele vragen, maar ik probeer het te doorgronden ipv klakkeloos overnemen en plakken in mijn eigen programma. ;-)

[Bericht gewijzigd door Fantomaz op zondag 25 januari 2015 21:41:15 (39%)

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
marcob

Golden Member

Elk geheugen adres in de chip is 8 bits. Start adres is $02, dus er wordt gelezen vanaf $02.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Arco

Special Member

Staat ook in de datasheet. Adres is auto-incremented, dus adres 0x02 t/m 0x06 worden uitgelezen:

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

OK dat is een stuk duidelijker inderdaad. :-)
Loopt hij altijd tot 0x06? En reserveert de PIC hier automatisch een reeks Bytes voor?

Er wordt op voorhand één Byte gereserveert
Ach nee! Natuurlijk niet!

De gereserveerde bytes zijn natuurlijk die

code:


[secs, mins, hrs,YearDays,WeekDayMonths]

die gevuld worden vanaf $02, 5x 1 byte lang... |:(

Kijk dat was iets waar ik zo nooit achter kwam. >:)

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

OK, even een update van mijn PIC->RTC via I2C projectje.

Mijn RTC (PCF8563) klok ICtjes waren binnen. (blijft een mooie service van Farnell. Wel in zee gaan met particulieren, zij het met een minimale aanschaf van 60,50 euro (incl BTW).

Een klein printje gemaakt volgens de schaarse(!!) schema's van deze RTC.
Omdat er geen waarden bij de Pull-up resistoren stonden, gokte ik op 1K.

In de eerste testfase de code van Knutselaar, zoals die elders in dit topic te vinden was, rauw gecopy-pasted naar mijn code.
Even zo rauw de aanpassingen naar een 16F-serie PIC gemaakt.

Het programma startte mooi, maar op het punt van communicatie met de RTC ging het fout.
Ik kreeg een onlogische waarde terug. Nu had ik daar al eens wat over gelezen tijdens mijn vooronderzoek naar deze RTC, maar dat stukje vond ik niet terug op Internet.

Verder doorbordurend op wat er fout zou kunnen zijn, las ik eea over de pull-up weerstanden in de I2C bus. Ik zat met 1K nogal laag en men zette meer in op 10K. Ideaal zou 4K7 zijn.
Laatstgenoemde had ik niet, dus heb ik 5K6 geprobeerd.
Dit hielp echter ook niets.

Nu verwacht ik dat het ergens in de config ligt, die bij de 18F-serie anders is dan bij de 16Fxxx PIC's

Toch kan ik daar niet veel over vinden.
Ook programma's met RTC's in PIC basic zijn schaars, wanneer ze aan een 16Fxxx PIC hangen.

Onderstaande code heb ik gebruikt.
Het toekennen van de juiste poort lijkt niet nodig omdat deze hardwarematig zijn. (C3 en C4, resp. Data en Clock)

Zijn er nog configs die er perse bij moeten staan??

code:


Device 16F877
 
    Xtal 4
 
All_Digital  true
    Dim Minuten         As Byte   ; minuten                 (decimaal)
    Dim Seconden        As Byte   ; seconden                (decimaal)
    Dim Uren            As Byte   ; uren                    (decimaal
    Dim Dag             As Byte   ; datum v/d maand         (decimaal
    Dim Maand           As Byte   ; maand                   (decimaal)
    Dim JaarVier        As Byte   ; jaar zoals in PCF8583 (hoogste 2 bits in YearDays)
    Dim Jaar            As Word   ; jaar
    Dim Weekdag         As Byte
 
    Dim WeekdagString[2]      As Byte
    Dim MaandString[3]        As Byte
 
                                  ;Het jaar wordt in de PCF8385 alleen bijgehouden in een vier 
                                  ;jaars tijdvak (0 tot 3) waarbij 0 het schrikkeljaar is.
                                  ;De software waarin de PCF8385 opgenomen is moet zelf een 
                                  ;variable bijhouden waaruit het uiteindelijke jaar berekend kan worden.
                                  ;In dit voorbeeld wordt daar JaarDev4 voor gebruikt. JaarDev4 
                                  ;moet met 1 verhoogd worden wanneer het jaar in de PCF8583 
                                  ;van 3 naar 0 verandert.
    Dim YearDays        As Byte   ;bit 0 tot 3 voor dag eenheden, bit 4 
                                  ;en 5 voor dag tientallen (0-3), bit 6 en 7 jaar (0-3).
    Dim WeekDayMonths   As Byte   ;bit 0 tot 3 voor maand eenheden, bit 4 voor maand 
                                  ;tientallen (0-1), bit 5 tot 7 weekdagen (0-6).
    Dim secs            As Byte   ;bit 0 tot 3 voor seconden eenheden, bit 4 tot 6 
                                  ;voor seconden tientallen (0-5), bit 7 niet gebruikt.
    Dim mins            As Byte   ;bit 0 tot 3 voor minuten eenheden, bit 4 tot 6 
                                  ;voor minuten tientallen (0-5), bit 7 niet gebruikt.
    Dim hrs             As Byte   ;bit 0 t0t 3 voor uren eenheden, bit 4 en 5 
                                  ;voor uren tientallen (0-2), bit 6 0=AM 1=PM , bit 7 0=24 
                                  ;uur mode, 1=12 uur mode(AM/PM).
    Dim JaarDev4        As Byte   ;hoogste 7 bits = jaar - 2000 gedeeld door 4 
                                  ;(wordt niet door PCF8583 geupdate), laagste bit is jaar3 flag
    Dim jaar3           As Byte   ;flag om de jaar overgang van 3 naar 0 
                                  ;(schrikkeljaar)te kunnen detecteren voor update van JaarDev4
    Dim dummy           As Byte   ;hulp variable.
 
    Symbol Speaker     = PORTC.1
    Symbol LED         = PORTC.2
    
 Declare LCD_ENPin PORTB.3
Declare LCD_RSPin PORTB.2
 
     
    Cls
 
    Print At 1,1, "Knutselaar.eu"
 
    DelayMS 2000
 
    GoSub getTime
    If hrs = 0 And YearDays = 1 And WeekDayMonths = 1 Then ;reset status van de PCF8583. (PCF8583 is leeg) 
        GoSub setTime                                      ;Stelt klok op "Do 28 Feb 2012  23:59:55" in.
    End If               
 
 
 
Loop:
    GoSub getTime
 
    Print At 1 , 1, Str WeekdagString, " ", Dec2 Dag," ",Str MaandString," ", Dec4 Jaar, "  "
    Print At 2 , 1 , @Uren, ":", Dec2 Minuten, ":", Dec2 Seconden, " " 
 
    DelayMS 100
 
    Toggle LED
 
    GoTo Loop
 
 
getTime:
 
    HBusIn %10100000, $02, [secs, mins, hrs,YearDays,WeekDayMonths] ;haal tijd op vanuit de PCF8583
    HBusIn %10100000, $10, [ JaarDev4 , jaar3]                      ;haal jaar op (-2000 / 4) 
 
    Seconden = ((secs >> 4) * 10) + (secs & 15)                     ;zie proton help "Math Operators"
    Minuten  = ((mins  >> 4) * 10) + (mins  & 15)
    Uren     = ((hrs     >> 4) * 10) + (hrs     & 15)
    Dag      = (((YearDays >> 4 ) & 3 ) * 10) + (YearDays  & 15)
    Maand    = (((WeekDayMonths >> 4) & 1 ) * 10) + (WeekDayMonths  & 15)
    JaarVier = (YearDays     >> 6)
    Weekdag  = (WeekDayMonths  >> 5)
 
    Jaar = 2000 + JaarVier + (JaarDev4*4)
 
    If JaarVier = 3 Then                    ;Twee if statements om JaarDev4 eens in de 4 jaar te verhogen 
        jaar3 = 1                           ;Bij overgang naar schrikkeljaar
        HBusOut %10100000, $11, [ jaar3 ]
    End If
 
    If JaarVier = 0 And jaar3 = 1 Then      ; omslag naar jaar 0 (schrikkeljaar)
        jaar3 = 0
        JaarDev4 = JaarDev4 + 1             ; JaarDev ophogen met 1 
        HBusOut %10100000, $10, [ JaarDev4, jaar3 ]
    End If
 
    Select Case Weekdag
        Case 0
            Str WeekdagString = "Zo"
        Case 1
            Str WeekdagString = "Ma"                                                    
        Case 2
            Str WeekdagString = "Di"
        Case 3
            Str WeekdagString = "Wo"
        Case 4
            Str WeekdagString = "Do"
        Case 5
            Str WeekdagString = "Vr"
        Case 6
            Str WeekdagString = "Za"
    End Select
 
    Select Case Maand
        Case 1
            Str MaandString = "Jan"
        Case 2
            Str MaandString = "Feb"    
        Case 3
            Str MaandString = "Mar"
        Case 4
            Str MaandString = "Apr"    
        Case 5
            Str MaandString = "Mei"
        Case 6
            Str MaandString = "Jun"    
        Case 7
            Str MaandString = "Jul"
        Case 8
            Str MaandString = "Aug"    
        Case 9
            Str MaandString = "Sep"
        Case 10
            Str MaandString = "Okt"    
        Case 11
            Str MaandString = "Nov"
        Case 12
            Str MaandString = "Dec"
    End Select
Return
 
setTime:                   ;Wordt in dit voorbeeld alleen gebruikt om lege PCF8583 te vullen
 
    Seconden = 55          ;Waarden voor "Do 28 Feb 2012  23:59:55" (testen schrikkeldag)
    Minuten = 59
    Uren = 23
    Dag = 28
    Maand = 2
    Jaar = 2012
    Weekdag = 4           ; Donderdag                                               
 
    dummy=Seconden/10     ;dummy is tientallen van Seconden
    dummy=dummy*16        ;waarde doorschuiven naar de vier MSB
    secs=Seconden//10     ;secs is eenheden van Seconden 
    secs=secs | dummy     ;Bitwise OR combineert beide waarden in een byte
 
    dummy=Minuten/10
    dummy=dummy*16
    mins=Minuten//10
    mins=mins | dummy
 
    dummy=Uren/10
    dummy=dummy*16
    hrs=Uren//10
    hrs=hrs | dummy
 
    JaarVier = (Jaar - 2000) // 4                                   'rest van Jaar-2000 gedeelt door 4
    YearDays = (JaarVier << 6) +  ((Dag / 10) << 4) + (Dag // 10)
    JaarDev4 = ((Jaar - 2000) / 4)                                   ;Integer van Jaar-2000 gedeeld door 4 
 
    WeekDayMonths = (Weekdag << 5) + ((Maand/10) << 4) + (Maand //10)
 
    HBusOut %10100000, $02, [ secs,mins,hrs, YearDays,WeekDayMonths ]
    HBusOut %10100000, $10, [ JaarDev4 ]
Return
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Arco

Special Member

Het is niet helemaal duidelijk wat je nu gebruikt. Je schrijft PCF8563, maar de code is voor een PCF8583... (een heel ander klok ic)
Geven die i2c functies geen waarde terug of e.e.a. gelukt of niet gelukt is?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Registers voor de PCF8563

http://www.knutselaar.eu/images/RTC/PCF8563-register-table-thumb.jpg

Registers voor de PCF8583

http://www.knutselaar.eu/images/RTC/PCF8583-register-table-thumb.jpg

Deze zijn dus niet gelijk, zoals Arco al aangaf.

Ow wat stom!
Dat zie ik nu pas.
Ik werk met de 8583!
Ik ben vermoedelijk de mist in gegaan bij het zoeken naar info met de zoekkreet PCT.

@Piet, je programma was toegespitst op de 18Fxxx PIC's
De configs voor de 16Fxxx ken ik niet...

Ik bedoel, ik kan niet zomaar een vertaalslag maken.

(vervolg)
Ik heb hem goed aangesloten en de programmering is, evan los van de 18F gebasseerde config en codes, hetzelfde als bij Piet.

Ik stuur ook Donderdag enkele seconden voor 0:00 aan.

Ik krijg echter standaard een reading op mijn display met:
Vr xx feb 2625 oid. De datum weet ik niet meer (ben nu niet thuis) maar wel dat het Vrijdag was en een jaartal dat ik niet meer ga meemaken.
De tijd is dan 010:00:00
De tijd loopt ook niet op.

Het is wel appart (of juist niet) dat deze info altijd gelijk is.
Na een reset, reboot van alles of wat dan ook...
Hij blijft gelijk.

Even en opwelling hoor, maar worden alle configs van de PCF8583 wel goed gezet in het begin? (kan het nu niet controleren)

Haal ik de DTA en CLK lijnen weg, komt hij niet verder dan Knutselaar.eu (ook dat wilde ik nog even laten staan. :-) )
Laat ik de clk (volgens mij was het CLK, die op pootje 23 van de 16F877) weg, krijg ik óók diezelfde reading.

Ik weet niet waar het fout gaat.
Kan die WDT nog iets doen? Die staat in het config deel van de code van Piet wel uitgeschakeld, maar niet in die code van mij...
Kon ik gisteren niet meer testen.

[Bericht gewijzigd door Fantomaz op vrijdag 6 februari 2015 14:59:06 (66%)

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

Ik gebruik voor de 16F877A config meestal:

pic basic code:


Device 16F877A               
Config HS_OSC , WDT_OFF, PWRTE_ON, LVP_OFF

Misschien moet je de batterij van de PCF8583 eens losmaken
Het programma wat ik gestuurd heb stelt alleen de tijd in wanneer de PCF8583 leeg is.

Dat het progamma niet verder loopt wanneer je de I2C lijnen verbreekt, klop.
Het commando HbusIn en HbusOut blijft wachten.

[Bericht gewijzigd door Piet_Knutselaar op vrijdag 6 februari 2015 17:04:21 (18%)

Dank je Piet.
Ik zal het eens met die configs proberen.
Ik had overigens geen externe voeding aangesloten op de PCF8583.
Hij had uitsluitend zijn 5v= van de reguliere voeding.
Dat wordtwel anders, maar ik zit nog watin de testfase.

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)

Hallo Fantomaz,

Ik heb alles even vluchtig doorgelezen, weet niet helemaal precies wat je van plan bent om te gaan doen.

Ik heb echter weleens met I²C gewerkt, volgens een master-slave principe.

Voor de Slave moest van te voren i.i.g. dit neergezet worden:
#include <16F883.h>
#use delay(clock=8000000)
#fuses HS,NOWDT,INTRC_IO
#use i2c(SLAVE,sda=PIN_C4,scl=PIN_C3,address=0x04)

Bij bij de master dit:
#include <16F887.h>
#use delay(clock=8000000)
#fuses HS,WDT,INTRC_IO,PUT, NOLVP
#use i2c(Master,sda=PIN_C4,scl=PIN_C3,RESTART_WDT)

De slave heeft dus een bepaald adres, dat is hier 0x04.

pic basic code:


   i2c_start();               //set i2c to start condition
   i2c_write(0x04);           //send address
   i2c_write(0x55);      //send master data from port B bits
   i2c_start();               //restart to change data direction
   i2c_write(0x05);           //address with direction bit changed
   i2c_stop();

Met 0x04 kan de master naar de slave schrijven. Door opnieuw een i2C_start op te roepen, en het adres van de slave met +1 te verhogen kan de master nu ontvangen ipv data zenden.

Ik weet niet of dit hetgene is wat je bedoeld, maar zoiets zie ik nergens terug.

Ik werk met Picbasic, Mirno.
De door jou gestelde code's ken ik niet.
Ik houd vast aan een paar werkende voorbeeld progjes, die moet custumizen naar mijn project.
Ik hebechter hetvoorbeeld progje nog niet werkend omdat de configfiles anders zijn.
Maar bedank voor je suggestie :-)

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
marcob

Golden Member

Als je problemen hebt met de config / fuse, installeer dan de PIC® Fuse Configurator. Kies je zelf de juiste config, inclusief uitleg van de verschillende opties. Voor extra uitleg is de datasheet en Google ook een goede vriend.

http://www.protonbasic.co.uk/content.php/2607-PIC-FuseConfigurator-Mk2

Ook een tweede tip, plaats een LED op een uitgang welke je laat knipperen via je hoofd lus. Of zet je tijdelijk in andere routines, zo merk je snel en eenvoudig wat een programma wel of niet doet.

[Bericht gewijzigd door marcob op zondag 8 februari 2015 00:33:22 (25%)

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Je argument met de LED is me wel bekend, Marcob.
Dat doe ik zelf ook vaak. Hoewel ik tegenwoordig markeringen op het display print, zodat ik niet alleen kan zien waar het programma zich bevindt, maar ook wat een zekere waarde moet zijn.

Tenzij ik je verkeerd begrijp en je doelt op een LED op de I2C data- of clocklijnen om te zien of er communicatie is.

Daarbij...
Er zijn een aantal voorbeelden van programma's die je kunt uitkleden naar believen, of die je kunt knippen & plakken in je eigen programma.
Dat ga ik doen, maar laat ik dan eerst dat voorbeeldprogramma eens daadwerkelijk werkend zien.
Daar zit ik nu...
Programma is mooi en zou moeten werken.
Ik heb het redelijk kunnen doorgronden en het enige wat anders is, is dat het gebaseerd is op de 18Fxxxx PIC en niet op mijn 16F877A waarvan de config settings anders zijn.

Piet_Knutselaar had al aangegeven in dit topic welke configs hij gebruikt in de 16F877a PIC, dus die ga ik zometeen eerst proberen.

Je linkje, marcob, ga ik zo bekijken.

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)