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

PLL en C avec MikroC
folkeu08
Débutant
Débutant
Messages : 45
Âge : 57
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#1 Message par folkeu08 » mer. 22 nov. 2017 02:32 lien vers la Data-Sheet : Cliquez ici

Bonjour,

Je possède un petit émetteur FM dont la fréquence est stabilisée par un MC145151 programmable par DIP. A chaque changement de fréquence, il faut calculer les bits à programmer. L'idée est de remplacer le MC145151 par un MC145170 (programmation série).
J'ai commencé à dessiner un schéma avec un Pic 18f4550 dont en périphérie, on trouve :
* 3 boutons poussoirs qui gérent la montée, descente et la validation de la fréquence d'émission,
* un affichage avec des 7 segements à cathode commune pilotés par un max7219.
Voici le schéma de base ci-dessous :

Schema.png


Le firmware écrit avec MicroC pour Pic gére déjà correctement l'utilisation voulue des bouton et l'affichage comme il est possible de la visualiser ci-dessous :

Schema 2.png


Je suis à l'étape de l'envoi des données au MC145170. J'ai cherché une routine déjà toute faite car je ne suis pas un débutant en programmation et encore plus en c ! J'ai trouvé ce bout de code mis en pièce jointe.
Cette routine declare la fréquence un un intéger non signé (Uint) et dans mon source MikroC, ma valeur fréquence est déclarée en unsigned long. Je ne pense pas que cela pose un problème.
Dans la data, je ne comprends pas trop pourquoi il existe 2 types de trames pour envoyer le R register (15 et 24 bits). Quelqu'un pourrai t-il m'éclairer à ce sujet ?
Merci !

1° Je vais commencer par transposer cette routine en MikroC et tester qu'elle se compile.
2° Je vais dessiner la platine électronique pour réaliser les test en grandeur réelle car Proteus ne dispose pas de ce composant en simulation.
3° dès que l'électronique fonctionne comme souhaitée, je publie dans la rubrique réalisation de ce forum.
Merci de votre aide et heureux de trouver un forum où l'on parle "C" en français avec des utilisateurs de MikroC
François
mc145170.rar
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par folkeu08 le mar. 28 nov. 2017 23:29, modifié 2 fois.

PLL en C avec MikroC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » mer. 22 nov. 2017 07:32 lien vers la Data-Sheet : Cliquez ici

 ! Message de modération :
Bonjour et bienvenue folkeu08,
Tu as mis ton lien de PIC et j'en félicite !
Il ne te reste plus qu'a mettre tes photos sur le serveur plutôt que sur un hébergeur externe dont on ne maitrise pas l'affichage et la durabilité. lien vers procédure

Nous n'avons pas ta PJ ?

A très vite

Merci de votre aide et heureux de trouver un forum où l'on parle "C" en français avec des utilisateurs de MikroC

Merci ça fait chaud au cœur
C'est en faisant des erreurs, que l'on apprend le mieux !!!

PLL en C avec MikroC
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » jeu. 23 nov. 2017 02:23 lien vers la Data-Sheet : Cliquez ici

Bonjour Jérémy, folkeu08, et tous le forum,

Dans la datasheet, je ne comprends pas trop pourquoi il existe 2 types de trames pour envoyer le R register (15 et 24 bits).


Peux tu citer la page ?

j'ai un peu regardé le datasheet du MC145170, c'est un circuit que tu peux piloter par PC, ou microcontrôleur(SPI)

le minimal est 30Mhz sous 3 volts, le maximal et de 185Mhz sous 5 volts, si je me trompe pas.

Dans le mode SPI, il y a possibilité que l'horloge soit différente en fonction d'un choix, comme j'ai survolé, il faut que je regarde un peu mieux.

Sinon sympa à toi de nous le faire partager.

Merci !

A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

PLL en C avec MikroC
folkeu08
Débutant
Débutant
Messages : 45
Âge : 57
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#4 Message par folkeu08 » sam. 25 nov. 2017 17:05 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Je n'ai pas répondu sur l'instant car je suis dans le dessin du schéma et du PCB pour réaliser des tests hardware. Proteus ne dispose pas de MC145170 pour la simulation virtuelle.

Peux tu citer la page ?

C'est en page page 8 table 1
Je remets ci dessous le lien du datasheet car je ne le retrouve pas dans mon premier post
MC145170DT2.pdf


Je me suis replongé dans le data pour zen tirer le fonctionnement suivant :

Le Mc145170 dispose de 3 registres :
* le registre C (configuration register) de 8 bits. Il configure le mode de fonctionnement du MC
* le registre R (reference divider ) de 15 ou 24 bits.
* le registre N (main divider) de 16 bits


