I2c - pic18f46k22

Salut!

J'ai essayé de développer ma propre bibliothèque I2C pour mplab V6.10 - XC8 V2.46. Ce n'est pas arduino directement, j'espère que peux parler de ceci ici... Le forum microchip n'est pas des plus vivant et 100% anglais.. J'essaie ailleurs pour voir un peu si quelqu'un sait me répondre :slight_smile:

Je voudrais connecter un pic18F46K22 à un DS1307 pour écrire l'heure puis la lire. Cependant, en tant que débutant, ce n'est pas forcément facile de le faire seul, j'ai déjà passé un très long moment pour comprendre l'I2C, traduire la doc, avoir un code qui compile, ... Je voudrais donc commencer par m'assurer que ma bibliothèque est correcte avant d'aller plus loin. :slight_smile: Oui car j'ai essayé de faire une communication mais cela semble fort silencieux, si déjà ma bibliothèque est correct, ça me fermera des portes ^^

J'aimerais savoir si quelqu'un pourrait jeter un œil à ma bibliothèque et me donner son avis. Est-ce exact ? Est-ce que ça devrait marcher ? Des problèmes ? J'ai créé cette bibliothèque moi-même en lisant la documentation Microchip pour le PIC18F46K22. (Copie du code ci-dessous)

Actuellement, je ne m'occupe pas des collisions de bus car je voulais commencer par une communication très simple : un maître et un seul esclave. Je serai très heureux si ça marche déjà ainsi et ferai évoluer cela après.. Une chose à la fois ^^

Merci d'avance pour votre aide, commentaires, avis et corrections !

Passez une bonne journée,

Cordialement,

Lucas.

void I2C2_Init(void);
void I2C2_Start(void);
void I2C2_Stop(void);
void I2C2_WriteAddr(uint8_t addr);
void I2C2_ReadAddr(uint8_t addr);
void I2C2_WriteData(uint8_t data);
uint8_t I2C2_ReadData(uint8_t ack);
void I2C2_Restart(void);
void I2C2_Idle(void);

void I2C2_Init(void)
{
    TRISDbits.TRISD0 = 1;
    TRISDbits.TRISD1 = 1;
    SSP2STATbits.SMP = 1;
    SSP2STATbits.CKE = 0;
    SSP2CON1bits.SSPEN = 1;
    SSP2CON1bits.SSPM = 0b1000;
    SSP2ADD = 19;
}

void I2C2_Start(void)
{
    I2C2_Idle();
    SSP2CON2bits.SEN = 1;
    while(SSP2CON2bits.SEN);
}
void I2C2_Stop(void)
{
    I2C2_Idle();
    SSP2CON2bits.PEN = 1;
    while(SSP2CON2bits.PEN);
}
void I2C2_WriteAddr(uint8_t addr)
{
    I2C2_Idle();
    SSP2BUF = addr << 1 | 0;
    while(SSP2STATbits.BF);
    
    while(SSP2CON2bits.ACKSTAT);
}
void I2C2_WriteData(uint8_t data)
{
    I2C2_Idle();
    SSP2BUF = data;
    while(SSP2STATbits.BF);

    while(SSP2CON2bits.ACKSTAT);
}
void I2C2_ReadAddr(uint8_t addr)
{
    I2C2_Idle();
    SSP2BUF = addr << 1 | 1;
    while(SSP2STATbits.BF);
    
    while(SSP2CON2bits.ACKSTAT);
}
uint8_t I2C2_ReadData(uint8_t ack)
{
    I2C2_Idle();
    SSP2CON2bits.RCEN = 1;
    while(!SSP2STATbits.BF);
    uint8_t data = SSP2BUF;
    while(SSP2STATbits.BF);
    SSP2CON2bits.ACKDT = (ack == 0) ? 0 : 1;
    SSP2CON2bits.ACKEN = 1;
    while(SSP2CON2bits.ACKEN);
    return data;
}
void I2C2_Restart(void)
{
    I2C2_Idle();
    SSP2CON2bits.RSEN = 1;
    while(SSP2CON2bits.RSEN);
}
void I2C2_Idle(void)
{
    while ((SSP2CON2 & 0x1F) || (SSP2STATbits.R_W));

}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

1 Like

Tu peux bien sûr en parler, sur le forum francophone, nous sommes ouverts.
Historiquement ici, c'est plutôt Atmel AVR 8 bits et maintenant très fortement ESP32.
A part quelques professionnels ou anciens professionnels, je ne sais pas si quelqu'un pourra te répondre efficacement sur les pics.

1 Like

