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

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » sam. 28 nov. 2020 19:03 lien vers la Data-Sheet : Cliquez ici

Bonsoir,


Ce post concerne un test du NCO1 Numerically Controlled Oscillator present sur les 18FxxK42
en mode FREQUENCE.. avec sortie Duty cycle=50%
par la suite je testerai le Mode PULSE ..
J'ai utilisé ma BASE 18F comme support hardware et mon analyser logique SQA50 + Terminal YAT pour la partie mesure.
Un potar sur l'entree EA1 ADC 12 bits !
Ce MCU avec gestion PPS des entrees/sorties peut aiguiller la sortie NCO1 sur le PORTA ou C
j'ai choisi RC5

La base est un simili DDS , avec un compteur sur 20 bits , sur lequel on peut aiguiller les differentes sources de FOSC..
avec comme base, FOSC interne de 64MHZ ( 16MHz * PLL ) pour le MCU
ce qui offre un large panel de frequences possibles:
en 3 Gammes de sorties disponibles avec ce NCO :
avec FOSC 64 000 000 Hz ------- 30.5Hz à > 15MHz
avec MFINTOSC 500 000 Hz ------- 0.238Hz à > 238 KHz
avec LFINTOSC 32 000 hz ------- 0.015 Hz à > 3 Khz
* Mon analyser logique SQA 50Mhz plafonne sur les hautes frequences ( et devient inutile pour mesurer la duree des crenaux trop courts)

Le compteur 20 bits est piloté par un registre de 3x8bits INCREMENT
je peux aiguiller la valeur Analog 12bits ADC , cumulée 16 fois pour initialiser ce compteur
ou via une valeur numerique issu du clavier
commande MODE=0 (via clavier) MODE=1 (Analogique via Potar )

La formule donnant la frequence de sortie sur RC5 :
Freq_Out= ( NCO1CLK / 2 ) * ( Increment) / Diviseur
avec diviseur = Constante= 2^20 = 1 048 576 .
Le /2 est du à la presence de la bascule realisant le duty cycle de 50%

NCO1_Freq_Diagram.jpg




plus de details sur ma page web
tableau de resultat
projet mikroC
le fichier de config du terminal YAT .. avec touches de fonctions programmables
terminal_NCO1_Yat.jpg


A votre disposition pour repondre ou developper sur ce post.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le dim. 29 nov. 2020 12:11, modifié 1 fois.
Aide toi, le ciel ou FantasPic t'aidera

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#2 Message par PEDRO » sam. 28 nov. 2020 20:57 lien vers la Data-Sheet : Cliquez ici

Bonsoir paulfjujo,

