temps d'appuis sur un bouton
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

temps d'appuis sur un bouton



  1. #1
    invite74119562

    temps d'appuis sur un bouton


    ------

    Bonjour,

    je suis en train d'essayer de vouloir écrire le temps d'appuis sur un bouton poussoir.
    Cependant ça merde un peu

    je met le code ici :

    Code:
    void mesure_temps (void)
    {
    
      unsigned char tps_maintien;
      unsigned char tps_mnt;
      unsigned char bcdtemp;
      unsigned int bcd;
    
      
    
    
    
      TCCR1A = 0b00000000; 	// mode normal -> On ne compte pas encore
      TCCR1B = 0b00000000; 	// prescaler à 1024	
    
    
      TCNT1L = 0b00000000; 	//| Timer Control Register Timer 1 à 0;
      TCNT1H = 0b00000000; 	//| 
    
      sei();
    
      while (BP_avant==0)
      // Tant que le Bouton est appuyé, on commence à compter avec un prescaler de 1024 			
       {
       	  TCCR1A = 0b00000000;			//|On compte à la vitesse du prescaler 
          TCCR1B = 0b00000101; 			//|
    
    
          while (BP_avant ==1 )  			//Tant que le bouton est relaché	 
          {
      		 TCCR1A = 0b00000000;		//|On arrête de compter
      		 TCCR1B = 0b00000000; 		//|
    
             tps_maintien=TCNT1/781;	    // temps de maintien d'un bouton et temps en seconde + dizaine de seconde (65535/781) = 83 OK
    	     tps_mnt = tps_maintien;
    	     bcd=CONVERTBCD(tps_mnt+1);
    
    	     bcdtemp=(bcd & 0x0F) + '0';
    			//  Masque effectué afin de ne garder que les huit premier bits du nombre bcd 
    
    	     LCD_WriteDigit(bcdtemp,3);
    			//  Affichage du digit des unités sur le LCD 	
    
    	     bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller de quatre bits le nombre bcd, ensuite application du masque
    
             LCD_WriteDigit('S',2);
    
    	     LCD_WriteDigit(bcdtemp,1);
    			//  Affichage du digit des dizaines sur le LCD 	
    
    	     bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller encore de quatre bits le nombre bcd, ensuite application du masque
    
    		 TCNT1L =0b00000000;			//|Le compteur est remis à 0
    		 TCNT1H =0b00000000;		    //|
    
          } 
    
       }
    
    
    } // fin fonction
    Le truc c'est que quand j'appuie sur le bouton (Bouton_avant == 0) ça commence à compter, c'est ce qui est attendu, mais quand je lache le bouton (et donc quand Bouton_avant == 1), le temps devrait s'afficher et le compteur devrait s'arrêter, ce qui n'es pas le cas.

    Avez vous une idée???

    -----

  2. #2
    sdec25

    Re : temps d'appuis sur un bouton

    Bonjour,
    Pourquoi les while sont imbriqués ?
    Il faut utiliser cette structure :
    Code:
    while(btn_appuye==1);
    début compteur
    while(btn_appuye==0);
    fin compteur

  3. #3
    invite74119562

    Re : temps d'appuis sur un bouton

    Merci, à force de m'acharner, je ne l'avais pas vu.

    Quand je met les fonction d'affichage dans le premier "WHILE" je vois le registre qui s'incrémente à partir de l'appuis du bouton.
    Mais dès que je le relache, il ne s'arrête pas, même avec la correction


    Code:
    void mesure_temps (void)
    {
    
      unsigned char tps_maintien;
      unsigned char tps_mnt;
      unsigned char bcdtemp;
      unsigned int bcd;
    
      
    
    
    
      TCCR1A = 0b00000000; 	// mode normal -> On ne compte pas encore
      TCCR1B = 0b00000000; 	// prescaler à 1024	// (8000000/(1025*65535)) = 8,38s
    
    
      TCNT1L = 0b00000000; 	//| Timer Control Register Timer 1 à 0;
      TCNT1H = 0b00000000; 	//| 
    
    
      while (BP_avant==0)
      // Tant que le Bouton est appuyé, on commence à compter avec un prescaler de 1024 			
       {
       	  TCCR1A = 0b00000000;			//|On compte à la vitesse du prescaler 
          TCCR1B = 0b00000101; 			//|
       }
    
      while (BP_avant==1 )  			
      // Tant que le Bouton est relaché, on arrête de compter, on affiche la valeur du registre
      // on remet la valeur du regsitre à 0 
       {
      	  TCCR1A = 0b00000000;		//|On arrête de compter
      	  TCCR1B = 0b00000000; 		//|
    
          tps_maintien=TCNT1/781;	    // temps de maintien d'un bouton et temps en seconde + dizaine de seconde (65535/781) = 83 OK
    	  tps_mnt = tps_maintien;
    	  bcd=CONVERTBCD(tps_mnt+1);
    
    	  bcdtemp=(bcd & 0x0F) + '0';
    			//  Masque effectué afin de ne garder que les huit premier bits du nombre bcd 
    
    	  LCD_WriteDigit(bcdtemp,3);
    			//  Affichage du digit des unités sur le LCD 	
    
    	  bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller de quatre bits le nombre bcd, ensuite application du masque
    
          LCD_WriteDigit('S',2);
    
    	  LCD_WriteDigit(bcdtemp,1);
    			//  Affichage du digit des dizaines sur le LCD 	
    
    	  bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller encore de quatre bits le nombre bcd, ensuite application du masque
    
          TCNT1L =0b00000000;			//|Le compteur est remis à 0
    	  TCNT1H =0b00000000;		    //|
    
        } 
    
    
    } // fin fonction

  4. #4
    sdec25

    Re : temps d'appuis sur un bouton

    Déjà, je ne vois pas de raison de faire les traitements à l'intérieur des boucles while.
    La méthode la plus simple et sûre est celle de mon message précédent. Il n'y a rien dans les while.
    Sinon, Bp_avant est défini où ?

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

    Re : temps d'appuis sur un bouton

    Bonsoir,

    tout les variale sont soit défini en locale ou en globale (car elles sont utilisée soit juste dans ce code soit ans l'entiereté du code source (-> globale)

    Sinon, ben j'ai effectué le même principe que tu m'a proposé sauf que j'affiche la valeur du registre qui s'incrémente.

    Certaines variable sont dans mobile.h

    Code:
    #include "mobile.h"
    
    // unsigned char max_tps_depasse = 0;
    
    void mesure_temps (void)
    {
    
      unsigned char tps_maintien;
      unsigned char tps_mnt;
      unsigned char bcdtemp;
      unsigned int bcd;
    
      
    
    
    
      TCCR1A = 0b00000000; 	// mode normal -> On ne compte pas encore
      TCCR1B = 0b00000000; 	// prescaler à 1024	// (8000000/(1025*65535)) = 8,38s
    
    
      TCNT1L = 0b00000000; 	//| Timer Control Register Timer 1 à 0;
      TCNT1H = 0b00000000; 	//| 
    
    
      while (BP_avant==0)
      // Tant que le Bouton est appuyé, on commence à compter avec un prescaler de 1024 			
       {
       	  TCCR1A = 0b00000000;			//|On compte à la vitesse du prescaler 
          TCCR1B = 0b00000101; 			//|
       }
    
      while (BP_avant==1)  			
      // Tant que le Bouton est relaché, on arrête de compter, on affiche la valeur du registre
      // on remet la valeur du regsitre à 0 
       {
      	  TCCR1A = 0b00000000;		//|On arrête de compter
      	  TCCR1B = 0b00000000; 		//|
       } 
    
      tps_maintien=TCNT1/781;	    // temps de maintien d'un bouton et temps en seconde + dizaine de seconde (65535/781) = 83 OK
    	  tps_mnt = tps_maintien;
    	  bcd=CONVERTBCD(tps_mnt+1);
    
    	  bcdtemp=(bcd & 0x0F) + '0';
    			//  Masque effectué afin de ne garder que les huit premier bits du nombre bcd 
    
    	  LCD_WriteDigit(bcdtemp,3);
    			//  Affichage du digit des unités sur le LCD 	
    
    	  bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller de quatre bits le nombre bcd, ensuite application du masque
    
          LCD_WriteDigit('S',2);
    
    	  LCD_WriteDigit(bcdtemp,1);
    			//  Affichage du digit des dizaines sur le LCD 	
    
    	  bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller encore de quatre bits le nombre bcd, ensuite application du masque
    
          TCNT1L =0b00000000;			//|Le compteur est remis à 0
    	  TCNT1H =0b00000000;		    //|
    
    } // fin fonction

    Voila retravaillé, mais ça ne donne rien

  7. #6
    sdec25

    Re : temps d'appuis sur un bouton

    Essaie ça :
    Code:
    #include "mobile.h"
    
    // unsigned char max_tps_depasse = 0;
    
    void mesure_temps (void)
    {
    
      unsigned char tps_maintien;
      unsigned char tps_mnt;
      unsigned char bcdtemp;
      unsigned int bcd;
    
      
    
    
    
      TCCR1A = 0b00000000; 	// mode normal -> On ne compte pas encore
      TCCR1B = 0b00000000; 	// prescaler à 1024	// (8000000/(1025*65535)) = 8,38s
    
    
      TCNT1L = 0b00000000; 	//| Timer Control Register Timer 1 à 0;
      TCNT1H = 0b00000000; 	//| 
    
      while (BP_avant==1) {} // on attend que le bouton soit appuyé
    
       	  TCCR1A = 0b00000000;			//|On compte à la vitesse du prescaler 
          TCCR1B = 0b00000101; 			//|
      while (BP_avant==0) {} // tant que bouton appuyé, on ne fait rien
    
      // Le Bouton est relaché, on arrête de compter, on affiche la valeur du registre
      // on remet la valeur du regsitre à 0 
      	  TCCR1A = 0b00000000;		//|On arrête de compter
      	  TCCR1B = 0b00000000; 		//|
    
      tps_maintien=TCNT1/781;	    // temps de maintien d'un bouton et temps en seconde + dizaine de seconde (65535/781) = 83 OK
    	  tps_mnt = tps_maintien;
    	  bcd=CONVERTBCD(tps_mnt+1);
    
    	  bcdtemp=(bcd & 0x0F) + '0';
    			//  Masque effectué afin de ne garder que les huit premier bits du nombre bcd 
    
    	  LCD_WriteDigit(bcdtemp,3);
    			//  Affichage du digit des unités sur le LCD 	
    
    	  bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller de quatre bits le nombre bcd, ensuite application du masque
    
          LCD_WriteDigit('S',2);
    
    	  LCD_WriteDigit(bcdtemp,1);
    			//  Affichage du digit des dizaines sur le LCD 	
    
    	  bcdtemp=((bcd>>=4) & 0x0F) + '0'; 
    			// Décaller encore de quatre bits le nombre bcd, ensuite application du masque
    
          TCNT1L =0b00000000;			//|Le compteur est remis à 0
    	  TCNT1H =0b00000000;		    //|
    
    } // fin fonction

  8. #7
    invite74119562

    Re : temps d'appuis sur un bouton

    ça ne fonctionne pas...

  9. #8
    sdec25

    Re : temps d'appuis sur un bouton

    Citation Envoyé par moustiqu3 Voir le message
    ça ne fonctionne pas...
    Ça reste bloqué quelque part ?
    Sinon, à quoi vois-tu que ça ne fonctionne pas ?

  10. #9
    invite74119562

    Re : temps d'appuis sur un bouton

    Bonsoir,

    le bute est de commencer à incrémenter le timer1 lors de l'appuis sur le BP_avant et d'arrêter la l'incrémentation lorsque ce même BP est lâché.
    Ensuite, nous affichons la valeur du compteurs.

    Je compile avec avrstudio, il propose un simulateur ou nous pouvons voir les registres.
    Lors de l'appuis du Bouton, le compteur s'incrémente

    Lors que nous relachons le bouton, il s'incrémente toujours alors qu'il ne devrait pas

    De plus, pas grand chose ne s'affiche sur l'afficheur LCD, du moins pas l'incrémentation

  11. #10
    sdec25

    Re : temps d'appuis sur un bouton

    Le compteur s'incrémente encore alors que le code suivant (qui devrait arrêter le compteur) est exécuté ?
    Code:
      	  TCCR1A = 0b00000000;		//|On arrête de compter
      	  TCCR1B = 0b00000000; 		//|

  12. #11
    invite74119562

    Re : temps d'appuis sur un bouton

    Avec ta fonction, il ne s'incrémente plus

  13. #12
    sdec25

    Re : temps d'appuis sur un bouton

    Citation Envoyé par moustiqu3 Voir le message
    Avec ta fonction, il ne s'incrémente plus
    Je dois deviner pourquoi ?
    Comme tu as un simulateur fais des essais dessus...

  14. #13
    invite74119562

    Re : temps d'appuis sur un bouton

    c'est normal qu'il ne s'incrémentais plus, car tu mettais ceci

     Cliquez pour afficher


    Le bouton étant à 1 sans appuis, il y avait les registres du timer1 (TCCR1A et B ) à 0, ce qui signifie : no clock source et donc : on ne compte pas.

    Il fallait appuyé sur le Bouton, et donc BP_avant = 0, mais là on ne faisait rien.

    Par contre dans ma fonction, je voyais le timer s'incrémenter, mais je ne le voyais pas s'arrêter!

  15. #14
    sdec25

    Re : temps d'appuis sur un bouton

    ok, donc le bouton est appuyé au début de la fonction ? Si c'est le cas vire la ligne
    Code:
    while(btn == 1) {}
    D'où vient le problème selon toi ?
    Matériel ? Algorithme ? Configuration du compteur ? Autre ?

Discussions similaires

  1. Equations des moments, flèches, réactions d'appuis
    Par invite7848b6d0 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 03/03/2009, 00h51
  2. bouton d'urgence ou bouton tactile?
    Par invite0ee7a339 dans le forum Électronique
    Réponses: 31
    Dernier message: 14/02/2007, 00h28
  3. Le Temps Sujet:Le Pneumatique et son influence sur le temps d'arret
    Par inviteb213beb1 dans le forum TPE / TIPE et autres travaux
    Réponses: 1
    Dernier message: 27/10/2006, 13h10
  4. calcul effort de réactions aux points d'appuis
    Par invite30f4bc02 dans le forum Physique
    Réponses: 1
    Dernier message: 04/08/2006, 12h22
  5. bouton avec temps de fonctionnement integre
    Par invitee1878879 dans le forum Électronique
    Réponses: 6
    Dernier message: 05/04/2006, 11h14
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...