Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Incrementer une valeur avec un BP exponentiellement
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » jeu. 5 mai 2016 08:39

Bonsoir à tous,

Je cherche à incrémenter/décrémenter un compteur avec deux boutons poussoirs !

La difficulté réside dans le faite de le rendre, exponentielle ? ou de plus en plus rapide, quand on laisse le doigt dessus, mais avec un maximum tout de même ( pas trop vite quoi).
Mais il devra être très réactif quand on fait un appui bref ou deux appuis bref de suite . Donc ne prendre en compte les pauses dans l'appui long .....

Je pensais faire ça a base de boucle, mais ça fonctionne pas comme je voudrais.
L'utilisation de Vdelay_ms permet de mettre une variable dans la pause!

j'en suis rendu la pour le moment mais je vais creuser mon affaire

Code : Tout sélectionner

    if (BP_M==1){
       delay_ms(10);
       if ( BP_M == 1){

            if (flag_curseur==0){
               minute++;
               if (minute >=100)minute = 0;
             }
            else{
               seconde++;
               if (seconde >=60) seconde = 0 ;
             }
            MAJ();

            tempo = 0;

            while (BP_M==1){
                  tempo++;
                    
                if 
(tempo > 30)pause = 0 ;
                else if (tempo > 25)pause = 50 ;
                else if (tempo > 20)pause = 100 ;
                else if (tempo > 15)pause = 150 ;
                else if (tempo > 8)pause = 250 ;

                if (tempo > 8){
                    if (flag_curseur==0){
                       minute++;
                       if (minute >=100)minute = 0;
                     }
                    else{
                       seconde++;
                       if (seconde >=60) seconde = 0 ;
                     }
                     MAJ();
                     if (BP_M == 1)Vdelay_ms(pause);
                 }
              }
       }
    }
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Incrementer une valeur avec un BP exponentiellement
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#2 Message par Guest » jeu. 5 mai 2016 11:30

bonjour

tu peux faire cela:

debut boucle
variable=variable+J;
tempo
puis si toujours appuyer j++
retour boucle
j'ai pas trop regarde ton code :wink:
enfin voila mon organigramme que je ferais. Tu peux aussi raccourcir la tempo jouer sur les deux

A+

Incrementer une valeur avec un BP exponentiellement
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » jeu. 5 mai 2016 14:27

J'en suis rendu la, l'effet est vraiment bien , mais c'est farfelue :-D

Code : Tout sélectionner

    if (BP_M==1){             // Détectection d'appui sur LE BP "+"
       
delay_ms(30);          // Pause anti-rebond
       
if ( BP_M == 1){       // Si l'appui est confirmé (court ou long)
          
MAJ(1);             // On incremente tout de suite le compteur + Mise à jour de l'affichage
          
tempo 0;          // RAZ de la tempo

         
while (BP_M==1){     // Boucle tant que le BP est appuyé pour detecter un appui long
               
tempo++;       // Incremente la tempo
               
delay_ms(10);  // pause dans la boucle pour ne pas compter trop vite et garder de la réactivité pour en sortir
               
               
if (tempo 56)pause 50 ;        // Si ca fait plus de 56 boucles on diminue la pause pour accelerer la compteur
               
else if (tempo 48)pause 100 ;  // Si ca fait plus de 48 boucles
               
else if (tempo 43)pause 150 ;  // Si ca fait plus de 43 boucles
               
else if (tempo 40)pause 250 ;  // Si ca fait plus de 40 boucles

               
if (tempo 40){                     // La deuxieme incrementation demarre seulement aprés un certain nombre de boucles  afin de détecter un appui court
                   
MAJ(1);                          // Une fois la temporisation d'appui court dépassée on peut incrémenter a chaque boucle
                   
if (BP_M == 1)Vdelay_ms(pause);  // pause variable suivant le temps d'appui sur le BP qui a pour but d'accelerer le comptage
                
}
           }
        }
     } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Incrementer une valeur avec un BP exponentiellement
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » ven. 6 mai 2016 16:24

bonjour,