très intéressant ce sujet.
Les PIC ont considérablement évolué depuis le 16F84 (que je n'ai jamais pratiqué), et j'aurai une suggestion à te faire.

Je pense qu'il serait intéressant pour beaucoup de monde d'avoir une présentation de ton 18F27K42, en listant ses diverses fonctionnalités et en expliquant à quoi elles servent.
Par exemple, en disant qu'il possède des ADC, ce que n'avaient pas les vieux PIC, et qu'ils sont maintenant en 12 bits, avec je présume, diverses références de tension interne.

J'ai découvert l'existence de la fonction PPS en lisant tes posts, je ne sais pas encore quelles sont les limites de cette fonctionnalité et je suppose qu'il doit y avoir d'autres nouvelles fonctionnalités sur ces dernières générations de PIC

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » dim. 29 nov. 2020 10:50 lien vers la Data-Sheet : Cliquez ici

bonjour à tous,

PEDRO a écrit :...
Je pense qu'il serait intéressant pour beaucoup de monde d'avoir une présentation de ton 18F27K42,
en listant ses diverses fonctionnalités et en expliquant à quoi elles servent.


c'est ce que j'essaie de faire sur ma page web ..
en listant, au fur et à mesure, par des tests, les nouvelles fonctionnalites de ce PIC.

à noter que c'est tres difficile de faire un classement convenable à toute recherche:
par type de PIC,
par fonctionnalité, (ADC,DAC,Timer,..)
par device ( sensor, capteur,interfaces)
par protocole Hardware ( SPI,I2C,SMBUS, RS232 (UART), ou protoocle software RS485,MODBUS,..etc

* au passage , je ne sais pas comment rajouter sur ma page web, une option "Rechercher par mot clé"
sachant qu'on ne peut pas heberger sur free un programme CGI, ou ...


:!!: NE PAS OUBLIER QUE TOUT EST DIT DANS LA SPECSHEET DE 831 pages ! .. et in fine, il faudra la lire !.
:sifflotte: et je ne vais surement pas la traduire
et je compte bien sur la plupart d'entre vous à participer à la vulgaristaion de ce PIC ou autres apparentés.

Je rappelle que je mets TOUT mon travail à disposition, ainsi que les sources , ce qui est assez rare sur le WEB ,
le but d'un forum étant de partager ... même les astuces ou
oops déboires rencontrés.

il reste encore pas mal de fonctions speciales à tester dans ce PIC
j'ai testé ausi par ailleur le SMT compteur 24 bits , tres utile pour chronometrer la duree à 1 cycle pres
d'un sous programme ou morceau de programme... remplace avantageusement le timmerX 16 bits

a un moment donné , je pense qu'il faudra une page recapituilative à mettre dans la section Tutoriel
pour regrouper les posts eparpillés
fonction 1-> lien ver le post # xxxx
fonction 2-> lien ver le post # xxxy
fonction 3-> lien ver le post # xxxz

Je comptais aussi faire la meme chose avec la serie 18F47Q10 , mais NON supporté par MikroC
donc uniquement avec MLPLABX IDE + XC8
MikroE est en train d'abandonner le developpement du compilateur MikroC ( et basic ,pascal)
je deconseille donc d'en acheter la licence qui pese plus de 220€
mais la version libre permet de faire au moins des petits programmes de test.(<2Ko)

Reste à savoir si je dois continuer avec MikroC ou basculer une bonne fois pour toute sur MPLABX
Les utilisateurs de MPLABX se retouvent plutout sur lesite de MicroChip
dont justement, le dernier post est :
XC8 the good, the bad, and the Ugly

quel est votre avis sur ce point ?
Aide toi, le ciel ou FantasPic t'aidera

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#4 Message par venom » dim. 29 nov. 2020 15:02 lien vers la Data-Sheet : Cliquez ici

Bonjour paulfjujo et bonjour à tous.
paulfjujo a écrit :* au passage , je ne sais pas comment rajouter sur ma page web, une option "Rechercher par mot clé"
sachant qu'on ne peut pas heberger sur free un programme CGI, ou ...

Tu as toujours l'option de faire une recherche via Google uniquement via ton site.

Dans Google taper site:AdresseDuSite SuiviDeL'argument
Exemple a écrit :site:http://paulfjujo.free.fr/ 16f88


Google affichera uniquement les pages web de ton site qui contiennent l'argument 16f88

C'est pas aussi précis qu'un moteur de recherche au sein de ton site web, mais si ça peut dépanner :wink: :-D

Ou ajouter le script qui affichera une barre Google qui fera le même taf directement sur ton site.

Lien de création de la barre





@++
Mon site web
Mon discord : venom#4888

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » dim. 29 nov. 2020 16:07 lien vers la Data-Sheet : Cliquez ici

[

venom a écrit :...
paulfjujo a écrit :* au passage , je ne sais pas comment rajouter sur ma page web, une option "Rechercher par mot clé"
sachant qu'on ne peut pas heberger sur free un programme CGI, ou ...

Tu as toujours l'option de faire une recherche via Google uniquement via ton site.
Dans Google taper site:AdresseDuSite SuiviDeL'argument
Exemple a écrit :site:http://paulfjujo.free.fr/ 16f88


Oui, il y a cette solution , sachant que ma liste de mot clé Keywords devient lourding
mais à Priori , Google se souvient de bien plus de choses !

Code : Tout sélectionner

<meta name="Keywords"
content="ELECTRONICS,DIY,16F84,16F628,16F88,16F877,16F887,16F1619,16F1847,18F87J50,18F4685,TSL235,Clicker2,AT89C2051,ILI9341,TERATERM,
18F252,18F46K22,12F1840,RADIO,CTN,PT100,AD7715,MAX1241,MikroC,MCP3424,MCP3304,MCP23017,ADC 16bits,LCD Nokia,Pickit2,Pickit3,
Capacimetre,MAX1240,HC-SR504,DDS,AD9835,AD9850,Android,StartUSB,18F2550,PWM,Sleep,GSM2,QUECTEL M95,LM3914,Ready For PIC,
18F45K22,18F27K42,18F47Q10,VB6,asm,ARCHOS 43,MPLAB,LCD,MAX187,LM335,AD7896,DS1302,DS1307,FFT,RS232,I2C,MCP6S26,MAX541,WIFI3-click,ESP8266,
RAYTRACING,XPORT,12F683,C18,RFOBasic,Socket,MODBUS,TeleInfo,comparator,HC06,YC-MCU,RN41,APPINVENTOR2,HM10,I2C,Pickit4"
>


pour ma part perso,
j'ai crée une liste sous excel de tous les liens dynamiques de ma page d'accueil
liste avec "filtres automatique" pour faire une recherche specifique ..
:sifflotte: car je m'y perds moi-meme !
Aide toi, le ciel ou FantasPic t'aidera

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » dim. 6 déc. 2020 09:30 lien vers la Data-Sheet : Cliquez ici

bonjour à tous,

juste pour mettre ici une version minimaliste TEST NCO 18F27K42 avec MPLABX XC8
apres un petit test clignotement led sur RA4 , histoire de verifier que le programme tourne ( avec la bonne frequence FOSC)
puis sortie d'un signal 10KHz par defaut sur RC5 ( configuration par defaut avec MCC)
puis ensuite d'un signal de 238.4Hz .. en boucle

la frequence de sortie sur RC5 est donné par la relation
Choix frequence Nclock * Increment / (2x(2 ^20))

ou
pour connaitre l'Increment pour une frequence donnée Fx
Increment= Fx * 2097152/ Choix frequence Nclock
exemple
Increment= 238.42 * 2097152 / 500 000 =1000

la partie principale du code :

Code : Tout sélectionner


   CPrint
(" NCO1 operates in Fixed Duty Cycle mode 50% , divide by 2  (PFM=0)\r\n");
     NCO1CONbits.PFM=0; //else Fixed duty cycle is 50%
      pI=&Increment;
     Increment=1000;
     CPrint(" Increment = ");
     txt=&TEXTE[0];
     sprintf(txt," Increment = %5d \r\n",Increment);
     Print(txt);
      NCO1INCU=  *(pI+2);
       NCO1INCH=  *(pI+1);
        NCO1INCL=  *(pI+0);
      PWS_Valeur=0;
    //  The NCO clock source is selected by configuring
    // the  N1CKS<2:0> bits in the NCO1CLK register.
      NCO1_Clock_Choix=3;  //  0=FOSC  1=HFINTOSC  3=500Khz
      CPrint (" NCO1CLK choix = ");
      cx=  NCO1_Clock_Choix+48;
      UART1_Write(cx);
      CPrint ("    soit ");
      CPrint ( NCO1_Clock_Name[NCO1_Clock_Choix]);
       CRLF1();
       NCO1CLK=  PWS_Valeur<<|  NCO1_Clock_Choix ;
       NCO1CONbits.NCO1EN=1;  // enable
       CPrint ("   Freq Output=  ");
      F0= (NCO1_Clock[NCO1_Clock_Choix] * (float)Increment ) / 2097152.0 ;
       if(  NCO1_Clock_Choix>1)
      Float2Ascii (F0, CRam1,3);
      else
        Float2Ascii 
(F0, CRam1,1);
      Print (CRam1);
      CRLF1();

 


et toujours, une sortie terminal pour voir ce qui se passe :

Code : Tout sélectionner

(0.000)  Clignote led rouge sur RA4
(4.004)  NCO status=1 Valeur par defaut = 10KHz sur sortie RC5
(0.029)  Init NCO (voir page 454 datasheet) 
(0.031)  Polarity =(Not inverted) 
(0.013)  NCO1 operates in Fixed Duty Cycle mode 50% , divide by 2  (PFM=0)
(
0.026)  Increment =  Increment =  1000 
(0.016)  NCO1CLK choix = 3    soit   MFINTOSC (500 kHz)
(
0.028)    Freq Output=  238.419


package zip du projet issu de MPLABX :
Test_18F27K42_NCO.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » dim. 6 déc. 2020 13:15 lien vers la Data-Sheet : Cliquez ici

Bonjour paulfjujo, et tout le forum,

paulfjujo a écrit :Source du message Ce post concerne un test du NCO1 Numerically Controlled Oscillator present sur les 18FxxK42

oops Je viens de comprendre à quoi ça pouvait servir suite au poste de chabb

Et surtout grâce au lien que tu as mis en section ASM

On doit pouvoir faire un générateur de fonction en réglant bien FOSC (1 Hz à 10 Mhz) mais il nous sortira un signal carré qu'il faudra faire passer par des filtres pour avoir une belle sinusoïdale.

Avec l'adc du Pic qui est sur12 bit, on doit couvrir 4095 valeurs si je me trompe .......

Merci ! pour le retour, je vais voir comment mettre en fonction tout ça, en version ASM :langue:

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

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » dim. 6 déc. 2020 17:06 lien vers la Data-Sheet : Cliquez ici

Temps-x a écrit :
On doit pouvoir faire un générateur de fonction en réglant bien FOSC (1 Hz à 10 Mhz) mais il nous sortira un signal carré qu'il faudra faire passer par des filtres pour avoir une belle sinusoïdale.
Avec l'adc du Pic qui est sur12 bit, on doit couvrir 4095 valeurs si je me trompe .......


oui, on a affaire à un module style DDS AD9850 ( FOSC de 125MHz !)
..SANS DAC pour la sortie sinusoide.

tout à Fée !

de 1 à 10MHz , il faudra commuter aussi la source FOSC du NCO1
gamme de quelques secondes à X Megaherz
via le keyboard , on peut agir sur le choix de NCO1Clock , de 0 à 4 , et de l' Increment de 1 à 999999

FreqOut= FOSC /2 * Increment / (2^20)
avec le choix de FOSC= 0=>64MHz ou 3=>500Khz ou 4=> 32Khz
ou
Increment= Fx * 2097152/ FOSC [Choix frequence Nclock]
ex: pour 1000Hz ,choix=3 => Increment=4194 avec une resolution de 0,238Hz et FOSC=500KHz

je viens de transposer un programme musical issu d'unblog precedementcité par ailleurs
en MikroC..
la sortie est sur RC5
qualité caca-boudin , mais c'est juste pour le principe d'utiliser le NCO pour sortir une frequence donnée

Projet MikroC
Music_18F27K42_NCO1_tests.zip


Code : Tout sélectionner


   
#define Version "2020_1206"
     
 
// programme adapté d'une version MPLABX  issu du blog de Yves Pelletier
 // http://electroniqueamateur.blogspot.com/2018/02/jouer-une-melodie-avec-le-mplab-xpress.html
     
 
#define Directory "C:\\_MikroC\\_MesProjets_MikroC\\Music_18F27K42_NCO1_tests"
#define Project "Joue_Note_18F27K42_via_NCO.mcppi"
#define Source  "Joue_Note_18F27K42_via_NCO"
#define Eeprom " not used ...."
#define Config "P18F27K42_Fosc_Interne_64Mhz.cfgsch   "
#define OTHERS " ..."

/*
CONFIG1L : $300000 : 0x0004
CONFIG1H : $300001 : 0x0009
CONFIG2L : $300002 : 0x00F7
CONFIG2H : $300003 : 0x00BF
CONFIG3L : $300004 : 0x007F
CONFIG3H : $300005 : 0x003F
CONFIG4L : $300006 : 0x009F
CONFIG4H : $300007 : 0x000F
CONFIG5L : $300008 : 0x0001
CONFIG5H : $300009 : 0x0000

*/

#define PROCESSOR "18F27K42"
#define POWER_SUPPLY  " 3.3 à 5V"
//#define OSCILLATEUR_INTERNE       usage de Q=8MHz
#define FOSC "64.0"  // MHz
#define BAUD 19200  // UART1

#define CLS 12
#define CR 13    //0x0D
#define LF 10
#define TAB 9
#define BACK 8
#define Beep 7
#define Separator 0x20   // space
#define ON 0    // because led tirée au +VCC
#define OFF 1
#define SPECIAL 1
#define NORMAL 0


const char mesg0[]=" Directory :"Directory"\r\n";
const char mesg1[]=" MikroC pro 7.60 \r\n";
const char mesg2[] =" Projet :"Project"\r\n";
const char mesg3[]=" Test PIC18F27K42 NCO1 \r\n";
const char mesg4[]=" Config bit : "Config" FOSC:"FOSC" MHz\r\n";
const char mesg5[]=" Source : "Source"_"Version".c\r\n";
const char mesg6[]=" 18F27K42 MUSIC via NCO1 \r\n";
const char mesg7[]=" .. \r\n";
const char mesg8[]=" OTHERS "OTHERS"\r\n";
const char mesg9[]="..\r\n";
const char mesg10[]="                    ";   // pour effacer 1 ligne LCD
const char * Messages[]={mesg0,mesg1,mesg2,mesg3,mesg4,mesg5,mesg6,mesg7,mesg8,mesg9,mesg10};
const char Blancs[]="  ";  // remplace TABULATION (variable)


const  float NCO1_Clock[5]={64000000.0,64000000.0,32000.0,500000.0,32000.0};
const char NCO1_CL4[] =" MFINTOSC/4 (32 kHz)";
const char NCO1_CL3[] ="  MFINTOSC (500 kHz)";
const char NCO1_CL2[] =" LFINTOSC" ;
const char NCO1_CL1[] =" HFINTOSC ";
const char NCO1_CL0[] =" FOSC";
const char * NCO1_Clock_Name[] ={ NCO1_CL0,NCO1_CL1,NCO1_CL2,NCO1_CL3, NCO1_CL4};

const int tempo = 100;  //durée, en millisecondes, de la note la plus courte
const int pause = 20; // durée, en millisecondes, de la courte pause après chaque note; doit être plus petite que tempo!

//Définition des notes

const int *NoteC2[2] = {0b00000001, 0b00010010};
const int *NoteDb2[2]= {0b00000001, 0b00100011};
const int *NoteD2[2] = {0b00000001, 0b00110100};
const int *NoteEb2[2] = {0b00000001, 0b01000110};
const int *NoteE2[2] = {0b00000001, 0b01011010};
const int *NoteF2[2] = {0b00000001, 0b01101110};
const int *NoteGb2[2] = {0b00000001, 0b10000100};
const int *NoteG2[2] = {0b00000001, 0b10011011};
const int *NoteAb2[2] = {0b00000001, 0b10110011};
const int *NoteA2[2] = {0b00000001, 0b11001101};
const int *NoteBb2[2] = {0b00000001, 0b11101001};
const int *NoteB2[2] = {0b00000010, 0b00000110};

const int *NoteC3[2] = {0b00000010, 0b00100101};
const int *NoteDb3[2]= {0b00000010, 0b01000101};
const int *NoteD3[2] = {0b00000010, 0b01101000};
const int *NoteEb3[2] = {0b00000010, 0b10001100};
const int *NoteE3[2] = {0b00000010, 0b10110011};
const int *NoteF3[2] = {0b00000010, 0b11011100};
const int *NoteGb3[2] = {0b00000011, 0b00001000};
const int *NoteG3[2] = {0b00000011, 0b00110110};
const int *NoteAb3[2] = {0b00000011, 0b01100111};
const int *NoteA3[2] = {0b00000011, 0b10011011};
const int *NoteBb3[2] = {0b00000011, 0b11010010};
const int *NoteB3[2] = {0b00000100, 0b00001100};

const int *NoteC4[2] = {0b00000100, 0b01001001};
const int *NoteDb4[2]= {0b00000100, 0b10001011};
const int *NoteD4[2] = {0b00000100, 0b11010000};
const int *NoteEb4[2] = {0b00000101, 0b00011001};
const int *NoteE4[2] = {0b00000101, 0b01100111};
const int *NoteF4[2] = {0b00000101, 0b10111001};
const int *NoteGb4[2] = {0b00000110, 0b00010000};
const int *NoteG4[2] = {0b00000110, 0b01101100};
const int *NoteAb4[2] = {0b00000110, 0b11001110};
const int *NoteA4[2] = {0b00000111, 0b100110101};
const int *NoteBb4[2] = {0b00000111, 0b10100011};
const int *NoteB4[2] = {0b00001000, 0b00010111};

const int NoteC5[2] = {0b00001000, 0b10010011};

sbit LED_Rouge at LATA.B4;
sbit LED_Rouge_Dir at TRISA.B4;
sbit SQA at LATA.B3;
sbit SQA_Dir at TRISA.B3;



#define MAX_LEN1 128
#define MAX_LEN2 64
#define MAX_LEN3 80

unsigned int i,j,k,l,m,n;

volatile unsigned char Temp=0;
volatile unsigned char Buffer1[MAX_LEN1];
volatile int Flag_Buffer1;
volatile unsigned char c1,cx;
volatile unsigned int i1;
volatile unsigned int Index1;
volatile unsigned int CptErr;
int Special=0;
char CRam1[MAX_LEN2];
char TEXTE[MAX_LEN1];
char *txt;
float F0,F1;
unsigned char * p1;
unsigned char * p2;

unsigned long Consigne;
unsigned long Increment;
int FStep=0;
unsigned int Count0 = 0;


char NCO1_Clock_Choix=0;  // 0 à 4
char *pC;
char *pI;
char PWS_Valeur=;  // = 2 ^ PWS_Choix =>{1,2,4,8,16,32,64,128]};
char PWS_Choix;  // 0 à 7


volatile struct chbits {   // 8 flags
       unsigned FrameErr:1;
       unsigned RAZ:1;
       unsigned Tmr0_Elapsed:1;
       unsigned Togle:1;
       unsigned Second:1;
       unsigned Gie:1;
       unsigned Full:1;
      unsigned Melodie:1;
 }Drapeaux ;

void Init_Hardware(void) ;
void CRLF1(void) ;
void Raz_Buffer(void) ;
void Print(char *Tx);
void CPrint(const char *txt);
void strConstRamCpy(unsigned char *dest, const code char *source);


void Print(char *Tx)
{
 int i=0;
    while( *(Tx)>0)
    {
    UART1_Write(*(Tx++));
   i++;
   if (i>80) break;
  }
}
void CPrint(const  char *Tx)
{
  int i=0;
    while( *(Tx)>0)
    {
    UART1_Write(*(Tx++));
    i++;
   if (i>80) break;
    }
}
void CRLF1(void)
{
    UART1_Write(13);
      UART1_Write(10);
}

// --- Copie le texte depuis FLASH ROM vers RAM
void strConstRamCpy(unsigned char *dest, const code char *source)
 {
  while (*source)*dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}



 void Float2Ascii (float x, unsigned char *str,char precision)
{
 // converts a floating point number to an ascii string
 // version limitée à 6 decimales maximum
 // x is stored into str, which should be at least 30 chars long
 int ie, i, k, ndig;
 double y;
  ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
 ie = 0;
 // if x negative, write minus and reverse
 if ( x < 0.0000)
 {
   *str++ = '-';
   x = -x;
 }
 // put x in range 1 <= x < 10
 if (> 0.00000) while (< 1.00000)
 {
   x *= 10.000;                // a la place de =*
   ie--;
 }
 while (>= 10.000)
 {
   x = x/10.000;
   ie++;
 }
 // in f format, number of digits is related to size
 ndig += ie;                                // a la place de =+
 //round. x is between 1 and 10 and ndig will be printed to
 // right of decimal point so rounding is ...
 for (= i = 1; i < ndig; i++)
 y = y/10.000;
 x += y/2.000;
 if (>= 10.000) {= 1.000; ie++;}
 if (ie<0)
 {
   *str++ = '0'; *str++ = '.';
   if (ndig < 0) ie = ie-ndig;
   for (= -1; i > ie; i--)  *str++ = '0';
 }
 for (i=0; i < ndig; i++)
 {
   k = x;
   *str++ = k + '0';
   if (==  ie ) *str++ = '.';
   x -= (y=k);
   x *= 10.000;
  }
 *str = '\0';
}


void Init_Hardware()
{
  PORTA = 0xFF;
  ANSELA=0;
  ANSELA1_bit=1;
  PORTA=0;
  TRISA = 0b10000011 ;
  LED_Rouge_Dir=0;
  LED_Rouge=1;
  SQA_Dir=0;
  SQA=0;
  WPUA1_bit=0;
  ODCA1_bit=0;
   // RA0= OWS input  RA1=Analog Input  RA2..RA5 as output  RA7 input

  LED_Rouge=1;

  ANSELB=0;
  PORTB = 0x00;
  TRISB = 0xFF;    //  RB0..B7 Input   ATTENTION B7 B6 for ICSP Pickit3
  WPUB=0xFF;

  CM1CON0=0;
  CM2CON0=0;

  PORTC=0;
  TRISC = 0x80;    //
  ANSELC=0x00 ;
  WPUC0_bit=1;  // pull Up
  WPUC1_bit=1;  // pull Up
  WPUC2_bit=1;
  WPUC3_bit=1;  // pull Up
  WPUC4_bit=1;  // pull Up
  WPUC6_bit=1;  // pull Up
  WPUC7_bit=1;  // pull Up

  //   Open-Drain Configuration on Pins Rx<7:0>
  //1 = Output drives only low-going signals (sink current only)
  //0 = Output drives both high-going and low-going signals (source and sink current)
  // datasheet: The user must configure these pins as open-drain inputs.
  ODCONC.B4=1;
  ODCONC.B3=1;
  //
 FVRCON=0;
 FVRCON.FVREN=0;  //(was 0)  page 597  paragraph 34.3
 FVRCON.ADFVR1=1; // 01 = Fixed Voltage Reference Peripheral output is 1,024)
  FVRCON.ADFVR0=0;
}
// on joue la note avec la fréquence et la durée requises

void playnote(int *laNote, int duree)
{
    NCO1CON.NCO1EN = 1;   // activation du NCO
    // réglage de la fréquence
    NCO1INCH =*(laNote); // laNote[0];   // increment register (high value)
    NCO1INCL =*(laNote+1);// laNote[1];   // increment register (low value)
    attend(duree*tempo-pause);  // on attend pendant que la note joue
    NCO1CON.NCO1EN = 0;  // désactivation du NCO
    VDelay_ms(pause);
}

 void Initialise_NCO1 (char Choix)
{
    NCO1CON = 0x0;
   // NCO1CON.NCO1EN=0;  // disable
   // NCO1CON.NCO1POL=0;
   // NCO1CON.PFM=0; // duty cycle = 50%
    NCO1ACCU = 0x00;
    NCO1ACCH = 0x00;
    NCO1ACCL = 0x00;
    // Increment  4194 pour 1000 Hz
    NCO1INCU = 0x00;
    NCO1INCH = 0x10;
    NCO1INCL = 0x62;
    // CKS FOSC; PWS 1_clk;
    NCO1CLK = 3; //Choix; ////  0=FOSC  1=HFINTOSC  3=500Khz  4=32Khz
    NCO1CON.NCO1EN=1;  // enable
}


void main(void)
{
    Init_Hardware();
    
  Unlock_IOLOCK
()  ;
   I2C1SDAPPS = 0x14;   //RC4->I2C1:SDA1;
   I2C1SCLPPS = 0x13;   //RC3->I2C1:SCL1;
   RC3PPS = 0x21;   //RC3->I2C1:SCL1;
   RC4PPS = 0x22;   //RC4->I2C1:SDA1;
   RC6PPS = 0x13;   //RC6->UART1:TX1;
   RA4PPS = LATA4;
   U1RXPPS = 0x17;   //RC7->UART1:RX1;
   // U1CTSPPS = 0x15;   //RC5->UART1:CTS1;
   RC5PPS=0x26 ; //NCO1OUT;  //  RC5 => 0x26 ?
   Lock_IOLOCK() ;
   
   UART1_Init
(19200);
    //UART_Remappable_Init(19200);

    CRLF1();
    CPrint("\r\n Presentation : \r\n");
    for (i=0;i<9;i++)  CPrint(Messages[i]);
    CRLF1();
    
    NCO1_Clock_Choix
=3;  //  0=FOSC  1=HFINTOSC  3=500Khz
    Initialise_NCO1(NCO1_Clock_Choix);
    CPrint(" Init NCO1 en mode Frequence  \r\n");
    SQA=1;
    Delay_ms(100);
    SQA=0;
    
    CPrint
(" Sortie RC5 NCO1 avec Duty Cycle=50% (PFM=0)\r\n");
    CPrint (" NCO1CLK choix = ");
    cx=  NCO1_Clock_Choix+48;
    UART1_Write(cx);
    CPrint ("    soit ");
    CPrint ( NCO1_Clock_Name[NCO1_Clock_Choix]);
    CRLF1();
    FStep=4194;
    Increment=4194; // 1000Hz
    CPrint (" NCO1 output test de 1 à 10Khz  \r\n");
    for (j=0;j<10;j++)
    {
     NCO1CON.NCO1EN=0;  // enable
     pI=&Increment;
     txt=&TEXTE[0];
     sprintf(txt," j=%5d  Step=%5d  Increment = %5d ",j,FStep,Increment);
     Print(txt);
     NCO1INCU=  *(pI+2);
     NCO1INCH=  *(pI+1);
     NCO1INCL=  *(pI+0);
     NCO1CON.NCO1EN=1;  // enable
     CPrint (" Freq Output= ");
     //Foverflow=  NCO clock /2 * Increment / 2^20   ;   /1 048 576?
     F0= (NCO1_Clock[NCO1_Clock_Choix] * (float)Increment ) / 2097152.0 ;
     //FloatToStr(F0,CRam1);
     if(  NCO1_Clock_Choix>1)
      Float2Ascii (F0, CRam1,3);
      else
        Float2Ascii 
(F0, CRam1,1);
      Print (CRam1);
      CRLF1();
      Increment=Increment +FStep;
      SQA=1;
       Delay_ms(5);
      SQA=0;
      LED_Rouge=!LED_Rouge;
      Delay_ms(1000);
     }
        LED_Rouge=OFF;
        CPrint (" Musique Maestro !\r\n");
        NCO1INCU=0;
        // playnote (note, durée)
        playnote(NoteC2, 3);
        playnote(NoteC2, 1);
        playnote(NoteE2, 3);
        playnote(NoteE2, 1);
        playnote(NoteG2, 3);
        playnote(NoteG2, 1);
        playnote(NoteA2, 3);
        playnote(NoteA2, 1);
        playnote(NoteBb2, 3);
        playnote(NoteBb2, 1);
        playnote(NoteA2, 3);
        playnote(NoteA2, 1);
        playnote(NoteG2, 3);
        playnote(NoteG2, 1);
        playnote(NoteA2, 3);
        playnote(NoteG2, 1);
         SQA=1;
        playnote(NoteC4, 3);
        SQA=0;
        playnote(NoteC4, 1);
        playnote(NoteE4, 3);
        playnote(NoteE4, 1);
        playnote(NoteG4, 3);
        playnote(NoteG4, 1);
        playnote(NoteA4, 3);
        playnote(NoteA4, 1);
        playnote(NoteBb4, 3);
        playnote(NoteBb4, 1);
        playnote(NoteA4, 3);
        playnote(NoteA4, 1);
        playnote(NoteG4, 3);
        playnote(NoteG4, 1);
        playnote(NoteA4, 3);
        playnote(NoteG4, 1);

        playnote(NoteF3, 3);
        playnote(NoteF3, 1);
        playnote(NoteA3, 3);
        playnote(NoteA3, 1);
        playnote(NoteC4, 3);
        playnote(NoteC4, 1);
        playnote(NoteD4, 3);
        playnote(NoteD4, 1);
        playnote(NoteEb4, 3);
        playnote(NoteEb4, 1);
        playnote(NoteD4, 3);
        playnote(NoteD4, 1);
        playnote(NoteC4, 3);
        playnote(NoteC4, 1);
        playnote(NoteD4, 3);
        playnote(NoteC4, 1);

        playnote(NoteF2, 3);
        playnote(NoteF2, 1);
        playnote(NoteA2, 3);
        playnote(NoteA2, 1);
        playnote(NoteC3, 3);
        playnote(NoteC3, 1);
        playnote(NoteD3, 3);
        playnote(NoteD3, 1);
        playnote(NoteEb3, 3);
        playnote(NoteEb3, 1);
        playnote(NoteD3, 3);
        playnote(NoteD3, 1);
        playnote(NoteC3, 3);
        playnote(NoteC3, 1);
        playnote(NoteD3, 3);
        playnote(NoteC3, 1);
        
        LED_Rouge
=ON;
        CPrint (" Fin Musique \r\n");
  
  
//  }



(0.104)
(0.000) Presentation :
(0.000) Directory :C:\_MikroC\_MesProjets_MikroC\Music_18F27K42_NCO1_tests
(0.000) MikroC pro 7.60
(0.000) Projet :Joue_Note_18F27K42_via_NCO.mcppi
(0.000) Test PIC18F27K42 NCO1
(0.000) Config bit : P18F27K42_Fosc_Interne_64Mhz.cfgsch FOSC:64.0 MHz
(0.311) Source : Joue_Note_18F27K42_via_NCO_2020_1206.c
(0.000) 18F27K42 UART1 ADC12b NCO1
(0.000) ..
(0.000) OTHERS ...
(0.000)
(0.000) Init NCO1 en mode Frequence
(0.000) Sortie RC5 NCO1 avec Duty Cycle=50% (PFM=0)
(0.000) NCO1CLK choix = 3 soit MFINTOSC (500 kHz)
(0.000) NCO1 output test de 1 à 10Khz
(0.000) j= 0 Step= 4194 Increment = 4194 Freq Output= 999.927
(2.464) j= 1 Step= 4194 Increment = 8388 Freq Output= 1999.855
(2.531) j= 2 Step= 4194 Increment = 12582 Freq Output= 2999.782
(2.534) j= 3 Step= 4194 Increment = 16776 Freq Output= 3999.710
(2.530) j= 4 Step= 4194 Increment = 20970 Freq Output= 4999.637
(2.532) j= 5 Step= 4194 Increment = 25164 Freq Output= 5999.565
(2.532) j= 6 Step= 4194 Increment = 29358 Freq Output= 6999.492
(2.530) j= 7 Step= 4194 Increment = -31984 Freq Output= 7999.419
(2.532) j= 8 Step= 4194 Increment = -27790 Freq Output= 8999.347
(2.534) j= 9 Step= 4194 Increment = -23596 Freq Output= 9999.274
(2.526) Musique Maestro !

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » lun. 7 déc. 2020 02:15 lien vers la Data-Sheet : Cliquez ici

Bonsoir paulfjujo, et tout le forum,

Bon avec tout ça... j'ai pu ca faire la même chose , je mettrais la source ASM quand j'aurais fini, très intéressant ces nouveaux Pic. :sad:

Comme j'ai déjà une petite notion sur les notes de musique, je vais voir ce que je peux en sortir, même voir avec les Fichier Rtttl

Merci !

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

PIC18F27K42 et NCO1 Numerically Controlled Oscillator
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » lun. 21 févr. 2022 18:09 lien vers la Data-Sheet : Cliquez ici

bonsoir à tous,


j'ai eu besoin de rajouter une effet melodie au CLAVIER , qui va bientot etre finalisé...
pour avertir qu'un code PIN bluetooth a été accepté ...ok
mais je ne me rappelais plus tres bien comment recuperer , modifier un fichier RTTL ...
je suis donc retourné su ce sujet et refais un peu le ménage sur ma page tra itant ceci, coté C ,
et ton appli RTTL.exe exportant un fichier data en Asm

j'en rappelle ici , la procedure pour pouvoir l'utiliser sous C

Dans l'application RapidQ RTTL.exe ,
1) ouvrir un fichier musical au format Rttl, ex: Pink panther
2) Le Lire
3) L'editer ( touche Note noire)
4) L'exporter en ASM

