horloge + temperature I2C afficheur 7 segment
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

horloge + temperature I2C afficheur 7 segment



  1. #1
    invited02d59f3

    horloge + temperature I2C afficheur 7 segment


    ------

    bonjour a tous

    j'aimerai réaliser comme dit dans le titre une horloge et un afficheur de température sur des afficheur type 7 segment (j'ai crée des afficheur spécifique car chaque chiffre fais plus d'un mètre de haut)

    pour se faire ayant déjà programmer des pic en I2C (PIC16F628A)(j'utilise l'ASM) j'aimerai utiliser un DS1307 pour l'heure et la date et un (ou deux) DS1621 pour la température, j'utilise déjà des MCP23016 pour commander mes 4 digits

    mon problème se pose
    j'ai des difficulté avec la langue de Shakespeare
    j'ai donc du mal a comprendre la datasheet de ces 2 composant

    si vous quelqu'un sais comment les configurer et traduire leur donner

    se serai sympa de m'aider merci d'avance

    -----

  2. #2
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Bonsoir,

    si le choix n'est pas encore définitif, connaissez-vous le SAA1064 qui est très simple d'emploi pour la gestion des afficheurs en I2C?

    A+

  3. #3
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Sinon pour les 2 autres circuits, quelles sont les difficultés rencontrées?

  4. #4
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    les choix sont presque definitif (j'ai recuperer ses composant en grande quantiter)

    sinon je connais les SAA1064 mais il multiplexe les sortie se qui ne convient pas pour mon application de plus la carte avec les MCP et deja fonctionnelle

    j'aimerai just que l'on m'explique comment configurer le DS1307 et le DS1621
    comment metre a l'heure/date et comment lire l'heure date temperature

    merci

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

    Re : horloge + temperature I2C afficheur 7 segment

    j'ai essayer sans succès de dialoguer avec le capteur de température (DS1621 http://datasheets.maxim-ic.com/en/ds/DS1621.pdf )

    j'ai câbler A0,A1,A2 a la masse de mon montage.
    mon programme initialise le bus I2C

    start
    envoie adresse B'10010000' ;pour ecriture

    envoie EEh ;debut de conversion
    STOP

    START
    envoi adresse B'10010000' ;pour ecriture
    envoi AAh ;demande de lecture
    START
    envoi adresse +1 B'10010001' ; pour lecture
    reçoit un octets
    ACK
    le mette dans read0
    reçoit un octet
    NACK
    met ds read1


    envoie read0 sur le mcp ;routine déjà tester et qui fonctionne

  7. #6
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Bonjour,

    pour le DS1307 voici les fonctions pour travailler avec en C.
    Pour lancer l'horloge, le bit 7 (CH) dans le registre des secondes doit être mis à 0 (voir la fonction active_horloge()).

    Code:
    #define DS1307_DevAdr_Wr       0xD0 //DS1307 Adresse en mode écriture
    #define DS1307_DevAdr_Rd       0xD1 //DS1307 Adresse en mode lectrure
    
    // Registres DS1307
    #define seconds_reg      0x00
    #define minutes_reg      0x01
    #define hours_reg        0x02
    #define day_reg          0x03
    #define date_reg         0x04
    #define month_reg        0x05
    #define year_reg         0x06
    #define control_reg      0x07
    le code
    Code:
    void active_horloge()
    {
    char temp, clock_go;
    
    clock_go = 0;   // mise à 0 du bit CH (Clock Halt) => bit 7 du DS1307
    clock_go = Dec2Bcd(clock_go);
    temp = ds1307_read_RTC(seconds_reg);
    clock_go = clock_go | temp;
    ds1307_write(seconds_reg, clock_go) ;
    ds1307_write(control_reg, 0b10010000) ; // sortie SQW à 1Hz
    
    //==============================================================================
    //                     Init Temps et calendrier
    //==============================================================================
    
    void RTC_Initial_values() 
    {
     I2C_Stop();
     delay_ms(5);
    
     ds1307_write(seconds_reg, 0x00);   // pointe sur le registre des secondes 
     ds1307_write(minutes_reg,0x00);   // pointe sur le registre des minutes (0mn)
     ds1307_write(hours_reg,0x16);     // pointe sur le registre des heures (16h) 
     ds1307_write(day_reg,0x00);       // pointe sur le registre des jours de la semaine(lundi, mardi, etc)
     ds1307_write(date_reg,0x04);      // pointe sur le registre de la date du jour (n° du jour ici 04)
     ds1307_write(month_reg,0x08);     // pointe sur le registre des mois (Aout=08)
     ds1307_write(year_reg,0x09);      // pointe sur le registre des années (2009=09)
    }
    
    //***************************************************************//
    //***         routine de lecture dans un registre du ds1307               ***//
    //***************************************************************//
    
    char lecture_ds1307_registre(char rtcreg)
    {
     char rtc_data=0;
    
     I2C_start();
     I2C_Wr(0xd0);           // adresse du DS1307
     I2C_Wr(rtcreg);         // On pointe sur le registre à lire
     I2C_Repeated_Start();   // On relance un start I2C
     I2C_Wr(0xd1);           
     rtc_data=I2C_Rd(0);     // On lit le registre sans acknowledge 
    while (I2C_Is_Idle()==0); // On attend tant que le bus I2C est occupé (busy)  
     i2c_stop();
     return(rtc_data); // récupération de la data et renvoi du paramètre
    }
    
    //==============================================================================
    //             Routine d'écriture dans les registres de l'horloge DS1307
    //==============================================================================
    
    void ds1307_ecrire(unsigned char rtcreg, unsigned char rtc_data)
    {
     while (I2C_Is_Idle() == 0) ; // On attend la libération du bus I2C
     I2c_start();  // Start du bus I2C
     I2c_Wr(DS1307_DevAdr_Wr);       // 1101 000x est l'adresse et le dernier bit (x=0) indique la direction (0=write; 1=read) 
     I2c_Wr(rtcreg);                 // indique dans quel registre on souhaite écrire 
     I2c_Wr(rtc_data);              // on écrit la data dans le registre
     while (i2c_Is_Idle() == 0) ;// on attend la libération du bus
     I2c_stop(); // arrêt du bus
    }
    Je regarderai pour le DS1621 plus tard.

    @+

  8. #7
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Ne pas oublier que les datas à stocker ou à lire dans les registres sont de type BCD (binaire codé décimal).

  9. #8
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    merci pour tes reponse

    je v essayer de traduire sa en assembleur dans la journée

  10. #9
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    recapitulatif pour voir si j'ai compris

    on commence par initialiser
    ecriture dans les registre
    seconde 0X00
    minute 0X52 //01 min
    heure 0X15
    jour 0X03
    mois 0X06
    annee 0X09
    control 0X00 //je n'utilise pas la pin sqw

    puis on passe la bit 7 des seconde a 1(CH) pour demarer l'horloge

    ensuite on lit les registre a intervale voulus pour afficher l'heure ou la date

  11. #10
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    peut ton utiliser l'horloge sans batterie??

    car lorsque je la connecte je ne communique plus avec aucun mcp

  12. #11
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Ah oui, vous travaillez en asm.

    Voici pour la gestion du DS1621 en asm:

    Code:
    ;******************************************
    ;*******     Init  DS1621       *******
    ;******************************************
    
    INIT_	CALL	ENV_STA     ;start
    	MOVLW	h'90'     ;adresse du DS1621 en écriture
    	CALL	ENV_BYT
    	MOVLW	h'AC'     ;acces au registre de config
    	CALL	ENV_BYT
    	MOVLW	h'00'     ; conversion continue
    	CALL	ENV_BYT
    	CALL	ENV_STO     ;Stop
    	CALL	ENV_STA     ;start
    	MOVLW	h'90'     ;adresse du DS1621 en écriture
    	CALL	ENV_BYT
    	MOVLW	h'EE'     ;debut de conversion
    	CALL	ENV_BYT
    	CALL	ENV_STO     ;stop
    ;********************************************
    ;** Lecture température en I2C du DS 1621  **
    ;********************************************	
    	
    LECT_	CALL	ENV_STA     ;start
    	MOVLW	h'90'       ;adresse du DS1621 en écriture
    	CALL	ENV_BYT
    	MOVLW	h'AA'       ; lecture Température
    	CALL	ENV_BYT     
    	CALL	ENV_RSTA   ;restart
    	MOVLW	h'91'      ;adresse du DS1621 en lecture		
    	CALL	ENV_BYT
    	CALL	REC_BYT
    	MOVWF	OCT_H      ;1er octet reçu dans OCT_H (MSB)
    	CALL	ENV_ACK    ; envoi ACK
    	CALL	REC_BYT
    	MOVWF	OCT_B    ;2eme octet reçu dans OCT_B (LSB)      
    	CALL	ENV_NAC    ;envoi NOACK
    	CALL	ENV_STO    ;stop
    	RETURN
    ;**********************************************
    Si vous avez besoin d'un code en asm pour la gestion du ds1307 demandez.
    A+

  13. #12
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Citation Envoyé par thesheep Voir le message
    puis on passe la bit 7 des seconde a 1(CH) pour demarer l'horloge

    ensuite on lit les registre a intervale voulus pour afficher l'heure ou la date
    Non, le bit CH (Clock Halt) doit être positionné à 0 à l'init pour démarrer l'horloge.

    Il vaut mieux activer à 1 le bit4 du control register (SQWE) pour pouvoir vérifier que l'horloge tourne bien (mettre une led par exemple avec une résistance de tirage au +Vcc) et mettre les bits RS0 et RS1 du même registre à 0 pour avoir 1Hz.

    A+

  14. #13
    invite03481543

    Re : horloge + temperature I2C afficheur 7 segment

    Citation Envoyé par thesheep Voir le message
    peut ton utiliser l'horloge sans batterie??

    car lorsque je la connecte je ne communique plus avec aucun mcp
    Oui, la batterie n'est pas indispensable pour faire fonctionner l'horloge.

  15. #14
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    merci pour toute ces reponse

  16. #15
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    encore merci hulk

    j'arrive a afficher l'heure

    maintenant il me reste a faire une routine pour le mettre a l'heure
    et après je regarderai ta routine pour la température

  17. #16
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    la routine pour la mise a l'heure est plus compliquer que prevu
    je m'enbrouie le cerveau

    je 3 boutons je pensai faire comme ceci
    appuie long sur bouton 1 on passe en mode reglage

    l'année clignote on la change avec les bouton + et -
    pour valider apuie sur bouton 1
    on passe au mois meme chose ainsi de suite

    on arrive au minute on les modifie
    on valide
    mise a 0 des sec
    retour mode affichage

    je vous donne ma routine de lecture et affichage
    je l'appel
    je change le registe de l'horloge et l'adresse de l'afficheur et je la rappel ainsi de suite pour tous afficher (je n'affiche pas les seconde)
    Code:
    clockread
    	movlw	ADRCLOCK
    	movwf	adrr		; adresse de l'horloge
    	call	I2CR		; lit un octet sur le bus I2C au registe choisie avant et le mette dans read
    	movfw	read		; octet lue
    	movwf	diz			; extrait les dizaine
    	movwf	uni			; extrait les uniter
    	call	dizaine		; extrait les dizaine
    	call	unite		; extrait les uniter
    	REEPROM	diz			; lit a l'adress diz dans l'eeprom pour envoyer le bonne octet au mcp
    	movwf	affi		; charger valeur a afficher ds affi
    	clrf	gp			; pour piloter le premier chiffre du mcp
    	call	I2CW		; envoyer la valeur lue a ladresse definie avant l'appelle de la fonction
    	REEPROM	uni			; lit a l'adress uni
    	movwf	affi		; charger valeur a afficher ds affi
    	incf	gp,f		; deuxieme chiffre
    	call	I2CW		; envoyer la valeur lue
    	return

  18. #17
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    j'essai actuellement de communiquer avec la sonde de temperature

    et j'envoie l'octet de poid fort recu su le mcp mais probleme rien ne s'affiche

    voici mon code
    Code:
    start
    
    	MOVLW	h'90'     ;adresse du DS1621 en écriture
    	movwf	adrw
    
    	MOVLW	h'AC'     ;acces au registre de config
    	movwf	gp
    	MOVLW	h'01'
    	movwf	affi
    
    		call          I2C_INIT			; on initialise le bus la routine teste si le bus est libre
    		call          I2CSTART			; on envoie un start condition
    		movf	adrw,w      		; on charge l'adresse complete + 0 pour ecriture dans w
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    		movf	gp,w			; choix du port a ecrire
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    		movf	affi,w			; envoie de la valeur a afficher
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK 
    		call           I2CSTOP               ; on envoie un stop condition pour liberer le bus
    	btfsc	I2CACK
    	bsf		PORTA,1			; allumer porta,1
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	movwf	gp
    	MOVLW	h'EE'     ;debut de conversion
    
    		call          I2C_INIT			; on initialise le bus la routine teste si le bus est libre
    		call          I2CSTART			; on envoie un start condition
    		movf	adrw,w      		; on charge l'adresse complete + 0 pour ecriture dans w
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    		movf	gp,w			; choix du port a ecrire
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK 
    		call           I2CSTOP               ; on envoie un stop condition pour liberer le bus
    
    	
    LECT
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    
    		call          I2C_INIT			; on initialise le bus la routine teste si le bus est libre
    		call          I2CSTART			; on envoie un start condition
    
    
    	MOVLW	h'90'       ;adresse du DS1621 en écriture
    
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    
    	MOVLW	h'AA'       ; lecture Température
    
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    
    		call          I2CSTART			; on envoie un start condition
    
    	MOVLW	h'91'      ;adresse du DS1621 en lecture		
    
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    
    		call		I2CtoW
    
    	MOVWF	affi      ;1er octet reçu dans OCT_H (MSB)
    		call		I2C_envoie_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    		call		I2CtoW
    
    		call		I2C_envoie_NoACK
    		call		I2CSTOP               ; on envoie un stop condition pour liberer le bus
    
    ;**********************************************
    	call	tempo
    
    	movlw	ADR
    	movwf	adrw
    	clrf	gp
    		call          I2C_INIT			; on initialise le bus la routine teste si le bus est libre
    		call          I2CSTART			; on envoie un start condition
    		movf	adrw,w      		; on charge l'adresse complete + 0 pour ecriture dans w
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    		movf	gp,w			; choix du port a ecrire
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK   ; on lit l'ACK je n'ecrit pas le test, il faut tester un bit
    		movf	affi,w			; envoie de la valeur a afficher
    		call          WtoI2C                 ; on envoie le contenu de w sur le bus
    		call          I2C_reception_ACK 
    		call           I2CSTOP               ; on envoie un stop condition pour liberer le bus
    
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    	call	tempo
    
    	goto	start
    quelle sont mes erreur ??

  19. #18
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    des idée??

  20. #19
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    petit up!!!!!!!!!!!!!!

  21. #20
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    toujour mon probleme pour la temperature des idée ????

  22. #21
    invited02d59f3

    Re : horloge + temperature I2C afficheur 7 segment

    probleme resolu

    et je ne sais toujour pas se que c'etait
    j'ai recrée un programme du debut et la il fonctionne


    merci pour votre aide

Discussions similaires

  1. Afficheur BCD 7 Segment
    Par invite695eda23 dans le forum Électronique
    Réponses: 21
    Dernier message: 17/06/2009, 14h27
  2. Afficheur 7 segment
    Par invite64878b4e dans le forum Électronique
    Réponses: 17
    Dernier message: 18/03/2008, 09h08
  3. afficheur lcd en afficheur 7 segment
    Par invite3cc40cdb dans le forum Électronique
    Réponses: 3
    Dernier message: 04/02/2008, 09h43
  4. Recuperer la temperature du CPU sur afficheur 7 segment
    Par invitef965ce46 dans le forum Électronique
    Réponses: 7
    Dernier message: 16/06/2006, 10h59
  5. afficheur 7 segment
    Par invite747e32ab dans le forum Électronique
    Réponses: 1
    Dernier message: 21/10/2004, 09h58
Découvrez nos comparatifs produits sur l'informatique et les technologies.