Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#31 Message par Stefox » jeu. 24 juil. 2025 12:55

Ah oui quand je zoom, je le vois en effet, ça me paraît mieux ainsi ! ^^

Un tout grand merci pour tout !! Le write addr, fonctionne aussi, je vais essayer donc de faire ce que je voulais faire, ecrire une heure et la lire :-D Je vous tiens au courant de mon avancée ! :)

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#32 Message par Stefox » jeu. 24 juil. 2025 15:27

Bon.. C'est franchement pas trop mal !! :-D . Cependant, j'ai un petit bug sur la fin.

J'ai fait un main avec un LCD pour voir l'évolution et le bus semble se bloquer après l'affichage de "Slave -r detect" Le programme se fige la dessus.

L'analyseur voit SDA a 0 et SCL a 1 tout le temps après l'affichage de ce message.

J'imagine que c'est mes while dans mes fonctions I2C qui fait figer tout ?

J'ai dû mettre aussi la fin de mon code en commentaires car sinon le lcd se clear complètement et le programme se fige aussi..

Mes fonctions pour la lecture te semble correct ou bien aurais-je mal compris la procédure après un restart ?

main.txt

I2C2.txt
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#33 Message par satinas » jeu. 24 juil. 2025 15:59

En fait j'ai confondu avec un autre programme, il semble que tu n'ai pas utilisé du tout les registres ANSEL. Tous ces registres sont à 0xff au reset car les pins mixtes démarrent toutes en mode analogique. Pour la led il faut mettre la pin en numérique, et si cela marchait quand même sans cela, ce n'était pas le cas de l'I2C.

La fonction I2C2_ReadAddr(uint8_t addr) n'est pas à jour pour retourner correctement l'acknoledge.
Dans la fonction I2C2_ReadData(uint8_t ack) il faut mettre le bit IF à 0 avant de mettre RCEN à 1, et pour la suite les bits BF et IF sont-ils bien utilisés ?

Regarde le code que j'avais fait pour la carte de Pedro. J'abuse du bit IF, t'es pas obligé de faire pareil. En plus pas de blocage car je teste même le retour du start, là aussi t'es pas obligé de suivre :-)
https://fantaspic.fr/viewtopic.php?f=36&t=1125
18F47Q10_xc8_Pedro.X.7z
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par satinas le jeu. 24 juil. 2025 16:43, modifié 1 fois.

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#34 Message par Stefox » jeu. 24 juil. 2025 16:12

J'ai bien utilisé Ansel pour l"I2C, dans la fonction init que j'ai donné ici, c'était d'ailleurs le bug initiale ^^

Je vais tenter de comprendre un peu le code donné ^^ Mais il, y a déjà pas mal de chose qui ne fonctionnera plus aujourd'hui, tout comme de nombreux code que j'ai pu trouvé sur internet ^^

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#35 Message par satinas » jeu. 24 juil. 2025 16:17

Il faut mettre en numérique toutes les pins non utilisées en analogique, donc ANSELB = 0

Ta fonction I2C2_ReadAddr() doit être la même que I2C2_WriteAddr() au bit R/W près, et regarde ma fonction I2c2Read() pour la lecture de data.

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#36 Message par Stefox » jeu. 24 juil. 2025 16:42

Ok, j'ai appliqué les modifications mais cela fige toujours.

On est d'accord que les corrections que j'ai apporté suite à ton message ont bien été comprises ?

Fct.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#37 Message par satinas » jeu. 24 juil. 2025 16:48

Ca m'a l'air correct.
BIen que j'aime pas le debugger de MPLABX, il pourrait être utile. Ou alors tu affiches une valeur différente sur le lcd avant chaque while tueur, et tu pourras savoir où est le blocage.
C'est pourquoi je mets des codes retour d'erreur partout, cela sert surtout au développement pour déceler rapidement les anomalies, après cela sert plus à grand chose.

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#38 Message par Stefox » jeu. 24 juil. 2025 16:51

Tu me conseillerais donc plutôt d'utiliser les if au lieu des while dans mes fonctions alors ? Du moins après le restart vu qu'avant cela à l'air de fonctionner

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#39 Message par satinas » jeu. 24 juil. 2025 16:52

Pour le moment ton code est censé être bon, ce n'est que du debug, trouve le while qui boucle.
je parle des flags IF, pas de l'instruction if :-)

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#40 Message par satinas » jeu. 24 juil. 2025 16:59

Ton programme est ok, il faut juste le debugger, trouver le while qui boucle.

Le voilà mon while, je répète dans ton cas reste simple :-)

Code : Tout sélectionner

//------------------------------------------------------------------------------
bool I2c2WaitFlag(void)
//------------------------------------------------------------------------------
// bus i2c2, attente que le flag SSPIF passe à 1
//
// après SEN = 1,         attente fin du start
// après RSEN = 1,        attente fin du restart
// après PEN = 1,         attente fin du stop
// après écriture SSPBUF, attente fin envoi octet et réception ack/nak
// après RCEN = 1,        attente réception octet
// après ACKEN = 1,       attente fin envoi ack/nak
{
  unsigned int t=50000;       // time-out 100ms
  while (t--) {
    if (PIR3bits.SSP2IF) return TRUE;
    __delay_us(2);
  }
  return FALSE;
}


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités