Décodage signal DCF77
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Décodage signal DCF77



  1. #1
    invitea2667dd8

    Exclamation Décodage signal DCF77


    ------

    Je dois faire une horloge à l'aide du signal DCF77 avec un microcontroleur.

    Est-ce que quelqu'un peut m'aider pour savoir comment je dois traîter ce signal ????

    Merci pour votre aide !!!

    -----

  2. #2
    Jack
    Modérateur

    Re : Décodage signal DCF77

    salut,

    qu'appelles-tu "traiter le signal"? Tu parles du signal radio et de sa démodulation? du décodage du signal numérique?

    A+

  3. #3
    f6bes

    Re : Décodage signal DCF77

    Bjr Jack,
    En général c'est bien cela: extraire les tops de synchronisme pour commander
    les compteurs de l'horloge.En général c'est un petit module tout prét.
    Cordialement

  4. #4
    invitea2667dd8

    Re : Décodage signal DCF77

    He bien j'ai un module qui me donne des impulsions de 100 ms ou 200ms toutes les secondes. Le problème que j'ai c'est que je ne sais pas comment m'y prendre pour traiter ces impulsions. Détetecter des niveaux ou des flancs?? Comment savoir que j'ai l'impulsion du début de la trame.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Décodage signal DCF77

    j'espère que tu as lu le principe de fonctionnement du DCF77?

    Tu as pu constater que le codage d'un bit à '0' ou à '1' dépendait de la largeur de l'impulsion: chaque bit est codé sur une seconde,la valeur variant selon la durée de l'impulsion (100ms pour un '0' et 200ms pour un '1')

    Pour synchroniser le début de trame, il suffit de ne pas détecter d'impulsion pendant une durée supérieure à 1s.

    A+

  7. #6
    invited185049b

    Question Re : DEMANDE d'aide!

    Bonjour,

    quelqu'un pourrait m'aide pour faire le programme en c qui decode le signal horaire dcf77 par un microcontrôleur PIC18F458 et affiché sur LCD ?
    à partir de cette info de programme que j'ai obtenu ci-dessous en assembler avec le PIC16F84.

    Un grand merci

    ______________________________ __________________
    Le timer TMR0 est configuré de telle maniere qu'une interruption tmr0 a lieu toutes les :

    1) pour la detection = 1000ms / 256=>(pre-diviseur tmr0) / temps d'une interruption soit 66.56µs
    ; quartz de 15M360 /4 = 3840 = 0.260µs
    ; d'ou une interruption toutes les 0.260µs * 256 = 66.56µs
    1000000µs / 256 / 66.56µs= 58.68 ===> mon compteur "cmpt_TIMER_0" atteindra cette valeur pour detecter les 1000 ms

    j'arrondis à la valeur 58 ou 3A hexa

    Le bit de synchro sera donc detecté si la valeur de mon compteur tmr0 est = à 58 *2 soit 116 ou 74 hexa ==> detection_start_bit
    selon caractéristique du start bit ,temps entre bit 58 et 60 (ou 0) = 2seconde ya pas de bit 59

    Je considére toute valeur supérieure à 70 hexa, pour mon compteur, la detection du start bit ( je choisis la valeur d115)

    A la 1ere interruption RB0 , on clear le timer 0 et son compteur , le principe étant de mesurer par la suite
    le temps entre 2 interruptions qui nous donnera 2 resultats soit 58 pour un "bit normal" ou 74 pour un "start bit"

    Pour les bits 20 , 21 à 27 , 29 à 34 puis parité 28 et 35,un wait de 150ms afin de tester l'état re‡u , à savoir soit un 0 ou un 1
    des impulsions de 100 ms=0 ou 200 ms=1











    ; interrup RB0
    ;*************
    int_RB0
    bcf STATUS , RP0 ; sélectionner banque0
    bcf STATUS , RP1

    btfsc INTCON,INTE ; bit4 tester si interrupt RB0 autorisée
    btfss INTCON,INTF ; oui, tester si interrupt RB0 en cours
    ; signale une transition sur la pin RB0 dans le sens déterminé par
    ; INTEDG du registre OPTION (b6)

    goto int_suivante ; non sauter

    call INT_RB0 ; oui, traiter interrupt RB0
    clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
    clrf TMR0 ;reset du timer0
    bcf INTCON,INTF ; effacer flag interupt RB0

    goto int_end ;fin interruption

    etc…………….


    INT_RB0

    ;interruption rb0 portB RECEPTION DCF 77


    bcf STATUS,RP0
    bcf STATUS,RP1 ;en bank 0

    bsf INTCON,T0IE ;autorise le timer 0 des la 1ere interruption rb0

    movlw B'00000001' ; valeur pour inverser LED
    xorwf PORTC,f ; inverser LED

    btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
    goto $+2 ; non pas encore
    goto compteur_dcf77_59bits ; oui alors prgm normal

    ; DETECTION du START-BIT
    ;˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜
    detection_startbit
    movfw cmpt_TIMER_0 ;charge nb interruptions tmr0
    addlw -d'115' ; ;detection_start_bit-d'117'
    ;TMR0 cmpt doit etre au minimum à cette valeur pour le start-bit
    btfsc STATUS,C
    goto synchro_ok
    clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
    clrf TMR0 ;reset du timer0
    return

    synchro_ok ;on a détecté le bit de synchro, init du compteur

    clrf compteur_dcf77 ; init à 0

    bsf bit_synchro_dcf77_ok,0 ;c'est le bit de synchro, je signale sa prise en compte par ce flag
    bcf STATUS,RP0 ;en bank 0
    return

    compteur_dcf77_59bits
    ;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    bcf STATUS,RP0
    bsf PORTA,5 ;synchro ok led ON
    incf compteur_dcf77,f ; init à 0

    VERIF_PULSE_2_Seconde
    ;*********************
    movfw compteur_dcf77 ;compteur à 59 ?
    xorlw d'59' ; 3C en hexa
    btfss STATUS,Z
    goto VERIF_PULSE_1_Seconde

    movfw cmpt_TIMER_0
    ;charge nb interruptions tmr0 (2s-150ms)/256/66.56= 108.5 je mets 100
    addlw -d'100' ; ;detection_start_bit-d'117' ;
    btfsc STATUS,C
    goto VERIF_PULSE_1_Seconde

    clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
    clrf TMR0 ;reset du timer0

    clrf compteur_dcf77 ;pas glop! ...on reset tout
    bcf PORTA,5
    clrf HEURES_DCF ; on reset les variables DCF
    clrf MINUTES_DCF
    clrf bit_synchro_dcf77_ok ;on reset le bit_synchro_dcf
    return

    VERIF_PULSE_1_Seconde
    ;***************************** ********
    movfw cmpt_TIMER_0
    ;charge nb interruptions tmr0 (1s-150ms)/256/66.56= 58.6 je mets 45
    addlw -d'45' ; soit 760 ms minimum entre 2 pulses
    btfsc STATUS,C ;si inférieure à d45 C=1
    goto RESET_DU_COMPTEUR

    clrf compteur_dcf77 ;pas glop! ...on reset tout
    bcf PORTA,5
    clrf HEURES_DCF ; on reset les variables DCF
    clrf MINUTES_DCF
    clrf bit_synchro_dcf77_ok ;on reset le bit_synchro_dcf
    return




    RESET_DU_COMPTEUR
    ;***************************
    bcf STATUS,RP0
    movfw compteur_dcf77 ;compteur à 60 ?
    xorlw d'59' ; 3C en hexa
    btfss STATUS,Z
    goto $+2
    clrf compteur_dcf77 ;remets compteur à 0


    ENVOIE_MISE_A_HEURE
    ;***************************
    movfw compteur_dcf77 ;compteur à 0 ?
    btfss STATUS,Z ;test si Z=1
    goto BITS_20_TEST ;non on continu
    call Envoie_mise_heure ; vers affichage lcd
    return ;et on sort

    BITS_20_TEST
    ;****************
    movfw compteur_dcf77 ;test si bit 20 = 1 comme il se doit
    xorlw d'20'
    btfss STATUS,Z ;compteur à 20 ? alors bit C =1
    goto BITS_28_TEST
    call DELAY_150ms ; 153.755 exactement
    btfsc PORTB,0 ;tester si = 1 200ms =1 100ms = 0
    goto BITS_28_TEST
    bcf bit_synchro_dcf77_ok,0 ;alors erreur reception
    return

    BITS_28_TEST
    ;*****************
    bcf STATUS,RP0
    btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
    goto BITS_35_TEST

    bcf STATUS,RP0
    movfw compteur_dcf77 ;teste la PARITEE PAIRE des bits 21 à 27 ==> bit 28
    xorlw d'28'
    btfss STATUS,Z ;compteur à 28 ? alors bit Z =1
    goto BITS_35_TEST
    call TEST_PARITE ;flag =0 ?...
    clrf FLAG_PARITE ;reset flag
    return
    BITS_35_TEST
    ;*****************
    bcf STATUS,RP0
    btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
    goto BITS_0_19

    bcf STATUS,RP0
    movfw compteur_dcf77
    xorlw d'35' ;teste la PARITEE PAIRE des bits 29 a 34 ==> bit 35
    btfss STATUS,Z
    goto BITS_0_19
    call TEST_PARITE ;flag =0 ?...
    clrf FLAG_PARITE ;reset flag
    return

    BITS_0_19
    ;************
    movfw compteur_dcf77 ;compteur de 0 à 20 (hexa=14) ,on passe
    sublw d'19'
    btfss STATUS,C ;compteur à 21 ? alors bit C =0
    goto BITS_36_59
    return

    BITS_36_59
    ;*************
    movfw compteur_dcf77 ;compteur de 36(hexa=24) à 59(hexa=3B) ,on passe
    sublw d'35'
    btfsc STATUS,C ;compteur sup à 37(hexa=25)
    goto capture_bit_dcf77
    return

    capture_bit_dcf77
    ;***********************
    bcf STATUS,RP0 ;en bank 0
    bcf STATUS,Z ;clear bit Z
    BITS_29_34
    ;*************
    movfw compteur_dcf77 ;29 - 34 : Heures codées en BCD, bit de poids faible en premier
    sublw d'28'
    btfsc STATUS,C ;compteur à 29 ? alors bit C =0
    goto BITS_21_27
    goto DCF_HEURES

    BITS_21_27
    ;***************
    movfw compteur_dcf77 ;21 - 27 : Minutes codées en BCD, bit de poids faible en premier
    sublw d'20'
    btfsc STATUS,C ;compteur à 21 ? alors bit C =0
    goto $+2
    goto DCF_MINUTES
    return

    ;36 - 41 : Jour codé en BCD, bit de poids faible en premier.
    ;42 - 44 : Jour de la semaine codé en BCD, bit de poids faible en premier.
    ;45 - 49 : Mois codé en BCD, bit de poids faible en premier.
    ;50 - 57 : Année (sur deux chiffres) codées en BCD, bit de poids faible en premier.
    ;59 : Pas d'impulsion

    DCF_MINUTES
    ;**************
    bcf STATUS,RP0 ;en bank0
    call DELAY_150ms ; 153.755 exactement

    test1_valeur_bit_Parite
    ;**************************** ;calcul de la PARITE
    ;------------------------
    movfw PORTB ;charge valeur du portB
    andlw 0x01 ;garde seulemnt le bit 0
    xorwf FLAG_PARITE,f ;inverse le bit0 du flag ,doit etre à 0 pour une "PARITE PAIRE"

    ;test de la valeur re‡ue sur RB0
    ;---------------------------------------
    btfss PORTB,0 ;teste état du port si = 1
    goto zero_DCF_minute ;non a 0
    goto un_DCF_minute ;oui a 1

    zero_DCF_minute
    bcf STATUS,C ; force un 0 => Carry = 0
    rrf MINUTES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
    return

    un_DCF_minute
    bsf STATUS,C ; force un 1 => Carry = 1
    rrf MINUTES_DCF,f ;décalage vers la droite faire entrer le bit par la gauche
    return



    DCF_HEURES
    ;*************
    bcf STATUS,RP0 ;en bank0
    call DELAY_150ms ; 153.755 exactement

    test2_valeur_bit_Parite
    ;**************************** ;calcul de la PARITE
    ;------------------------
    movfw PORTB ;charge valeur du portB
    andlw 0x01 ;garde seulemnt le bit 0
    xorwf FLAG_PARITE,f ;inverse le bit4 du flag ,doit etre à 0 pour une "PARITE PAIRE"

    ;test de la valeur re‡ue sur RB0
    ;---------------------------------------
    btfss PORTB,0 ;teste état du port si = 1
    goto zero_DCF_heure ;non a 0
    goto un_DCF_heure ;oui a 1

    zero_DCF_heure
    bcf STATUS,C ; force un 0 Carry = 0
    rrf HEURES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
    return

    un_DCF_heure
    bsf STATUS,C ; force un 1 Carry = 1
    rrf HEURES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
    return

    TEST_PARITE
    ;¤¤¤¤¤¤¤¤¤¤¤¤¤

    ; on va vérifier que le bit de parité re‡u est identique au bit de parité calculé
    bcf STATUS,RP0 ;en bank0
    call DELAY_150ms ; 153.755 exactement


    movfw PORTB ;charge valeur PORTB
    andlw 0x01 ;sur RB0
    xorwf FLAG_PARITE,f ; xor avec la valeur calculée

    btfss FLAG_PARITE,0 ; si flag,0 = 0, alors nombre de "1" re‡us = pair, sinon impair.
    goto parite_paire
    goto parite_impaire

    parite_paire
    return
    parite_impaire
    bcf bit_synchro_dcf77_ok,0 ;traitement de l'erreur à écrire
    bcf PORTA,5 ;synchro nok led OFF
    clrf compteur_dcf77
    return

    Envoie_mise_heure
    ;**************************
    bcf STATUS,RP0 ;en bank 0

    bsf FLAG_DCF,1 ;autorise ecriture heure DCF vers le DS1307
    return

  8. #7
    inviteeec0036b

    Re : Décodage signal DCF77

    Salut fred,

    Je voudrai savoir si tu as reussi finalement a decodé le signal dcf et a afficher le temps? Quel langage as-tu utilisé?
    Cordialement.

    Citation Envoyé par fred_12 Voir le message
    He bien j'ai un module qui me donne des impulsions de 100 ms ou 200ms toutes les secondes. Le problème que j'ai c'est que je ne sais pas comment m'y prendre pour traiter ces impulsions. Détetecter des niveaux ou des flancs?? Comment savoir que j'ai l'impulsion du début de la trame.

  9. #8
    inviteeec0036b

    Re : DEMANDE d'aide!

    Salut roy,

    Je voudrai savoir si tu as finalement pu retranscrire le programme assembleur en C?


    Citation Envoyé par Roy_M Voir le message
    Bonjour,

    quelqu'un pourrait m'aide pour faire le programme en c qui decode le signal horaire dcf77 par un microcontrôleur PIC18F458 et affiché sur LCD ?
    à partir de cette info de programme que j'ai obtenu ci-dessous en assembler avec le PIC16F84.

    Un grand merci

    ______________________________ __________________
    Le timer TMR0 est configuré de telle maniere qu'une interruption tmr0 a lieu toutes les :

    1) pour la detection = 1000ms / 256=>(pre-diviseur tmr0) / temps d'une interruption soit 66.56µs
    ; quartz de 15M360 /4 = 3840 = 0.260µs
    ; d'ou une interruption toutes les 0.260µs * 256 = 66.56µs
    1000000µs / 256 / 66.56µs= 58.68 ===> mon compteur "cmpt_TIMER_0" atteindra cette valeur pour detecter les 1000 ms

    j'arrondis à la valeur 58 ou 3A hexa

    Le bit de synchro sera donc detecté si la valeur de mon compteur tmr0 est = à 58 *2 soit 116 ou 74 hexa ==> detection_start_bit
    selon caractéristique du start bit ,temps entre bit 58 et 60 (ou 0) = 2seconde ya pas de bit 59

    Je considére toute valeur supérieure à 70 hexa, pour mon compteur, la detection du start bit ( je choisis la valeur d115)

    A la 1ere interruption RB0 , on clear le timer 0 et son compteur , le principe étant de mesurer par la suite
    le temps entre 2 interruptions qui nous donnera 2 resultats soit 58 pour un "bit normal" ou 74 pour un "start bit"

    Pour les bits 20 , 21 à 27 , 29 à 34 puis parité 28 et 35,un wait de 150ms afin de tester l'état re‡u , à savoir soit un 0 ou un 1
    des impulsions de 100 ms=0 ou 200 ms=1











    ; interrup RB0
    ;*************
    int_RB0
    bcf STATUS , RP0 ; sélectionner banque0
    bcf STATUS , RP1

    btfsc INTCON,INTE ; bit4 tester si interrupt RB0 autorisée
    btfss INTCON,INTF ; oui, tester si interrupt RB0 en cours
    ; signale une transition sur la pin RB0 dans le sens déterminé par
    ; INTEDG du registre OPTION (b6)

    goto int_suivante ; non sauter

    call INT_RB0 ; oui, traiter interrupt RB0
    clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
    clrf TMR0 ;reset du timer0
    bcf INTCON,INTF ; effacer flag interupt RB0

    goto int_end ;fin interruption

    etc…………….


    INT_RB0

    ;interruption rb0 portB RECEPTION DCF 77


    bcf STATUS,RP0
    bcf STATUS,RP1 ;en bank 0

    bsf INTCON,T0IE ;autorise le timer 0 des la 1ere interruption rb0

    movlw B'00000001' ; valeur pour inverser LED
    xorwf PORTC,f ; inverser LED

    btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
    goto $+2 ; non pas encore
    goto compteur_dcf77_59bits ; oui alors prgm normal

    ; DETECTION du START-BIT
    ;˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜
    detection_startbit
    movfw cmpt_TIMER_0 ;charge nb interruptions tmr0
    addlw -d'115' ; ;detection_start_bit-d'117'
    ;TMR0 cmpt doit etre au minimum à cette valeur pour le start-bit
    btfsc STATUS,C
    goto synchro_ok
    clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
    clrf TMR0 ;reset du timer0
    return

    synchro_ok ;on a détecté le bit de synchro, init du compteur

    clrf compteur_dcf77 ; init à 0

    bsf bit_synchro_dcf77_ok,0 ;c'est le bit de synchro, je signale sa prise en compte par ce flag
    bcf STATUS,RP0 ;en bank 0
    return

    compteur_dcf77_59bits
    ;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    bcf STATUS,RP0
    bsf PORTA,5 ;synchro ok led ON
    incf compteur_dcf77,f ; init à 0

    VERIF_PULSE_2_Seconde
    ;*********************
    movfw compteur_dcf77 ;compteur à 59 ?
    xorlw d'59' ; 3C en hexa
    btfss STATUS,Z
    goto VERIF_PULSE_1_Seconde

    movfw cmpt_TIMER_0
    ;charge nb interruptions tmr0 (2s-150ms)/256/66.56= 108.5 je mets 100
    addlw -d'100' ; ;detection_start_bit-d'117' ;
    btfsc STATUS,C
    goto VERIF_PULSE_1_Seconde

    clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
    clrf TMR0 ;reset du timer0

    clrf compteur_dcf77 ;pas glop! ...on reset tout
    bcf PORTA,5
    clrf HEURES_DCF ; on reset les variables DCF
    clrf MINUTES_DCF
    clrf bit_synchro_dcf77_ok ;on reset le bit_synchro_dcf
    return

    VERIF_PULSE_1_Seconde
    ;***************************** ********
    movfw cmpt_TIMER_0
    ;charge nb interruptions tmr0 (1s-150ms)/256/66.56= 58.6 je mets 45
    addlw -d'45' ; soit 760 ms minimum entre 2 pulses
    btfsc STATUS,C ;si inférieure à d45 C=1
    goto RESET_DU_COMPTEUR

    clrf compteur_dcf77 ;pas glop! ...on reset tout
    bcf PORTA,5
    clrf HEURES_DCF ; on reset les variables DCF
    clrf MINUTES_DCF
    clrf bit_synchro_dcf77_ok ;on reset le bit_synchro_dcf
    return




    RESET_DU_COMPTEUR
    ;***************************
    bcf STATUS,RP0
    movfw compteur_dcf77 ;compteur à 60 ?
    xorlw d'59' ; 3C en hexa
    btfss STATUS,Z
    goto $+2
    clrf compteur_dcf77 ;remets compteur à 0


    ENVOIE_MISE_A_HEURE
    ;***************************
    movfw compteur_dcf77 ;compteur à 0 ?
    btfss STATUS,Z ;test si Z=1
    goto BITS_20_TEST ;non on continu
    call Envoie_mise_heure ; vers affichage lcd
    return ;et on sort

    BITS_20_TEST
    ;****************
    movfw compteur_dcf77 ;test si bit 20 = 1 comme il se doit
    xorlw d'20'
    btfss STATUS,Z ;compteur à 20 ? alors bit C =1
    goto BITS_28_TEST
    call DELAY_150ms ; 153.755 exactement
    btfsc PORTB,0 ;tester si = 1 200ms =1 100ms = 0
    goto BITS_28_TEST
    bcf bit_synchro_dcf77_ok,0 ;alors erreur reception
    return

    BITS_28_TEST
    ;*****************
    bcf STATUS,RP0
    btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
    goto BITS_35_TEST

    bcf STATUS,RP0
    movfw compteur_dcf77 ;teste la PARITEE PAIRE des bits 21 à 27 ==> bit 28
    xorlw d'28'
    btfss STATUS,Z ;compteur à 28 ? alors bit Z =1
    goto BITS_35_TEST
    call TEST_PARITE ;flag =0 ?...
    clrf FLAG_PARITE ;reset flag
    return
    BITS_35_TEST
    ;*****************
    bcf STATUS,RP0
    btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
    goto BITS_0_19

    bcf STATUS,RP0
    movfw compteur_dcf77
    xorlw d'35' ;teste la PARITEE PAIRE des bits 29 a 34 ==> bit 35
    btfss STATUS,Z
    goto BITS_0_19
    call TEST_PARITE ;flag =0 ?...
    clrf FLAG_PARITE ;reset flag
    return

    BITS_0_19
    ;************
    movfw compteur_dcf77 ;compteur de 0 à 20 (hexa=14) ,on passe
    sublw d'19'
    btfss STATUS,C ;compteur à 21 ? alors bit C =0
    goto BITS_36_59
    return

    BITS_36_59
    ;*************
    movfw compteur_dcf77 ;compteur de 36(hexa=24) à 59(hexa=3B) ,on passe
    sublw d'35'
    btfsc STATUS,C ;compteur sup à 37(hexa=25)
    goto capture_bit_dcf77
    return

    capture_bit_dcf77
    ;***********************
    bcf STATUS,RP0 ;en bank 0
    bcf STATUS,Z ;clear bit Z
    BITS_29_34
    ;*************
    movfw compteur_dcf77 ;29 - 34 : Heures codées en BCD, bit de poids faible en premier
    sublw d'28'
    btfsc STATUS,C ;compteur à 29 ? alors bit C =0
    goto BITS_21_27
    goto DCF_HEURES

    BITS_21_27
    ;***************
    movfw compteur_dcf77 ;21 - 27 : Minutes codées en BCD, bit de poids faible en premier
    sublw d'20'
    btfsc STATUS,C ;compteur à 21 ? alors bit C =0
    goto $+2
    goto DCF_MINUTES
    return

    ;36 - 41 : Jour codé en BCD, bit de poids faible en premier.
    ;42 - 44 : Jour de la semaine codé en BCD, bit de poids faible en premier.
    ;45 - 49 : Mois codé en BCD, bit de poids faible en premier.
    ;50 - 57 : Année (sur deux chiffres) codées en BCD, bit de poids faible en premier.
    ;59 : Pas d'impulsion

    DCF_MINUTES
    ;**************
    bcf STATUS,RP0 ;en bank0
    call DELAY_150ms ; 153.755 exactement

    test1_valeur_bit_Parite
    ;**************************** ;calcul de la PARITE
    ;------------------------
    movfw PORTB ;charge valeur du portB
    andlw 0x01 ;garde seulemnt le bit 0
    xorwf FLAG_PARITE,f ;inverse le bit0 du flag ,doit etre à 0 pour une "PARITE PAIRE"

    ;test de la valeur re‡ue sur RB0
    ;---------------------------------------
    btfss PORTB,0 ;teste état du port si = 1
    goto zero_DCF_minute ;non a 0
    goto un_DCF_minute ;oui a 1

    zero_DCF_minute
    bcf STATUS,C ; force un 0 => Carry = 0
    rrf MINUTES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
    return

    un_DCF_minute
    bsf STATUS,C ; force un 1 => Carry = 1
    rrf MINUTES_DCF,f ;décalage vers la droite faire entrer le bit par la gauche
    return



    DCF_HEURES
    ;*************
    bcf STATUS,RP0 ;en bank0
    call DELAY_150ms ; 153.755 exactement

    test2_valeur_bit_Parite
    ;**************************** ;calcul de la PARITE
    ;------------------------
    movfw PORTB ;charge valeur du portB
    andlw 0x01 ;garde seulemnt le bit 0
    xorwf FLAG_PARITE,f ;inverse le bit4 du flag ,doit etre à 0 pour une "PARITE PAIRE"

    ;test de la valeur re‡ue sur RB0
    ;---------------------------------------
    btfss PORTB,0 ;teste état du port si = 1
    goto zero_DCF_heure ;non a 0
    goto un_DCF_heure ;oui a 1

    zero_DCF_heure
    bcf STATUS,C ; force un 0 Carry = 0
    rrf HEURES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
    return

    un_DCF_heure
    bsf STATUS,C ; force un 1 Carry = 1
    rrf HEURES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
    return

    TEST_PARITE
    ;¤¤¤¤¤¤¤¤¤¤¤¤¤

    ; on va vérifier que le bit de parité re‡u est identique au bit de parité calculé
    bcf STATUS,RP0 ;en bank0
    call DELAY_150ms ; 153.755 exactement


    movfw PORTB ;charge valeur PORTB
    andlw 0x01 ;sur RB0
    xorwf FLAG_PARITE,f ; xor avec la valeur calculée

    btfss FLAG_PARITE,0 ; si flag,0 = 0, alors nombre de "1" re‡us = pair, sinon impair.
    goto parite_paire
    goto parite_impaire

    parite_paire
    return
    parite_impaire
    bcf bit_synchro_dcf77_ok,0 ;traitement de l'erreur à écrire
    bcf PORTA,5 ;synchro nok led OFF
    clrf compteur_dcf77
    return

    Envoie_mise_heure
    ;**************************
    bcf STATUS,RP0 ;en bank 0

    bsf FLAG_DCF,1 ;autorise ecriture heure DCF vers le DS1307
    return

Discussions similaires

  1. signal DCF77
    Par invite39a1e8a8 dans le forum Électronique
    Réponses: 3
    Dernier message: 20/11/2007, 21h15
  2. installation décodeur DCF77
    Par invitedb2a260d dans le forum Électronique
    Réponses: 18
    Dernier message: 20/04/2007, 20h38
  3. Simuler un signal DCF77 Dans Proteus
    Par invite938bdab7 dans le forum Électronique
    Réponses: 2
    Dernier message: 02/03/2007, 11h18
  4. horloge DCF77
    Par invite9fa0d696 dans le forum Électronique
    Réponses: 2
    Dernier message: 26/06/2006, 21h05
  5. Problème DCF77
    Par invite1469b964 dans le forum Électronique
    Réponses: 2
    Dernier message: 17/04/2006, 14h51
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...