un exemple (mais en C18 MPLAB) pour gerer une consigne de 86 à 1717986918 L-86 pour un module DDS AD9835
registre 32 bits definissant la frequence qui est alors affichée des qu'on lache un bouton.
avec une evolution exponentielle 1,2,4,8,16,.. 256 en fonction de la duree d'appui sur BP INC ou DECR
et un BP de validation pour sortir de la boucle de reglage.
( Il y le traitement d'affichage qui alourdit le tout , mais le principe y est).


Code : Tout sélectionner


  case 11 
:  // reglage  frequence AD9835
             {   Led_Up=1; Led_Down=1;Led_Centre=0;
                 LCD_Erase_Ligne(1);
                 PrintOut_Eeprom_Msg(11);// mode AD9835
                 LCD_Erase_Ligne(2);
                 LCD_Pos(2,0);
                 fltToa (Freq_AD9835,txt,2);
                 LCD_PutRamString(txt);
                 Tempo(25000L); 
                 LCD_Erase_Ligne
(1);
                 PrintOut_Eeprom_Msg(12);// reglage Freq AD9835
                 Tempo(50000L);
                 LCD_Erase_Ligne(2);
                 Step=1;DX=1;
                 // boucle ........................
                 do
                 
{
                   // test direct touches + et -
                   if((BP_Droite==0)&&(DX<8))
                   {  Step=Step<<2;
                      DX=DX+1;}
                   if((BP_Gauche==0)&& (DX>1))
                   { Step=Step>>2;
                     DX=DX-1; }
                   LCD_Erase_Ligne(2);
                   // test direct touches + et -
                   if (U2.ML <(1717986918L-Step))
                   {
                     if(BP_Incr==0)
                     { Led_Up=0; Led_Down=1;Led_Centre=1;
                       U2.ML=U2.ML+Step;
                       LCD_Pos(2,0);LCD_Put('>');
                      }
                    } 
                    else  
                    
{
                      LCD_Pos(2,0);
                      LCD_Put('?');
                      LCD_Put(' ');
                   }    
                   if 
(U2.ML>(Step+86))
                   {
                     if(BP_Decr==0)
                       {
                        Led_Up=1; Led_Down=0;Led_Centre=1;
                        U2.ML=U2.ML-Step;
                        LCD_Pos(2,0);LCD_Put('<');
                       }
                     }
                     else  
                     
{
                     LCD_Pos(2,0);
                     LCD_Put('?');
                     LCD_Put(' ');
                   } 
                   LCD_Pos
(2,1);LCD_Put(48+DX);
                   LCD_Pos(2,5);
                   F1=(float) U2.ML;
                   Freq_AD9835=F1 / FFacteur_AD9835;
                   txt=&Texte[0];
                   fltToa (Freq_AD9835,txt,1);
                   LCD_PutRamString(txt);
                   LCD_Put(' ');LCD_Put('H');LCD_Put('z');
                   // si changement de coeff multiplicateur   
                   if ((BP_Gauche==0) || BP_Droite==0) Tempo(50000);
                   // si aucun BP appuyés
                   if ((PORT_Buttons & 0x1F)==0x1F) Tempo(50000); else Tempo(500L);
                   if ((BP_Incr==1) && BP_Decr==1)   
                     
{
                           Led_Up=1; Led_Down=1;Led_Centre=0;
                     }
                  } 
                while
(BP_Valid==1);  //BP valid 
                //.............. fin de boucle .....................
                jb=3; 
                              OUT_RS232
                Put_RS
('M');Put_RS('=');
                F1=(float) U2.ML;
                txt=&Texte[0];
                fltToa (F1,txt,1);
                k=PutStr_RS(txt);
                Put_RS(TAB);Put_RS('F');Put_RS('=');
                txt=&Texte[0];
                fltToa (Freq_AD9835,txt,1);
                k=PutStr_RS(txt);
                CRLF();
                OUT_LCD
                break
;  
             
} //case Menu=11




Mais, au final j'ai adopté un joystick .. valeur analogique potar et interrupt via seuils
=> ecart pointe sur une table en memoire pour la progression exponentielle

Code : Tout sélectionner

unsigned int Table_Progr_Freq_Pic[11]={    0,1,2,5,10,50,100,250,500,1000,5000};
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 21 invités