Bonjour,
FantasPic - Accueil sur ce forum tu trouveras des amateurs de PIC (dont je suis) mais avec allergie au C (ça c'est pour moi).
Bon dimanche à tous.

1 Like

Merci beaucoup ! :slight_smile: Je vais essayer aussi par la-bas ! ^^

J'avoue que j'ai fait le C car c'est ce que j'ai appris à l'école, j'ignore en quel autre langage c'est développable et sur quel IDE, mais très curieux d'apprendre cela :smiley: Peut-être que dans d'autres langages il y aura des bibliothèque déjà faites ou plus facile à trouver et surement d'autres avantages ^^

Bonjour stefox1

Il y a PicBasicPro qui a des instructions pour i2C.

J'ai pas mal pratiqué "dans le temps" :wink:

Cordialement
jpbbricole

1 Like

Pour le C pour PIC18 il existe (pas gratuits) :

MikroC (bon choix de bibliothèques)
CCS (petit choix de bibliothèques)

1 Like

Je vois que tu as déjà eu une réponse.
Moi c'est en Basic : Proton BASIC Community Positron Proton Development Suite

1 Like

le compilateur Basic proposé ci-dessus est un dérivé de PicBasic Pro avec quelques évolutions.

Il existe une version gratuite de Positon 8 pour PIC18 supportant quelques références de PIC18 :

“FREE” 18F devices:
PIC18F13K50, PIC18F25K20, PIC18F25K22 PIC18F452, PIC18F45K20, and PIC18F46K20

Manuel : https://drive.google.com/file/d/1n66aAuRWKTOSjlghpizfoyKQcVBGFxq3/view

Ce compilateur Positron16 , ex Proton, comporte quelques bibliothèques dont une pour DS1307 , exemple de code ici : https://rosettamicro.com/

J'ai utilisé ces divers compilateurs il y a une quinzaine d'années , je ne savais pas que ça existait encore , ayant complètement tourné le dos aux divers PIC :wink:

1 Like

Je ne fais plus du tout de PIC depuis trop longtemps pour te répondre, mais j'ai comme un doute que tu trouves plus de librairies qu'en C.
Car bien souvent les librairies des autres langages, sont écrites en C, pour des raisons de performance.

Franchement sans aucun parti pris, car j'aime bien faire du LUA sur ESP, je ne vois pas de raison objectives d'apprendre un autre language, si tu connais déjà le C.
A par biensûr la découverte et une volonté d'ouverture.
Pour parler sechement, c'est plus une perte de temps, qu'autre chose :slight_smile:

1 Like

@stefox1 : As-tu tu envisagé de laisser de côté les PIC pour l'un des nombreux micro-controlleurs pris en charge par l'environnement Arduino et ainsi rejoindre une vaste communauté et bénéficier d'un grand nombre de bibliothèques ?

1 Like

Mon but est bien de le faire en C et de résoudre le problème que j'ai posé initialement ^^

Cependant, si je ne trouve pas de solutions à ce souci, je pense ne pas avoir le choix de devoir changer de langage/interface à un moment donné.. :confused:

Mon projet complet est destiné à fonctionner 24h/24 7J/7. Je pense qu'Arduino ne sera pas suffisament fiable sur le long terme. D'où mon choix du pic ^^

Fais tu ici allusion à l'environnement de développement Arduino ou à certaines cartes particulières vendues par la société Arduino ?

Oui par exemple, les cartes Arduino Uno, Mega, Pico, ...

Ce n'est pas de cela que tu me parlais ? :thinking:

J'ai besoin d'un microcontroleur robuste, presque industriel, c'est pour une gestion de code dans une usine. Idéalement, un microcontrôleur seul, auquel je viens implémenter autour ce que je veux, comme mon pic ^^ Pas une carte pré-monté comme les arduino ou ESP

'Arduino' c'est plus que ce que tu y voit

Sur ce forum des intervenants conçoivent leur carte imprimée sans aucun élément prémonté , le micro-controlleur 8 bit ou 32 bits qu'ils ont choisi faisant tourner un programme conçu avec l'IDE Arduino en utilisant des bibliothèques disponibles maintenues par leurs développeurs

.... comme ce que tu écris avec en prime le bénéfice une vaste collection de bibliothèques de qualité:

J'ai besoin d'un microcontroleur robuste, presque industriel, c'est pour une gestion de code dans une usine. Idéalement, un microcontrôleur seul, auquel je viens implémenter autour ce que je veux,

1 Like

Et cela pourrait correspondre à un fonctionnement 24h/24 7J/7 dans un milieu industriel ?

Car dans ce cas, cela devient interessant ce que tu me dis la ! :o

As-tu des références de puce pour avoir quelques idées ?

oui si le programme est conçu dans cette optique, idem pour le routage de la carte imprimée, le soudage des composants, le câblage......etc...

1 Like

Ok super intéressant ! Je l'ignorais complètement, pour moi arduino était destiné qu'au carte arduino ! :o

As-tu quelques références comme ça de tête de puce compatible ?

en attendant que je ponde une liste de puces :wink:
tu peux déjà faire une recherche sur 'ATMega328 standalone' tu trouvera des tutoriels pour ce microcontrolleur 8 bits de Microchip (auparavant d'Atmel)

1 Like