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

Obtenir une fréquence de ~400kHz
entretoize
Débutant
Débutant
Messages : 25
Enregistré en : mai 2016

#1 Message par entretoize » mar. 21 juin 2016 08:20

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:

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
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » mar. 21 juin 2016 09:24

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..
Aide toi, le ciel ou FantasPic t'aidera

Obtenir une fréquence de ~400kHz
entretoize
Débutant
Débutant
Messages : 25
Enregistré en : mai 2016

#3 Message par entretoize » mar. 21 juin 2016 13:17

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.

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:

oscillo.jpg


*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
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » mar. 21 juin 2016 15:41

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
Aide toi, le ciel ou FantasPic t'aidera

Obtenir une fréquence de ~400kHz
entretoize
Débutant
Débutant
Messages : 25
Enregistré en : mai 2016

#5 Message par entretoize » mer. 22 juin 2016 07:45

J'ai réussi à avoir un réponse du capteur ça y'est !
En fait, je ne suis pas sûr d'où ça venait, j'ai revu mon code, puis j'ai tester toutes les adresses et à 0x68 j'ai bien un akcnowledgement par le capteur.
Donc sans changer la fréquence pour l'instant...
Merci

Obtenir une fréquence de ~400kHz
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » mer. 22 juin 2016 08:41

:bravo:
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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