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
PLL en C avec MikroC
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
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 :
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 :
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 ?
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
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 :
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 :
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 ?
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
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
PLL en C avec MikroC
Bonjour Jérémy, folkeu08, et tous le forum,
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.
A+
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.
A+
PLL en C avec MikroC
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
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.
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
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
Ci-dessous le détail de la fonction Shift_Left de CCS
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 ?
François
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
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
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 ?
François
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
PLL en C avec MikroC
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
si j'ai bien compris, c'est pour serialiser un entier long -> envoi bit par bit ..
MSB bit en tete !
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
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
PLL en C avec MikroC
PLL en C avec MikroC
PLL en C avec MikroC
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
Bonjour Paulfjujo,
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.
Je n'ai pas su attendre et je viens de la tester. La routine fonctionne.
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
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.
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.
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
// ce qui devrait donner , apres nettoyage des UART indesirables
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;
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;
PLL en C avec MikroC
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
La routine ci dessus fonctionne mais m'envoie toujours un binaire 16 bits
Ce code
est-il l'identique de celui-ci ?
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
François
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;
}
François
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 44 invités