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
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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%
plus de details sur ma page web
tableau de resultat
projet mikroC
le fichier de config du terminal YAT .. avec touches de fonctions programmables
A votre disposition pour repondre ou developper sur ce post.
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%
plus de details sur ma page web
tableau de resultat
projet mikroC
le fichier de config du terminal YAT .. avec touches de fonctions programmables
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.
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
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
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
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous,
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 !.
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
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 ?
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 !.
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
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 ?
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
Bonjour paulfjujo et bonjour à tous.
Tu as toujours l'option de faire une recherche via Google uniquement via ton site.
Dans Google taper site:AdresseDuSite SuiviDeL'argument
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
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
@++
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
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
@++
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
[
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 !
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 ..
car je m'y perds moi-meme !
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'argumentExemple 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 ..
car je m'y perds moi-meme !
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 :
et toujours, une sortie terminal pour voir ce qui se passe :
package zip du projet issu de MPLABX :
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<<5 | 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 =0 (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 :
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
Bonjour paulfjujo, et tout le forum,
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 .......
pour le retour, je vais voir comment mettre en fonction tout ça, en version ASM
A+
paulfjujo a écrit :Source du message Ce post concerne un test du NCO1 Numerically Controlled Oscillator present sur les 18FxxK42
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 .......
pour le retour, je vais voir comment mettre en fonction tout ça, en version ASM
A+
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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=0 ; // = 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 (x > 0.00000) while (x < 1.00000)
{
x *= 10.000; // a la place de =*
ie--;
}
while (x >= 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 (y = i = 1; i < ndig; i++)
y = y/10.000;
x += y/2.000;
if (x >= 10.000) {x = 1.000; ie++;}
if (ie<0)
{
*str++ = '0'; *str++ = '.';
if (ndig < 0) ie = ie-ndig;
for (i = -1; i > ie; i--) *str++ = '0';
}
for (i=0; i < ndig; i++)
{
k = x;
*str++ = k + '0';
if (i == 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.
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
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.
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
A+
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.
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
A+
PIC18F27K42 et NCO1 Numerically Controlled Oscillator
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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
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
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.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 44 invités