Programme C bouton, delay
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Programme C bouton, delay



  1. #1
    invite01336075

    Programme C bouton, delay


    ------

    Bonjour

    J'ai besoin d'aide pour un petit truc en C.
    Voici mon problème :

    Je veux qu'un bouton réagissent différement en fonction de combien de temps ou comment on appuie dessus.
    Je veux qu'au bout de 3 secs (environ) d'appuie il se produise quelque chose.
    Et il faudrait aussi que si j'appuie 2 fois de suite assez rapidement il se produise autre chose. Un peu comme un clique long avec la souris ou un double clique.

    J'ai fais cette fonction :

    Code:
    int compte_temps_ouverture(void)
    {
    int var_temps=0;
    int var_temps2=0;
    int var_temps3=0;
    int resultat;
    while (PORTA.4 == 1) {  }  // attente d'un appui
    
    	delay_ms(25);               // anti-rebonds
    	var_temps = 0;
    
    		while (PORTA.4 == 0 && var_temps<100)        // teste si encore appuyé
    		{
      		delay_ms(25);
      		var_temps++;              // "compte" le temps
    		}
    			if(var_temps<100)
    			{
    			
    				while(PORTA.4==1 && var_temps2<35)
    				{
    				delay_ms(25);
    				var_temps2++;
    				}
    					if(var_temps2<35)
    					{
    						while(PORTA.4==0 && var_temps3<100)
    						{
    						delay_ms(25);
    						var_temps3++;
    						}
    
    						if(var_temps3==100)
    						{
    						resultat=0;
    						}
    						if(var_temps3<100)
    						{
    						resultat=1;
    						}
    					}
    					if(var_temps2>35)
    					{
    					resultat=3;
    					}
    				}
    			if(var_temps==100)
    			{
    			resultat=0;
    			}
    				
    	delay_ms(25);		// anti-rebonds
    	return resultat;
    }

    Mais elle est assez énorme et ne fonctionne pas parfaitement.
    Si quelqu'un pouvait m'aider à la perfectionner ce serait super !
    (J'utilise MPLAB v7.5, CC5X, une PICDEM 2 plus demo board)

    Merci d'avance.

    EDIT : Et bien sur si vous voyez un moyen beaucoup plus simple pour que sa fonctionne n'hesitez pas! Je m'en fou de conserver ce que j'ai déjà fait.

    -----

  2. #2
    invite01336075

    Re : Programme C bouton, delay

    Je l'ai modifié par ci par la mais j'arrive toujours pas à obtenir quelque chose de bien fonctionnel.. sa réagit toujours pas bien à des moments. Je sais pas trop quand il faut que je mette des antirebonds en fait.. et comment bien gérer les boucles.. j'en met un peu partout.. sa marche mais c'est pas optimal.

  3. #3
    invitea5e3e6e1

    Re : Programme C bouton, delay

    Bonjour
    Pas beaucoup de temps pour tester, mais à mon idée, il est préférable d'utiliser un timer, avec des flgs.
    Quand on appuie sur le bouton ,après correction des rebonds,on déclenche un timer sur 3 secondes avec flag = ON
    Si on clic une 2ème fois avant retombée du timer & flag == ON ---> action double clic.
    Si retombée du timer (après 3 secondes) & flag tjr == ON ---> action .
    Si on relâche avant flag= false et plus d'action du timer en fin de tempo.
    Dans action remettre le flag à FALSE, pour la retombée du bouton et éviter un déclenchement permanent.
    L'utilisation du timer permet de s'affranchir des tempo souvent bloquantes.
    C'est une analyse simple, sans doute à affiner.
    A tester...
    Courtoisement

  4. #4
    invite7a49d0d5

    Cool Re : Programme C bouton, delay

    Salut,

    je plussoie... l'utilisation d'un Timer pourrait simplifier les choses...

    vede
    ;O]
    ___________
    ...

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

    Re : Programme C bouton, delay

    Mmh d'accord merci ! Sa me parait bien mais le truc c'est ce que je ne sais pas trop comment sa marche les timers et les flags.
    Surtout les flags..

    Un timer c'est une variable qui s'incrémente toute seul régulièrement, si j'ai bien compris.

    Si elle s'incrémente toute les 8 microsecondes pour faire une boucle qui dure 3 secs il faut faire un truc style :

    while(TMRO!=37500)
    {
    }

    C'est bien ça?

    Et un flag c'est quoi? Je pensais que c'etait pour les interruptions mais pas uniquement visiblement.

  7. #6
    invite01336075

    Re : Programme C bouton, delay

    Mmh j'ai fais des tests. Et en fait la valeur maximale de TMR0 est 255 si je j'ai bien compris. Donc c'est pas comme ça qu'il faut faire.
    En fait je vois pas du tout.
    Dans la fonction delay je me sers déjà du timer mais je suppose que vous voulez dire autre chose..la je vois pas trop

  8. #7
    Seb.26

    Re : Programme C bouton, delay

    Citation Envoyé par Groumpif Voir le message
    Si elle s'incrémente toute les 8 microsecondes pour faire une boucle qui dure 3 secs il faut faire un truc style :

    while(TMRO!=37500)
    {
    }

    C'est bien ça?
    L'intérêt d'un Timer, c'est justement de ne pas faire comme ça ... le but, c'est que le Timer incrémente un compteur en tâche de fond pour que tu puisse faire autre chose en même temps ... et quand ton compteur passe à une valeur attendue, tu fais quelques chose ...

    Il va falloir que tu lise la datasheet de ton uCPU, et/ou que tu trouve des tutos sur le net ...

    en bref : RTFM !
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  9. #8
    invite01336075

    Re : Programme C bouton, delay

    Ah d'accord. Je me disais bien que sa revenait au même sinon.. Bon ben je repars à la recherche de tuto.
    Merci

    EDIT : RTFM?
    EDIT2 : ok ^^

  10. #9
    Murayama

    Re : Programme C bouton, delay

    Bonjour!

    À part ça, quelques commentaires sur votre fonction:
    1. La ligne while(PORTA.4 == 1){} va bloquer jusqu'à ce que
    quelqu'un appuie.

    2. delay_ms(25) n'est pas une chose à faire. Écrire de préférence:
    #define DELAY_VAL 25
    puis dans le code delay_ms(DELAY_VAL);
    ce qui fait que si vous vous apercevez qu'il faut 50 au lieu de 25,
    il n'y aura que la line #define à changer. Pareil pour les autres
    délais (35, 100).

    3. Il y a un trou dans la logique:
    if(var_temps2 < 35), puis plus loin if(var_temps2 > 35).
    Que se passe-til si var_temps2 == 35?

    Pascal



    Citation Envoyé par Groumpif Voir le message
    Ah d'accord. Je me disais bien que sa revenait au même sinon.. Bon ben je repars à la recherche de tuto.
    Merci

    EDIT : RTFM?
    EDIT2 : ok ^^

  11. #10
    invite01336075

    Re : Programme C bouton, delay

    Après quelques recherche je vais juste essayer de faire clignoter une DEL avec les interruptions sur TMR0.

    J'ai fais un programme avec ce que j'ai trouvé un peu partout. Sa compile mais ne fais rien. Je continue mes recherches..

    Code:
    #include "int16CXX.H"
    
    int compteur;
    
    #pragma origin 4
    interrupt timer0 (void)
    {
       int_save_registers;	
       compteur++;
       if (compteur > 8)
       {
          compteur = 0;
          PORTB=PORTB^1;     
       }
       INTCON.2 = 0;            
       int_restore_registers; 
    }
    
    // PROGRAMME PRINCIPAL
    void main(void)
    {
    TRISB=0x01;	
    TRISA=0xFF;
    PORTB=0;
    OPTION = 0b11010111;
    INTCON = 0b10100000;
    
    while(1)
    {
    nop();
    }	
    }
    L'interruption de se déclenche pas. Je ne vois pas pourquoi..

  12. #11
    invite01336075

    Re : Programme C bouton, delay

    Ah je n'avais pas vu ton message Murayama.

    effectivement je vais tenir compte de ces trois points
    Surtout le dernier car il y en effet un problème.

    Merci

  13. #12
    Seb.26

    Re : Programme C bouton, delay

    Pour ton test avec l'IT, est-ce que si tu fais une grosse boucle, la LED clignote ? ...

    En gros, est-ce que ton port est bien initialisé ?

    part d'un programme qui fait clignoter la LED avec un délai() et ensuite remplace le délai() par une interruption ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #13
    invite01336075

    Re : Programme C bouton, delay

    C'est bon j'ai réussi a faire clignoter une DEL avec l'interruption
    Maintenant je vais essayer de faire ce que vous m'aviez dit pour mon bouton.
    Je vous mets mon programme tel qu'il est maintenant et qu'il fonctionne :

    Code:
    void delay_ms( uns16 millisec);
    #include "int16CXX.H"
    
    int compteur;
    
    #pragma origin 4
    interrupt timer0 (void)
    {
       int_save_registers;	
       compteur++;
       if (compteur > 7)
       {
          compteur = 0;
          PORTB=PORTB^1;     
       }
       INTCON.2=0;          
       int_restore_registers; 
    }
    
    // PROGRAMME PRINCIPAL
    void main(void)
    {
    TRISB=0x00;	
    TRISA=0xFF;
    PORTB.1=0;
    compteur=0;
    OPTION = 0b10000111;
    INTCON = 0b10100000;
    PIE1 = 0b00000001;
    TMR0 = 0 ;  
    T0IE = 1 ;   
    GIE = 1;
    while(1)
    {
    nop();
    }	
    }		//fin prog principal
    Merci bcp !

    EDIT : Par contre je suis pas sur que toute les lignes que j'ai rajouter soit obligatoire mais bon sa marche alors je cherche pas plus loin pour l'instant.

  15. #14
    invite01336075

    Re : Programme C bouton, delay

    Mmh je vois mal comment faire pour déclencher un timer de 3 secs avec le flag on.
    Pour moi le flag passe à 1 quand le TMR0 déborde. C'est à dire toute les 65536μs avec le prédiviseur sur 256. Donc comment faire pour qu'il reste à 1 pendant trois secondes?

    Est ce que quelqu'un pourrait me réexpliquer plus en détail la marche à suivre pour mettre en place l'idée de F1TVB quelques posts plus haut.. parce que j'ai du mal à tout saisir..

    merci d'avance!

  16. #15
    Seb.26

    Re : Programme C bouton, delay

    Bah ... aujourd'hui, tu compte jusqu'a 7 avant de faire clignoter ...

    soit 7 * 65536μs ... il te suffit de compter jusqu'à 3s / 65536μs ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  17. #16
    invite01336075

    Re : Programme C bouton, delay

    Oui ça j'avais compris tout seul, mais merci quand même

    C'est pas ça mon problème je veux pas faire clignoter ma del toute les 3 secs. Je veux que quand j'appuie au moins 3 secs sur un bouton une DEL s'allume.
    et que si je double clique sur un bouton une autre DEL s'allume.
    (une seul DEL allumée à la fois)

    Et F1TVB m'avais expliqué. Mais j'y arrive pô.
    J'ai fais un truc un peu au pif mais sa donne rien de bien, j'ai ma DEL en RB0 qui est allumé puis quand j'appuie sur le bouton RA4 ben la DEL RB1 s'allume immédiatement et RB0 s'éteint (ou presque immédiatement, pas au bout de 3 secs quoi..)
    Et je comprends pas pourquoi !
    Quelqu'un voit le problème?

    Code:
    void delay_ms( uns16 millisec);
    #include "int16CXX.H"
    
    
    int compteur;
    int flag;
    
    #pragma origin 4
    interrupt timer0 (void)
    {
       int_save_registers;	
       compteur++;
    
       if (compteur > 46 && flag==1)
       {
            compteur = 0;
    		PORTB.0=0;
            PORTB.1=1; 
    		flag=0;		   
       }
       INTCON.2=0;          
       int_restore_registers; 
    }
    
    // PROGRAMME PRINCIPAL
    void main(void)
    {
    
    TRISB=0x00;	
    TRISA=0xFF;
    PORTB=0b00000001;
    
    OPTION = 0b10000111;
    INTCON = 0b10100000;
    PIE1 = 0b00000001;
    T0IE = 1 ;   
    GIE = 1;
    
    
    flag=0;
    compteur=0;
    
    while(1)
    {
    if(PORTA.4==0)
    	{
    	delay_ms(50);
    	compteur=0;
    	flag=1;
    
    		while(PORTA.4==0)
    		{
    		}
    
    	delay_ms(25);
    	flag=0;
    	}
    }	
    }		//fin prog principal

  18. #17
    invite01336075

    Re : Programme C bouton, delay

    J'ai trouvé mon problème. C'est que ma fonction delay utilise aussi TMR0 donc sa peut pas marcher. Il me faut une autre fonction delay.. Mais sinon est ce que c'est ça l'idée? Ou je suis encore à coté de la plaque?

  19. #18
    invitea5e3e6e1

    Re : Programme C bouton, delay

    Bonjour
    Si le timer0 est occupé utilisez TMR1.
    Vous pouvez aussi créer une fonction délais classique pour remplacer delay_ms(), puisqu'elle est utilisée uniquement lorsque l'on actionne un bouton.
    Bon courage..

Discussions similaires

  1. [Blanc] lave linge indesit wil11 bouton programme ne cesse de tourner
    Par invitea0ed94d7 dans le forum Dépannage
    Réponses: 60
    Dernier message: 01/12/2008, 11h27
  2. [Blanc] Ariston AT105: le bouton de programme ne cesse de tourner
    Par invitec3bdc6b3 dans le forum Dépannage
    Réponses: 1
    Dernier message: 06/07/2008, 18h32
  3. [Blanc] bouton programme de ARISTON MARGHERITA tourne sans arrêt.[résolu]
    Par invite1793f3e1 dans le forum Dépannage
    Réponses: 16
    Dernier message: 22/04/2008, 23h38
  4. [Blanc] bouton programme qui tourne pas
    Par invite1b7dec00 dans le forum Dépannage
    Réponses: 6
    Dernier message: 01/08/2007, 22h17
  5. [Blanc] machine ariston:bouton programme
    Par invite7a109963 dans le forum Dépannage
    Réponses: 3
    Dernier message: 16/06/2007, 20h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...