IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

generer un signal 40khz carre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut generer un signal 40khz carre
    bonjour ,
    je souhaite generer un signal de 40khz a l aide d un , sur un carte picdemplus2, compiler c18 et pickit3 en programmer, le tout sur mplab8.87


    je pense que mon code a souffert de mes different essai mais je vous le soumet malgre tout ... J'ai de tres gros soucis avec l'utilisation des timer ... malgre les divers sujets lus sur le sujets ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    /*
     
     */
    #include  <p18f4520.h> //ATTENTION penser a adapter la ref du uC
     
    #pragma config OSC = INTIO67, FCMEN = OFF, PWRT = OFF, MCLRE = ON
    #pragma config PBADEN = OFF
    #pragma config LVP = OFF
    #pragma config WDT = OFF, DEBUG=ON
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
     
    #define TRISA_Init		0b00111111			//LEDS (RA6 et RA7 configure en output )
    #define TRISB_Init		0b11111110			//RB0 configure en output
    #define TRISC_Init		0b00111111			//Toutes les pins configurees en input par mesure de securite
    #define	LED_PRESENCE	LATA = 0b10000000	//allume une LED : RA7 allumee et RA6 eteinte
    #define	LED_ABSENCE		LATA = 0b01000000	//allume une LED : RA6 allumee et RA7 eteinte
    #define Compteur_Pulses_TX_Init 20			//configure le nombre de pulses du compteur 
     
    int  	Compteur_Pulses_TX;			//declaration de notre compteur de pulses emis
    int  	Compteur_Pulses_RX;			//declaration de notre compteur pulses recus
    int 	Compteur_MS_TIMEOUT;		//declaration de notre compteur nombre de cycles complets				///////////////////////////////////////////////////////////////////////////
     
    void main(void) 
     
    {	OSCCON = 0b01110000;			//configuration du registre de controle de l oscillateur 
    	while (!(OSCCONbits.IOFS) )		//quand le bit IOFS (i/o frequency stable)est a 0
    	Nop()
    	OSCTUNE = 0b01000000;			//configuration du registre de reglage de l oscillateur  :oscillateur interne
    	while (!(OSCCONbits.IOFS) )		//quand le bit IOFS (i/o frequency stable)est a 0
    	Nop()							//,PLL active, frequence calibree en usine,
    //Config des PORT
     
    	TRISA = TRISA_Init;  	// initialisation de portA
    	TRISB = TRISB_Init;		// initialisation de portB
    	TRISC = TRISC_Init;		// initialisation de portC
    //config des timer 0 et 1
    //Timer0
    	T0CON =   0b11000000; 		//Timer0 enable sur 16bits
    	INTCON =  0;				//initialisation du registre interuption 0
    	INTCON2 = 0b01000000;		//initialisation du registre interuption 2
    	TMR0L	= 0b1010;			//
    	//TMR0H	= 0;				//
    								//
     
    //
    	T1CON =   0b10000001; 					//  enable en 16 bits
    	INTCON =  0;							//initialisation du registre interuption 0
    	INTCON2 = 0b100100;						//initialisation du registre interuption 2
    //	TMR1L	= 0b11111111;//0b11011011;		//(40 000 000/4)=x; (10cm/34300=y)c'est le temps  pour parcourir 10 cm a la vitesse de la lumiere
    //	TMR1H	= 0b11111111;//0b11111110;		//x*y =292 cycles, nous somme sur 16 bits donc 292 = la duree 
    											//du timer
    ///////////////////////////////////////////////////////////////////////////////////////
    TMR1H = 0;//initialise le timerH 1
    TMR1L = 0;//initialise le timerL 1
     
    while(1)
    	{ 				///////////////////////////////////////////////////////////////////////////////////
    	Compteur_Pulses_TX = Compteur_Pulses_TX_Init;	//initialisation du compteur de pulses emis
    	TRISB = TRISB_Init;								// initialisation de portB
     
    	// debut de l emission de pulses I0IO.....
    	while	(Compteur_Pulses_TX)
    		{ 	
    			LATB = 0b00000001;				//creation d un pulse I		
     
    			LATB = 0;						//creation d un pulse 0
    		//	Nop();							//creer de courts delais afin d affiner le signal carre
     
    		Compteur_Pulses_TX = Compteur_Pulses_TX -1;		//compte a rebour 20->0 dans l exemple
    		}
    	// passage en entree 
    	TRISB = 0xFF;				// toutes les pins a 1, donc en entree	
    	//init du TimeOut
    //Timer0
    	T0CON =   0b11000000; 		//Timer0 enable sur 16bits
     
    	TMR0L = 0; 					//Timer0 low 
    	INTCONbits.TMR0IF = 0;		//overflow flag bit a 0
    	INTCONbits.INT0IF = 0;		//external interrupt flag bit a 0
    	Compteur_MS_TIMEOUT = 500;	//500ms
    	Compteur_Pulses_RX = Compteur_Pulses_TX_Init;	// init du cptr de pulses recues à 20, pour decrementer a chaque pulses reçues
     
    /*while (Compteur_Pulses_TX)
    	{
    INTCONbits.TMR0IF == 1;//quand le flag passe a 1
    TMR0L = TMR0L +1; 	   //tu incremente le timer 0
    }*/	}
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Ton code ne fait absolument pas ce que tu décris. D’ailleurs, je ne sais pas vraiment ce qu'il fait

    Ici, tu fais des sorties et des entrées, alors que ton problème est de générer un signal carré à 40kHz. Je te conseille de créer un mini projet à côté pour ne réaliser que cette tâche et comprendre le principe.

    Tu as 2 solutions :
    1. Tout faire dans le while(1) du main. Soyons honnêtes, c'est une mauvaise solution.
    2. Régler ton timer pour qu'il déclenche une interruption avec une fréquence de 80kHz. Chaque fois qu'une interruption a lieu, tu changes l'état de la patte. Tu auras donc un signal carré à 40kHz.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	while	(Compteur_Pulses_TX)
    		{ 	
    			LATB = 0b00000001;				//creation d un pulse I		
     
    			LATB = 0;						//creation d un pulse 0
    		//	Nop();							//creer de courts delais afin d affiner le signal carre
     
    		Compteur_Pulses_TX = Compteur_Pulses_TX -1;		//compte a rebour 20->0 dans l exemple
    		}
    Si tu as un oscilloscope, tu pourras tenter de regarder la fréquence du signal carré généré, mais tu risques de ne pas avoir assez de bande-passante car les changement se font extrêmement vite. Si tu souhaites être en attente active, tu dois attendre avant de changer d'état (pour 0 --> 1 et pour 1 --> 0).

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut
    merci pour ta reponse . alors pour a voir branche la carte sur un oscillo , je vois passer un signal carré ....
    cependant , tes remarques me semble pleine de bon sens ... je vais essaye de creuser dans ce sens ... merci , et je reste ouvert a toutes autre remarque, conseils etc ;..

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    En même temps, tu dois pas pouvoir monter à beaucoup plus de 4MHz avec le PIC et si tu as un oscilloscope correct tu as une bande passante de facilement 40MHz.... Je me suis un peu emballé

    Quelle est la fréquence du signal que tu observes d'ailleurs ?

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut
    je n'ai plus trop les chiffre en tete mais c'etait tres faible 4khz un truc comme ca ...

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut
    j ai ecris ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include  <p18f4520.h> //ATTENTION penser a adapter la ref du uC
    #include <timers.h>
    
    
    #pragma config OSC = INTIO67, FCMEN = OFF, PWRT = OFF, MCLRE = ON
    #pragma config PBADEN = OFF
    #pragma config LVP = OFF
    #pragma config WDT = OFF, DEBUG=ON
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /** I N T E R R U P T S ***********************************************/
    #pragma interrupt InterruptService 
    void InterruptService(void)
    {
    	if(INTCONbits.TMR0IF)
    	{	// Interruption Timer0
    		INTCONbits.TMR0IF = 0;
    		WriteTimer0(65411); // //mettre la valeur adapté a son delais pour generer ici 
    		// Ton traitement
    		LATBbits.LATB0 = !LATBbits.LATB0;	// Example
    	}
    }	
    #pragma code InterruptVector = 0x08
    void InterruptVector (void)
    {
      _asm
        goto InterruptService //saut dans la routine d'interruption
      _endasm
    }
    
    /** T R A I T E M E N T ***********************************************/
    #pragma code
    void main(void)
    {
        // Set up global interrupts
        RCONbits.IPEN = 0;          // Désactive les niveaux de priorité sur les interruptions(mode compatibilité)
        INTCONbits.GIE = 1;        	// Autoriser les interruptions
        INTCONbits.PEIE = 1;      	// Autoriser les interruptions périphériques
    
    	// Débordement Timer0 toutes les X secondes
    	OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
    	WriteTimer0(65411); //mettre la valeur adapté a son delais pour generer ici 
    		// Ton traitement
    	INTCONbits.TMR0IF = 0;
    
    	// Configuration des Ports
    	TRISBbits.TRISB0= 0;
    	
    	// Initialisation des Ports
    	LATBbits.LATB0 = 0;
    
    	while(1)
    	{
    INTCONbits.TMR0IF = 1
    LATBbits.LATB0 = (!(LATBbits.LATB0));//il refuse cette ecriture
    
    	}
    }

    cependant j ai un soucis de syntaxe evers la fin du code

Discussions similaires

  1. Led éteinte sur un signal PWM carré
    Par bm dans le forum Arduino
    Réponses: 15
    Dernier message: 17/05/2015, 20h32
  2. Signal analogique carré 0-24V
    Par akuma8 dans le forum Arduino
    Réponses: 40
    Dernier message: 07/01/2015, 14h52
  3. Réponses: 11
    Dernier message: 18/11/2010, 11h07
  4. Réponses: 1
    Dernier message: 28/10/2009, 07h33
  5. Detecter et generer un signal sonore
    Par jmjmjm dans le forum API, COM et SDKs
    Réponses: 22
    Dernier message: 03/02/2006, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo