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 !!!
-----
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 !!!
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+
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
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.
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+
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
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.
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.
Salut roy,
Je voudrai savoir si tu as finalement pu retranscrire le programme assembleur en C?
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