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
Obtenir une fréquence de ~400kHz
-
entretoize
Débutant- Messages : 25
- Enregistré en : mai 2016
Bonjour, voila j'utilise un PIC18f2450 avec un cristal à 20MHz.
Après n'avoir pas réussi à faire fonctionner le moindre code trouvé sur le net sur le protocole I2C j'ai décider de faire ça moi même vu que le protocole est assez simple. Je pense avoir un bon début mais avec un signal d'horloge (i2c) trop faible du coup mon premier essai avec de communication avec un MPU6050 ne fonctionne pas (aucun d'acknowledgement). Même si je n'ai pas lu qu'il y avait une fréquence minimum pour le signal d'horloge, j'aimerais déjà que ce soit conforme pour éliminer ce problème.
Donc pour avoir un signal d'horloge j'utilise le timer0 avec ce code:
Donc ça fonctionne sauf que au mieux j'ai 20MHz/4 soit 5MHz pour le timer qui m'envoi un overflow tous les 256 fronts soit à 19.531kHz que je divise encore par 4 pour pouvoir changer l'état de SDA puis SCL à 1 puis à 0 et recommencer au final j'ai donc 4kHz.
D'où ma question comment faire plus rapide ?
Merci d'avance.
Après n'avoir pas réussi à faire fonctionner le moindre code trouvé sur le net sur le protocole I2C j'ai décider de faire ça moi même vu que le protocole est assez simple. Je pense avoir un bon début mais avec un signal d'horloge (i2c) trop faible du coup mon premier essai avec de communication avec un MPU6050 ne fonctionne pas (aucun d'acknowledgement). Même si je n'ai pas lu qu'il y avait une fréquence minimum pour le signal d'horloge, j'aimerais déjà que ce soit conforme pour éliminer ce problème.
Donc pour avoir un signal d'horloge j'utilise le timer0 avec ce code:
Code : Tout sélectionner
PSA=1; //Timer Clock Source uses no Prescaler
T0CS=0; //Prescaler gets clock from FCPU (Fosc/4=5MHz)
T08BIT=1; //8 BIT MODE (0->255)
TMR0IE=1; //Enable TIMER0 Interrupt
PEIE=1; //Enable Peripheral Interrupt
GIE=1; //Enable INTs globally
TMR0ON=1; //Now start the timer!
void interrupt ISR()
{
if(TMR0IE && TMR0IF)//Check if it is TMR0 Overflow ISR
{
//TMR0 Overflow ISR
TMR0IF=0;
i2cframe();
}
}
Donc ça fonctionne sauf que au mieux j'ai 20MHz/4 soit 5MHz pour le timer qui m'envoi un overflow tous les 256 fronts soit à 19.531kHz que je divise encore par 4 pour pouvoir changer l'état de SDA puis SCL à 1 puis à 0 et recommencer au final j'ai donc 4kHz.
D'où ma question comment faire plus rapide ?
Merci d'avance.
Obtenir une fréquence de ~400kHz
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
tu veux utiliser l'I2C en mode maitre ?
la vitesse dans ce cas n'est pas critique, meme avec un I2C bit bang (software).
si tu as des problemes, il faut chercher ailleurs.
5Mhz-> 19,531khz -> 4khz ??
que fait la fonction i2cframe() ?
pour aller plus vite,precharge tmr0 avec 128 (2*plus vite) 0u 192 ->4x .
En I2C ne pas oublier les resistances pull-up 2,7k à 4,7k
montre ton code qui ne marche pas..
tu veux utiliser l'I2C en mode maitre ?
la vitesse dans ce cas n'est pas critique, meme avec un I2C bit bang (software).
si tu as des problemes, il faut chercher ailleurs.
5Mhz-> 19,531khz -> 4khz ??
que fait la fonction i2cframe() ?
pour aller plus vite,precharge tmr0 avec 128 (2*plus vite) 0u 192 ->4x .
En I2C ne pas oublier les resistances pull-up 2,7k à 4,7k
montre ton code qui ne marche pas..
Obtenir une fréquence de ~400kHz
-
entretoize
Débutant- Messages : 25
- Enregistré en : mai 2016
Oui je compte utiliser l'I2C en mode maitre, ca me paraissait logique pour obtenir des info d'un capteur, je découvre l'i2c, j'ai un peu de mal avec le datasheet du MPU-6050 en fait, je suis dessus...
Pour la fréquence finale, j'ai un peu arrondi, c'est plutot 5kHz en gros.
I2cframe c'est ma fonction qui gère l'i2c, elle génère les signaux SCL et SDA.
Evident, comment ni ai-je pas pensé !
Voici un petit graph sorti de mon oscillo de ce que j'obtiens pour l'instant:
*SCL en jaune et SDA en bleu
Pour la fréquence finale, j'ai un peu arrondi, c'est plutot 5kHz en gros.
I2cframe c'est ma fonction qui gère l'i2c, elle génère les signaux SCL et SDA.
pour aller plus vite,precharge tmr0 avec 128 (2*plus vite) 0u 192 ->4x .
Evident, comment ni ai-je pas pensé !
Voici un petit graph sorti de mon oscillo de ce que j'obtiens pour l'instant:
*SCL en jaune et SDA en bleu
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Obtenir une fréquence de ~400kHz
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
je viens juste de faire des test à l'oscillo sur le mode I2C SOFTWARE et le mode I2C Hardware sur un PIC18F87J50
qui peut gerer 2 ports (I2C1 et I2C2)
En mode SOFTWARE I2C (utilisant donc la librairie Soft_I2C mikroC
avec FOS interne 8Mhz .. SCL est à 20Khz
avec Q8Mhz+PLL .. 48Mhz SCL est à 70Khz
En mode HARDWARE I2C , avec Init_I2C2(400000); pour 400Khz
avec FOSC 8MHz .. SCL est à 333Khz
avec Q8Mhz+PLL 48Mhz SCL est à 378 Khz
alimentation MCU 3,3V
Amplitude de crete de SCL 1,92V
nota:
En mode SOFTWARE I2C (mikroC)
il n'y a pas de parametre pour fixer la vitesse du bus 100Khz ou 400Khz
ce qui prouve aussi , que la frequence n'est pas un parametre primordial
tout du moins avec un esclave LCD I2C., celui ci reagissant bien dans ces 4 cas de figures
qui peut gerer 2 ports (I2C1 et I2C2)
En mode SOFTWARE I2C (utilisant donc la librairie Soft_I2C mikroC
avec FOS interne 8Mhz .. SCL est à 20Khz
avec Q8Mhz+PLL .. 48Mhz SCL est à 70Khz
En mode HARDWARE I2C , avec Init_I2C2(400000); pour 400Khz
avec FOSC 8MHz .. SCL est à 333Khz
avec Q8Mhz+PLL 48Mhz SCL est à 378 Khz
alimentation MCU 3,3V
Amplitude de crete de SCL 1,92V
nota:
En mode SOFTWARE I2C (mikroC)
il n'y a pas de parametre pour fixer la vitesse du bus 100Khz ou 400Khz
ce qui prouve aussi , que la frequence n'est pas un parametre primordial
tout du moins avec un esclave LCD I2C., celui ci reagissant bien dans ces 4 cas de figures
Obtenir une fréquence de ~400kHz
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités