Pic kristal frequentie fout

Alle vragen m.b.t digitale schakelingen m.b.v. losse i.c's
en oplossingen m.b.v. PIC processoren.
Plaats reactie
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Pic kristal frequentie fout

Bericht door Stynus »

Ik heb een 3276800Hz kristal aan een pîc16f877a hangen bij een soort klok. Nu heb ik een klein testprogramma gemaakt om de interrupt te testen en het valt me op dat ik rond de 60-80 interrupts teveel krijg per minuut.

Ik heb timer0 gebruikt voor de interrupt. De prescaler staat op 256 In het TMR0 register steek ik telkens 128. Dan zou ik volgens mijn berekening op 25 interupts per seconden komen.
3276800/4*256*128*x=1sec
(x = aantal interrupts)
3276800/4*256*128*25=1sec

Mijn test code

Code: Selecteer alles

    Device          16F877A
    Config          WDT_Off, PWRTE_ON, XT_OSC , PWRTE_ON, lvp_off
    XTAL            3',2768 MHz
    ALL_DIGITAL     true
    
    'Lcd declaraties      
    Symbol  Lengte      = 16
    Symbol  Regels      = 2
    Declare LCD_DTPIN PORTD.4 
    Declare LCD_ENPIN PORTD.1
    Declare LCD_RSPIN PORTD.0
    Declare LCD_INTERFACE   4
    Declare LCD_LINES   Regels
    
    'Knoppen 
    Symbol  Knop1       = PORTE.2
    Symbol  Knop2       = PORTA.0
    Symbol  Knop3       = PORTA.4
    Symbol  Knop4       = PORTC.0
    Symbol  Knop5       = PORTA.1
    Symbol  Knop6       = PORTA.5
    Symbol  Knop7       = PORTC.1
    Symbol  Knop8       = PORTA.2
    Symbol  Knop9       = PORTE.0
    Symbol  Knop0       = PORTA.3
    Symbol  Knopenter   = PORTE.1
    Symbol  Knopback    = PORTC.2        
    Symbol  Back        = 10
    Symbol  Enter       = 11 
    Dim     Knop        As Byte    
    Dim     Uren10      As Byte
    Dim     Uren1       As Byte
    Dim     Min10       As Byte
    Dim     Min1        As Byte
    
    'Algemeen
    Dim     Index       As Byte
    Dim     intAan      As Bit
    Dim     temp        As Byte
    Dim     initbit     As Bit
    
    'Leds
    Symbol  rij0        = PORTC.7
    Symbol  rij1        = PORTC.6
    Symbol  rij2        = PORTC.5
    Symbol  rij3        = PORTC.4
    Symbol  rij4        = PORTD.3
    Symbol  rij5        = PORTD.2
    Symbol  ledKolom    = PORTB
    Dim     ledTabel[6] As Byte
    TRISB               = 0
    
     'Tijden
    Dim     Uren        As Byte
    Dim     Minuten     As Byte
    Dim     Seconden    As Byte
    Dim     Tijd        As DWord
    Dim     LedTijd     As Word
    
    'Interupt   
    Symbol  T0IE        = INTCON.5         ' TMR0 Overflow Interrupt Enable 
    Symbol  T0IF        = INTCON.2         ' TMR0 Overflow Interrupt Flag 
    Symbol  GIE         = INTCON.7         ' Global Interrupt Enable 
    Symbol  PS0         = OPTION_REG.0     ' Prescaler ratio bit-0 
    Symbol  PS1         = OPTION_REG.1     ' Prescaler ratio bit-1 
    Symbol  PS2         = OPTION_REG.2     ' Prescaler ratio bit-2  
    Symbol  PSA         = OPTION_REG.3     ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)  
    Symbol  T0CS        = OPTION_REG.5     ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
    '3276800/4*256*128*25=1sec 
    GIE                 = 0                         ' Turn off global interrupts 
    PSA                 = 0                         ' Assign the prescaler to external oscillator 
    PS0                 = 1                         ' Set the prescaler 
    PS1                 = 1                         ' to increment TMR0 
    PS2                 = 1                         ' every 256th instruction cycle 
    T0CS                = 0                        ' Assign TMR0 clock to internal source 
    TMR0                = 128                        ' Clear TMR0 initially 
    T0IF                = 0
    T0IE                = 1                        ' Enable TMR0 overflow interrupt 
    GIE                 = 1                         ' Enable global interrupts 

    Clear
    Cls
    Dim bla As Word 
    hier: 
'****************************************************************
    High rij0
    PORTB = 0
    
main:
    Print At 1, 1, DEC2 Minuten, ":", DEC2 Seconden
    DelayMS 500
GoTo main

ON_HARDWARE_INTERRUPT GoTo Interupt
GoTo hier
Interupt:
    If T0IF = 1 Then
        T0IF = 0
        TMR0 = 128 
        Inc Index
        If Index = 26 Then
            Index = 0
            Toggle PORTB.0
            Inc Seconden
            If Seconden = 60 Then
                Seconden = 0
                Inc Minuten
            EndIf        
        EndIf
    EndIf
 Context Restore                 ' Restore the registers and exit the interrupt    

End

Ziet er soms iemand waarom het fout gaat?
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Gebruikersavatar
cheeta
Berichten: 514
Lid geworden op: do 7 okt 2004, 21:16
Locatie: . .. .. .. .. .. .. .

Bericht door cheeta »

vanwaar dat kristal is zo te zien een infra rood kristal?
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Als je 4mhz neemt dan krijg je nooit een tijd waar je iets mee kan.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Mat Janssen
Moderator
Moderator
Berichten: 11593
Lid geworden op: wo 10 dec 2003, 18:36
Locatie: nederweert. .. .. .. .. .. .. .. .. .

