Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Question bête I2C



  1. #1
    Nemesio

    Question bête I2C


    ------

    Bonjour,

    J'avais posté un problème concernant une horloge I2C DS1307 couplé à un 16F876A, malgré un nombre improbable d'essais de quartz/horloges changées ce fichu machin ne fonctionne pas du tout.

    Je recommence tout depuis le début et j'ai un vague doute (je ne suis pas du tout électronicien).

    Est ce que, lorsque la DS est alimentée via la pin 8, le quartz (32,768 12,5pF) relié aux pins 1 et 2 , 3 et 4 au GND, ce maudit quartz doit osciller? Sans être banché au bus brut tel quel, alimenté avec le quartz?

    J'ai un 2V sur la pin 2 et rien de rien ne veut sortir de la pin1 (c'est surement très con mais juste pour me rassurer).

    Durant les 5 jours passés dessus (oui je suis têtu) j'ai eu une oscillation sur la pin 1 et 2 très propre et je n'ai jamais réussi à reproduire le phénomène, m'étant complètement embrouillé (merci Umfred pour ton aide mais je suis encore pas sorti d'affaire )

    -----

  2. #2
    umfred

    Re : Question bête I2C

    Citation Envoyé par Nemesio
    Est ce que, lorsque la DS est alimentée via la pin 8, le quartz (32,768 12,5pF) relié aux pins 1 et 2 , 3 et 4 au GND, ce maudit quartz doit osciller? Sans être banché au bus brut tel quel, alimenté avec le quartz?

    J'ai un 2V sur la pin 2 et rien de rien ne veut sortir de la pin1 (c'est surement très con mais juste pour me rassurer).
    oui le quartz devrait osciller, mais si tu utilise une sonde d'oscilloscope , n'oublie qu'elle a une certaine capacité qui peut filtré le signal de l'oscillateur.

    la pin 1 est une entrée(donc tu ne verra pas de signal et si tu as un potentiel flottant sur la pin 2 vérifie que tes soudures sont bonnes.

    Je viens aussi de voir cette remarque dans la datasheet:
    Please note that the initial power-on state of all registers is not defined. Therefore, it is important to
    enable the oscillator (CH bit = 0) during initial configuration.
    Donc ne pas oublier de mettre à 0 le bit CH (il se trouve dans le registre des secondes) dès le début.

  3. #3
    Nemesio

    Re : Question bête I2C

    Merci umfred,

    j'abuse un peu mais là j'ai l'impression d'être un bon gros boulet ce machin résiste à tous mes assauts
    J'ai voulu remettre tout au clair et tout virer sauf l'alim et ce qui est nécessaire avant de brancher le bus.
    Toute les pins donc sauf le SDA SCL et SQW.
    Je me demandais si ainsi alimenté sans initialisation par le bus il était normal que j'aie 2V en pin 2 absolument rien en pin 1 et par voie de conséquence un cristal qui n'oscille pas.

    Est ce que donc ce fichu DS aura une OSC sur la pin 1 dès que CH sera à 0?

    J'entends par là, est ce que cette fameuse horloge "disabled" pour CH <> 0 (état indéfini s'il en est ou 1) bloque l'oscillation du quartz connecté en pin 1 et 2?
    Ou est ce que CH <> ne fais que bloquer le registre compteur et la sortie SQW?

    Bref a pwal le biniou il binioute ou il fait dodo?

    (Je n'ai aucune connaissance dans se dommaine ne supposez pas que je sache ne serait ce que la base du fonctionnement, je peux seulement affirmer que en pin 2, le DS non connecté au bus a un 2V stable non modulé c'est correct comme valeur pour le quartz?)

    En torturant ce truc j'avais fini par avoir une oscillation mais je ne sais pas si c'était dû à un branchement enfin correct ou à un programme d'initialisation qui était enfin passé (auquel cas j'envisagerai un suicide ^^)
    Dernière modification par Nemesio ; 13/06/2006 à 21h56.

  4. #4
    Nemesio

    Re : Question bête I2C

    Plein de fautes pardon impossible d'éditer

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

    Re : Question bête I2C

    Salut,

    pas de panique, je crois avoir déjà posté pour cette horloge, très simple à mettre en oeuvre à condition de s'y prendre dans l'ordre.
    Donc déjà:
    1/ Fais voir le schéma que tu utilises.
    2/ Dans quel langage écris-tu?
    3/ Fais lire ta romance...

  7. #6
    umfred

    Re : Question bête I2C

    En fait en regardant de plus près le bit CH, ne débloquerait que la sortie 7 et les compteurs internes et non pas l'oscillateur.

    J'ai trouvé ça dans la bote d'application concernant le quartz des RTC:
    Checking For Oscillation
    The first impulse that a designer has when checking for oscillator operation often is to connect an oscilloscope probe to the oscillator input (X1) or output (X2) pin. Doing so is not recommended when using a Real-Time Clock. Since the oscillator is designed to run at low power (which extends operating time from a battery), loading the oscillator with an oscilloscope probe is likely to stop the oscillator. If the oscillator does not stop, the additional loading will reduce the signal amplitude, and may cause erratic operation, such as varying amplitude. Oscillation should therefore be verified indirectly.

    Oscillation can be verified several ways. One method is to read the seconds register multiple times, looking for the data to increment. On RTCs with an OSF (Oscillator Stop Flag), clearing and then monitoring this bit will verify that the oscillator has started and is continuously running. These methods won’t work if the designer is troubleshooting a design and cannot communicate with the RTC. An alternate method is to check the square wave output on RTCs that have a square wave output. Check the datasheet to verify if the RTC must be written first to enable the oscillator and square wave output. Note that most RTC square wave outputs are open-drain, and require a pull up resistor for operation. The square wave output can also be used to verify the accuracy of the RTC, however, a frequency counter with sufficient accuracy must be used.
    Donc le problème vient probablement de la sonde de ton oscillo en parallèle des condensateurs internes de la RTC.
    La méthode qu'ils préconisent est de vérifier la sortie 7 (mais il faut que ce fameux bit CH soit à 0, hors on sait pas au démarrage son état :s).
    Il faut donc connecter l'I2C pour configurer ta RTC. Attention le bus I2C (SCL) ne doit pas dépasser 100kHz, vérifie ce point déja, et ensuite vérifie la trame que tu lui envoie. Si la communication ne dépasse pas le 1er octet envoyé (l'adresse de la RTC), vérifie les soudures et la valeur que tu envoies.

  8. #7
    Nemesio

    Re : Question bête I2C

    Alors alors,

    Puisque justement je n'arrivais pas à démarrer SQW j'ai voulu vérifier la base de mon branchement en regardant si tout était correct avant de brancher l'I2C.
    Donc pour régler mon problème d'oscillateur il faut que je fasse marcher ce pourquoi je tentais de vérifier l'oscillation (une corde vite...)
    Coucher l'oscillation je veux bien mais j'ai déjà réussi à mesurer une belle OSC @ 32KHz (à l'intant même où j'aurais mieux fait de me péter un bras plutôt que de tout trifouiller)

    Mon bus est configuré à 100KHz et je ne vois absolument rien à l'oscillo quand j'envoie une trame (en fait mon prog bloque sur le STOPI2C avant d'envoyer le STARTI2C suivi de l'adresse de la DS) donc j'envoie nada.

  9. #8
    Nemesio

    Re : Question bête I2C

    @Hulk le schéma... ah ouais ça serait pas bête de travailler proprement huhu...

    je vais tenter de trouver ce dont je me suis inspiré...
    http://www.techdesign.be/projects/007/007.htm

    Evidemment j'ai connecté SCL au SCL correspondant à mon pic et pareil pour SDA (pin 14 et 15)

    Je programme en ASM (juste pour que ça soit bien dur on dirait que j'aime bien m'embêter)
    Dernière modification par Nemesio ; 13/06/2006 à 22h33.

  10. #9
    Nemesio

    Re : Question bête I2C

    Une des milliards de sources que j'ai tapé
    Fichiers attachés Fichiers attachés

  11. #10
    umfred

    Re : Question bête I2C

    dans ce fichier, tu envoie l'adresse de la RTC, suivi de l'adresse du registre des secondes et tu arrêtes la transmission. il faudrait que tu initialises l'ensemble de tes registres ensuite.

    je te propose d'écrire ça:

    ;Phase d'initialisation de la RTC

    Bank1
    BSF SSPCON2,SEN ;Signal START
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW RTC_ADD_IN ;Adresse RTC en mode écriture
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x00 ;Première adresse de la RTC
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x00 ;initialise les secondes à 0
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x00 ;initialise les minutes à 0
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x40 ;initialisation des heures à 0h00 mode 24h (à vérifier, la doc me semble bizarre sur ce point)
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x01 ;initialise le jour à Lundi
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x0 ;initialise le jour du mois au 1er
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x01 ;initialise le mois à Janvier
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW 0x06 ;initialise l'année à 06 (pour 2006 par exemple)
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    MOVLW B'10010000 ;initialise la sortie en générateur de signal 1Hz (pratique pour tester le fonctionnement de la RTC
    CALL Send_I2C_Byte ;On envoit W vers la RTC, attention fonction en Bank0
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0

    Bank1
    BSF SSPCON2,PEN ;Signal STOP
    CALL WaitMSSP ;On attend la fin de l'opération, attention fonction en Bank0
    Dis moi ce que ça donne.

  12. #11
    Nemesio

    Re : Question bête I2C

    "MOVLW RTC_ADD_IN ;Adresse RTC en mode écriture"

    Tiens une boulette => MOVF RTC_ADD_IN,W

    Me fallait au moins le joli fond orange du forum pour voir un truc aussi bête!

  13. #12
    Nemesio

    Re : Question bête I2C

    Bon je bloque sur le Wait comme d'hab mais j'ai pu observer un truc louche:

    voila l'allure de mon tracé SDA SCL sur les pin 13 et 14 de mon PIC,

    -Avec la RTC branchée:

    +5 --------------
    SDA 0_____________\_______________ ___

    +5
    SCL 0_____________________________ ___

    SDA répond bien mais SCL devrait être à +5 au départ

    -RTC débranchée du bus:

    +5---------------
    SDA 0 ____________\_________________ _

    +5------------------------------------
    SCL 0

    Damned il semble que ma RTC bloque ma SCL à 0 d'entrée je suppose donc que de base la RTC doit faire osciller le quartz sinon SCL tombe à 0 maintenu par les pull-ups.

    Il me semble donc que j'ai un problème de quartz mais j'ai branché 3 RTC différentes sur des quartz dont la réf se trouve dans le datasheet...

  14. #13
    umfred

    Re : Question bête I2C

    Citation Envoyé par Nemesio
    "MOVLW RTC_ADD_IN ;Adresse RTC en mode écriture"

    Tiens une boulette => MOVF RTC_ADD_IN,W

    Me fallait au moins le joli fond orange du forum pour voir un truc aussi bête!

    non non c'est pas une boulette, tu as utilisé #define pour le définir , il s'agit donc d'une constante pas d'une variable

    Citation Envoyé par nemesio
    Damned il semble que ma RTC bloque ma SCL à 0 d'entrée je suppose donc que de base la RTC doit faire osciller le quartz sinon SCL tombe à 0 maintenu par les pull-ups.
    Seul le maître controle le signal SCL, je pense donc pas que ca vienne de ta RTC. Peux tu me rappeler la valeur de tes pull-up?

    Je te conseillerai aussi de boucler sur la phase d'initialisation que je t'ai proposer avec éventuellement un changement d'état d'une autre sortie (relié à une LED par exemple) a près chaque WAIT pour voir sur lequel tu est bloqué.
    Une solution pour éviter d'être bloqué serait d'ajouter une tempo (2secondes par exemple) dans ton WAIT , en cas de dépassement de tempo il faudrait retourner au début de l'initialisation également.

  15. #14
    Nemesio

    Re : Question bête I2C

    Après beaucoup de d'énervement de compos sacrifiés sur l'autel de l'essai noobesque la chose marche parfaitement merci umfred, je cumulais les problèmes:

    -problème de watchdog
    -mauvaise soudure (une tite masse qui avait décidé de voir du pays)
    -erreur stupide dans mon debug (j'ai voulu debug les données brutes qui sont par essence non imprimable il fallait convertir la base de temps)
    -plusieurs flags étaient à surveiller (je les ai transmis en argument via une macro)

    Bref sans oscillo c'était impossible ^^

    voila voila je ne vais plus vous polluer pour le moment!
    je vais remettre la chose en ordre avec des computed goto comme il faut plutôt que des JMP à rallonge et je devrais avoir un bon squelette I2C (beaucoup plus gros que je pensais à traîter).

    umfred Dallas Inst

  16. #15
    Nemesio

    Re : Question bête I2C

    Citation Envoyé par Nemesio
    Après beaucoup de d'énervement de compos sacrifiés sur l'autel de l'essai noobesque la chose marche parfaitement merci umfred, je cumulais les problèmes:

    -problème de watchdog
    -mauvaise soudure (une tite masse qui avait décidé de voir du pays)
    -erreur stupide dans mon debug (j'ai voulu debug les données brutes qui sont par essence non imprimable il fallait convertir la base de temps)
    -plusieurs flags étaient à surveiller (je les ai transmis en argument via une macro)

    Bref sans oscillo c'était impossible ^^

    voila voila je ne vais plus vous polluer pour le moment!
    je vais remettre la chose en ordre avec des computed goto comme il faut plutôt que des JMP à rallonge et je devrais avoir un bon squelette I2C (beaucoup plus gros que je pensais à traîter).

    umfred Dallas Inst
    Pour répondre à ma question donc le quartz du DS n'oscille pas avant d'avoir mis le premier registre à 00 pour des raison d'economie de pile sur le produit fini

  17. #16
    jf_templier

    Re : Question bête I2C

    Citation Envoyé par Nemesio Voir le message
    Bonjour,

    J'avais posté un problème concernant une horloge I2C DS1307 couplé à un 16F876A, malgré un nombre improbable d'essais de quartz/horloges changées ce fichu machin ne fonctionne pas du tout.

    Je recommence tout depuis le début et j'ai un vague doute (je ne suis pas du tout électronicien).

    Est ce que, lorsque la DS est alimentée via la pin 8, le quartz (32,768 12,5pF) relié aux pins 1 et 2 , 3 et 4 au GND, ce maudit quartz doit osciller? Sans être banché au bus brut tel quel, alimenté avec le quartz?

    J'ai un 2V sur la pin 2 et rien de rien ne veut sortir de la pin1 (c'est surement très con mais juste pour me rassurer).

    Durant les 5 jours passés dessus (oui je suis têtu) j'ai eu une oscillation sur la pin 1 et 2 très propre et je n'ai jamais réussi à reproduire le phénomène, m'étant complètement embrouillé (merci Umfred pour ton aide mais je suis encore pas sorti d'affaire )
    bonjour
    l'oscillateur doit fonctionner sans probleme il doit y avoir environ 2.5V sur X1 et aussi sur X2 mesuré avec une sonde a haute impedance sur X1
    si ce n'est pas le cas le circuit est HS ,
    il faut etre tres prudent en soudant le quartz il faut porter un bracelet antistatique relié a la masse. et avoir un fer a souder lui aussi relier a la masse ainsi que la station de travail
    le quartz aussi est tres fragil, ne pas tordre les patte en forcant sur le boitier, a la moindre contrainte le diapason se casse. il faut tenir la patte du composant avec une petite pince pres du boitier et plier le fil vers l'exterieur

Discussions similaires

  1. question bête
    Par Lilia92 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 10
    Dernier message: 09/12/2007, 09h12
  2. question bête
    Par permanganate de potassium dans le forum Chimie
    Réponses: 9
    Dernier message: 24/03/2007, 20h34
  3. Question bête...
    Par Adrian1903 dans le forum Électronique
    Réponses: 8
    Dernier message: 24/05/2006, 11h12
  4. Bête question.
    Par blOurk dans le forum TPE / TIPE et autres travaux
    Réponses: 2
    Dernier message: 17/05/2006, 21h31
  5. question bête
    Par adrislas dans le forum Mathématiques du supérieur
    Réponses: 12
    Dernier message: 08/02/2005, 20h22
Découvrez nos comparatifs produits sur l'informatique et les technologies.