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

pbm PIC16f876A et I2C



  1. #1
    midnight
    salut tlm !

    je fait mes débuts avec l'i2c grace au cours de bigonoff mais j'ai quelques problèmes

    j'essaye de lançer ce programme sans qu'aucun peripherique i2c ne soit branché sur la liaison



    [code:1:98a6ded393]bsf STATUS,RP0 ; banque 1
    clrf SSPSTAT ; slew rate control en service, mode I²C
    movlw D'2' ; valeur de recharge du BRG (400 Kbauds)
    movwf SSPADD ; dans registre de recharge
    bcf STATUS,RP0 ; banque 0
    movlw B'00101000' ; module MSSP en service en mode I²C master
    movwf SSPCON ; dans registre de contrôle
    bcf PORTA,2 ; éteindre la LED

    bsf STATUS,RP0 ; banque 1
    bsf SSPCON2,SEN ; lancer le start-condition

    i2c_start
    btfsc SSPCON2,SEN ; attendre fin start-condition
    goto i2c_start ; boucler
    bcf STATUS,RP0 ; banque 0


    movlw SLAVE ; charger l'adresse de l'esclave
    movwf SSPBUF
    bsf PORTA,2 ; allumer la led
    bsf STATUS,RP0 ; banque 1
    i2c_adress
    btfsc SSPSTAT,R_W
    goto i2c_adress
    bcf STATUS,RP0 ; banque 0
    bcf PORTA,2 ; eteindre la led

    END ; fin de programme[/code:1:98a6ded393]


    le led ne s'eteint jamais
    mon programme reste bloqué dans la boucle de vérification que l'emission est terminée donc la led sur PA.2 reste toujours allumée.

    mon port A est configuré en sortie
    mon port C en entrée
    SLAVE représente l'adresse de mon peripherique i2c (non conecté) et vaut 0b01110000

    je suis sur que c'est une conerie mais je vois pas ...

    PS : désolé bigonoff si j'ai repris pas mal de tes bouts de codes mais je préfère être sur qu'ils marchent

    -----

  2. Publicité
  3. #2
    etronics
    Salut

    si il n' y a pas de peripherique i2c de connecté cela restera bloqué car tu attend une réponse .

    mais je ne suis pas spécialiste ....

    si ton programe doit continuer à tourner sans voir de peripherique il faut qu'il controle de temps en temps si cela repond , si reponse alors il continu vers le periphérique sinon il continu sa boucle .

    @+++ dan

  4. #3
    midnight
    salut,

    je trouve ça bizare car meme en mettant une eeprom i2c sur le bus, le programme reste bloqué dans cette boucle.

  5. #4
    midnight
    personne d'autre n'a d'idée ?

  6. #5
    etronics
    Salut

    tu veux faire quoi au juste avec ton programme , je peux essayer de voir si tu me donne le schèma et le code source complet , car il manque le debut ...

    @+++ dan

  7. A voir en vidéo sur Futura
  8. #6
    midnight
    salut,

    je voudrais comuniquer en I²C avec ce controleur de LCD http://ftp.jetedata.cz/pub/ham/sheet/p/pcf8576c.pdf

    son adresse sur le bus I²C est 0111000

    ce composant est inséré dans un autre montage mais j'ai relié la masse de ce montage avec celle de de mon pic. J'ai récupéré le bus I²C sur le montage en coupant toute connection avec l'ancien microcontroleur et je l'ai relié à mon 16f876a

    mon fichier asm complet est : http://malabar.kikrok.free.fr/16f876a/i%b2c.asm

  9. Publicité
  10. #7
    LouR56
    Salut, dans ton programme, je suis en train de me demander s'il ne manque pas:

    movlw SLAVE ; charger l'adresse de l'esclave
    movwf SSPBUF ; placer l'adresse dans le buffer
    bsf PORTA,2 ; allumer la led
    bsf STATUS,RP0 ; banque 1
    -> bsf SSPSTAT,R_W ; envoyer l'adresse sur le bus I²C

    i2c_adress
    btfsc SSPSTAT,R_W ; envoi terminé?
    goto i2c_adress ; non, attendre qu'il le soit
    bcf STATUS,RP0 ; oui, repasser en banque 0
    bcf PORTA,2 ;éteindre la led

    Je vais vérifier, mais en attendant rien ne t'empêche d'éssayer
    @+
    Louis

  11. #8
    midnight
    salut

    j'ai rajouté cette instruction et effectivement ma led s'éteint bien.

    mais je trouve bizare que que bigonoff ait oublié cette instruction dans
    son cours ainsi que dans ses programmes ...

    ce que je trouve bizare aussi c'est que mon programme ne sortait pas de la boucle du fait que le bit R/W étais au niveau 1 donc un transfert étais actif !!!

    @+

  12. #9
    Bigonoff
    Salut
    -------

    Tout d'abord, tu ne précises pas la fréquence de ton quartz.
    Je présume que c'est un 4,8Mhz. ?

    Ensuite, ton programme n'a pas de fin, la directive "END" n'implique nullement l'arrêt du pic, donc le programme va poursuivre toute la mémoire programme, et reprendre ensuite le programme au début, réallumant toujours la led.

    A+
    Bigonoff
    Vive l'Internet libre

  13. #10
    midnight
    dans la doc du 16f87Xa j'ai trouvé ça :

    Transmission of a data byte, a 7-bit address or the
    other half of a 10-bit address is accomplished by simply
    writing a value to the SSPBUF register. This action will
    set the Buffer Full flag bit, BF, and allow the Baud Rate
    Generator to begin counting and start the next transmission.
    donc aparament le fait de plaçer la donnée dans SSPBUF lançe la transmition, Bigonoff as donc raison.

    par contre jene comprends toujours pas pourquoi mon programme reste bloqué.

    si quelqu'un as un code source de programme pour 16f87X qui utilise le bus I2C je suis preneur.

    ++

  14. #11
    midnight
    salut,

    oui mon quartz est un 4 Mhz.

    et j'ai essayé de faire boucler le programme sur le

    bcf PORTA,2

    après la fameuse boucle et le résultat est le meme

  15. #12
    midnight
    bon j'ai toujours pas trouvé le problème

    meme en faisant tourner mon programme dans le vide avant le END c pareil

  16. Publicité
  17. #13
    LouR56
    Moi non plus, ça m'aurais étonné que Bigonof se trompe dans son programme mais si tu dis que ton programme tourne avec "bsf SSPSTAT,R_W", je ne comprend pas ce qui t'arrive. Essaye avec un quartz de 20MHz peut-être...
    Louis

  18. #14
    Bigonoff
    Salut
    -------

    Tu n'as pas oublié tes résistances de rappel au +5V sur les lignes SDA et SCL, par hasard?

    Parce que sans ça, le module détecte un niveau 0 sur SCL, et c'est considéré comme étant une pause (voir cours-part2)

    A+
    Bigonoff
    Vive l'Internet libre

  19. #15
    midnight
    salut,

    en fait j'avais bien mis les résistances de tirages mais leurs valeurs étaient trop élevées par rapport aux valeurs de résistances qui ont été mise en série sur SCL et SDA sur l'autre montage

    @+

Sur le même thème :

Discussions similaires

  1. Problème de quartz avec PIC16F876A
    Par black_is_beautiful dans le forum Électronique
    Réponses: 2
    Dernier message: 16/07/2007, 16h09
  2. Pic16f876A/communication RS232
    Par Bidebuster dans le forum Électronique
    Réponses: 8
    Dernier message: 23/05/2007, 11h15
  3. Pb de Quartz PIC16F876A
    Par FantomX dans le forum Électronique
    Réponses: 5
    Dernier message: 12/01/2007, 09h08
  4. pbm afficheur en I2C
    Par nephen dans le forum Électronique
    Réponses: 4
    Dernier message: 18/05/2006, 16h51
  5. Programme de base pour PIC16F876A
    Par ico dans le forum Électronique
    Réponses: 4
    Dernier message: 10/04/2006, 05h46
Découvrez nos comparatifs produits sur l'informatique et les technologies.