[PIC] Problème de mise en place I²C

Problème de mise en place I²C [PIC] - C - Programmation

Marsh Posté le 02-05-2008 à 19:38:09    

(je mets ca en sous cat C sans grande conviction mais y a rien de plus approprié)

 

Bien .. Dans le cadre d'un projet que je dois réaliser en 2e année de ma formation en école d'electronique, je dois mettre en place une liaison I²C entre un microcontroleur et une EEPROM d'une part, et entre un microcontroleur et un accélérometre d'autre part (qui dispose d'un bus I²C ou SPI, au choix) .. Pour diverses raisons, j'ai donc choisi un 18F4550, et pour la RAM, une 24AA256 (toutes 2 de Microchip)

 

Dans un premier temps, j'ai utilisé le code disponible sous la forme de l'Application Note 997 (dispo sur le site de Microchip) .. Ca fonctionnait (les formes d'onde vues sur un oscilloscope etaient correctes, et correspondaient bien a ce qui etait attendu), mais pas exactement comme je le souhaitais ...

 

Bref, j'ai donc ensuite tenté de revenir à la base, et de tenter de programmer le truc moi meme .. En utilisant les différents registres dont dispose le 18F4550, qui permettent de gérer ca en hard (alors que le programme de l'AN997 gérait ca en soft) : SSPCON1,SSPCON2,SSPADD,SSPBUF et autres :o

 

J'ai donc utilisé un code ressemblant a celui ci :

 

http://www.google.fr/codesearch?hl [...] 52.c#first

 
Code :
  1. #include <p18f4550.h>
  2. void setup(void)
  3. {
  4. char x;
  5. TRISB = 0x03;
  6. SSPSTAT = 0x80;  // slew rate disabled for Standard Speed mode (100 kHz and 1 MHz)
  7. SSPCON1  = 0x38;  // I2C Master mode, clock = FOSC / (4 * (SSPADD+1))
  8. SSPCON2 = 0x00;  // not a lot
  9. SSPADD  = 19;   // baud rate in address reg 100k in 8Mhz, clock = Fosc/(4*(SSPADD+1))
  10. x = SSPBUF;   // dummy read clears BF
  11. }
  12. void main(void)
  13. {
  14. setup();
  15. while(1)
  16. {
  17.  SSPCON2bits.SEN = 1;     // send start bit
  18.  while(SSPCON2bits.SEN);    // and wait for it to clear
  19.  SSPCON2bits.ACKDT = 0;    // acknowledge bit
  20.  PIR1bits.SSPIF = 0;
  21.  SSPBUF = 0b10100000;      // 10100000 - write command
  22.  while(!PIR1bits.SSPIF);     // wait for interrupt
  23.  PIR1bits.SSPIF = 0;     // then clear it.
  24.  SSPBUF = 0;      // read from address 0
  25.  while(!PIR1bits.SSPIF);     //
  26.  PIR1bits.SSPIF = 0;     //
  27.       }
  28. }
 

Bref .. Le code compile sans probleme, pas d'erreurs dans MPLAB, etc ... Je programme le pic (avec l'ICD2 de Microchip), enfin a priori y a aucun probleme dans l'interface ordi -> pic ..

 

Je lance le programme .. Déja, rien ne se passe sur l'oscilloscope .. Et ensuite, le programme stoppe au premier while(!PIR1bits.SSPIF) .. Vérification faite, le SSPIF reste désespérement à 0, alors qu'il devrait se mettre a 1, tel que précisé dans les datasheets et tous les documents sur l'I²C que j'ai pu trouver ..

 