Lorsque que l'on ne dialogue pas avec le MC 145170, la broche ENB reste à l'état haut.
L'initialisation du MC145170 se fait ainsi :
* ENB à l'état haut, Din à l'état bas, Clk à l'état bas
* Envoi de 4 pulses de clk
* ENB à l'état bas
* Envoi de 3 pulses de clk
* Din à l'état haut
* Envoi d'une pulse de clk
* Din à l'état bas
* Envoi d'une pulse de clk
* ENB à l'état haut (tous les registres sont RAZ)
* ENB à l'état bas
* Envoi du registre C (8 bits)
* ENB à l'état
* ENB à l'état bas
* Envoi du registre R (15 ou 24 bits)
* ENB à l'état haut
* ENB à l'état bas
* Envoi du registre N (16 bits)
* ENB à l'état
→ pour un changement de fréquence, il suffit de ne renvoyer que le register N

Configuration du MC145170 avec un oscillateur externe de 4MHz (4000KHz) pour une fréquence de comparaison de 10KHz

Valeurs des différents registres :
Le registre C aura pour valeur (8 bits) :
Décimal : 39
Hexadécimal : 27
Binaire : 00100111

C7 : 0 Polarity unchanged
C6 : 0 Differential phase detector disable
C5 : 1 Enable the lock detector output -> oui
C4 : 0 OSCin is selected
C3 : 0
C2 : 1
C1 : Enable the fV output → oui
C0 : Enable the fR output → oui

Le registre R aura pour valeur (15 ou 24 bits) :
Décimal :400 (4000/10) → (4MHz/10KHz)
Hexadécimal : 01 90
Binaire 16 bits : 00000001 10010000
Binaire 15 bits : 0000001 10010000
Le binaire 15 bits est possible car R ne dépasse la valeur.
Pour des valeurs largement supérieures le binaire 24 bits aurai du être utilisé

Le registre N aura pour valeur (16 bits) : (pour une fréquence de 108,50MHz)
Décimal : 10850 → 108500KHz/10KHz
Hexadécimal : 2A 62
Binaire 16 bits : 00101010 01100010


Il est possible de programmer en dur l'envoi des registres C et R en binaire.
Par contre, j'ai déclaré dans mon source la valeur d'affichage de la fréquence en « unsigned long » (MikroC pour Pic) pour l'afficher au travers du MAX7219.
Je vais devoir donc convertir cette valeur en binaire 16 bits avant de l'envoyer au MC145170.
Je dispose d'une routine de convertion pour le compilateur CCS.
Le valeur à transmettre est déclarée à l'identique. Une sous-routine convertis cette valeur en binaire avec une librairie « shift_left » propre à CSS. Je ne trouve pas l'identique dans MikroC qui pour moi correspondrai à une rotation à gauche

Code : Tout sélectionner

void tune_pll(void)
{
int ctr;
unsigned long n_reg;

   // Convert channel number to N counter value
   n_reg = Channel + 30940;

   // Set clock, enable low
   CLK = 0;
   EN = 0;
   
   
// Shift in channel frequency to N reg (MSB first)
   for( ctr = 0 ; ctr <= 15 ; ctr++)
   {
      // Decompose the PLL N value into bits, set data pin
      DIN = shift_left(&n_reg, 2, 0);
      
      
// Cycle the clock
      CLK = 1;
      CLK = 0;   
   
}
   
   
// Clean up and set enable high which 
   // transfers count to N reg
   DIN = 0;
   EN = 1;

}


Ci-dessous le détail de la fonction Shift_Left de CCS
ccs_c Shift_left().pdf


Questions :
1° Mon interprétation du data est-elle correcte ?
2° Ma fréquence d'émission est déclarée en « unsigned long » dans MikroC pour PIC. Un forumeur disposerai t-il d'une routine pour transposer cette valeur en binaire pour l'envoi au registre N ?
Merci !
François
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

PLL en C avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » dim. 26 nov. 2017 14:32 lien vers la Data-Sheet : Cliquez ici

bonjour,


si j'ai bien compris, c'est pour serialiser un entier long -> envoi bit par bit ..
MSB bit en tete !

Code : Tout sélectionner


Channel
=0;
  n_reg=Channel + 30940;
  L=n_reg;
  for( i = 0 ; i < 16 ; i++)
   {
      WordToStr(i,Entree);
      UART1_Write_Text(Entree);
      UART1_Write('=');
      L= n_reg & 0x8000;
      if (L>0) DIN=1; else DIN=0;
       n_reg=n_reg<<1;
       UART1_Write(DIN+48);
       CRLF1();
      // Cycle the clock
      CLK = 1;
      CLK = 0;
      
   
}
   CRLF1();


ce qui donne pour
// 30940 -> 111100011011100 calculette windows10 en mode programmeur
0=0
1=1
2=1
3=1
4=1
5=0
6=0
7=0
8=1
9=1
10=0
11=1
12=1
13=1
14=0
15=0
Aide toi, le ciel ou FantasPic t'aidera

PLL en C avec MikroC
folkeu08
Débutant
Débutant
Messages : 45
Âge : 57
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#6 Message par folkeu08 » dim. 26 nov. 2017 14:41 lien vers la Data-Sheet : Cliquez ici

Bonjour paulfjujo,

Il y a de cela dans l'idée sauf que c'est pas sur une RS232 mais en SPI.
C'est bien le MSB en premier à envoyer.
Je vais essayer de reprendre ce code et de l'adapter avec les broches de la SPI
Merci !
François

