Nou heb ik dit forum al flink doorgespit maar kom niet echt iets bruikbaars tegen dus dan maar zelf aan de gang.
Pic-basic Lite (proton) gedownload en ff de handige cursus doorlopen (op picbasic.nl) en gaan. Nu heb ik wat in elkaar gezet wat op zich wel werkt, als de spanning wegvalt dan wordt de data netjes in EEProm gezet en bij aanzetten weer uitgelezen en gebruikt. Zit alleen nog met wat vragen/foutjes dus alle hulp is welkom. Wil graag UREN,Minuten op het display (alles wordt nu omgerekend naar hele uren). Code moet geoptimaliseerd worden want ik wil ook nog een toerenteller maken en heb daar anders geen ruimte (denk ik) meer voor. kortom hier is mijn voorbeeld en wie heeft er tips.

Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
;EEPROM adresnamen 
Symbol EE_Teller    = 0       ;Adres 0 van de EEPROM bevat de tellerstand
; adresnaam spanningsdetektie
Symbol  noPower     =   PORTA.1
;Variabelen declareren
Dim Teller          As Word   ;Deze variabele bevat de tellerwaarde 
;eeprom waardo op nul zetten
EData 0
;start programma
Cls                           ;Display allereerste keer wissen
Clear
DelayMS 500                   ;LCD stabilisering 
;Hoofdprogramma
Print At 2,5, " Hrs In Use"
Teller = ERead EE_Teller      ;Lees EEPROM met adres 'EE_Teller' en geef waarde aan 'Teller'
;teller loop
    While 1 = 1
    Inc Teller       ;Ophogen van de waarde van teller met 1
    Print At 2,1, DEC3 (Teller/60)     ;De waarde in uren op het display zetten 
    DelayMS 6000  (edit: dit moet natuurlijk 60.000 zijn)            ;Een minuut wachten
    GoSub spanningweg         ;check even of er nog spanning aanwezig is
    Wend
spanningweg:
;Controleren op voedingsspanning
    If noPower = 1 Then
        EWrite EE_Teller, [Teller]
        DelayMS 20
    EndIf
Return
End

[Bericht gewijzigd door klein is fijn op (0%)]

Een minuut heeft 60.000 ms, geen 6.000.

De door jou gekozen methode is zeer onnauwkeurig:
1) De andere instructies (naast de delay) kosten ook tijd
2) De interne oscillator is onnauwkeurig.

Als je het niet erg vind dat je er per minuut een aantal seconden naast zit maakt dat niet uit. Anders wel.

Oplossingen: een kristal gebruiken en een van de interne timers van de PIC.

Inderdaad niet echt handig van mij een minuut heeft 60.000 ms (heel scherp picsels) :-)

De bedoeling is om natuurlijk gebruik te gaan maken van een Xtal oscillator om de tijdbasis wat nauwkeuriger te maken.

Maar goed afgezien van jullie tips nog andere handige code-snippets?

Op 20 december 2008 19:08:12 schreef JoWi:
Als je het niet erg vind dat je er per minuut een aantal seconden naast zit maakt dat niet uit. Anders wel.

"Zeer onnauwkeurig" en "een aantal seconden per minuut" is zwaar overdreven. Ik denk dat je met 1 while en 1 increase instructie nog geeneens een seconde afwijking per uur haalt.

Stel je uC draait op 12Mhz, er zitten 3600 seconden in een uur, dan moet je bijna extra 1000 instructies per seconde gebruiken wil je aan de 1 seconde afwijking per uur komen. Een While loopje met een Incr en Print verbruikt een stuk minder.

Gebruik je een AVR dan kom je helemaal nooit aan de 1 seconde per uur, gezien zo'n ding ruim 3000 extra instructies per seconde moet afwerken om 1 seconde vertraging per uur te krijgen op 12MHz.

Interne oscilators zijn echter niet handig om te gebruiken, maar met een goed gecalibreerde red je nog steeds geen seconden per minuut.

Interne oscillator zou binnen 1% nauwkeurig moeten zijn toch?

Verder zou ik me idd niet druk maken om die paar instructies, die delay van 60 seconden zijn 60 miljoen instructies (op 4 mhz). Als de rest 1000 instructies kost is de afwijking 16 ppm.

Op 21 december 2008 14:32:28 schreef klein is fijn:
[...]"Zeer onnauwkeurig" en "een aantal seconden per minuut" is zwaar overdreven. Ik denk dat je met 1 while en 1 increase instructie nog geeneens een seconde afwijking per uur haalt.

Typo, ik bedoelde "een aantal seconden per uur". Maar dan hou ik nog steeds mijn "zeer onnauwkeurig" vol.
Een 1% nauwkeurigheid betekend dus 36 seconden per uur. Mischien heb jij een klok die 12 minuten per dag afwijkt, maar dat lijkt mij niet normaal.
Ik heb even gemeten aan een 16F628 bij kamertemperatuur en 5.0 Volt, dan draait de interne oscillator op 4.035 MHz en voldoe je aan de 1% grens, Maar bij afwijkende temperatuur en spanning dus niet.

Hier zie je trouwens het frequentieverloop van een 1Mhz klok van een andere PIC (geen "precision RC") over anderhalf uur:
http://pe1grl.khds.nl/images/RC_osc.gif

De andere code in de loop is nu nog minimaal, maar volgens mij wil de TS ook nog een toerenteller toevoegen, en dan klopt die delay natuurlijk steeds minder.

Een 32.768 kristal aansluiten op timer1, prescaler op 1:1, levert 2 overflows per seconde op. dat los je perfect op door in de interrupt timerh na de overflow te laden met b'10000000'. De nauwkeurigheid wordt bepaald door je kristal. Ik heb er momenteel 1 lopen die in 1 dag minder dan 1 seconde afwijkt. Good enough for me.

Hier zie je trouwens het frequentieverloop van een 1Mhz klok van een andere PIC (geen "precision RC") over anderhalf uur:

Apart.. op zich is hij wel stabiel binnen +/- 1%, maar zit structureel 10% onder de gewenste waarde. Ik vraag me af of het wel goed gemeten is?

Maar goed, als je het nauwkeurig wilt qua klok kun je beter direct naar ofwel netspanning, ofwel DCF/GPS kijken. Zelfs een goed kristal met 10 ppm zit er op jaarbasis nog 5 minuten naast.

Waarschijnlijk verkeerd gekalibreerd? Of slecht aangesloten?

Het viel me op dat het weghalen van ontkoppelings condensatoren bij m'n pic een flink verschil maakte met de stabiliteit van de interne rc. Gemeten met een while loopje en een knipperend led. Snelheid leek steeds langzamer te worden. Heb het toen maar een paar minuten laten lopen, op een vrij trage clock, maar het was vrij goed zichtbaar.