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 :

programme en C pr uC


Sujet :

C

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut programme en C pr uC
    Bonjour
    pourriez vous m'expliquer ce que fais le programme suivant
    je veux tester mon microcontroleur pic18f4620 et j'ai trouvé ce prog sur net , vu que je suis pa trop douée en C , j'ai besoin de savoir ce que fais exactement ce programme

    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
    91
    92
    93
    94
    /** I N C L U D E S **************************************************/
    #include "p18f4620.h"
    #include "delays.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <usart.h>
    /**Bits de configuration**********************************************/
    #pragma config OSC=HSPLL 
    #pragma config PWRT=ON
    #pragma config BOREN=OFF
    #pragma config WDT=OFF
    #pragma config MCLRE=ON
    #pragma config PBADEN=OFF
    #pragma config LVP=OFF
    #pragma config XINST=OFF
    #define CLOCK_FREQ		(40000000)      // Hz
    /*#pragma config OSC = INTIO7//Internal oscillator block, port function on RA6 and RA7
    #pragma config FCMEN = OFF//Fail-Safe Clock Monitor disabled
    #pragma config PWRT = OFF//Power-up Timer disabled
    #pragma config WDT = OFF//Watchdog Timer disabled
    #pragma config MCLRE = ON//MCLR pin enabled; RE3 input pin disabled*/
     
    /**Prototypes**********************************************************/
    void InitInterrupt();
    void InitUART(void);
    void Fonction (int fct);
    void UpdateDutyCycle();
    void low_isr();
    /**Variables***********************************************************/
    unsigned int cnt8000 = 0;
    char cntDty = 0;
    char boolUpdateDty = 0;
    const unsigned char Dty [24] = {128, 160, 191, 218, 238, 251, 255, 251, 238, 218, 191, 160, 128, 95, 64, 37, 17, 4, 0, 4, 17, 37, 64, 95}; // Testing
    unsigned long int tempDty1 = 0, tempDty2 = 0;
    /*SETUP ISR VECTOR******************************************************/
    #pragma code low_vector=0x18    //setup the ISR (interupt service routenes) vector
    void low_interrupt (){
      _asm GOTO low_isr _endasm    //jump to interrupt handler
    }
    #pragma code
    /*ISR********************************************************************/
    #pragma interruptlow low_isr    //the ISR
    void low_isr()
    {
        if (PIR1bits.TMR2IF == 1)
    	{
    		PIR1bits.TMR2IF=0;
    		boolUpdateDty = 1;
     
    		if (cnt8000 < 8000)
    			cnt8000++;
    		else
    			cnt8000 = 0;
        }
    }
    #pragma code
    /** D E C L A R A T I O N S *******************************************/
    void main()
    {
    	InitInterrupt();
    	T2CONbits.TMR2ON = 1;
     
    	while (1)
    	{
    		if (boolUpdateDty==1)
    		{
    			boolUpdateDty = 0;
    			UpdateDutyCycle();
    		}
    	}
    }
     
    void InitInterrupt()
    {
    	PIE1bits.TMR2IE = 1;	//enable Timer2 interrupt
            INTCONbits.PEIE = 1;    //enable peripheral interrupts
            INTCONbits.GIE = 1;     //enable glogal interrupts
    	IPR1bits.TMR2IP = 0;	// low priority
    }
    void UpdateDutyCycle()
    {
     
    	if ((cnt8000%334)==0)
    	{
    		tempDty1 = 50000/255;
    		tempDty2 = Dty[cntDty]*tempDty1/100;
     
    		SetDCPWM1(tempDty2);
    		if (cntDty < 22)
    			cntDty++;
    		else
    			cntDty = 0;
    	}
    }
    Merciii

  2. #2
    Modérateur

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

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il y a des points en particulier que tu ne comprends pas et qu'il y a au moins des parties que tu comprends... Ce serait bien de préciser un peu ce que tu comprends, ça ira plus vite d'expliquer ce qui manque que tout.

    En vrac :

    Les #pragma sont des commandes liées au compilateur (C18 je présume) pour configurer directement certains registres du PIC (par exemple #pragma config OSC=HSPLL pour fixer la source de l'oscillateur), ou indiquer des zones différents de la source (#pragma code low_vector=0x18 pour une interruption, #pragma code pour du code général, il pourrait aussi y avoir d'autres #pragma pour la définition des variables globales). Voir la documentation du compilateur pour les détails.

    _asm GOTO low_isr _endasm pour mettre du code assembleur dans du code C.

    PIR1bits.TMR2IF : ce genre d'écriture permet d'accéder un bit particulier (ici le bit TMR2IF) d'un port particulier (ici, PIR1). Il faut regarder le fichier #include "p18f4620.h" pour voir tous les ports et bits accessibles, et bien sûr faire une comparaison avec la documentation du PIC.

    void InitInterrupt() active les interruptions. Voir doc du PIC pour comprendre pourquoi c'est fait ainsi.

    UpdateDutyCycle() semble faire une mise à jour du rapport cyclique de la PWM. Le calcul pour la mise à jour dépend de l'application.

    Tu ne nous mets pas tout le code, ou alors le code que tu as récupéré n'est pas complet.



    Voila voila !

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    salut,

    Le plus simple quand on commence, c'est d'utiliser une carte d'évaluation : avec, tu auras un programme qui va bien et dont tu seras sure qu'il fonctionne.

    Pourquoi cherches-tu as comprendre ce code ? tu veux faire quoi exactement ?

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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