Bericht door Mat Janssen »

Misschien moet het kommaatje dat je bij de 3 hebt staan, weg.
XTAL 3',2768 MHz
signature ruimte te huur ;-)
Verhuurd :!:
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Nee achter de 3 is commentaar.
Ik kan alleen 3 aangeven daar.

Maar dat kan het niet zijn. Al geef ik daar 20 in dan moet mijn interrupt nog goed lopen aangezien die met een hardware timer werkt.

Maar ik was net is aan het denken. als de condensatoren bij het kristal "fout" zijn, verandert dan de frequentie?
Hoeveel pF moet ik normaal zetten bij deze frequentie?
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Mat Janssen
Moderator
Moderator
Berichten: 11593
Lid geworden op: wo 10 dec 2003, 18:36
Locatie: nederweert. .. .. .. .. .. .. .. .. .

Bericht door Mat Janssen »

Afhankelijk van het merk en type ligt deze tussen de 22 en 33 pF.
signature ruimte te huur ;-)
Verhuurd :!:
Gompy

Bericht door Gompy »

Bij een frequentiemeter regel je de kristalklok bij met een folietrimmer.
Nu laat ik even mijn gedachten de vrije loop, wanneer je een afwijking in de condensatoren hebt doe je eigenlijk het zelfde als met de folietrimmer.
http://hem.passagen.se/communication/pic/fcntrs232.gif
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Dat kan ik ook wel is proberen.
Straks is kijken of ik er nog 1 heb liggen.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Gompy

Bericht door Gompy »

BTW, wist je dat je websites niet te benaderen zijn ?
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Ja weet ik. Is vannacht iets mis gegaan bij men host.
Heb al een mail gestuurd ervoor maar meer kan ik niet doen :p. Zal morgen normaal wel gemaakt zijn hoop ik.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Ik heb geen regelbare condensator kunnen vinden dus heb het maar in de software gefixt.
De 128 die ik eerst in het T0IF register zette heb ik vervangen door 118. Nu heb ik op een uur nog 5sec afwijking wat goed genoeg is voor dit.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

De complete code is ondertussen klaar:
http://www.elektronicastynus.be/Project ... hp#Update2
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
reddevil
Berichten: 316
Lid geworden op: wo 7 feb 2007, 22:54
Locatie: lummen. .. .. .. .. .. .. .. .. .....

Bericht door reddevil »

Ziet er goed uit, heb 1 kleine opmerking: je hebt je subroutines van onder gezet, dat kan oms problemen geven.
Dit heb ik zelf al ondervonden, dat het programma niet werkte en gewoon de subs van boven gezet en toen wel perfect werkte zonder voor de rest iets aan het programma te veranderen.
Professioneel LED Temmer :twisted: alléé dat hoop ik.
Yoepie
Berichten: 11
Lid geworden op: wo 30 apr 2008, 8:53
Locatie: . .

Re: Pic kristal frequentie fout

Bericht door Yoepie »

stynus schreef:Ik heb een 3276800Hz kristal aan een pîc16f877a hangen bij een soort klok. Nu heb ik een klein testprogramma gemaakt om de interrupt te testen en het valt me op dat ik rond de 60-80 interrupts teveel krijg per minuut.

Ik heb timer0 gebruikt voor de interrupt. De prescaler staat op 256 In het TMR0 register steek ik telkens 128. Dan zou ik volgens mijn berekening op 25 interupts per seconden komen.
3276800/4*256*128*x=1sec
(x = aantal interrupts)
3276800/4*256*128*25=1sec

knip knip

Ziet er soms iemand waarom het fout gaat?

Misschien stomme vraag maar waarom laat je de pic niet op 4Mhz lopen en hang je het cristal niet op porta.4 met TOCS op 1 of bij een exacte timing van een DS1307 + DS32Khz via I2C

Nog een ding....

'Interupt
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol GIE = INTCON.7 ' Global Interrupt Enable

'------------------------------------------------------------------
goto jump_over_interrupt

Interrupt_routine:
bla
bla
bla
retfie

jump_over_interrupt:


GIE = 0 ' Turn off global interrupts
PSA = 0 ' Assign the prescaler to external oscillator
PS0 = 1 ' Set the prescaler
PS1 = 1 ' to increment TMR0
PS2 = 1 ' every 256th instruction cycle
T0CS = 0 ' Assign TMR0 clock to internal source
TMR0 = 128 ' Clear TMR0 initially
T0IF = 0
T0IE = 1 ' Enable TMR0 overflow interrupt
GIE = 1 ' Enable global interrupts
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5971
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

deze manier is goedkoper. En aan een RTC moet voor zover ik weet nog altijd een kristal aan.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
Yoepie
Berichten: 11
Lid geworden op: wo 30 apr 2008, 8:53
Locatie: . .

Bericht door Yoepie »

stynus schreef:deze manier is goedkoper. En aan een RTC moet voor zover ik weet nog altijd een kristal aan.
Sampel bestellen bij maxim dan weet je wat je hebt aan een DS1307 + DS32Khz
ooit was ik ook bezig de tijd te berekenen via een pic, te veel rompslomp.
Heb toen 14 dagen op tijd gekregen daarna 1 sec verschil, 28 dagen 2sec verschil etc
na zoveel dagen de sec weer af- bijtellen. Ahnee geef mij maar een RTC met ingebouwd kristal. Werkt altijd en op tijd!

hier zie je een voorbeeld
http://www.protongeeks.com/index.php?op ... &Itemid=28
Plaats reactie