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 :

Problème d'interruption sur PIC16F877


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Par défaut Problème d'interruption sur PIC16F877
    Bonjour,

    je vais exposer mon problème je travaille sur un projet qui me permet de compter via des interruptions et on envoie des consignes a partir du PC via la RS232 j'utilise comme microcontroleur un PIC16F877. Le programme est simple a chaque fois que mon timer fait un overflow l'interruption incrémente une variable etc. mais mon problème n'est pas la, c'est que lorsque j'alimente ma carte, pour la faire fonctionner je dois procéder a plusieurs RESET sur la pin MCLR.

    Y a t-il une instruction particulière pour activer au démarrage les interruptions? (surtout pour la RS232)

    voici mon code d'interruption et des instructions présente dans ma boucle principale permettant l'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void interrupt()
    {
    if ((Usart_Data_Ready()) && (PIR1.RCIF==1))
    {
    CONSIGNES = Usart_Read();
    PIR1.RCIF = 0;
    }
     
    if (PIR1.TMR2IF)
    {
    compteur_ms++ ;
    PIR1.TMR2IF = 0;
    }
    }
    et dans ma boucle main j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INTCON = 0xC0; // interruptions USART
    PIE1.RCIE = 1;
    PIR1.RCIF = 0;
     
    T2CON = 0x4C; // Configurations du Timer2
    PR2 = 247;
    TMR2 = 0; // Initialisation du registre Timer2
    puis dernières lignes qui concerne les lancements du timer2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PIE1.TMR2IE = 1; // interruptions TIMER2 activées
     
    // une partie de code qui va faire des comparaisons
     
    PIE1.TMR2IE = 0; // interruptions TIMER2 désactivées.
    Petite précision une fois que les resets sont effectués la totalité du programme que j'ai créé fonctionne parfaitement mais le but principal de mon projet c'est qu'il fonctionne sans qu'on aie a faire des resets.

    merci d'avance pour vos futures réponses

  2. #2
    Membre chevronné
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Par défaut
    J'ai pas tout capté, ni au but recherché ni au problème, mais on va essayer quand même...

    pourrais-tu poster tout le code de l'interruption (je déduit qu'il y a autre sinon ça ne peut pas marcher dans l'état...) et les initialisations dans la main (voir tout le main), ça pourrait aider.

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Par défaut
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    #define barriere_1 PORTA.F2
    #define barriere_3 PORTA.F4
    #define barriere_4 PORTA.F5
     
    #define LED_GO PORTA.F1
    #define LED_RESET PORTA.F0
     
    unsigned char CONSIGNES='0';
     
    unsigned char compteur_ms = 0;
    unsigned char compteur_cs = 0;
    unsigned char compteur_s = 0;
    unsigned char compteur_min = 0;
    int j;
     
    unsigned char TABCPT1[4]={0,0,0,0};
    unsigned char TABCPT2[4]={0,0,0,0};
     
    void interrupt(void);
    void FONCTION_CAT1 (void);
    void FONCTION_CAT2 (void);
    unsigned char comptage1(void);
    unsigned char comptage2(void);
    void ecritureEEPROM(unsigned char addr, unsigned char donnee);
    unsigned char LectureEEPROM(unsigned char addr);
     
    void interrupt(void)
    {
       if ((Usart_Data_Ready()) && (PIR1.RCIF==1))
       {
          CONSIGNES = Usart_Read();
          PIR1.RCIF = 0;
       }
     
       if (PIR1.TMR2IF)
       {
          compteur_ms++ ;                   // increment counter
          PIR1.TMR2IF = 0;                  // clears TMR2IF
       }
    }
     
    void main(void)
    {
        ADCON1 = 0x07;         // tout en numérique pour le portA
     
        PCON = 0x00;
        PCON = 0x03;
     
        INTCON = 0xC0;         // interruptions USART
        PIE1.RCIE = 1;
        PIR1.RCIF = 0;
     
        T2CON = 0x4C;          // Configurations du Timer2
        PR2 = 247;
        TMR2  =   0;           // Initialisation du registre Timer2
     
        TRISA = 0x34;          // Barrières en entrées leds en sorties
        PORTA = 0x37;
        TRISB = 0x03;          // BPs en entrées
        PORTB = 0x00;
     
        Usart_Init(2400);      // 2400 bauds
        I2C_Init(400000);      // I2C initialisé a 400kHz
     
        for( ; ; )                // boucle infinie
        {
            int i;
     
            if ((CONSIGNES == '1'))
            {
                CONSIGNES = '0';
                FONCTION_CAT1();
            }
     
            if ((CONSIGNES == '2'))
            {
                CONSIGNES = '0';
                FONCTION_CAT2();
            }
     
            if(CONSIGNES == 'A')
            {
                CONSIGNES = '0';
                for(i=0;i<1024;i++)
                {
                    Usart_Write(LectureEEPROM(i));
                }
            }
     
            if (CONSIGNES == 'R')
            {
                LED_RESET = 0;
                CONSIGNES = '0';
     
                for(i=0;i<1024;i++)
                {
                    Usart_Write(LectureEEPROM(i));    // envoi de toute la mémoire par la RS
                    Delay_ms(2);
                }
     
                for(i=0;i<1024;i++)
                {
                    ecritureEEPROM(i,0x00);     // reset de l'EEPROM
                    Delay_ms(10);
                }
     
                j=0;
     
                LED_RESET = 1;
            }
            else
            {
                PIR1.RCIF==1;
            }
        }
    }
     
    void FONCTION_CAT1 (void)
    {
        int i;
     
        LED_GO = 0; // Led allumée
        LED_RESET = 1; // Led éteinte
     
        compteur_ms = 0;
        compteur_cs = 0;
        compteur_s = 0;
        compteur_min = 0;
     
        Usart_Write('Z');
     
        TMR2 = 0;
        while(barriere_1 == 1);
        {
               //attends que l'on traverse la première barrière
        }
     
        PIE1.TMR2IE = 1;            //  interruptions activées
     
        do
        {
            comptage1();    // compte les ms
        }
        while(barriere_3 == 1); // tant que on a pas traversé la 4eme barriere
     
        PIE1.TMR2IE = 0;            //  interruptions désactivées
     
        Usart_Write(TABCPT1[0]);  //
        Usart_Write(TABCPT1[1]);  //
        Usart_Write(TABCPT1[2]);  //
        Usart_Write(TABCPT1[3]);  //  envoi des temps
     
        compteur_ms = 0;
        compteur_cs = 0;
        compteur_s = 0;
        compteur_min = 0;
     
        TMR2 = 0;
     
        Delay_ms(3000);
     
        while(barriere_3 == 1);
        {
               //attends que l'on traverse la troisième barrière
        }
     
        PIE1.TMR2IE = 1;            //  interruptions activées
        do
        {
            comptage2();
        }
        while(barriere_1 == 1); // tant que on a pas traversé la 1ere barriere
     
        PIE1.TMR2IE = 0;            // interruptions désactivées
     
        Usart_Write(TABCPT2[0]);  //
        Usart_Write(TABCPT2[1]);  //
        Usart_Write(TABCPT2[2]);  //
        Usart_Write(TABCPT2[3]);  //
     
        for(i=0;i<4;i++)
        {
            ecritureEEPROM(j, TABCPT1[i]);         //stockage dans la mémoire
            j++;
            Delay_ms(10);
        }
        for(i=0;i<4;i++)
        {
            ecritureEEPROM(j, TABCPT2[i]);
            j++;
            Delay_ms(10);
        }
     
        if (j>127)
        {
            if(Usart_Data_Ready)
            {
               Usart_Write('M');
            }
        }
     
        Usart_Write('F');
        Delay_ms(20);
        LED_GO = 1;
        LED_RESET=1;
    }
     
    void FONCTION_CAT2 (void)
    {
        int i;
     
        LED_GO = 0; // Led allumée
        LED_RESET = 1; // Led éteinte
     
        compteur_ms = 0;
        compteur_cs = 0;
        compteur_s = 0;
        compteur_min = 0;
     
        Usart_Write('Z');
     
        TMR2 = 0;
        while(barriere_1 == 1);
        {
               //attends que l'on traverse la première barrière
        }
     
        PIE1.TMR2IE = 1;            //  interruptions activées
     
        do
        {
            comptage1();    // compte les ms
        }
        while(barriere_4 == 1); // tant que on a pas traversé la 4eme barriere
     
        PIE1.TMR2IE = 0;            // interruptions désactivées
     
        Usart_Write(TABCPT1[0]);  //
        Usart_Write(TABCPT1[1]);  //
        Usart_Write(TABCPT1[2]);  //
        Usart_Write(TABCPT1[3]);  //  envoi des temps
     
        compteur_ms = 0;
        compteur_cs = 0;
        compteur_s = 0;
        compteur_min = 0;
     
        TMR2 = 0;
     
        Delay_ms(3000);
     
        while(barriere_4 == 1);
        {
               //attends que l'on traverse la quatrième barrière
        }
     
        PIE1.TMR2IE = 1;            //  interruptions activées
        do
        {
            comptage2();
        }
        while(barriere_1 == 1); // tant que on a pas traversé la 1ere barriere
     
        PIE1.TMR2IE = 0;            // interruptions désactivées
     
        Usart_Write(TABCPT2[0]);  //
        Usart_Write(TABCPT2[1]);  //
        Usart_Write(TABCPT2[2]);  //
        Usart_Write(TABCPT2[3]);  //
     
        for(i=0;i<4;i++)
        {
            ecritureEEPROM(j, TABCPT1[i]);         //stockage dans la mémoire
            j++;
            Delay_ms(10);
        }
        for(i=0;i<4;i++)
        {
            ecritureEEPROM(j, TABCPT2[i]);
            j++;
            Delay_ms(10);
        }
     
        if (j>127)
        {
            if(Usart_Data_Ready)
            {
               Usart_Write('M');
            }
        }
     
        Usart_Write('F');
        Delay_ms(20);
        LED_GO = 1;
        LED_RESET=1;
    }
     
    unsigned char comptage1 (void)
    {
        if(compteur_ms >= 10)           // si ça fais 1 centième de seconde...
        {
            compteur_ms = 0;              // on remet les millisecondes a 0
            compteur_cs++;
        }
            if(compteur_cs >=100)      //si ça va fais 1 seconde...
            {
                compteur_cs = 0;
                compteur_s++;          // on incrémente d'une seconde
            }
     
            if(compteur_s >= 60)           // si ça fais 1 minute...
            {
                compteur_s = 0;
                compteur_min++;
            }
               if(compteur_min >=60)   // si ça fais 1 heure...
               {
                  compteur_min = 0;
               }
     
        TABCPT1[0] = compteur_ms;
        TABCPT1[1] = compteur_cs;
        TABCPT1[2] = compteur_s;
        TABCPT1[3] = compteur_min;
     
        return ((unsigned char)TABCPT1);
    }
     
    unsigned char comptage2 (void)
    {
        if(compteur_ms >= 10)           // si ça fais 1 centième de seconde...
        {
            compteur_ms = 0;              // on remet les millisecondes a 0
            compteur_cs++;
        }
            if(compteur_cs >=100)      //si ça va fais 1 seconde...
            {
                compteur_cs = 0;
                compteur_s++;          // on incrémente d'une seconde
            }
     
            if(compteur_s >= 60)           // si ça fais 1 minute...
            {
                compteur_s = 0;
                compteur_min++;
            }
               if(compteur_min >=60)   // si ça fais 1 heure...
               {
                  compteur_min = 0;
               }
     
        TABCPT2[0] = compteur_ms;
        TABCPT2[1] = compteur_cs;
        TABCPT2[2] = compteur_s;
        TABCPT2[3] = compteur_min;
     
        return ((unsigned char)TABCPT2);
    }
     
    void ecritureEEPROM(unsigned char addr, unsigned char donnee)
    {
        I2C_Start();           // start signal
        I2C_Wr(0xA0);          // envoi byte via I2C (adresse EEPROM + W)
        I2C_Wr(addr);          // envoi byte (data adress)
        I2C_Wr(donnee);        // envoi byte (donnée)
        I2C_Stop();            // stop signal
    }
     
    unsigned char LectureEEPROM(unsigned char addr)
    {
        unsigned char result;
     
        I2C_Start();           // start signal
        I2C_Wr(0xA0);          // envoi byte via I2C  (addresse EEPROM + W)
        I2C_Wr(addr);          // envoi byte (data address)
        I2C_Repeated_Start();  // start signal répété
        I2C_Wr(0xA1);          // envoi byte (addresse EEPROM + R)
        result = I2C_Rd(0u);   // lecture donnée (NO acknowledge)
        I2C_Stop();
        return result;
    }
    voici tout mon programme pour info j'utilise les routines qui sont déjà intégrées a mon logiciel de développement mikroC donc le but que je recherche est que je souhaite que mon programme dès qu'il est alimenté se prépare a recevoir des données via la liaison RS232 car pour le moment je fais quelques resets manuels via la pin MCLR avant de pouvoir communiquer avec le pic.

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Bonjour,

    Il faut savoir que dans la configuration des registres du PIC il existe également les directives "config", qui permettent de manipuler d'autres types de registres. Pour cela tu as des macros qui permettent de les configurer (j'en ai pas vu dans ton code).

    Ou tu as sous MPLAB une petite interface te permettant de tout configurer (configure -> Configuration Bits dans le menu).

    En ce qui est du MCLRE tu peux le desactiver, tu peux configurer également le WDT, les oscillateurs et beaucoup d'autres choses.

    Pour ton problème d'interruption n'oublie pas de valider toutes les interruptions (je ne connais pas le registre en question pour le 16F877 donc il faut se repporter à la datasheet).

Discussions similaires

  1. Problème d'interruption sur PIC18
    Par MITCH23 dans le forum C
    Réponses: 1
    Dernier message: 06/10/2014, 12h29
  2. Problème de reqûete sur la date, année et mois en cours
    Par Jean-Marc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2004, 16h36
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 09h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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