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

Problème concernant une DS1307 sur I2C



  1. #1
    Nemesio

    Problème concernant une DS1307 sur I2C


    ------

    Bonjour,

    Je viens vous exposer un problème de bus sur lequel je plante depuis bientôt 3 jours...

    J'ai branché sur un 16F876 une DS1307 via I2C (jusque là, rien d'extravagant) SCL SDA sur les pins ad-hoc des deux côtés, 4MHz pour le pic, quartz RTC connecté, pin Vbat au GND, 5V etc etc

    N'ayant jamais utilisé l'I2C je charge le datasheet Microchip et je suis la procédure classique, voici le source (c'est un peu en vrac j'en suis au début du projet):

    ;------------ Programme ---------------

    ; Titre : CdR
    ; Date de départ : 31 Mai 2006
    ; Date de version alpha : 01 Juin 2006 (test RS232)
    ; Date de version bêta :
    ; Date de version release :
    ; Auteur : B.Marien
    ; PIC utilisé : PIC 16F876/16F876A
    ; Base de fréquence externe à 4Mhz XT
    ;
    ;***** PIC16F876 ****************************** ******************** ****
    ;
    ; MCLR/Vpp -- 1 28 -- RB7/PGD
    ; RA0/AN0 -- 2 27 -- RB6/PGC
    ; RA1/AN1 -- 3 26 --> RB5
    ; RA2/AN2/Vref-/CVref -- 4 25 -- RB4
    ; RA3/AN3/Vref+ -- 5 24 <-- RB3/PGM
    ; RA4/T0CKI/C1OUT -- 6 23 -- RB2
    ; RA5/AN4/SS/C2OUT -- 7 22 -- RB1
    ; - Vss --> 8 21 -- RB0/INT
    ; OSC1/CLKI --> 9 20 <-- Vdd +
    ; OSC2/CLKO <-- 10 19 <-- Vss -
    ; RC0/T1OSO/T1CKI -- 11 18 -- RC7/RX/DT
    ; RC1/T1OSI/CCP2 -- 12 17 -- RC6/TX/CK
    ; RC2/CCP1 -- 13 16 -- RC5/SDO
    ; RC3/SCK/SCL -- 14 15 -- RC4/SDI/SDA
    ;
    ; RB3 = LVP
    ; RB5 = sortie test
    ;***************************** ******************** *********************

    ;----------------- Directive d' assemblage pour MPLAB -----------------


    LIST P=16F876 ;Device
    #INCLUDE P16F876.INC ;Fichier invoqué contenant les infos du proc

    ;***** Pattern de configuration

    ; CP -- DEBUG WRT1 WRT0 CPD LVP BOREN -- -- PWRTE WDTE FOSC1 FOSC0
    ;bit 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    ; 1 1 1 1 1 1 1 0 1 1 0 0 0 1(3FB1)
    ;
    ; CP = 1 Code protection off
    ; -- 1 /!\ Mettre à 1 les bits non utilisés /!\
    ; DEBUG = 1 In-Circuit debugger disabled, RB6 RB7 free
    ; WRT1/0 = 11 No code protection
    ; CPD = 1 No EEPROM protection
    ; LVP = 1 Low Voltage Programming enabled, RB3 no more free I/O
    ; BOREN = 0 No brown-out
    ; -- 1
    ; -- 1
    ; PWRTE = 0 Power-up timer enabled
    ; WDTE = 0 WDT disabled
    ; FOSC1/0 = 01 XT

    __CONFIG 0x3FB1 ;Word de configuration (watchdog...)

    ERRORLEVEL -302 ;Suppression des erreurs de Bank

    ;---------------------- Définition des macros ----------------------

    Bank0 macro
    BCF STATUS,RP0
    BCF STATUS,RP1
    endm

    Bank1 macro
    BSF STATUS,RP0
    BCF STATUS,RP1
    endm

    Bank2 macro
    BCF STATUS,RP0
    BSF STATUS,RP1
    endm

    Bank3 macro
    BSF STATUS,RP0
    BSF STATUS,RP1
    endm

    ;-------------------- Définition des constantes --------------------

    ;Initialisation I2C
    #define RTC_ADD_IN B'11010000' ;Control Byte d'écriture vers DS1307
    #define RTC_ADD_OUT B'11010001' ;Control Byte de lecture vers DS1307
    #define RTC_BAUD D'100' ;Baud en Kbps
    #define FOSC D'4000' ;Oscillateur en KHz

    ;Initialisation RS232
    #define carry STATUS,C ;Flag décimal
    #define zero STATUS,Z ;Flag de résultat nul
    #define _receivedcar flag,0 ;Alias de flag, bit indicateur de réception

    #define CT_TEST PORTB,5 ;Sortie BLINK

    ;--------------------- Définition des variables --------------------
    ; ORG 0x20
    i EQU 0x20 ;Variable de division
    j EQU 0x21 ;Variable de division
    k EQU 0x22 ;Variable de division
    XTEMPO EQU 0x23 ;Registre temporaire du multiplicateur de temporisation 0,25s

    saveW EQU 0x24 ;\
    savesta EQU 0x25 ; >Sauvegarde de registres pour rétablissement après interruption
    saveFSR EQU 0x26 ;/
    flag EQU 0x27
    caractere EQU 0x28
    compteur EQU 0x29
    SECONDS EQU 0x2A
    MINUTES EQU 0x2B
    HOURS EQU 0X2C
    CONTROL EQU 0X2D

    ;-------------------- Init des ports A, B et C ----------------------

    ORG 0 ;Point de départ du code
    GOTO init
    org 4
    GOTO interrupt ;Interruption

    init:
    Bank0 ;Passage en Bank0
    CLRF PORTA ;\
    CLRF PORTB ; >Clear Data Latches
    CLRF PORTC ;/
    Bank1
    CLRF TRISA ; A en sortie
    CLRF TRISB ; B en sortie
    MOVLW B'10011000' ; RC7 en entrée ( RX ) / RC6 en sortie ( TX ) / RC3 en entrée (SCL) / RC4 en entrée (SDA)
    MOVWF TRISC

    ; GOTO debut ;On saute l'I2C pour la simulation

    ;Init I2C en Master Mode 100KHz
    Bank0
    MOVLW B'00101000' ;SSPEN pour valider l'I2C, SSPMx pour Master Mode
    MOVWF SSPCON ;Config établie dans le registre correspondant

    Bank1
    MOVLW B'10000000' ;Slew Rate configuré pour le 100KHz
    MOVWF SSPSTAT

    MOVLW (FOSC / (4 * RTC_BAUD)) -1 ;Calcul SPADD pour obtenir le paramètre menant à 100KHz, soit SSPADD = 9
    MOVWF SSPADD

    ;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

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

    ******
    j'initialise mes options_reg intcon après pour ne pas gêner tant que ça ne marche pas
    Donc je saute un peu de code qui est un simple blinker et une sortie uart pour voir si le prog tourne encore...
    ******
    ;---------------------- Fonctions invoquées ------------------------

    ;Retardateur I2C
    WaitMSSP:
    Bank0
    BTFSS PIR1,SSPIF ;On vérifie le flag de fin d'opération
    GOTO $-1 ;Pas encore fini
    BCF PIR1,SSPIF ;RAZ du flag de fin d'opération
    RETLW 0 ;Retour

    ;Fontion d'envoi sur l'I2C
    Send_I2C_Byte:
    Bank0
    MOVWF SSPBUF ;On envoit le contenu de W dans le Buffer I2C
    RETLW 0 ;Retour

    [...]
    Blabla les autres fonctions
    [...]

    End


    Oui mais non car mon prog bloque au premier WaitMSSP donc sur SSPIF qui ne se met jamais à 1.

    Quand je regarde au voltmètre mes SCL et mes SDA ils restent collés à 0V :/
    Le buff me semble donc occupé alors que la RTC est le seul périph connecté!

    Je vous serai reconnaissant de me sortir de la crise de nerf qui me guette avant ce week end

    -----

  2. Publicité
  3. #2
    umfred

    Re : Problème pour concernant une DS1307 sur I2C

    As-tu pensé à mettre les résistances de pull-up nécessaires à l'I2C ?

  4. #3
    Nemesio

    Re : Problème pour concernant une DS1307 sur I2C

    2X 1K8, oui je pense être dans les normes d'après le datasheet I2C Microchip pour une valeur de 100KHz >_<.
    Merci d'y avoir pensé ça doit être un truc tout bête je suis sûr! Mais là, non

  5. #4
    umfred

    Re : Problème pour concernant une DS1307 sur I2C

    Comme apparement tes fonctions sont en bank0, il faut que tu fasse un changement de bank juste avant l'appel à ces fonctions, si je me trompe pas (c'est le truc chiant avec les PIC, la gestion des bank )

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

    Re : Problème pour concernant une DS1307 sur I2C

    Surtout en assembleur...

  8. #6
    Nemesio

    Re : Problème pour concernant une DS1307 sur I2C

    Si je reprends l'endroit où je coince:

    ;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

    Or,

    ;Retardateur I2C
    WaitMSSP:
    Bank0
    BTFSS PIR1,SSPIF ;On vérifie le flag de fin d'opération
    GOTO $-1 ;Pas encore fini
    BCF PIR1,SSPIF ;RAZ du flag de fin d'opération
    RETLW 0 ;Retour

    Le prog s'arrête, enfin tourne en boucle sur SSPIF mais les changements de Bank sont bien là :/ (Bank1 pour SSPCON et passage en Bank0 pour PIR)

    Je ne crois pas m'être trompé :/
    Dernière modification par Nemesio ; 09/06/2006 à 06h38.

  9. Publicité
  10. #7
    invite03481543

    Re : Problème pour concernant une DS1307 sur I2C

    Salut,

    j'ai pas le temps de regarder ton prog par contre j'ai une routine perso en C qui tourne nickel.

    Si ça t'interesse...

  11. #8
    Nemesio

    Re : Problème pour concernant une DS1307 sur I2C

    Le C ne m'attire pas des masses pour programmer, mais si ça peut me permettre de voir l'ordre logique de l'Init je veux bien avec plaisir!

    Merci

  12. #9
    umfred

    Re : Problème pour concernant une DS1307 sur I2C

    essaie en forçant à 0 ton bit sspif juste avant de générer le bit de start, comme ceci:
    Bank0
    bcf PIR1,SSPIF

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

  13. #10
    Nemesio

    Re : Problème pour concernant une DS1307 sur I2C

    Ca commence à sentir bon je pense, je ne bloque pas sur cette condition (mon programme s'exécute correctement par la suite... Enfin c'est un simple blinker hum)

    Bank1
    BSF SSPCON2,ACKSTAT
    loop1:
    Bank1
    BSF SSPCON2,SEN ;Signal START

    btfsc SSPCON2,ACKSTAT ; tester ACK reçu
    goto loop1 ; pas reçu, on recommence

    C'est codé comme un goret, je ferai mieux après, mais logiquement:
    -Je force à 1 ACKSTAT
    -J'envoie SEN
    -Je teste ACKSTAT (if ackstat = 0 then on va à la suite)
    -Si ACKSTAT = 1 (inchangé donc) on redémarre de "J'envoie SEN"

    ACKSTAT est bien "Writeable" suivant le datasheet or ACKSTAT : Acknowledge Data Bit 1=Not Acknowledged 0=Acknowledged

    Corrigez moi si mon présentiment est faux ^^

  14. #11
    umfred

    Re : Problème pour concernant une DS1307 sur I2C

    au lieu d'utiliser le ACKSTAT, essaie plutot d'utiliser le RSEN (Repetive Start).
    Ca sera plus logique

Discussions similaires

  1. DS1307 sur station meteo
    Par pierodu13 dans le forum Électronique
    Réponses: 21
    Dernier message: 09/11/2008, 20h24
  2. question concernant une série
    Par Hafedh dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 30/10/2007, 21h51
  3. Probleme I2C
    Par marquesni dans le forum Électronique
    Réponses: 4
    Dernier message: 14/05/2006, 01h24
  4. Réponses: 1
    Dernier message: 07/05/2006, 13h13
  5. Problème avec RTC DS1307 [picbasic pro]
    Par Gwen1400 dans le forum Électronique
    Réponses: 4
    Dernier message: 05/04/2006, 08h54
Découvrez nos comparatifs produits sur l'informatique et les technologies.