Utilisation du Timer 0 sur PIC16F690
Répondre à la discussion
Affichage des résultats 1 à 1 sur 1

Utilisation du Timer 0 sur PIC16F690



  1. #1
    invite8c7e0f8f

    Utilisation du Timer 0 sur PIC16F690


    ------

    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;
    	}	
    }

    -----
    Dernière modification par JPL ; 24/05/2012 à 17h23. Motif: Ajout de la balise Code pour garder l'indentation

Discussions similaires

  1. Programmation en C avec Timer 0 et Timer 1
    Par invite6844fe5f dans le forum Électronique
    Réponses: 43
    Dernier message: 20/04/2010, 13h27
  2. Aide sur les timer sur un 16f876a
    Par invited023a47c dans le forum Électronique
    Réponses: 16
    Dernier message: 14/03/2009, 11h23
  3. Problème d'entrée sur un pic16f690
    Par v2h dans le forum Électronique
    Réponses: 15
    Dernier message: 17/02/2009, 19h00
  4. Message d'erreur sur MPLAB pour PIC16F690!!!
    Par inviteb3fa1a10 dans le forum Électronique
    Réponses: 15
    Dernier message: 25/06/2008, 10h36
  5. question sur PIC16F690
    Par inviteb3fa1a10 dans le forum Électronique
    Réponses: 2
    Dernier message: 02/06/2008, 10h19
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...