Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Aide probleme mikroc + 16f628A



  1. #1
    samot29

    Aide probleme mikroc + 16f628A


    ------

    Bonjour,

    Je réalise une petite appli pour un ami mais j'ai un problème sur la gestion des interruptions.
    L'appli est un compteur qui s'incrémente à chaque fois que RB0 passe à 0. Cette valeur du compteur est écrite en eeprom et quand (compteur = consigne ) --> "RB7 = 1".
    Tout fonctionne correctement sauf que régulièrement les données EEprom sont vérolées après un reset ou un ON/OFF. J'ai essayé plusieurs configuration de INTCON mais rien n'y fait.
    Je pense que c'est lié à la gestion des interruptions car seul la valeur eeprom du compteur est affectée et jamais la consigne. Quelqu'un peut-il m'aider à bien configurer le registre du PIC ?


    Code :


    void main() {
    CMCON |= 7;
    TRISA4_bit = 1;
    TRISA6_bit = 1;
    TRISA7_bit = 1;
    TRISB = 0x01; // Rbo en entrée, Rb1 à Rb7 en sortie
    PORTB = 0;
    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR); // Clear display
    Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
    Lcd_Out(1,1,message1);
    delay_ms(3000); // Delay 3s
    LIRE_E2P_CONSIGNE();
    LIRE_E2P_COMPTEUR();
    Lcd_cmd(_LCD_Clear);
    Lcd_Out(1,1,message5); // Write message1 in 1st row

    INTCON = 0x90; <----- Problème ??

    do {
    AFFICHE_CONSIGNE();
    RAFRAICHIR_COMPTEUR();
    } while(1);
    }

    void interrupt(){
    if (INTCON.INTF == 1)
    VAL_COMPTEUR = VAL_COMPTEUR +1;
    INTCON = 0xB0;
    INTCON.INTE = 1;
    }

    Merci d'avance pour votre aide

    -----

  2. Publicité
  3. #2
    paulfjujo

    Re : Aide probleme mikroc + 16f628A

    bonsoir,


    INTCON=0x90;
    me parait correct . GIE=1 INTE=1
    mais dans l'interrupt :

    Code:
    void interrupt(){
    if (INTCON.INTF == 1)
    VAL_COMPTEUR = VAL_COMPTEUR +1;
    INTCON = 0xB0;
    INTCON.INTE = 1;
    }
    Pourquoi INTCON=0xB0; // => GIE=1 PEIE=1 ? INTF=0
    plutot
    INTCON.INTF=0; // raz du flag et c'est tout , pas besoin de toucher à INTE, GIE et PEIE ?

    Comment geres-tu les stockage et lectures en EEPROM
    car si PEIE =1 risque d'interrupt par l'EEPROM

    rajoute les details de tes sous programmes , en particulier le stockage et lecture eeprom ...

  4. #3
    samot29

    Re : Aide probleme mikroc + 16f628A

    J'ai copié la partie interruption sur un exemple sans tout comprendre l'impact sur les options (en changeant jusqu'à ce que cela fonctionne !)
    Voici le code concernant la copie de la consigne en e2p :

    void SAVE_CONSIGNE()
    {
    if (Button(&PORTA, 0, 100, 1)) // Detect logical one to zero
    {
    for (ii=0; ii<=3; ii++)
    EEPROM_Write(0x00+ii,TMP_CONSI GNE[ii]);
    }
    }


    void LIRE_E2P_CONSIGNE()
    {
    for (ii=0; ii<3; ii++)
    {
    All = EEPROM_Read(0x00+ii); // Start EEPROM Location,
    TMP_CONSIGNE[ii] = All+48; // Look at ascii table
    }
    VAL_CONSIGNE = 0;
    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x03) - 48) * 1;
    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x02) - 48) * 10;
    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x01) - 48) * 100;
    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x00) - 48) * 1000;

    J'ai fait l'essai suivant tes recommandations (INTCON.INTF=0; seulement) mais c'est idem.

    Au besoin je peux mettre le code entier mais il n'est pas commenté et pas du tout optimisé (je suis débutant en programmation)

    samot29

  5. #4
    paulfjujo

    Re : Aide probleme mikroc + 16f628A

    bonjour,

    Ou est initialise TEMP_CONSIGNE[]?
    Poste tout ton code ...

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    samot29

    Re : Aide probleme mikroc + 16f628A

    Voila la totalite du code :

    /*

    '***************************** ****************************** ********************

    ' Réalisé par:

    ' samot29



    ' MCU: PIC16F628A

    ' Configuration Word

    ' Oscillator: 4Mhz INTOSC:I/O on RA.6, I/O on RA.7

    ' Watchdog Timer: OFF

    ' Power up Timer: Disabled

    ' Master Clear Enable: Enabled

    ' Browun Out Detect: Enabled

    ' Low Voltage Program: Disabled

    ' Code Protect: OFF

    '***************************** ****************************** ********************

    */

    // LCD module connections

    sbit LCD_RS at RB5_bit; // LCD_RS assigned to PORT RB4;

    sbit LCD_EN at RB6_bit; // LCD_EN assigned to PORT RB5;

    sbit LCD_D4 at RB1_bit; // LCD_D4 assigned to PORT RB0;

    sbit LCD_D5 at RB2_bit; // LCD_D5 assigned to PORT RB1;

    sbit LCD_D6 at RB3_bit; // LCD_D6 assigned to PORT RB2;

    sbit LCD_D7 at RB4_bit; // LCD_D7 assigned to PORT RB3;



    sbit LCD_RS_Direction at TRISB5_bit; // LCD_RS assigned to TRIS B4;

    sbit LCD_EN_Direction at TRISB6_bit; // LCD_EN assigned to TRIS B5;

    sbit LCD_D4_Direction at TRISB1_bit; // LCD_D4 assigned to TRIS B0;

    sbit LCD_D5_Direction at TRISB2_bit; // LCD_D5 assigned to TRIS B1;

    sbit LCD_D6_Direction at TRISB3_bit; // LCD_D6 assigned to TRIS B2;

    sbit LCD_D7_Direction at TRISB4_bit; // LCD_D7 assigned to TRIS B3;

    // End LCD module connections



    // Define Messages

    char message1[] = "* COMPTEUR *";

    char message2[] = " DE CYCLES ";

    char message3[] = " CONFIGURATION ";

    char message4[] = "Rst (-) (+) Ent";

    char message5[] = "CONSIGNE :";

    char message6[] = "Val :";

    char message7[] = "COMPTEUR :";

    char message8[] = "RAZ / RETOUR";

    char message9[] = " REMISE A ZERO ";

    char message10[] = "* CONSIGNE *";

    char message11[] = " RAZ COMPTEUR ";



    unsigned short ii, All ;

    signed int VAL_CONSIGNE;

    unsigned int nbre;

    unsigned int VAL_COMPTEUR = 0;

    char *TMP_CONSIGNE = "0000";

    char *TMP_COMPTEUR = "0000";



    void AFFICHE_COMPTEUR()

    {

    //LIRE_E2P_COMPTEUR();

    TMP_COMPTEUR[0] = VAL_COMPTEUR/1000 + 48; // milier;

    TMP_COMPTEUR[1] = (VAL_COMPTEUR/100)%10 +48; // centaine;

    TMP_COMPTEUR[2] = (VAL_COMPTEUR/10)%10 + 48; // dizaine ;

    TMP_COMPTEUR[3] = VAL_COMPTEUR%10 +48; // unite ;

    Lcd_Out(2,13,TMP_COMPTEUR); // affichage / LCD col 2, caract.7;



    }

    void SAVE_COMPTEUR()

    {

    for (ii=0; ii<=3; ii++)

    EEPROM_Write(0x04+ii,TMP_COMPT EUR[ii]);

    }



    RAFRAICHIR_COMPTEUR()

    {

    AFFICHE_COMPTEUR();

    SAVE_COMPTEUR();

    if (VAL_COMPTEUR > VAL_CONSIGNE) // if it's more than 9999 go to 0;

    PORTB.B7 =1 ;

    else

    PORTB.B7 =0 ;

    AFFICHE_COMPTEUR();

    }



    void interrupt(){

    if (INTCON.INTF == 1)

    VAL_COMPTEUR = VAL_COMPTEUR +1;

    //INTCON = 0xB0;

    INTCON.INTF=0 ;

    }



    void AFFICHE_CONSIGNE()

    {

    TMP_CONSIGNE[0] = VAL_CONSIGNE/1000 + 48; // milier;

    TMP_CONSIGNE[1] = (VAL_CONSIGNE/100)%10 +48; // centaine;

    TMP_CONSIGNE[2] = (VAL_CONSIGNE/10)%10 + 48; // dizaine ;

    TMP_CONSIGNE[3] = VAL_CONSIGNE%10 +48; // unite ;

    Lcd_Out(1,13,TMP_CONSIGNE); // affichage / LCD col 2, caract.7;

    }





    void RAFRAICHIR_CONSIGNE()

    {

    if(Button(&PORTA,1,100,1)){

    // Delay_ms(50); // If button is pressed, delay 0,2s and increment "number" with 1;

    VAL_CONSIGNE = VAL_CONSIGNE +1;

    if (VAL_CONSIGNE > 999)

    {VAL_CONSIGNE = 0 ;

    }

    }

    if(Button(&PORTA,6,100,1)){

    // Delay_ms(50); // If button is pressed, delay 0,2s and decrement "number" with 1;

    VAL_CONSIGNE = VAL_CONSIGNE -1;

    if (VAL_CONSIGNE < 0)

    {VAL_CONSIGNE = 0 ;

    }

    }

    if(Button(&PORTA,7,100,1)){

    // Delay_ms(50); // If button is pressed, delay 0,2s and decrement "number" with 1;

    VAL_CONSIGNE = 0;

    }

    Lcd_Out(1,1,message5);

    AFFICHE_CONSIGNE();

    }



    void SAVE_CONSIGNE()

    {

    if (Button(&PORTA, 0, 100, 1)) // Detect logical one to zero

    {

    for (ii=0; ii<=3; ii++)

    EEPROM_Write(0x00+ii,TMP_CONSI GNE[ii]);

    }

    }



    void LIRE_E2P_CONSIGNE()

    {

    for (ii=0; ii<3; ii++)

    {

    All = EEPROM_Read(0x00+ii); // Start EEPROM Location,

    TMP_CONSIGNE[ii] = All+48; // Look at ascii table

    }

    VAL_CONSIGNE = 0;

    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x03) - 48) * 1;

    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x02) - 48) * 10;

    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x01) - 48) * 100;

    VAL_CONSIGNE = VAL_CONSIGNE + (EEPROM_Read(0x00) - 48) * 1000;

    }

    void LIRE_E2P_COMPTEUR()

    {

    for (ii=0; ii<3; ii++)

    {

    All = EEPROM_Read(0x04+ii); // Start EEPROM Location,

    TMP_COMPTEUR[ii] = All+48; // Look at ascii table

    }

    VAL_COMPTEUR = 0;

    VAL_COMPTEUR = VAL_COMPTEUR + (EEPROM_Read(0x07) - 48) * 1;

    VAL_COMPTEUR = VAL_COMPTEUR + (EEPROM_Read(0x06) - 48) * 10;

    VAL_COMPTEUR = VAL_COMPTEUR + (EEPROM_Read(0x05) - 48) * 100;

    VAL_COMPTEUR = VAL_COMPTEUR + (EEPROM_Read(0x04) - 48) * 1000;

    }



    void CONF_CONSIGNE()

    //On rentre ici si on appui sur la touche reglage lors de l'init (1s)

    {

    if (Button(&PORTA, 0, 100, 1)) // Detect appui sur reglage;

    {

    Lcd_Cmd(_LCD_CLEAR);

    Lcd_Out(1,1,message3);

    Lcd_Out(2,1,message10);

    delay_ms(3000); // Delay 1s

    Lcd_Cmd(_LCD_CLEAR);

    Lcd_Out(2,1,message4);

    do{

    RAFRAICHIR_CONSIGNE();

    if (Button(&PORTA, 0, 100, 1))

    {SAVE_CONSIGNE();

    break;

    }

    }while(1);

    }

    }



    void RAZ_COMPTEUR()

    //On rentre ici si on appui sur la touche reglage lors de l'init (1s)

    {

    if (Button(&PORTA, 7, 100, 1)) // Detect appui sur reglage;

    {

    Lcd_Cmd(_LCD_CLEAR);

    Lcd_Out(1,1,message9);

    Lcd_Out(2,1,message1);

    delay_ms(3000); // Delay 1s

    Lcd_Cmd(_LCD_CLEAR);

    Lcd_Out(2,1,message8);

    Lcd_Out(1,1,message7);

    TMP_COMPTEUR[0] = VAL_COMPTEUR/1000 + 48; // milier;

    TMP_COMPTEUR[1] = (VAL_COMPTEUR/100)%10 +48; // centaine;

    TMP_COMPTEUR[2] = (VAL_COMPTEUR/10)%10 + 48; // dizaine ;

    TMP_COMPTEUR[3] = VAL_COMPTEUR%10 +48; // unite ;

    Lcd_Out(1,13,TMP_COMPTEUR); // affichage / LCD col 2, caract.7; do{

    do{

    if(Button(&PORTA,7,100,1)){

    VAL_COMPTEUR = 0;

    AFFICHE_COMPTEUR();

    SAVE_COMPTEUR();

    break;

    }

    if(Button(&PORTA,0,100,1))

    {

    break;

    }

    }while(1);

    }

    }

    void main() {

    CMCON |= 7; // Disable Comparators

    TRISA4_bit = 1;

    TRISA6_bit = 1;

    TRISA7_bit = 1;

    TRISB = 0x01; // Rbo en entrée, Rb1 à Rb7 en sortie

    PORTB = 0;

    Lcd_Init();

    Lcd_Cmd(_LCD_CLEAR); // Clear display

    Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

    Lcd_Out(1,1,message1);

    Lcd_Out(2,1,message2);

    delay_ms(3000); // Delay 3s

    LIRE_E2P_CONSIGNE();

    LIRE_E2P_COMPTEUR();

    CONF_CONSIGNE();

    RAZ_COMPTEUR();

    Lcd_cmd(_LCD_Clear);

    Lcd_Out(1,1,message5); // Write message1 in 1st row

    Lcd_Out(2,1,message7); // Write message1 in 1st row

    INTCON = 0x90;

    do {

    AFFICHE_CONSIGNE();

    RAFRAICHIR_COMPTEUR();

    } while(1);

    }

  9. #6
    samot29

    Resolu : Aide probleme mikroc + 16f628A

    Finalement j'ai résolu en ajoutant une tempo lors de l'écriture en eeprom.

    void SAVE_COMPTEUR()
    {
    for (ii=0; ii<=3; ii++)
    EEPROM_Write(0x04+ii,TMP_COMPT EUR[ii]);
    Delay_ms(100);
    }

    Idem sur "SAVE_CONSIGNE"
    j'ai essayé d'abord avec 50ms mais c'était pas suffisant.
    Par contre je suis preneur d'informations d'optimisation du code car je pense qu'il est grandement perfectible mais étant débutant je vais au plus facile.

    Merci à paulfjujo



    Merci à paulfjujo

  10. Publicité

Discussions similaires

  1. 16F628A problème config port
    Par nono7380 dans le forum Électronique
    Réponses: 6
    Dernier message: 31/12/2010, 11h58
  2. PROBLEME PIC 16F628a mikroC
    Par nico752 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/05/2010, 08h50
  3. aide MikroC
    Par Nicolelectro dans le forum Électronique
    Réponses: 6
    Dernier message: 24/04/2010, 07h52
  4. Passage de 16f84A au 16f628A, Probleme!!!!
    Par thor05 dans le forum Électronique
    Réponses: 9
    Dernier message: 20/08/2009, 03h27
  5. Aide pour le pic 16F628A
    Par dandano22 dans le forum Électronique
    Réponses: 6
    Dernier message: 29/03/2008, 09h15
Découvrez nos comparatifs produits sur l'informatique et les technologies.