Mais bon, le premier problème est déja que rien ne bouge sur l'oscillo, alors qu'on devrait voir un start :/
(si je fais une boucle while avec des restart a la chaine, rien n'apparait non plus)

 

Ce qui me fait penser que c'est peut etre un problème de montage, pourtant c'est pas bien sorcier .. La RAM, le PIC, tous les 2 correctement alimentés ... Un fil qui relie le SDA de l'un a l'autre, idem avec le SCL .. Sans oublier la résistance de pull-up, qui maintient les lignes a l'etat haut en l'absence de sollicitation (comme recommandé dans les brochures techniques) ... Et de tte facon le tout marchait correctement (et continue de marcher) avec l'autre programme ..

 

Alors quid ? Ca peut venir d'ou ? :sweat:

 

(j'ai déjà testé avec un autre 18F4550, revérifié les liaisons - avant j'utilisais une plaque a essais qui me paraissait un peu merdique, depuis j'ai refait ca proprement sur une vraie plaque avec soudures et tout le toutim, j'ai fait le tour de la datasheet du µP en question pour voir d'ou pouvait venir le probleme sans y trouver de réponses, maté des sujets sur la question sur pas mal de forums, essayé d'appliquer ce qu'ils recommandaient sans que ca change qqch .. bref, je suis perdu :sweat: )

 

PS : j'ai a ma disposition des 16F877 et des 18F2550, je vais d'ailleurs tester de ce pas le meme code avec le 18F2550, en espérant un miracle :o


Message édité par Juju_Zero le 03-05-2008 à 15:34:47

---------------
iRacing, LA simu automobile
Reply

Marsh Posté le 02-05-2008 à 19:38:09   

Reply

Marsh Posté le 03-05-2008 à 20:30:21    

Yo Juju :o
 
Test de base : commence par faire clignoter une LED, ça permettra de voir si ton prog se flashe bien, qu'il s'exécute bien, que l'oscillateur tourne et que le prog s'exécute :o

Reply

Marsh Posté le 03-05-2008 à 20:33:31    

Tu peux aussi poster un schéma
et donner les paramètres de l'option byte (HS/XT etc.)

Reply

Marsh Posté le 03-05-2008 à 23:01:03    

beel1 a écrit :

Yo Juju :o

 

Test de base : commence par faire clignoter une LED, ça permettra de voir si ton prog se flashe bien, qu'il s'exécute bien, que l'oscillateur tourne et que le prog s'exécute :o


Yo :o

 

Je savais pas que t'etais calé en PIC aussi :d

 

Je suis déja passé par la, et comme je l'ai deja dit, un autre programme du meme style marche sans probleme :o (sans que je touche a la maquette entre temps)

 

Mais euh bon ... Comme par magie, j'ai donc changé de PIC pour un 18F2550 (qui a la meme datasheet que le 18F4550 que j'utilisais avant, donc a priori les memes registres and so on), j'ai aussi ajouté des resistances supplémentaires (passant de 1kohm a ... tadammm .. 2kohm [:petrus75] ), et avec exactement le meme programme, ca s'est mis a marcher ... Incompréhensible :/ (si j'ai le temps je re testerai avec le 4550 pour voir si c'etait juste un probleme avec les resistances, mais ca me paraitrait enorme, qd meme ... d'autant que dans les documents Microchip ils parlent d'une valeur de 1 a 10k)

 

J'ai maintenant du boulot a rattraper pour faire marcher tout comme il faut, mais .. Au moins je sais dans quelle direction bosser [:figti]


Message édité par Juju_Zero le 03-05-2008 à 23:03:04

---------------
iRacing, LA simu automobile
Reply

Marsh Posté le 04-05-2008 à 10:44:11    

1k c'est faible commême, perso j'aurais plutôt tendance à mettre 10k. À moins d'être dans un environnement très perturbé, ça sert à rien de mettre la résistance la plus faible possible. D'ailleurs la dernière fois que j'ai mis un bus I²C sur un produit, les pulls-up étaient de 22k [:petrus75]
 
Ton init me paraît un peu légère aussi, y'a ptêt ceci :
    ADCON1 = 0x0F;                      // Enable digital I/O
qui manque
 
Ca va dépendre de ton Config bit PBADEN :

Citation :

Note: On a Power-on Reset, RB4:RB0 are configured as analog inputs by default and read as ‘0’; RB7:RB5 are configured as
digital inputs.  
By programming the Configuration bit, PBADEN (CONFIG3H<1> ), RB4:RB0 will alternatively be configured as digital inputs on POR.

Reply

Marsh Posté le 04-05-2008 à 16:11:20    

Pour la valeur de la résistance, je me suis basé la dessus :  
 
http://ww1.microchip.com/downloads [...] oc/i2c.pdf (page 9)
 
Quant au reste, bah, pour l'instant ca marche au poil sans ca, et apparemment d'après la datasheet, qd tu actives l'I2C, y a pas besoin de ce truc la :o  
 
Je cite  

Citation :


I²C clock output (MSSP module); takes priority over port data.


 
De tte facon vu que ca marche .. [:cupra]
 
Enfin qd je dis que ca marche, c'est bcp dire, j'ai encore parfois des WCOL ou des BCLIF qui surgissent de nulle part, mais au moins je sais ou regarder pour régler le probleme ... Alors qu'avant, nan, et c'est qd meme pénible de meme pas avoir la moindre idée de l'origine d'un probleme [:petrus75]


---------------
iRacing, LA simu automobile
Reply

Marsh Posté le 04-05-2008 à 21:06:53    

Juju_Zero a écrit :

Pour la valeur de la résistance, je me suis basé la dessus :  
 
http://ww1.microchip.com/downloads [...] oc/i2c.pdf (page 9)


J'aime bien le "values are approximative" en gros dans la slide et le paragraphe en-dessous pour dire que "bon, OK, c'est pas forcément ça" :D

Juju_Zero a écrit :

Quant au reste, bah, pour l'instant ca marche au poil sans ca, et apparemment d'après la datasheet, qd tu actives l'I2C, y a pas besoin de ce truc la :o  
 
Je cite  

Citation :


I²C clock output (MSSP module); takes priority over port data.



Yep. Sauf que si ta pinoche est aiguillée vers l'ADC et non vers le bus de données (j'arrive pas à avoir un schéma des broches du port B :/ ) bah ton MSSP il va lire que des 0.

