mardi 5 décembre 2017

Busy Bee partie 2, PCA

En lisant le manuel de référence du EFM8BB10F8 mon attention a été attiré par le périphérique PCA Programmable Counter Array. Chaque fabriquant nomme ses périphériques comme sa lui chante d'autres appelleraient ça Advance Capture/Compare. Cependant le PCA possède un mode de fonctionnement que je n'ai pas vue ailleurs. Silicon Labs appelle-ça le mode Frequency output. Dans cette deuxième partie mon objectif est d'expérimenter cette fonctionnalité.

PCA experements

Le PCA possède un compteur 16 bits et 3 canaux comparateurs qui peuvent-être utilisés selon 11 modes. J'ai créé un nouveau projet appelé PCA experements dans simplicity studio.

problème avec le configurateur

le PCA a 3 canaux j'ai choisi le canal 0 pour ma sortie en fréquence. L'entrée/sortie CEX0 peut-être assignée à n'importe qu'elle broche des ports 0 ou 1 mais j'ai découvert qu'il n'y a pas de registres pour sélectionner la broche désirée. Le crossbar choisi lui-même la broche en fonction de celles qui sont disponibles et d'un système de priorité par périphérique1.

Le crossbar assigne les broches par ordre croissant en commençant à P0.0 jusqu'à P1.7 pour les broches qui ne sont pas skipped. L'UART0 par contre est toujours assigné aux borches P0.4 pour TX et P0.5 pour RX. Le périphique SPI0 a la deuxième priorité il sera donc assigné aux broches de plus petite numérotations même s'il est activé après un autre périphérique. Comme dans mon projet je ne configure que CEX0 toutes les broches sont disponibles le crossbar a donc mis CEX0 sur la broche P0.0. Ça ne faisait pas vraiment mon affaire je voulais la sortie sur P1.3. Pour régler le problème j'ai tenté de sélectionner chaque broche l'une après l'autre dans la perpsective Configurator pour mettre la propriété skip à skipped. Le crossbar n'utilise pas les broches marqués skipped. Problème, le configurateur ne me laisse pas sélectionner les broches du port 1, elles sont tracées en gris pâle.

Au diable le configurateur

Au diable le configurateur, on n'est jamais mieux servit que par soi-même. J'ai configuré ce que j'ai pu dans le configurateur et j'ai ajouter le code suivant dans la fonction void SiLabs_Startup (void) du fichier pca_experements_main.c.


void SiLabs_Startup (void)
{
 // empêche le crossbar d'utiliser le port 0.
 P0SKIP=255; 
 // bloc pour le crossbar toutes les broches du port 1
 // sauf P1.3
 P1SKIP=~(1<<3); 
}

L'idée est de skipper toutes les broches des ports 0 et 1 sauf P1.3 obligeant ainsi le crossbar à utiliser cette broche.

A part ça il n'y a rien d'autre à faire sinon d'ajouter une seule ligne de code dans la fonction main. En mode Frequency output, la valeur dans le registre PCA0CPHx détermine la fréquence du générateur selon la formule:

Fcex=Fpca/2/PCA0CPHx
Fpca est la fréquence du signal qui alimente la minuterie du PCA
PCA0CPHx  est la valeur dans le registre PCA0CPHx. 
Ici x représente le canal, i.e. {0,1,2}

int main (void)
{
  // Call hardware initialization routine
  enter_DefaultMode_from_RESET();

 //fréquence de sortie sur Fcex0=Fpca/2/PCA0CP0H
        // Fsys=24,5Mhz/32
 // Fpca=Fsys/12=63802Hertz
 // Fcex0=63802/2/10=3190Hertz
 PCA0CPH0=10;
  while (1) 
  {
    // $[Generated Run-time code]
    // [Generated Run-time code]$
  }                             
}
Pour changer la fréquence il suffit de changer la valeur dans PCA0CPH0. Notez que la plus basse fréquence est obtenue avec la valeur zéro qui correspond à un diviseur de 256. La plus haute fréquence est obtenue avec le diviseur 1 qui donne une fréquence de Fpca/2. Si on utilise Fsys à sa fréquence maximale de 25Mhz et qu'on configure le diviseur du PCA0CPH0 à 1 on obtient une fréquence de sortie de 12,5Mhz. Le fonctionnement du mode frequency output est le suivant. La valeur du registre PCA0L est comparée avec la valeur de PCA0CPL0. Lorsque c'est 2 valeurs sont égales la sortie CEX0 est inversée et le registre PCA0L est rechargée avec la valeur PCA0CPL0+PCA0CPH0. Ainsi le compteur PCA0L doit toujours être incrémenté du même nombre de cycles pour atteindre l'égalité avec PCA0CPL0. Ainsi on obtient une onde carrée.

Expérience #2

Dans le configurateur si on active les interruptions sur PCA0


On doit aussi activé Cycle overflow interrupt

Ainsi que dans l'onglet channel 0 on doit activé la propriété capture/compare flag Interrupt.

Maintenant dans la routine d'interruption du périphérique PCA0 du fichier Interrupts.c on ajoute le code suivant:

SI_INTERRUPT (PCA0_ISR, PCA0_IRQn)
{
 static unsigned char hcycles=0;
 PCA0CN0&=0xfe; // remet à zéro le bit CCF0
 hcycles++;
 if (hcycles==2){
    hcycles=0;
           // truc pour commuter la valeur de PCA0CPH0 entre 10 et 20.
    PCA0CPH0=30-PCA0CPH0;
 }
}
Maintenant la fréquence de sortie du générateur change à chaque cycle entre 3190Hertz et 1595Hertz. Cet exemple peut-être facilement modifié pour fabriquer un modulateur FSK.

Conclusion

Grâce au configurateur et malgré ses défauts on a presque pas eu de code à écrire pour obtenir ce résultat.

  1. pas de récompense pour l'ingénieur qui a imaginé ce système.

Aucun commentaire:

Publier un commentaire

Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.