Bonjour,
Comme indiquer dans le titre, je travaille sur un Pic 16F690. J'essaye de réaliser un Orgue électronique 12 touches, pour résumer:
Avec un clavier 12 touche, je détecte la touche enfoncer et en sortie j'ai un signal carré dont la fréquence correspond à une note, ce signal est filtré, amplifié et envoyé sur un HP.
Bref, le clavier marche très bien, le programme retrouve parfaitement la touche appuyée. Le soucis est au niveau du signal de sortie pour mes tests, j'ai volontairement bloqué la valeur que j'envoie à ma fonction Timer pour produire un 440Hz(La). Donc en théorie peu importe la touche sur laquelle j'appuie la sortir devrait être un signal carré (+5/-5) de fréquence 440Hz environ. C'est là que le problème survient, sur la sortie j'ai un signal carrée dont la fréquence varie entre 342 et 401 Hz en fonction de la touche appuyée.
J'avais une erreur similaire avant celle-ci, mais c'était dû à la vitesse d'execution du programme il se trouve que certaine fonction que je n'avat pas écrite étaient des fonctions bloquantes. Elles n'étaient pas du tout indispensables au fonctionnement de l'orgue donc je les ai supprimées et le programme s'effectue à une fréquence nettement plus grande que celle que je désire en sortie.
Voilà mes équivalence syntaxiques:
#define OUT RA4 // Sortie de l'orgue
#define NBTOUCHES 13
Et voilà mon code, en espérant trouver un peu d'aide, merci d'avance:
Code:void InitPic(void); void PortTestColonne (void); void PortTestLigne (void); bool TestColonne (void); bool TestLigne (void); void FonctionSignal (/*int16 iPeriode*/void); void main (void){ //Déclaration int8 i8Colonne = 0, i8Ligne = 0, i8Touche=0; int8 i8TabTouche[NBTOUCHES] = {0x48,0x28,0x18,0x44,0x24,0x14,0x42,0x22,0x12,0x41,0x21,0x11,0x00}; int16 i16TabPeriode[NBTOUCHES] = {3800,3600,3400,3200,3000,2860,2700,2550,2400,2270,2150,2000,0}; char cTabCar[NBTOUCHES] = {'C','C','D','E','E','F','F','G','G','A','B','B','Z'}; int iIndice = 0; int16 iVal; //Instruction InitPic(); // Initialisation InitLCD(); OPTION_REG = 0x83; OUT = 0; TOIF=0; TMR0=0; while(1){ PortTestColonne (); i8Colonne = TestColonne(); PortTestLigne (); i8Ligne = TestLigne(); i8Touche = i8Colonne + i8Ligne; //Le mot Touche a respéctivement sur ses bits de poid fort et sur ses bits de poid faible les coordonée Colonne et ligne de la touche iIndice=0; while((i8Touche != i8TabTouche[iIndice])&&(iIndice<=NBTOUCHES)) { iIndice++; } if (i8Touche != 0x00){ FonctionSignal(/*i16TabPeriode[iIndice].*/); } else{ OUT = 0; } } } void PortTestColonne (void){ // Initialisation des port pour les test de la colonne TRISA = 0b11001111; TRISB = 0b11101111; TRISC = 0b10000000; RB4 = 1; RC5 = 1; RC4 = 1; RA5 = 1; } void PortTestLigne (void){ // Initialisation des port pour les test de la ligne TRISA = 0b11101011; TRISB = 0b01011111; TRISC = 0b10110000; RA2 = 1; RB7 = 1; RB5 = 1; } int8 TestColonne (void){ int8 i8Colonne; i8Colonne = RA2*64 + RB7*32 + RB5*16; // Le mot Colonne porte sur ses 4 bits de poid fort la coordonnée colonne de la touche return i8Colonne; } int8 TestLigne (void){ int8 i8Ligne; i8Ligne = RB4*8 + RC5*4 + RC4*2 + RA5; // Le mot Ligne porte sur ses 4 bits de poid faible la coordonnée ligne de la touche return i8Ligne; } void InitPic (void){ TRISA = 0b11101111; TRISB = 0b11111111; TRISC = 0b00110000; CM2CON0 = 0; //ne pas enlever cette ligne de code T1CON = 0; //ne pas enlever cette ligne de code } void FonctionSignal (/*int16 iPeriode*/void) { int iValDep ; iValDep = 256-(2270/32); // 185; if (TOIF == 1){ TOIF = 0; TMR0 = iValDep; OUT = !OUT; } }
-----