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 ---
- 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 ---
Modérateur : Jérémy
Fonctions I2C
Ben moi non plus
, c'est pour cela que je parlais de port série, le lcd est trop limité, il n'a pas de mémoire.
Je suis pas devant ton lcd, j'ai du mal à suivre, rappel ici c'est un asile de personnes agées, comme beaucoup de forums.
Ne mets pas de delay entre l'envoi de adresse+read et réception de l'octet data.
Le blocage se fait sur un while, trouve lequel.
Je suis pas devant ton lcd, j'ai du mal à suivre, rappel ici c'est un asile de personnes agées, comme beaucoup de forums.
Ne mets pas de delay entre l'envoi de adresse+read et réception de l'octet data.
Le blocage se fait sur un while, trouve lequel.
Fonctions I2C
Bon c'est étrange, je t'explique ce que j'ai fait ici :
J'ai décommenté tout mon programme pour recommencer la recherche du while en question. Voici le main avec lequel j'ai fait cela :
Dans ce cas, il va jusqu'au bout du programme (J'ai juste décommenté hein, je n'ai rien modifé) et m'affiche 49 parfois 1 parfois 5 ou 3 (c'est aléatoire, il devrait afficher 45 normalement mais bon soit) et exécute ma dernière ligne de code qui est de toggle une led (donc elle s'allume). Donc quand tout est décommenté dans le main, il parvient a sortir de la fonction I2C2_ReadAddr() et lancé la fonction I2C2_ReadData à en sortir également puisqu'il va ensuite m'afficher un nombre et puis inverser ma led.
Mais il ne va pas boucler, c'est comme s'il sortait du while et puis fini.
Je décide donc de le re-charger et il ne démarre pas. Je suis obligé de couper l'alimentation et de la remettre pour que le nouveau programme reprenne.
Je t'ai fait une petite vidéo pour que tu puisses voir si tu veux avec vue sur la carte et le pickit pour que tu vois quand je charge (Je ne modifie pas le programme, je le charge juste pour te montrer).
Pour expliquer ce qui se passe pendant la vidéo, ce sera peut être plus facile : Le programme est planté, j'ai plus rien sur l'écran, ... Je recharge le programme sans succès. Je coupe donc l'alim et la remet --> Réparé, le lcd et la led vie et fini par m'afficher 6 et reste comme ça (Il ne m'a pas afficher Slave -r detect c'est normal) --> Je recharge le programme donc le LCD s'efface mais rien dessus, je dois de nouveau couper et remettre l'alim.
J'ai décommenté tout mon programme pour recommencer la recherche du while en question. Voici le main avec lequel j'ai fait cela :
Dans ce cas, il va jusqu'au bout du programme (J'ai juste décommenté hein, je n'ai rien modifé) et m'affiche 49 parfois 1 parfois 5 ou 3 (c'est aléatoire, il devrait afficher 45 normalement mais bon soit) et exécute ma dernière ligne de code qui est de toggle une led (donc elle s'allume). Donc quand tout est décommenté dans le main, il parvient a sortir de la fonction I2C2_ReadAddr() et lancé la fonction I2C2_ReadData à en sortir également puisqu'il va ensuite m'afficher un nombre et puis inverser ma led.
Mais il ne va pas boucler, c'est comme s'il sortait du while et puis fini.
Je décide donc de le re-charger et il ne démarre pas. Je suis obligé de couper l'alimentation et de la remettre pour que le nouveau programme reprenne.
Je t'ai fait une petite vidéo pour que tu puisses voir si tu veux avec vue sur la carte et le pickit pour que tu vois quand je charge (Je ne modifie pas le programme, je le charge juste pour te montrer).
Pour expliquer ce qui se passe pendant la vidéo, ce sera peut être plus facile : Le programme est planté, j'ai plus rien sur l'écran, ... Je recharge le programme sans succès. Je coupe donc l'alim et la remet --> Réparé, le lcd et la led vie et fini par m'afficher 6 et reste comme ça (Il ne m'a pas afficher Slave -r detect c'est normal) --> Je recharge le programme donc le LCD s'efface mais rien dessus, je dois de nouveau couper et remettre l'alim.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Fonctions I2C
Essaie ce programme
Prends la dernière version, je n'arrête pas de le modifier ...
Code : Tout sélectionner
I2C2_Init();
Lcd_Init();
Lcd_Clear();
int num=0;
while (1)
{
num++;
value = secRead = 0;
while (1)
{
I2C2_Start();
value = 1;
if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2) break;
value = 2;
if (I2C2_WriteData(0x00) != 2) break;
second = dec2bcd(45);
value = 3;
if (I2C2_WriteData(second) != 2) break;
I2C2_Stop();
I2C2_Start();
value = 4;
if (I2C2_ReadAddr(SLAVE_1_ADRESS) != 2) break;
value = 5;
dataRead = I2C2_ReadData(0);
secRead = bcd2dec(dataRead);
break;
}
I2C2_Stop();
Lcd_Clear();
Lcd_Set_Cursor(1,1);
sprintf(buffer, "%d: %d %d", num, value, secRead);
Lcd_Write_String(buffer);
LATAbits.LATA0 = !LATAbits.LATA0;
__delay_ms(1000);
}
Prends la dernière version, je n'arrête pas de le modifier ...
Fonctions I2C
Après avoir chargé ce programme, j'ai donc du couper l'alim et la remettre car le charger n'a pas suffit et j'obtiens ceci "5 15" (voir photo) Rien de particulier ne se passe (Pas de léger scintillement de l'écran laissant voir une mise à jour ni de toggle de la led).
Si je recoupe l'alim et remet, j'arrive parfois a n'avoir rien (voir seconde photo)
Le 5 ne change jamais mais j'ai eu pour l'autre chiffre parfois 18 parfois 21 ou 22 (aléatoire aussi)
Si je recoupe l'alim et remet, j'arrive parfois a n'avoir rien (voir seconde photo)
Le 5 ne change jamais mais j'ai eu pour l'autre chiffre parfois 18 parfois 21 ou 22 (aléatoire aussi)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Fonctions I2C
Fonctions I2C
Fonctions I2C
Tu mets un break juste après l'appel de la première fonction I2C et le lcd doit faire défiler le compteur suivi de 1 et 0, enfin j'espère.
Si c'est bon, tu enlèves le break et tu le mets derrière l'appel de la 2ème fonction, et rebelote
Et tu continues ainsi. C'est tout pour ce soir, à l'EPHAD on se couche tôt, bon courage
Si c'est bon, tu enlèves le break et tu le mets derrière l'appel de la 2ème fonction, et rebelote
Et tu continues ainsi. C'est tout pour ce soir, à l'EPHAD on se couche tôt, bon courage
Fonctions I2C
J'ai donc enlever tout les break et mis un break juste après le start et le compteur s'incrémente et la led change
Je l'ai donc supprimé et j'en ai mis un juste après le " if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2)" et le lcd est vide et led éteinte, j'ai laissé le break et rajouté un break au fonction une par une jusqu'au start ou la ça refonctionne j'ai donc supprimé ce break.
Un break a I2C2_ReadAddr(SLAVE_1_ADRESS), ça fonctionne toujours, j'ai donc delete le break
Un autre a I2C2_ReadData(), ça fonctionne toujours, j'ai donc delete le break
Un break au dernier stop et le lcd est vide et led éteinte. je l'ai donc laissé
ça marche ahah, merci beaucoup pour ton temps ! Bonne nuit !
Quand je lance, le debug, on dirait qu'il fige à ce while, il me met tout le temps à cette ligne spécifiquement
J'ai mis la ligne en commentaire pour voir et en effet, il parvient donc à continuer et bloque ensuite au while du I2C2_WriteData();
Je l'ai donc supprimé et j'en ai mis un juste après le " if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2)" et le lcd est vide et led éteinte, j'ai laissé le break et rajouté un break au fonction une par une jusqu'au start ou la ça refonctionne j'ai donc supprimé ce break.
Un break a I2C2_ReadAddr(SLAVE_1_ADRESS), ça fonctionne toujours, j'ai donc delete le break
Un autre a I2C2_ReadData(), ça fonctionne toujours, j'ai donc delete le break
Un break au dernier stop et le lcd est vide et led éteinte. je l'ai donc laissé
ça marche ahah, merci beaucoup pour ton temps ! Bonne nuit !
Quand je lance, le debug, on dirait qu'il fige à ce while, il me met tout le temps à cette ligne spécifiquement
J'ai mis la ligne en commentaire pour voir et en effet, il parvient donc à continuer et bloque ensuite au while du I2C2_WriteData();
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Fonctions I2C
Je vois un peu sur le net que le bus I2C pourrait-être bloqué (SDA est a 0 et SCL a 1 ici) et que pour ce faire, je devrai faire 9 impulsions sur SDA si je détecte un blocage dans le while, réinitialiser SSP2 et recommencer la com.
Je ne suis pas ultra convaincu car cela ne se fait pas que de temps en temps.. Je ne sais pas essayer de suite pour voir..
Dis-moi ce que tu en penses
Je ne suis pas ultra convaincu car cela ne se fait pas que de temps en temps.. Je ne sais pas essayer de suite pour voir..
Dis-moi ce que tu en penses
Fonctions I2C
Bonjour,
Supprime tous les I2C2_Idle();
Cela veut dire que cela plante dès le premier envoi de l'adresse I2C, pas la peine d'aller plus loin.
Et si cela plante à ce niveau, je ne comprends pas comment tu as pu avoir un résultat un peu positif derrière. Il faut résoudre le problème avec le break placé derrière la ligne "if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2) break" et sans modifier cette ligne.
Le nombre de breaks importe peu, on sort du while dès le premier break rencontré, et à la sortie il y a un stop, c'est tout. Et si on ne rencontre aucun break, on ne sort jamais du while. Ne pas mettre de break juste derrière le stop dans le while puisqu'il y a un autre stop à la sortie, là je ne sais pas ce que cela donne avec un stop parasite.
Mon programme fait pareil que le tien qui indiquait "Slave detected", donc pourquoi il planterait, je ne vois pas. La seule différence est que le mien répète l'opération, et c'est ce qu'il faut faire pour vérifier que la communication I2C se fait correctement jusqu'au bout.
l'I2C en mode slave est un peu plus difficile à mettre en oeuvre, le mode host lui est ultra simple.
Tu as mis "ça marche" en fin de ton message de 21h45, je pensais que c'était bon, ensuite tu en as rajouté pour dire le contraire. Le fait que l'heure du message ne change pas quand on le modifie, c'est bien embêtant car on ne vient plus le relire.
Supprime tous les I2C2_Idle();
Je l'ai donc supprimé et j'en ai mis un juste après le " if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2)" et le lcd est vide et led éteinte
Cela veut dire que cela plante dès le premier envoi de l'adresse I2C, pas la peine d'aller plus loin.
Et si cela plante à ce niveau, je ne comprends pas comment tu as pu avoir un résultat un peu positif derrière. Il faut résoudre le problème avec le break placé derrière la ligne "if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2) break" et sans modifier cette ligne.
Le nombre de breaks importe peu, on sort du while dès le premier break rencontré, et à la sortie il y a un stop, c'est tout. Et si on ne rencontre aucun break, on ne sort jamais du while. Ne pas mettre de break juste derrière le stop dans le while puisqu'il y a un autre stop à la sortie, là je ne sais pas ce que cela donne avec un stop parasite.
Mon programme fait pareil que le tien qui indiquait "Slave detected", donc pourquoi il planterait, je ne vois pas. La seule différence est que le mien répète l'opération, et c'est ce qu'il faut faire pour vérifier que la communication I2C se fait correctement jusqu'au bout.
l'I2C en mode slave est un peu plus difficile à mettre en oeuvre, le mode host lui est ultra simple.
Tu as mis "ça marche" en fin de ton message de 21h45, je pensais que c'était bon, ensuite tu en as rajouté pour dire le contraire. Le fait que l'heure du message ne change pas quand on le modifie, c'est bien embêtant car on ne vient plus le relire.
Modifié en dernier par satinas le sam. 26 juil. 2025 05:57, modifié 2 fois.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités


