Incrémenter ou décrémenter une valeur PIC18F
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Incrémenter ou décrémenter une valeur PIC18F



  1. #1
    robintou

    Incrémenter ou décrémenter une valeur PIC18F


    ------

    Bonjour, je souhaite incrémenter ou décrémenter une valeur d'une variable lors de l'appui d'un bouton poussoir afin de réglé l'heure sur mon afficheur LCD, pour cela je dois passé par le bus SPI, je ne souhaite pas faire de conversion BCD.

    J'ai trouvé comment incrémenter, mais pour décrémenter je n'y arrive pas car par exemple lorsque je décrémente de "50" à "49" j'obtiens "4?" au lieu de 49. De plus mon code n'est pas du tout optimisé, j'aimerais aussi détecter un front montant lors de l'appui du bouton. J'utilise actuellement la fonction delay qui attends après chaque appui du bouton poussoir.

    Voici l'extrait du code :

    Code:
    void regheure() {
    
    #define led_v   LATCbits.LATC5
    #define led_j   LATCbits.LATC2
    #define led_r   LATGbits.LATG3
    #define led_b   LATGbits.LATG4
    #define CS_ON    LATDbits.LATD7 = 1
    #define CS_OFF   LATDbits.LATD7 = 0
    #define BP2 PORTEbits.RE0 == 0
    #define BP1 PORTEbits.RE1 == 0
    #define BP3 PORTEbits.RE2 == 0
    #define BP4 PORTEbits.RE3 == 0
    
        if (BP1) { //Lors de l'appui sur BP1, on arrête le comptage de l'heure
            INTCONbits.TMR0IF = 0;
            INTCONbits.GIE = 0;
            hr = 0x00;
            min = 0x00;
            sec = 0x00;
        }
    
        if (BP2) {//Lors de l'appui sur BP2 on incrémente les secondes
            CS_ON;
            sec = sec + 1;
            if (sec == 0x0A) {
                sec = 0x10;
            }
            if (sec == 0x1A) {
                sec = 0x20;
            }
            if (sec == 0x2A) {
                sec = 0x30;
            }
            if (sec == 0x3A) {
                sec = 0x40;
            }
            if (sec == 0x4A) {
                sec = 0x50;
            }
            if (sec == 0x5A) {
                sec = 0x00;
            }
    
            WriteSPI2(0x80);//Ecriture dans le registre de la RTC
            WriteSPI2(sec);
            __delay_ms(25);
            __delay_ms(25);
            __delay_ms(25);
            __delay_ms(25);
            CS_OFF;
    
        }
        if (BP3) {//On décrémente les secondes
            CS_ON;
            sec = sec - 1;
    
            if (sec == 0xFF)
                sec = 0x59;
    
            if (sec == 0x4A)
                sec = 0x50;
    
            if (sec == 0x3A)
                sec = 0x40;
    
            if (sec == 0x2A)
                sec = 0x30;
    
            if (sec == 0x1A)
                sec = 0x20;
    
            if (sec == 0x0A)
                sec = 0x10;
    
            if (sec == 0x5A)
                sec = 0x00;
        }
        WriteSPI2(0x80);//Ecriture dans le registre de la RTC
        WriteSPI2(sec);
        __delay_ms(25);
        __delay_ms(25);
        __delay_ms(25);
        __delay_ms(25);
        CS_OFF;
    
        if (BP4) {//On réactive les interruptions pour la lecture de l'heure (Validation de l'heure)
            INTCONbits.GIE = 1;
            INTCONbits.TMR0IF = 1;
            led_r = 0;
            led_j = 0;
            led_v = 0;
            led_b = 0;
        }
    }
    J'aimerais aussi si possible d'utiliser un filtre anti rebonds pour les boutons poussoirs si c'est possible niveau soft et sans ajouter de condensateur.

    Cordialement,

    Robintou

    -----
    Dernière modification par Antoane ; 11/05/2015 à 16h03. Motif: Remplacement balises Quote par code

  2. #2
    robintou

    Re : Incrémenter ou décrémenter une valeur PIC18F

    Excusez moi pour le double post, mais j'avais une petite erreur pour "BP3" :

    Code:
     if (BP3) {//On décrémente les secondes
            CS_ON;
            sec = sec - 1;
    
            if (sec == 0xFF)
                sec = 0x59;
    
            if (sec == 0x4F)
                sec = 0x49;
    
            if (sec == 0x3F)
                sec = 0x39;
    
            if (sec == 0x2F)
                sec = 0x29;
    
            if (sec == 0x1F)
                sec = 0x19;
    
            if (sec == 0x0F)
                sec = 0x09;
    
            if (sec == 0x5F)
                sec = 0x59;
        }
    Voilà.
    Dernière modification par robintou ; 11/05/2015 à 09h17.

  3. #3
    robintou

    Re : Incrémenter ou décrémenter une valeur PIC18F

    J'ai finalement réussi à décrémenter, mais il n'y a pas de solution d'optimisation ?

    Cordialement,

    Robintou

  4. #4
    paulfjujo

    Re : Incrémenter ou décrémenter une valeur PIC18F

    bonjour,


    Citation Envoyé par robintou Voir le message
    .. mais il n'y a pas de solution d'optimisation ?
    c'est incompatible avec

    je ne souhaite pas faire de conversion BCD.

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

    Re : Incrémenter ou décrémenter une valeur PIC18F

    J'ai réussi à réduire mon code avec une boucle if en utilisant le modulo, mais je n'arrive pas à le faire avec la décrémentation.

    Code:
     if (BP3) {
            CS_ON;
             sec = sec + 1;
            if ((sec % 0x10) == 0x0A) 
                sec = ((sec + 0x06) % 0x60);
            
        }
    Mais pour la décrémentation je bloque ...

    Code:
     if (BP2) {
            CS_ON;
            sec = sec - 1;
            if ((sec % 0x10) == 0x0F) //TODO
                sec = ((sec + 0x06) % 0x60);
        }
    Dernière modification par robintou ; 11/05/2015 à 16h56.

  7. #6
    paulfjujo

    Re : Incrémenter ou décrémenter une valeur PIC18F

    % modulo est en base 10 .. ne fonctionne pas avec % resultant=15

    testé sous mikroC avec HID terminal pour envoyer + ou -

    Code:
        if (strncmp(&readbuff,"+",1)==0)
        {
             sec = sec + 1;
             if ((sec % 0x10) == 0x0A)  sec = ((sec + 6) % 0x60);
             sprintf( &writebuff,"sec= %3d    %04X  \r\n",(unsigned int)sec,(unsigned int)sec);
        }
        if (strncmp(&readbuff,"-",1)==0)
        {
             sec = sec - 1;
            if  ((sec & 0x0F)==0x0F) sec = sec -6 ;
            if (sec>89) sec=89;
             sprintf( &writebuff,"sec= %3d    %04X  \r\n",(unsigned int)sec,(unsigned int)sec);
        }
    Partie decrementation testee OK..

    sec= 0 0000
    sec= 1 0001
    sec= 2 0002
    sec= 3 0003
    sec= 4 0004
    sec= 5 0005
    sec= 6 0006
    sec= 7 0007
    sec= 8 0008
    sec= 9 0009
    sec= 16 0010
    sec= 17 0011
    sec= 18 0012
    sec= 19 0013
    sec= 20 0014
    sec= 19 0013
    sec= 18 0012
    sec= 17 0011
    sec= 16 0010
    sec= 9 0009
    sec= 8 0008
    sec= 7 0007
    sec= 6 0006
    sec= 5 0005
    sec= 4 0004
    sec= 3 0003
    sec= 2 0002
    sec= 1 0001
    sec= 0 0000
    sec= 89 0059
    sec= 88 0058

  8. #7
    robintou

    Re : Incrémenter ou décrémenter une valeur PIC18F

    J'ai trouvé c'est bon :

    Code:
    // Pour +1:
    if ( sec == 0x59 ) {
        sec = 0;
    } else {
        sec = sec + 1;
        if ( ( sec & 0x0F ) == 0x0A ) {
            sec = sec + 6;
        }
    }
     
    // Pour -1:
    if ( sec == 0 ) {
        sec = 0x59;
    } else {
        sec = sec - 1;
        if ( ( sec & 0x0F ) == 0x0F ) {
            sec = sec - 6 ;
        }
    }

Discussions similaires

  1. Incrémenter une adresse
    Par invitecd05b4fb dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 13/04/2011, 11h27
  2. Incrémenter dans excel
    Par inviteffa8db36 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 16/10/2010, 18h41
  3. Incrémenter une table sur access
    Par invite3ba6c2ea dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 20/03/2010, 17h09
  4. incrémenter un menu
    Par invite74119562 dans le forum Électronique
    Réponses: 11
    Dernier message: 21/06/2009, 15h08
  5. Incrémenter une variable avec un PIC
    Par invite67d96d45 dans le forum Électronique
    Réponses: 1
    Dernier message: 24/06/2003, 14h05
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...