pic 16F84A , clock RTC en asm
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 37

pic 16F84A , clock RTC en asm



  1. #1
    juju_du_26

    pic 16F84A , clock RTC en asm


    ------

    Bonjour

    J'essaye de faire une liaison I2C entre un pic 16F84A et
    une clock RTC ( ref DS1307 ) en asm .
    Les signaux SDA et SCL sont sur RB0 et RB1 ( voir schema )
    Je precise que pour l'instant j"essaye juste d'ecrire dans la RTC
    mais j'ai une erreur ( pas de reponse de la rtc ) .
    Je pense que le probleme se situe dans la partie I2C_EMISSION
    ( qui envoi les donnees en serie sur le bus I2C )

    Ci joint un zip avec le schema , la doc du DS1307 et le programme

    Merci .

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonsoir,

    Dans ma sequence d'init du DS1307, la seule difference que je vois, avec ton programme
    et l'envoi d'un NACK en fin de dialogue au lieu du ACK..
    si l'init est OK , la sortie 1Hz doit etre active.. sinon PROBLEMO



    Code:
    Init_RTC
    	CALL STOP
    	CALL DELAY_10mS	; 10mS
    	CALL START
    	MOVLW	0xD0	; B'11010000'=0xD0 = adresse device
          CALL OUT_BYTE
          CALL ACK
          clrf ADDR
          MOVF ADDR, W	; addresse registre
         	CALL OUT_BYTE
         	CALL ACK
         	MOVF SEC,W
         	CALL OUT_BYTE
         	CALL ACK
    	MOVf MIN,W
         	CALL OUT_BYTE
         	CALL ACK
    	Movf HEURE,w
         	CALL OUT_BYTE
         	CALL ACK
    	Movf JourSem,w 		;day of the week
         	CALL OUT_BYTE
         	CALL ACK
    	Movf Jour,w 	  	;date 02
         	CALL OUT_BYTE
          CALL ACK
     	MOVF Mois,W	   	;Mois 12
         	CALL OUT_BYTE
         	CALL ACK
    	MOVF Annee,W		; ANNEE=5
         	CALL OUT_BYTE
         	CALL ACK
    	MOVLW	B'10010000'   	;Registre de controle  SQWE=1 RS0=RS1=0 sortie 1Hz
         	CALL OUT_BYTE
         	CALL NACK
    	call STOP
    	CALL DELAY_10mS	; 10mS
    ; a ce momment la led connectée sur pin7 doit osciller a 1HZ !
    	return

  3. #3
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Merci paulfjujo de cette premiere reponse .

    J'ai modifié le prog ( ajout de condition stop au debut ,
    remplacé le ack par un nack ) mais l'init ne se passe pas correctement ..
    Le probleme doit etre dans les sous prog ...
    Fichiers attachés Fichiers attachés

  4. #4
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut,

    Petite erreur... c'est seulement lors des lectures que le maitre envoi un NAK juste avant le STOP.
    A la fin d'une écriture, c'est l'esclave qui envoi ou non l'acquitement.
    ton prog parait correct. Essais en augmentant à outrance les tempo (si tu n'as pas d'oscillo, sert toi de tes leds pour suivre les états).
    Qu'est-ce qui est juste? dans le schéma SDA et CLK sont sur le port B, dans ton 1er post aussi. Dans le prog c'est le port A ??
    A+

  5. A voir en vidéo sur Futura
  6. #5
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Salut

    J'ai enlever le Nack , et rallenti le bus I2C ( rallongé les tempo ) et mon probleme se situ a l'envoi en serie des données .
    La rotation a gauche dans la carry ( RLF octet .... ) puis envoi de la carry sur SDA ne fonctionne pas ,
    J'ai bien la clk mais je n'ai que des 0 qui sortent sur SDA .

    ps SDA et CLK sont bien sur le portA ( RA0 et RA1 ) >> erreur sur le schema
    et les leds sur port B ( led verte allumée = init OK ou led rouge allumée = erreur )

    merci et @+

  7. #6
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Re salut
    J'ai modifié le sous prog qui envoi les donnees en serie sur SDA .
    Ca fonctionne . Le programme se deroule bien jusqu'au bout
    la led verte s'allume bien mais je n'ai pas le signal de 1Hz
    sur la sortie sqw/out de la rtc .
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  8. #7
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut,

    le probleme ne viens pas de ton test sur l'état de carry lors de l'émission. Il vient surtout de l'instruction 'RLF OCTET,0' que tu utilisais avant. C'est à dire que tu fait un décalage à gauche de OCTET et le résultat etait dans Wreg (donc OCTET avait toujours la même valeur).
    Ce probleme tu l'as corrigé en faisant 'RLF OCTET,F' : Dans ce cas le résultat du décalage est remis dans OCTET.
    A mon avis tu peut garder les 4 lignes de test que tu avais écrit
    Code:
    	bcf	SCL		; SCL a 0		
    	call	tempo_5us	; tempo de 5 us
    	rlf	OCTET,F		; rotation a gauche dans la carry 
    
    	btfsc	C,1		; si carry = 1
    	bsf	SDA		; SDA a 1            met SDA a 1 ou a 0
    	btfss	C,1		; si carry = 0         suivant etat de
     	bcf	SDA		; SDA a 0                  la carry
    J'ai juste interverti les lignes de tempo et de décalage. Il vaut mieux être prudent ?! même si dans ton cas la routine tempo ne modifie pas le flag carry..

    A+

  9. #8
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonsoir,

    je viens de voir une difference sur I2C_EMISSION
    je mets le carry à Zero à chaque tour de boucle et non uniquement avant d'entrer dans la boucle d'envoi
    pour ne pas reinjecter le carry


    Code:
    OUT_BYTE:                   ; send o_byte on I2C bus
    	MOVWF O_BYTE
    	MOVLW .8
    	MOVWF _N0
    OUT_BIT:
    	BCF STATUS,C    ; clear carry
    	RLF O_BYTE, F   ; left shift, most sig bit is now in carry
    	BTFSS STATUS, C ; if one, send a one
    	GOTO OUT_ZERO
    	GOTO OUT_ONE
    OUT_ZERO:
    	CALL LOW_SDA    ; SDA at zero
    	CALL CLOCK_PULSE
    	CALL HIGH_SDA
    	GOTO OUT_CONT
    OUT_ONE:
    	CALL HIGH_SDA   ; SDA at logic one
    	CALL CLOCK_PULSE
    	GOTO OUT_CONT
    OUT_CONT:
    	DECFSZ _N0, F   ; decrement index
    	GOTO OUT_BIT
    	RETURN

  10. #9
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut pauljujo,

    Il y a quelque truc bizarre dans ta routine:
    - effectivement carry est toujours a 0 donc tu envoi toujours un octet à 0 ?
    - pourquoi faire un appel à des routines pour positionner la ligne SDA?
    - pourquoi faire la séquence : SDA à 0 + pulse sur CLK + SDA à 1?
    --> tu pourrais tres bien te contenter de positionner la ligne SDA et ensuite faire la pulse sur le SCL
    - l'appel à 'CLOCK_PULSE' place le qu'une fois directement apres l'étiquette 'OUT_CONT'
    Code:
    OUT_BIT:
    	RLF O_BYTE, F   ; left shift, most sig bit is now in carry
    	BTFSC STATUS, C ; if one, send a one
    	GOTO OUT_ONE
    OUT_ZERO:
    	BCF	SDA    ; SDA at zero
    	GOTO OUT_CONT
    OUT_ONE:
    	BSF	SDA   ; SDA at logic one
    OUT_CONT:
    	CALL CLOCK_PULSE
    	DECFSZ _N0, F   ; decrement index
    	GOTO OUT_BIT
    ..ça devrais normalement fonctioner (sauf erreur de ma part)

    A+

  11. #10
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonsoir,

    Citation Envoyé par schmo Voir le message
    - effectivement carry est toujours a 0 donc tu envoi toujours un octet à 0 ?
    non, car RLF O_BYTE, F fait que chaque bit poussé dans carry est bien emis !
    par contre l'octet O_BYTE sera en fin de transmission, effectivement mis à Zero.

    J'essayerai ta version bien plus compacte .. avec le DS1307 mais aussi avec un PCF8574.

  12. #11
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Salut
    Je pense que les 2 routines que vous venez de proposer fonctionnent .
    J'ai copié celle de schmo pour sa simplicité. merci
    J'ai mis des led sur SDA et SCL et je vois bien toutes les donnees passer .
    Y compris l ' acknowwledge ( SDA a 0 et impultion sur SCL )
    Je remarque que j'ai une impultion sur SDA juste apres l'ack ( SCL restant a 0 )
    Seulement voila je n'ai toujours aucun signal sur la sortie SQW/OUT de la rtc
    Probleme de prog , pb d'oscillation du quartz ??
    J'essaye maintenant de lire dans la rtc pour voir ...
    Merci

  13. #12
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    re

    As-tu testé ta pile , il faut pas qu'elle descende en dessous de 3V..
    j'ai eu pas mal de deboire avec une pile trop usagée.
    Il me semble que le DS1307 peut fonctionner sans pile,mais il faut mettre la pin au Gnd.

  14. #13
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Re
    Oui la pile est ok a 3.18 V

  15. #14
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonjour schmo

    Citation Envoyé par schmo Voir le message
    ..ça devrais normalement fonctioner (sauf erreur de ma part)
    A+
    J'ai implementé ta solution dans mon appli,
    mais j'obtiens un fonctionnement aleatoire sur la lecture du RTC et aussi sur la cde du PCF8574 qui est aussi sur le bus I2C
    en revenant en arriere , avec la routine que j'utilise je n'ai pas de problemes.
    Timming probleme ?

  16. #15
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut juju,

    en étudiant plus a fond ta séquence d'écriture je me suis aperçu que tu écrivais b'10010000' dans le registre de contrôle. bit4 permet de valider la sortie oscillateur mais le bit7 correspond à définir un état à la sortie. Essais en mettant ce bit 7 à 0 pour voir..
    A+

  17. #16
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Salut

    J'ai un peu modifié le ss prog de reception de l'Ack , je n'ai plus cette impultion
    sur SDA entre chaque octet envoyé .

    J'ai ensuite fait des essais sur le registre 7 qui controle cette sortie SQW/OUT et....
    si je met le bit 4 ( SQWE) et le bit 7 ( OUT ) a 0 la sortie est bien a 0
    si je met le bit 4 ( SQWE) a 0 et le bit 7 ( OUT ) a 1 la sortie est bien a 1
    si je met le bit 4 ( SQWE ) a 1 , et quelque soit ce que je met sur les autres bits ( 7 , 1 , 0 )
    je n'ai aucun signal en sortie . Un probleme de quartz ??

    Merci

  18. #17
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonjour,

    Citation Envoyé par juju_du_26 Voir le message
    Salut
    je n'ai aucun signal en sortie . Un probleme de quartz ??
    Merci
    J'ai deja eu aussi un probleme avec un quartz horloger 32Khz , pas cher ! 0.30€
    j'ai tourné en rond pendant longtemps et son remplacement a été la solution.
    Ca ne coute pas grand chose d'essayer!

  19. #18
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut juju,

    Une idée comme ça: si tu envoi une deuxième trame d'écriture du registre 07 (contrôle) seul...C'est à dire du envoi ta 1ere trame d'écriture des registres 0 à 6. Une fois terminée (aprés le stop) tu envoi une 2eme trame d'écriture du registre 07
    Qu'en est il de la lecture des registres? correspondent-ils? l'heure évolue t-elle?

    A+

  20. #19
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonsoir,

    J'ai trouvé quelques bugs, apres quand meme 2H00 de tests!
    J'ai integres les routines I2C dans un programme existant , avec sortie RS232 pour debugger, c'est plus facile.

    J'utilise des etiquettes car mes Pins ne sont pas les memes.
    1ere modif sur I2C_emission : pulse SCL apres le changement SDA
    Enleveé la condition bloquante du Nack

    voir les resultats comaratif en fin de listing
    et les modifs 'mineures ) faites sur les modules I2C
    nota: je reteste la lecture RTC (donc son evolution) via ma routine, dont je suis sur..
    donc reste I2C_Reception à tester.
    La led 1hz clignote des l'init RTC.

    Code:
    #define I2C_SDA 	PORTB,7     ;RB7 (pin 40) ---> output-->SDA
    #define I2C_SCL 	PORTB,6     ;RB6 (pin 39) <--in/out---> SCL
    #DEFINE DEV_DS1307 		0xD0	; adresse DS1307 RTC
    
    #DEFINE  LedR	PORTE,1
    #DEFINE  LedV	PORTE,2	; led fin prog correct
    #define SDA_SENS TRISB,7
    #define SCL_SENS TRISB,6
    #define SCL 	PORTB,6
    #define SDA 	PORTB,7
    
    
    
    
    ; mise a l'heure par defaut (pour debugging)
    	MOVLW   0x00    ;00 Sec
    	MOVWF SEC
    	movlW 0X45      ;45 Mn
    	movWF MIN
    	MOVLW   0x16    ; 16 Heure
    	MOVWF HEURE
    	MOVLW   0x06    ;day samedi
    	MOVWF JourSem
    	MOVLW   0x04    ;date 04
    	MOVWF Jour
    	MOVLW   0x03    ;Mois  Mars
    	MOVWF Mois
    	MOVLW   0x11    ; ANNEE=11
    	MOVWF Annee
    	MOVLW   B'10010000'  ;Registre de controle  SQWE=1 RS0=RS1=0 sortie 1Hz
    	MOVWF CtrlReg
    	CALL Rs_CrLf
    	call Affiche_Time
    	CALL Rs_CrLf
    
    
        
        call Init_DS1307
    
    ;	call Init_RTC   ; la Led sur RTC DS1307 doit clignoter a 1HZ!
    
    	movlw '#'				
    	CALL  Output_Char
    	CALL Rs_CrLf
    
    	movlw   HIGH Txt3
    	movwf   ADR_HI
    	movlw   LOW Txt3
    	movwf   ADR_LO
    	CALL aff_char_flash
    	CALL Rs_CrLf
    
    Heure_courante  ; ok
    ; presentation (suite) sur PC
    	movlw   HIGH Txt0       ; 0x1A00
    	movwf   ADR_HI
    	movlw   LOW Txt0        ;
    	movwf   ADR_LO
    	CALL aff_char_flash
    	call delay_1s
    
        bsf RS232_ok		;
        bsf INTCON,INTE		; autorise IT RB0
    
    	bank1
    	bsf PIE1,TMR1IE		;  autoriser interruptions timer 1
    	bank0
    	bsf INTCON,GIE  	; Autorise ALL IT
    	bsf INTCON,PEIE 	; autoriser interruptions peripheriques
    	bsf T1CON,TMR1ON	; active timer1
    	clrf flags
    	bcf Abort_Saisie
    	movlw  LOW Buffin    ; oui, adresse de depart du buffer d'entree
    	movwf  Buff_In_Ptr     ; prochain caractere sera le premier
    	clrf  _Car_Recus
    	BSF RCSTA,CREN          ;enable Reception
    	bank1
    	bsf PIE1,RCIE           ; Autorise IT Reception
    	bank0
    
    Main_Boucle
    	btfss ELLIGIBLE		; attend la fin de tempo = synchronisation
    	goto	Main_Boucle
    	bcf  ELLIGIBLE
    	call Lecture_DS1307     ;lecture heure
    
    	movlw '#'				; starter
    	CALL Output_Char
    	call Envoi_Date
    	CALL Rs_CrLf
    	goto Main_Boucle
    	
    	
    ;************** en TEST **********************
    
    Init_DS1307
    	bcf	LedR		; led rouge eteinte ( erreur sur bus I2C )
    	bcf	LedV		; led verte eteinte ( tout est OK )
    	call I2CSTOP
    	call	tempo500ms	; tempo stabiliser alim et bus i2c
    	call I2CSTART	    ; condition de start du bus I2C
    	movlw 0xD0  	    ; adresse RTC est 11010000 en mode ecriture ( 0 )
    	call 	I2C_EMISSION
    	call	I2C_SLAVE_ACK
    	movlw b'00000000' 	    ; on va a l'adresse ram 0 du RTC
    	call 	I2C_EMISSION
    	call	I2C_SLAVE_ACK
    	movlw b'00000000' 	    ; écriture dans le registre d'adresse 0
    	call 	I2C_EMISSION   	    ; on met 0 dans le registre des SECONDES
    	call	I2C_SLAVE_ACK
    	movlw b'00000000' 	    ; écriture dans le registre d'adresse 1
    	call 	I2C_EMISSION  	    ; on met 0 dans le registre des MINUTES
    	call	I2C_SLAVE_ACK
    	movlw b'00001001' 	    ; écriture dans le registre d'adresse 2
    	call 	I2C_EMISSION  	    ; ici on met les HEURES
    	call	I2C_SLAVE_ACK
    	movlw b'00000110' 	    ; écriture dans le registre d'adresse 3
    	call 	I2C_EMISSION  	    ; ici on met les JOURS ( 1 lundi 2 mardi .... 7 dimanche )
    	call	I2C_SLAVE_ACK
    	movlw b'00010000' 	    ; écriture dans le registre d'adresse 4
    	call 	I2C_EMISSION  	    ; ici on met la DATE
    	call	I2C_SLAVE_ACK
    	movlw b'00000011' 	    ; écriture dans le registre d'adresse 5
    	call 	I2C_EMISSION 	    ; ici on met le MOIS
    	call	I2C_SLAVE_ACK
    	movlw b'00010010' 	    ; écriture dans le registre d'adresse 6
    	call 	I2C_EMISSION  	    ; ici on met l' ANNEE
    	call	I2C_SLAVE_ACK
    	movlw b'10010000'           ; écriture du contenu du registre
    	call 	I2C_EMISSION  	    ; de contrôle du DS1307  --> F SQWOUT = 1Hz
    	call	tempo_5us
    	call	tempo_5us
    	call	I2C_PIC_ACK
    	call    I2CSTOP	    ; bit de stop de I2C
    	call	tempo_5us
    	bsf	LedV		; fin prog OK allumer Led verte
        return
    
    
    I2CSTART
        bsf	SCL
    	bsf	SDA         ; au repos SDA et SCL a 1
    	call tempo_5us
    	bcf	SDA 		; SDA passe a 0
    	call tempo_5us
    	bcf	SCL		; SCL passe a 0
    	call tempo_5us 	; >> bus I2C occupé
        return
    
    I2CSTOP
        bcf	SCL
        bcf	SDA
    	call tempo_5us
    	bsf	SCL		; SCL passe a 1
    	call tempo_5us
    	bsf	SDA		; SDA passe a 1 >> bus I2C au repos
    	call tempo_5us
    	return
    
    
    I2C_SLAVE_ACK		; attend acknowledge de l'esclave 
    ;	bsf	SDA		; on s assure que SDA est a 1
    ;	bcf	SCL		; SCL a 0
    	call	SDA_IN		; SDA en entree
    	call	tempo_5us	; tempo de 5 us
    	bsf	SCL		; SCL a 1
    	call	tempo_5us
    	bcf	SCL	
    	call	tempo_5us
    	btfsc	SDA		; test si sda a 0 ?
    	call	NO_ACK		; NON ( sda tjrs a 1 ) >> NO_ack
    	bcf	SCL		; OUI >>>  SCL a 0
    	call	tempo_5us	; tempo de 5 us
    	return
    
    
    I2C_PIC_ACK		; envoye l'acknowledge du pic vers esclave
    	call	SDA_OUT		; SDA en sortie
    	bcf	SCL		; SCL a 0
    	bcf	SDA		; SDA a 0
    	call	tempo_5us	; tempo de 5 us
    	bsf	SCL		; SCL a 1
    	call	tempo_5us	; tempo de 5 us
    	bcf	SCL		; SCL a 0
    	bsf	SDA		; SDA a 1
    	return
    
    
    I2C_PIC_NACK		    ; Nack du pic vers esclave
     	call	SDA_OUT		; SDA en sortie
    	bcf	    SCL		    ; SCL a 0
    	bsf	    SDA		    ; SDA a 1 ( pas acknowledge )
    	call	tempo_5us	; tempo de 5 us
    	bsf	    SCL		    ; SCL a 1
    	call	tempo_5us	; tempo de 5 us
    	bcf	    SCL		    ; SCL a 0
    	return
    
    
    I2C_EMISSION		; envoye donnee du pic vers esclave
    	movwf	OCTET		; les donnees w -->> OCTET
    	call	SDA_OUT		; SDA en sortie
    	movlw	d'8'
    	movwf	N		; un octet = 8 bits a envoyer
    envoi
       	bsf	STATUS,C
    	rlf	    OCTET,f		; rotation a gauche dans la carry
    	btfsc	STATUS,C	; si carry = 1 ??
    	goto	$+3		    ; oui c=1 avancer de 3 lignes
     	bcf	    SDA		    ; non c=0 alors SDA a 0
    	goto	$+2		    ; et avancer + 2 lignes
    	bsf	    SDA		    ; SDA a 1
    	call	tempo_5us	; tempo de 5 us
    	bsf	    SCL		    ; SCL a 1
    	call	tempo_5us	; tempo de 5 us
    	bcf	    SCL	
    	decfsz	N,f		    ; decremente N ( si > 0 )
    	goto	envoi		; donnees suivante en bouclant
    	call	tempo_5us	; tempo de 5 us
    	bsf	SDA		; SDA a 1
    	bsf	SCL		; SCL a 1 = etat de repos du bus i2c
    	return
    
    I2C_RECEPTION		; recois donnees de l esclave vers le pic
    	movlw	d'8'
    	movwf	N		; la donnees sur 8 bits
    	clrf	OCTET
    	bsf	SDA		; on met SDA  a 1 pour etre lisible
    	call tempo_5us	; tempo de 5 us
    	bcf	SCL		; SCL a 0
    	call SDA_IN		; SDA en entree
    recoi
    	call tempo_5us	; tempo de 5 us
    	bcf	SCL
    	btfsc SDA		; si SDA a 1 ??	 	 met la carry a 1 ou a 0
    	goto $+3		; suivant etat de SDA
    	bcf	STATUS,C
    	goto $+2
    	bsf	STATUS,C
    	rlf	OCTET,1		; decallage a gauche
    	call tempo_5us
    	decfsz	N,f		; si N = 0
    	goto recoi		; donnees suivante en bouclant
    	bcf	SCL
    	call tempo_5us	; tempo de 5 us
    	movf OCTET,0		; met octet recu dans w
    	call SDA_OUT
    	bsf	SDA		; SDA a 1
    	bsf	SCL		; SCL a 1 = etat de repos du bus i2c
    	return
    
    
    NO_ACK		; si Nack de rtc alors stop i2c
    	call	tempo_5us
    	bsf	    LedR		; Led rouge allumée
    	call	I2C_STOP	; si nack  alors  fin transmition i2c
    	return		 
    
    SDA_IN		; mettre SDA ( RA1 ) en entree
    	bsf	STATUS,RP0	; aller en bank1
    	bsf SDA_SENS    ; SDA en entree
    	bcf	STATUS,RP0	; aller en bank0
    	return
    
    SDA_OUT		; mettre SDA ( RA1 ) en sortie
    	bsf	STATUS,RP0	; aller en bank1
    	bcf	SDA_SENS	; SDA en sortie
    	bcf	STATUS,RP0	; aller en bank0
    	return
    
    tempo_5us	; tempo de 5 us pour l' i2c
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	goto $+1
    	nop			
    	return
    
    tempo500ms		; temporisation de 500 ms
     	call 	 wait0
    	call 	 wait0
    	call 	 wait0
     	call 	 wait0
     	return
    
    wait0                   ; Boucles réalisant une tempo élémentaire
     	movlw  	.200      ; Charge count1 avec valeur décimale 200
    	movwf  	count1
    d1 	movlw   .200      ; Charge count2 avec valeur décimale 200
       	movwf   count2
    d2 	decfsz  count2,1  ; décremente et saute ligne suiv. si zero
       	goto    d2        ; si différent de zero
      	decfsz 	count1,1  ; décremente count1 si count2 == zero
    	goto    d1        ; boucle interne si count2 <> zero
    	return
    
    ***** resultat avec ma version  *********
    nota: la led 1hz clignote !
    
     Version  XPORT-Archos43it RFObasic 
     en MPLAB 100% asm rev 28/02/2011  
     Platine_DS1307_to_test.asm 
    
    
    04/03/11 16H45M00S
    #
     Init RTC par defaut
     aux valeurs definies en dur ..
    
     PIC16F877 avec bootloader Q=10Mhz
     MPLAB version 8.63
     Platine 16F877 2012
    #04/03/11 16H45M03S;
    #04/03/11 16H45M06S;
    #04/03/11 16H45M08S;
    #04/03/11 16H45M10S;
    #04/03/11 16H45M13S;
    #04/03/11 16H45M15S;
    #04/03/11 16H45M18S;
    
    ***** apres avoir enlevé la pile donc desinitialisé le RTC
     et remis la pile  ********
    la led 1hz ne clignote pas !
    
     Version  XPORT-Archos43it RFObasic 
     en MPLAB 100% asm rev 28/02/2011  
     Platine_DS1307_to_test.asm 
    
    
    04/03/11 16H45M00S
    #
     Init RTC par defaut
     aux valeurs definies en dur ..
    
     PIC16F877 avec bootloader Q=10Mhz
     MPLAB version 8.63
     Platine 16F877 2012
    #01/01/00  0H00M80S;
    #??/??/?? ??H??M:3S;
    #01/01/00  0H00M80S;
    #??/??/?? ??H??M:3S;
    
    *************  apres quelques ajusteemnt du programme ***
     nota: la led 1hz clignote
     dont pulse pares changement SDA dans I2C_Emission 
     ****************************************************
      
     Version  XPORT-Archos43it RFObasic 
     en MPLAB 100% asm rev 28/02/2011  
     Platine_DS1307_to_test.asm 
    
    
    04/03/11 16H45M00S
    #
     Init RTC par defaut
     aux valeurs definies en dur ..
    
     PIC16F877 avec bootloader Q=10Mhz
     MPLAB version 8.63
     Platine 16F877 2012
    #10/03/12  9H00M03S;
    #10/03/12  9H00M05S;
    #10/03/12  9H00M07S;
    #10/03/12  9H00M10S;
    #10/03/12  9H00M12S;

  21. #20
    Gérard

    Re : pic 16F84A , clock RTC en asm

    Je prends le train en marche.

    Pour avoir 1Hz sur SQW/OUT, il faut mettre le bit SQWE à 1 (enable), RS0 et RS1 = 0 (1Hz)
    Attention, la sortie est à drain ouvert, le DS ne peut que absorber du courant.

  22. #21
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut paulfjujo,

    intéressant..Donc la routine d'initialisation de la RTC fonctionne. La RTC est écrite à la bonne DATE/Heure et la sortie SQW oscille à 1Hz..même si la RTC reprend ses valeurs d'origine (01/01/01 ...80sec) après disparition d'alimentation/pile.
    Juste un petit détail: l'appel de la routine I2C_PIC_ACK est inutile lors d'une écriture des registres par le PIC. Lors d'une écriture c'est l"esclave qui acquitte les différents octets recus. C'est seulement lors d'une lecture que le maitre génère les acquittements positifs et négatifs.

    Les valeurs de tempo indiquées en commentaire correspondent-elles aux temps de cycles?

    A+

  23. #22
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Bonjour a tous et merci pour vos reponses .
    Merci a toi Paulfjujo >> J'ai remplacé mon quartz par un autre ( recupéré dans une vieille montre )
    et ... ca marche du premier coup !! La sortie SQW me donne bien un signal de 1Hz .
    Maintenant il faut essayer de lire la RTC .
    Si j'ai bien compris , pour lire l'adresse n de la RTC il faut
    > envoyer son adr 11010000 en mode ecriture
    > envoyer l'adresse qu ' on veut lire
    > condition de restart
    > envoyer son adr 11010001 en mode lecture
    > recuperer la ou les donnees en envoyant Ack ou Nack
    > envoyer condition de stop
    C 'est bien ca ?? Coment faire la condition de restart ( sur sda et scl ) ?
    Merci

  24. #23
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonjour,

    Oui

    ci joint ma routine (utiliseé dans les tests) pour comparaison
    Code:
    Lecture_DS1307
    	Call STOP
    	call delay_25us
    	CALL START
    	movlw  DEV_DS1307
    	CALL OUT_BYTE
    	CALL ACK
    	clrf ADDR           ; adresse 0
    	MOVF ADDR, W        ; send high byte of address
    	CALL OUT_BYTE
    	CALL ACK
    	movlw  DEV_DS1307+1
    	CALL    START       ;genere un start bit
    	movlw	DEV_DS1307+1
    	CALL    OUT_BYTE
    	CALL    NACK
    ;--------
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF	I_BYTE,W
    	MOVWF   SEC
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF    I_BYTE,W
    	MOVWF   MIN
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF    I_BYTE,W
    	MOVWF   HEURE
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF    I_BYTE,W
    	MOVWF   JourSem
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF    I_BYTE,W
    	MOVWF   Jour
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF    I_BYTE,W
    	MOVWF   Mois
    	CALL    IN_BYTE
    	Call    M_ACK
    	MOVF    I_BYTE,W
    	MOVWF   Annee
    	CALL    STOP
    	return

  25. #24
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Salut
    Ce matin j'ai remis l'horloge a l'heure ( modifié les valeurs dans le prog )
    Reprogrammé la rtc .. Jusque la tout est ok . Mais j'ai eu la mauvaise idée
    d'enlever mon pic , carte encore alimentée . Depuis plus rien , la clock RTC ne
    veut plus rien savoir . Elle ne reconnait meme pas son adresse et renvoie un Nack .
    Le composant est il HS ?? Y a t il qqchose a tester ?
    Pour la lecture je vais regarder ca .
    Merci

  26. #25
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    essaie d'enlever et remettre la pile du RTC

  27. #26
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Merci mais j'ai deja essayé avec la pile , sans la pile ( entrée reliée a la masse )
    mais ca n'a rien changé .

  28. #27
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    J'ai effectué quelques tests . En rallentissant le bus i2c je suis arrivé a envoyer quelques octets .
    La rtc refuse tous les octets finissant par un 1 ( envoye un Nack )
    J'ai essayé d'envoyer que des 0 puis de renvoyer les octets heures min sec ...
    Beaucoup d'erreur se produisent . J'ai meme changer le pic ( au cas ou ) mais non .
    J'ai l'impression que le composant est bon pour la poubelle ....

  29. #28
    juju_du_26

    Re : pic 16F84A , clock RTC en asm

    Bonjour a tous
    Voila , j'ai recu ma nouvelle clock RTC ( ref DS1307 )
    Je suis bien arrivé a ecrire dedans et la led sur SQW clignote bien a 1Hz .
    J'essaye maintenant de lire . J'ai fais un premier prog qui consiste juste a
    lire heures , minutes et mettre l'octet des minutes sur le portB du pic .
    J'ai fais quelques essais mais j'ai toujours 00010001 sur le portB .
    Je pense a un probleme dans le ss prog I2C_RECEPTION .
    Merci
    Fichiers attachés Fichiers attachés

  30. #29
    paulfjujo

    Re : pic 16F84A , clock RTC en asm

    bonsoir


    la seule difference que je vois avec ma subroutine Lecture_DS1307
    qui fait un STOP
    apres l'envoi de l'adresse à lire =0 pour les secondes
    puis un start
    apres l'envoi de l'adresse device en mode lecture
    puis la lecture de l'adresse à lire defini prealablement

    Code:
    Lecture_DS1307
         Call STOP
         CALL START
         MOVLW	0xD0		; B'11010000'
         MOVWF	DEV_DS1307     	; @D0H adresse device
        CALL OUT_BYTE
        CALL ACK
        clrf ADDR		; adresse 0
        MOVF ADDR, W		; send high byte of address
        CALL OUT_BYTE
        CALL NACK
        CALL STOP
        MOVLW	0xD1		; B'11010001'
        MOVWF	DEV_DS1307     	;Mode Lecture
        CALL    START 		;genere un start bit
        MOVF    DEV_DS1307,W
        CALL    OUT_BYTE
        CALL    NACK
    ;--------
        CALL    IN_BYTE
        Call   ACK
        MOVF	  I_BYTE,W
        MOVWF  SEC
        CALL    IN_BYTE
        Call  	ACK
        MOVF	I_BYTE,W
        MOVWF 	MIN
        CALL    IN_BYTE
        Call 	ACK
      .. etc ..
    essaie plutot avec les secondes pour tester ton programme
    et boucle ton programme au lieu de mettre un "sleep"
    pour voir evoluer l'affichage des leds sur le port B.

  31. #30
    invite36492e34

    Re : pic 16F84A , clock RTC en asm

    salut,

    Pour ta routine de lecture, la bonne séquence est :
    - positionne clock à 1
    - lecture de l'état de SDA
    - positionne clock à 0

    A+

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. [PIC ASM] fonction 1/x
    Par Qristoff dans le forum Électronique
    Réponses: 33
    Dernier message: 05/04/2011, 19h35
  2. Réalisation d'une Horloge/Clock Nixie - PIC + Module RTC
    Par invite3c35244f dans le forum Électronique
    Réponses: 26
    Dernier message: 31/05/2010, 08h16
  3. PIC + Clock
    Par invite0b1a0402 dans le forum Électronique
    Réponses: 14
    Dernier message: 11/04/2010, 20h21
  4. PIC 16F877 en ASM
    Par invite814175e4 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/12/2009, 17h04
  5. rtc dans in pic 8 bit?
    Par invitebd358db9 dans le forum Électronique
    Réponses: 3
    Dernier message: 10/11/2009, 13h37
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...