PLL en C avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » dim. 26 nov. 2017 15:04 lien vers la Data-Sheet : Cliquez ici

folkeu08 a écrit :Il y a de cela dans l'idée sauf que c'est pas sur une RS232 mais en SPI...
François



J'ai bien compris qu'il s'agissais de SPI .. avec les terme DIN , et CLK
j'ai mis une sortie UART , juste pour visualiser le resultat ..
Aide toi, le ciel ou FantasPic t'aidera

PLL en C avec MikroC
folkeu08
Débutant
Débutant
Messages : 45
Âge : 57
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#8 Message par folkeu08 » dim. 26 nov. 2017 15:41 lien vers la Data-Sheet : Cliquez ici

Bonjour Paulfjujo,

j'ai mis une sortie UART , juste pour visualiser le resultat ..

Ce n'est pas si évident pour moi car je débute la programmation avec cet exercice (projet personnel).

Donc si j'enléve les lignes qui concernent le RS232, j'obtiens ce code.
Je ne tarderai pas à essayer sous Proteus et reporterai le résultat ensuite dans un post suivant.
Je dessine les PCBs sous Kicad et tant que je suis dedans, je poursuis cette activité.
Résultat d'ici quelques jours.
Merci !

Code : Tout sélectionner


Channel
=0;
  n_reg=Channel + 30940;
  L=n_reg;
  for( i = 0 ; i < 16 ; i++)
   {
      
      L
= n_reg & 0x8000;
      if (L>0) DIN=1; else DIN=0;
       n_reg=n_reg<<1;
       
      
// Cycle the clock
      CLK = 1;
      CLK = 0;
  };
 


Je n'ai pas su attendre et je viens de la tester. La routine fonctionne.
Merci ! pour cette aide précieuse Paulfjujo,

Pour aller plus loin dans mes découvertes et apprentissage, je vais essayer de l'adapter pour envoyer un mot de 15 bits (Registre R)
François

PLL en C avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » dim. 26 nov. 2017 17:02 lien vers la Data-Sheet : Cliquez ici

// ce qui devrait donner , apres nettoyage des UART indesirables

Code : Tout sélectionner


void tune_pll
(void)
{
int ctr;
unsigned long n_reg;
unsigned long L;

   // Convert channel number to N counter value
   n_reg = Channel + 30940;
     // Set clock, enable low
   CLK = 0;
   EN = 0;
  
   
// Shift in channel frequency to N reg (MSB first)
   for( ctr = 0 ; ctr <= 15 ; ctr++)
   {
      L= n_reg & 0x8000;
      if (L>0) DIN=1; else DIN=0;
       n_reg=n_reg<<1;
     // Cycle the clock
      CLK = 1;
      CLK = 0
   
}
   // Clean up and set enable high which 
   // transfers count to N reg
   DIN = 0;
   EN = 1;
}


nota:
à verifier , avec ta datasheet , si au niveau du SPI,
il faut valider le CLK , APRES la presentation de la donnée, telle que décrit ci dessus

ou Pendant la presentation de la donnée .

Pendant =>
CLK=1;
affectation DIN
CLK=0;
Aide toi, le ciel ou FantasPic t'aidera

PLL en C avec MikroC
folkeu08
Débutant
Débutant
Messages : 45
Âge : 57
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#10 Message par folkeu08 » dim. 26 nov. 2017 17:26 lien vers la Data-Sheet : Cliquez ici

La routine ci dessus fonctionne mais m'envoie toujours un binaire 16 bits
Ce code

Code : Tout sélectionner

 for( ctri = 0 ; ctr < 16 ; ctr++)

est-il l'identique de celui-ci ?

Code : Tout sélectionner

 
 
// Shift in channel frequency to N reg (MSB first)
   for( ctr = 0 ; ctr <= 15 ; ctr++)


J'ai toujours les 16 bits qui arrivent dans le debugger SPI

la valeur que j'envoie est 1050 qui correspond en binaire 16 bits à : 00000100 00011010
Si je supprime le MSB pour envoyer à 15 bits j'obtiens donc cela : 00001000 0011010

Ce code n'est peut-être pas propre pour les puristes mais dans le debugger SPI, j'ai bien ce résultat

Code : Tout sélectionner

void tune_pll(void)
{
int ctr;
unsigned long n_reg;
unsigned long L;

   // Convert channel number to N counter value
   n_reg = Channel + 30940;
   L=n_reg;
   // Set clock, enable low
   CLK = 0;
   EN = 0;
  
  
[b]//Décallage à gauche 
   L= n_reg & 0x8000;
   n_reg=n_reg<<1;[/b]
   
   
// Shift in channel frequency to N reg (MSB first)
   for( ctr = 0 ; ctr <= 15 ; ctr++)
   {
      L= n_reg & 0x8000;
      if (L>0) DIN=1; else DIN=0;
       n_reg=n_reg<<1;
     // Cycle the clock
      CLK = 1;
      CLK = 0
   
}
   // Clean up and set enable high which 
   // transfers count to N reg
   DIN = 0;
   EN = 1;


15 bits.png


François
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

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