adaptation code pic18f
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

adaptation code pic18f



  1. #1
    Ticlem

    adaptation code pic18f


    ------

    bonjour à tous,

    J'ai trouvé ce code sur le site de cours : http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    Code:
    #include <p18f452.h>
    
    unsigned int duree=5555;
    char maj=1;
    
    //sous programme d'interruption
    #pragma interrupt itcomp
    void itcomp(void)
    {
    unsigned static int ancien;
    	if(PIR1bits.CCP1IF)
    					{
    					duree=CCPR1;
    					maj=1;
    					}
    	PIR1bits.CCP1IF=0;
    }
    
    #pragma code interruption=0x8
    void ma_fonction (void)
    {
    _asm goto itcomp _endasm
    }
    
    #pragma code
    
    void main(void)
    {
    // configure PORTC CCP1
    	DDRCbits.RC2=1;					// RC2/CCP1 en entree
    
    // configure le TIMER1
    	T1CONbits.RD16=0;				// TMR1 mode simple (pas de RW)
    	T1CONbits.TMR1CS=0;				// compte les impulsions sur internal clock
    	T1CONbits.T1CKPS1=1;			// prediviseur=1/8 periode sortie = 0.5us par cycle
    	T1CONbits.T1CKPS0=1;
    	T1CONbits.T1SYNC=1;				// pas de synchroniastion sur sleep/Reset
    	T1CONbits.TMR1ON=1;				// TMR1 Activé
    
    // configure le mode capture sur le TIMER1 avec IT sur CCP1
    	T3CONbits.T3CCP2=0;				// mode comparaison entre TMR1 et CCPR1
    	CCP1CON=0x05;					// capture mode sur fronts montants
    
    	PIE1bits.CCP1IE=1;				//active IT sur mode capture/comparaison CCP1
    
    	RCONbits.IPEN=1;				// Interruption prioritaires activées
    	INTCONbits.GIE=1;				// Toutes les IT démasquées autorisées
    
    	while(1)
    			{
    			if(maj){
    					maj=0;
    					}
    			}
    }
    Je le comprends et je sais qu'il permet de mesurer une période entre deux fronts montants d'un signal sur la pin RC2 à l'aide du module capture associé au timer1.

    Je possède le pic 18f2550, exactement celui-ci : http://www.tigal.com/product/2132

    De la même manière j'ai un signal carré connecté à la pin RC2 et je souhaites allumer ou éteindre des Leds (pin RA0 à RB2) de manière progressive en fonction de la période de mon signal.

    Mon signal a une période comprise entre 31500µs et 2000µs. Donc je n'ai normalement pas de débordement du Timer1.

    Comment adapter ce code dans mon cas?
    et ce qui concerne les bits de configuration?

    Merci beaucoup de votre aide

    -----

  2. #2
    RISC

    Re : adaptation code pic18f

    Salut,

    La syntaxe pour les bits de configuration des PIC18 est la suivante :
    #pragma config WDT=OFF, LVP=OFF,....

    Pour le PIC18F2550, tu ouvres le document dédiés aux bits de configuration de tous les PIC18 :
    * soit dans MPLAB : > Help > Topics > Language Tools > PIC18 Config Settings
    ou
    * c:\MCC18\doc\hlpPIC18ConfigSet .chm

    a+

  3. #3
    Ticlem

    Re : adaptation code pic18f

    Bonjour à tous,

    je reviens après un petit moment sans avoir touché mon programme!

    Code:
    #include <p18f2550.h>
    #pragma config PLLDIV=2,FOSC=HS, FCMEN=ON, WDT=OFF, IESO=ON, XINST=OFF, LVP=OFF 
    unsigned int duree=5555;
    char maj=1;
    
    //sous programme d'interruption
    #pragma interrupt itcomp
    void itcomp(void)
    {
    unsigned static int ancien;
    	if(PIR1bits.CCP1IF)
    					{
    					duree=CCPR1;
    					maj=1;
    					}
    	PIR1bits.CCP1IF=0;
    }
    
    #pragma code interruption=0x8
    void ma_fonction (void)
    {
    _asm goto itcomp _endasm
    }
    
    #pragma code
    
    void main(void)
    {
    // configure PORTC CCP1
    	DDRCbits.RC2=1;					// RC2/CCP1 en entree
    
    // configure le TIMER1
    	T1CONbits.RD16=0;				// TMR1 mode simple (pas de RW)
    	T1CONbits.TMR1CS=0;				// compte les impulsions sur internal clock
    	T1CONbits.T1CKPS1=1;			// prediviseur=1/8 periode sortie = 0.5us par cycle
    	T1CONbits.T1CKPS0=1;
    	T1CONbits.T1SYNC=1;				// pas de synchroniastion sur sleep/Reset
    	T1CONbits.TMR1ON=1;				// TMR1 Activé
    
    // configure le mode capture sur le TIMER1 avec IT sur CCP1
    	T3CONbits.T3CCP2=0;				// mode comparaison entre TMR1 et CCPR1
    	CCP1CON=0x05;					// capture mode sur fronts montants
    
    	PIE1bits.CCP1IE=1;				//active IT sur mode capture/comparaison CCP1
    
    	RCONbits.IPEN=1;				// Interruption prioritaires activées
    	INTCONbits.GIE=1;				// Toutes les IT démasquées autorisées
    
    	while(1)
    			{
    			if(maj){PORTAbits.RA2=!PORTAbits.RA2=0;					maj=0;
    					}
    			}
    }
    J'ai mis en rouge les changements, le premier pour le pic 18f2550 et le deuxième pour faire clignoter une led à chaque fois que la mesure est disponible.
    Je suis muni d'un oscillocope me permettant de visualiser un changement d'etat même pour des fréquences que l'oeil ne peut pas percevoir.
    Cependant je ne mesures rien, ma led ne change pas d'état, donc aucune mesure n'est prête!

    D'ou vient le problème?

    Merci de votre aide

  4. #4
    amoniaque

    Re : adaptation code pic18f

    Hi,

    Tu ne trouves pas ça bizarre comme code ?
    Code:
    PORTAbits.RA2=!PORTAbits.RA2=0;
    Deux affectations à RA2 dans la même ligne d'instructions ... Tu vas faire tourner la tête à ton compilo' .

    Perso' je ferrai quelque chose du genre PORTAbits.RA2 ^= PORTAbits.RA2;

  5. A voir en vidéo sur Futura
  6. #5
    Ticlem

    Re : adaptation code pic18f

    Pardon effectivement erreur de frappe, dans le programme il y a la ligne suivante:
    Code:
    PORTAbits.RA2=!PORTAbits.RA2;

  7. #6
    amoniaque

    Re : adaptation code pic18f

    Fais quelque chose du genre :
    Code:
    PORTAbits.RA2 = maj;
    Ou :
    Code:
    LATAbits.RA2 = maj;
    Car dans ton cas, si maj est à 1 ta sortie oscillera non stop.
    Là ta sortie sera une recopie de maj.

    De plus, as tu remarqué que maj n'était jamais à 0 ?!

  8. #7
    Ticlem

    Re : adaptation code pic18f

    Citation Envoyé par amoniaque Voir le message
    De plus, as tu remarqué que maj n'était jamais à 0 ?!
    Merci de ton aide, si maj est bien mis à zéro, dans la même ligne que le if(maj).

    Je souhaite visualiser la dynamique de ce programme afin de bien le comprendre, et bien l'exploiter.
    J'allume donc des leds quand j'ai un flag, et j'éteins quand la mesure est prête dans if(maj).

    De cette façon:
    Code:
    #include <p18f2550.h>
    #pragma config PLLDIV=2,FOSC=HS, FCMEN=ON, WDT=OFF, IESO=ON, XINST=OFF, LVP=OFF 
    
    unsigned int duree=5555;
    char maj=1;
    
    //sous programme d'interruption
    #pragma interrupt itcomp
    void itcomp(void)
    {
    unsigned static int ancien;
    	if(PIR1bits.CCP1IF)
    					{
    					duree=CCPR1;
    					maj=1;
    					PORTB=0b00000101;
    					}
    	PIR1bits.CCP1IF=0;
    
    }
    
    #pragma code interruption=0x8
    void ma_fonction (void)
    {
    _asm goto itcomp _endasm
    }
    
    #pragma code
    
    void main(void)
    {
    // configure PORTA et PORTB
    	TRISA = TRISB = 0x00;
    	PORTA = PORTB = 0x00;
    
    // configure PORTC CCP1
    	DDRCbits.RC2=1;					// RC2/CCP1 en entree
    
    // configure le TIMER1
    	T1CONbits.RD16=0;				// TMR1 mode simple (pas de RW)
    	T1CONbits.TMR1CS=0;				// compte les impulsions sur internal clock
    	T1CONbits.T1CKPS1=1;			// prediviseur=1/8 periode sortie = 0.5us par cycle
    	T1CONbits.T1CKPS0=1;
    	T1CONbits.T1SYNC=1;				// pas de synchroniastion sur sleep/Reset
    	T1CONbits.TMR1ON=1;				// TMR1 Activé
    
    // configure le mode capture sur le TIMER1 avec IT sur CCP1
    	T3CONbits.T3CCP2=0;				// mode comparaison entre TMR1 et CCPR1
    	CCP1CON=0x05;					// capture mode sur fronts montants
    
    	PIE1bits.CCP1IE=1;				//active IT sur mode capture/comparaison CCP1
    
    	RCONbits.IPEN=1;				// Interruption prioritaires activées
    	INTCONbits.GIE=1;				// Toutes les IT démasquées autorisées
    
    	while(1)
    			{
    			
    			if(maj){PORTB=0b00000000;
    					maj=0;
    					}
    			
    			}
    }
    A l'oeil je vois mes leds faiblement alimentées. Et sur l'oscillo je visualise la sortie du pic. Je vois une impulsion (voir photo).

    Je m'attendais à voir un signal périodique, j'ai du mal à interpreter ce que je vois.
    Pourquoi je ne vois pas plusieur carré? ici le carré à une largeur de 1µs et une amplitude de presque 5v normale le pic est alimenté en 5V)

    Est ce normal ce que je vois?
    Images attachées Images attachées  

  9. #8
    amoniaque

    Re : adaptation code pic18f

    Et tu as combien de temps entre tes impulsions ?
    À mon avis ce doit être le temps de ton signal qui créé l'interruption.

  10. #9
    Ticlem

    Re : adaptation code pic18f

    Citation Envoyé par amoniaque Voir le message
    Et tu as combien de temps entre tes impulsions ?
    À mon avis ce doit être le temps de ton signal qui créé l'interruption.
    Justement le temps entre deux impulsions n'est pas constant.
    Si je prends une echelle de temps de 1µs voir 5µs il n'y a qu'une seule impulsion qui apparait est toujours au même endroit.

    Si j'augmente mon echelle de temps de l'ordre de 5ms par division, j'ai réussi à en voir 3 espacés de 18ms, mais ceci est assez aléatoire, j'enverrai qu'une puis deux ou trois, il n'y a pas de régularité.

    Le temps de 1µs est le temps ou "maj" passe de 1 à 0.

    Si le signal à l'entrée de la pin RC2 est un signal de 100Hz, qu'elle valeur dois je obtenir dans ma variable "duree"?

  11. #10
    amoniaque

    Re : adaptation code pic18f

    Citation Envoyé par Ticlem Voir le message
    Si le signal à l'entrée de la pin RC2 est un signal de 100Hz, qu'elle valeur dois je obtenir dans ma variable "duree"?
    Dure de dire, on ne connait pas la fréquence de ton quartz.

    Mais tu peux nous montrer les calculs que tu as fait pour obtenir ces choix de configurations de CCP1.

  12. #11
    Ticlem

    Re : adaptation code pic18f

    J'ai un quartz de 8MHz.
    De plus mon signal varie de 30Hz à 500Hz, bien sur il y a une phase de transition entre le signal eteint de 0Hz à allumé 30Hz.
    Soit une periode maximal de 33000µs.

    Avec un prédiviseur de 8 le pic à des cycles de (1/(8000000/4))*8=4µs.
    Le timer1 s'incrémente donc toute les 4µs et ce jusqu'à 65536 incrémentations. Soit la période max sans débordement est de 262144µs.
    Je suis donc loin de tout débordement mais le prediviseur de 1 n'est pas suffisant puisque j'aurai des cycles de 0.5µs soit un débordement au bout de 32768µs. Par contre le prédiviseur de 2 suffirait peut être, il faudrait que j'alimente le pic qu'une fois la phase de transition passé.

    Donc à 100Hz, j'ai une période de 10 000µs donc divisé par 4 de 2500 incrémentation du timer1. Ainsi ma variable duree sera égale à 2500.

    Sauf que je dois remettre le timer1 à 0 à chaque fois que je remet maj = 0 sinon ma variable duree prendre les valeurs 2500 puis 5000 et 8500 etc et cela m'engendrera des erreurs.

    Est ce que je fais des erreurs de resonnement, ou de programmation?

  13. #12
    Ticlem

    Re : adaptation code pic18f

    Citation Envoyé par Ticlem Voir le message
    Sauf que je dois remettre le timer1 à 0 à chaque fois que je remet maj = 0 sinon ma variable duree prendre les valeurs 2500 puis 5000 et 8500 etc et cela m'engendrera des erreurs.
    Pour eviter ce problème voilà ce que je propose :
    Je crée une nouvelle variable.
    Code:
     
    unsigned int duree=5555;
    unsigned int dold=0;
    char maj=1;
    Je fais donc la différence afin d'obtenir, la période de mon signal
    Code:
    void itcomp(void)
    {
    unsigned static int ancien;
    	if(PIR1bits.CCP1IF)
    					{
    					duree=CCPR1-dold;
    					dold=CCPR1;
    					maj=1;
    					PORTB=0b00000101;
    					}
    	PIR1bits.CCP1IF=0;
    
    }
    Et si ma variable "dold" ("duree old") est plus grande que la variable "duree" alors il y eu débordement.
    Donc tant que "duree" est supérieur à "dold" je pourais allumer des leds en fonction de la fréquence sinon je fais rien.

    Code:
    	while(1)
    		{
    			
    		if(maj){
    			if(duree>dold){PORTB=0b000000;}
    			maj=0;
    		           } 
    			
    		}
    }
    Est ce bon? Il y a peut être des erreurs que je ne vois pas!

  14. #13
    Ticlem

    Re : adaptation code pic18f

    Citation Envoyé par Ticlem Voir le message
    J'ai un quartz de 8MHz.
    De plus mon signal varie de 30Hz à 500Hz, bien sur il y a une phase de transition entre le signal eteint de 0Hz à allumé 30Hz.
    Soit une periode maximal de 33000µs.

    Avec un prédiviseur de 8 le pic à des cycles de (1/(8000000/4))*8=4µs.
    Le timer1 s'incrémente donc toute les 4µs et ce jusqu'à 65536 incrémentations. Soit la période max sans débordement est de 262144µs.
    Je suis donc loin de tout débordement mais le prediviseur de 1 n'est pas suffisant puisque j'aurai des cycles de 0.5µs soit un débordement au bout de 32768µs. Par contre le prédiviseur de 2 suffirait peut être, il faudrait que j'alimente le pic qu'une fois la phase de transition passé.

    Donc à 100Hz, j'ai une période de 10 000µs donc divisé par 4 de 2500 incrémentation du timer1. Ainsi ma variable duree sera égale à 2500.
    Sauf que je dois remettre le timer1 à 0 à chaque fois que je remet maj = 0 sinon ma variable duree prendre les valeurs 2500 puis 5000 et 8500 etc et cela m'engendrera des erreurs.

    Est ce que je fais des erreurs de resonnement, ou de programmation?
    J'ai essayé de vérifier ces calculs, ben je ne trouves pas du tout ce résultat, voici ce que la pratique donne :
    pour 1.5Khz j'ai "duree" égale à 1000
    pour 750Hz j'ai 2000
    pour 500Hz j'ai 3000
    etc
    pour 100Hz j'ai 15000

    En gros ces resultats correspondent à une quartz de 48MHz.....

    D'ou vient cette différence? Des bits de configurations?

  15. #14
    Ticlem

    Re : adaptation code pic18f

    J'ai ce pic en bootloader :
    http://www.tigal.com/product/2132

    J'ai inversé la masse et l'alim, je ne sais pas pourquoi, et je n'arrive plus à alimenter le pic. Même en usb, j'ai vu la lumiere "power" très faible et puis s'éteindre....

    Mon pic est bon pour la poubelle?

Discussions similaires

  1. Programmation pic18f
    Par invite8a011b82 dans le forum Électronique
    Réponses: 4
    Dernier message: 05/01/2011, 12h23
  2. Interfacage lecteur code à barres PS/2 - PIC18F
    Par invite2d9e7c03 dans le forum Électronique
    Réponses: 2
    Dernier message: 27/11/2010, 15h23
  3. pic18f
    Par nirvo dans le forum Électronique
    Réponses: 10
    Dernier message: 01/07/2010, 09h15
  4. Un langage codé léger, 2 caractères non codé=1 caractère codé. Une solution?
    Par invite06e0b926 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 30/06/2010, 10h02
  5. Pic18f Adc
    Par invitecfe43b36 dans le forum Électronique
    Réponses: 1
    Dernier message: 28/07/2006, 14h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.