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 ---
- 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 ---
Modérateur : Jérémy
Incrementer une valeur avec un BP exponentiellement
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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
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);
}
}
}
}Incrementer une valeur avec un BP exponentiellement
Incrementer une valeur avec un BP exponentiellement
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
J'en suis rendu la, l'effet est vraiment bien , mais c'est farfelue
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
}
}
}
} Incrementer une valeur avec un BP exponentiellement
- paulfjujo

Maître- Messages : 3260
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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).
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
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};Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