--> copier dans le presse papier

avec notetab++
on le recupere dans un nouveau fichier texte
Recherche ... Remplacer...... Remplacer db par \r\n, ( espace dB par CR LF et virgule)
puis supprimer les adresses sur 5 bytes
Conserver le nom actuel ( qui pourrait etre rallongé , complété ..plus de limites..)
Rajouter un suffixe terminateur 0xFF apres le Nom et aussi 0xFF en fin de fichier
on obtient alors la version pour langage C
rajouter l'entete de definition de la nouvelle table
on obtient alors
ex:
unsigned char PinkPanther[]={
// 0xFE,0xFD,0xFC,0xFB,0xFA,
0x50,0x69,0x6E,0x6B,0x50,0x61,0x6E,0x74,0x68,0x65,0x72,0xFF,
//0xFE,0xFD,0xFC,0xFB,0xFA,
0x00,0xA2,0xE8,0x00,0xBC,0x00,0xAC,0xCE,0x00,0xBC,0x00,
0x00,0x00,0x02,0xEE,0x00,0xC1,0xD1,0x00,0xBC,0x00,0xCD,0x6F,0x00,0xBC,0x00,0x00,
0x00,0x02,0xEE,0x00,0xA2,0xE8,0x00,0xBC,0x00,0xAC,0xCE,0x00,0xBC,0x00,0x00,0x00,
0x00,0x5E,0x00,0xC1,0xD1,0x00,0xBC,0x00,0xCD,0x6F,0x00,0xBC,0x00,0x00,0x00,0x00,
0x5E,0x01,0x12,0x39,0x00,0xBC,0x01,0x02,0xEA,0x00,0xBC,0x00,0x00,0x00,0x00,0x5E,
0x00,0xA2,0xE8,0x00,0xBC,0x00,0xAC,0xCE,0x00,0xBC,0x00,0x00,0x00,0x00,0x5E,0x01,
0x02,0xEA,0x00,0xBC,0x00,0xF4,0x46,0x02,0xEE,0x00,0x00,0x00,0x02,0xEE,0x00,0xE6,
0xAF,0x00,0x5E,0x00,0xCD,0x6F,0x00,0x5E,0x00,0xAC,0xCE,0x00,0x5E,0x00,0x99,0xD8,
0x00,0x5E,0x00,0xAC,0xCE,0x02,0xEE,
//0xFE,0xFD,0xFC,0xFB,0xFA
0xFF
};



*nota : sortie NCO1 sur RC0 ( RC0PPS = 0x26; //NCO1;) directe sur buzzer 5V

PLAY_RTTL_MUSIC_with_NCO_18F27K42_2022.zip


Melodie #0 Mission Imp
Melodie #1 Bolero
Melodie #2 Smoke on the water
Melodie #3 Somethin
Melodie #4 PinkPanther
Melodie #5 LaurelAn
Melodie #6 AlfredHi
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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