Reply

Marsh Posté le 05-05-2008 à 11:39:21    

a tu résolu le probleme car je block comme toi avec mon 4550
merci

Reply

Marsh Posté le 05-05-2008 à 20:26:32    

beel1 a écrit :


J'aime bien le "values are approximative" en gros dans la slide et le paragraphe en-dessous pour dire que "bon, OK, c'est pas forcément ça" :D


Ouai :d
 
J'ai trouvé la docu officielle Philips, qui traite en particulier de la valeur de resistance a utiliser, et j'ai rien compris :o  

beel1 a écrit :

Yep. Sauf que si ta pinoche est aiguillée vers l'ADC et non vers le bus de données (j'arrive pas à avoir un schéma des broches du port B :/ ) bah ton MSSP il va lire que des 0.


Bah apparemment y a pas de probleme de ce genre vu que ca marche [:cupra]  

coincoin94 a écrit :

a tu résolu le probleme car je block comme toi avec mon 4550
merci


Je suis passé au 2550 et voila [:tinostar]  
 
J'ai assez de choses a faire pour pas prendre le temps de repasser au 4550 et voir ce qui allait pas :/ D'ailleurs je pense que je trouverai pas le probleme [:cerveau klem]


---------------
iRacing, LA simu automobile
Reply

Marsh Posté le 05-05-2008 à 20:47:14    

Ouais 'fin 'faudrait pas que ça se mette à déconner sur le 2550 aussi, hein [:eraser17]
 
Genre en pleine démo [:kbchris]

Reply

Marsh Posté le 05-05-2008 à 20:47:14   

Reply

Marsh Posté le 05-05-2008 à 20:53:30    

T'inquiete :o
 
D'facon je vais surement encore devoir changer pour une version low voltage (a moins que t'aies une solution miracle pour faire cohabiter un pic alimenté en 5V et un truc alimenté en 3.3V max :o), alors j'ai encore le temps de trouver des trucs qui marchent pas [:cerveau klem]


---------------
iRacing, LA simu automobile
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed