Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Métronome PICDEM 2 plus



  1. #1
    Groumpif

    Métronome PICDEM 2 plus


    ------

    Bonjour tout le monde,

    Je cherche à réaliser une sorte de métronome avec ma carte PICDEM 2 plus démo board.
    Voici en gros ce que je veux :
    Faire bipper le buzzer à une certaine vitesse en allumant une DEL sur chaque temps pour représenter les 4 temps d'une mesure à 4 temps.
    Puis j'aimerais pouvoir faire augmenter ou diminuer le tempo grace aux deux boutons. Bon et si j'arrive à faire tout ça j'essaierai d'afficher des trucs sur l'écran.
    J'arrive à faire bipper mon buzzer commeje veux en allumant une DEL sur chaque temps. Maintenant mon problème vient du réglage de la vitesse avec les boutons. Déjà je ne peux pas me servir des deux boutons et avoir les 4 DEL à la fois, parce que un bouton et une DEL sont connectés sur le même bit RB0 de la PORTB.
    Pour détecter les appuis sur les bouton j'ai pensé aux interruptions mais j'ai l'impression que le bouton RA4 ne peut pas en déclencher.

    Voici mon programme pour l'instant :

    Code:
    void delay(uns16 millisec);
    void antirebond(void);
    #define Cmd_Option 0x00
    #include "int16CXX.H"
    
    
    unsigned tempo : 16;
    
    #pragma origin 4
    
    
    interrupt int_server(void)
    {
    int_save_registers
    if (INTF==1)
    {	
    nb=nb+200;
    INTF=0;
    }	
    int_restore_registers 
    }
    
    void main()
    {
    TRISB=0x01;		
    TRISC.2=0;	
    TRISA=0b11111111;		
    OPTION = 0xCF; 
    GIE=1;
    uns16 nb=500;
    	while(1)
    	{	
    	PORTC.2=1;
    	PORTB=0b00000000;
    	delay(nb);
    	PORTC.2=0;		
    	PORTB=0b00000010;		
    	delay(nb);
    	PORTC.2=1;
    	PORTB=0b00000100;
    	delay(nb);
    	PORTC.2=0;
    	PORTB=0b00001000;
    	delay(nb);			
    	}
    
    
    }
    
    
    
    
    void delay(uns16 millisec)
    
    {
        OPTION = 2 ;
        do {
            TMR0 = 0 ;
            clrwdt() ;  
            while ( TMR0 < 125) ;  
           } while ( --millisec > 0) ;
    }
    
    void antirebond(void)
    {
    for(tempo=0;tempo<5000;tempo++)
    ;
    }
    J'ai quelques problèmes avec les interruptions. Déjà si je veux modifier une variable de mon programme principal alors que je suis dans l'interruption comment faire?
    Je programme en C avec MPLAB v7.5 et CC5X.

    -----
    Dernière modification par Groumpif ; 06/07/2010 à 08h37.

  2. Publicité
  3. #2
    Groumpif

    Re : Métronome PICDEM 2 plus

    J'ai modifié un peu mon programme. Il s'éxécute bien mais l'interruption ne fonctionne pas. J'ai l'impression qu'elle se n'active pas.

    Code:
    void delay(uns16 millisec);
    void antirebond(void);
    #include "INT16CXX.H"
    
    unsigned tempo : 16;
    
    //INTERRUPTION
    
    #pragma origin 4
    
    interrupt int_server(void)
    {
    int_save_registers
    if (INTF==1)
    {
    PORTB=0b00001111;	
    INTF=0;
    }	
    int_restore_registers 
    }
    
    //PROGRAMME PRINCIPAL
    void main()
    {
    
    TRISB=0x01;		
    TRISC=0b00000000;	
    TRISA=0b11111111;		
    OPTION = 0xCF; 
    INTCON=0b11011000; //autorisation de l'interruption
    
    uns16 nb=500;
    	while(1)
    	{	
    	PORTC.2=1;
    	PORTB=0b00000000;
    	delay(nb);
    	PORTC.2=0;		
    	PORTB=0b00000010;		
    	delay(nb);
    	PORTC.2=1;
    	PORTB=0b00000100;
    	delay(nb);
    	PORTC.2=0;
    	PORTB=0b00001000;
    	delay(nb);
    		if(PORTA.4==0)
    		{
    		nb=nb+100;
    		antirebond();
    		while(PORTA.4==0);
    		antirebond();
    		}			
    	}
    }
    
    
    
    
    void delay(uns16 millisec)
    {
        OPTION = 2 ;
        do {
            TMR0 = 0 ;
            clrwdt() ;  
            while ( TMR0 < 125) ;  
           } while ( --millisec > 0) ;
    }
    
    void antirebond(void)
    {
    for(tempo=0;tempo<5000;tempo++)
    ;
    }

    Je comprends pas pourquoi sa s'éxécute pas. Quelqu'un pourrait m'expliquer? Merci d'avance,
    Dernière modification par Groumpif ; 06/07/2010 à 10h06.

  4. #3
    Groumpif

    Re : Métronome PICDEM 2 plus

    Avec le cours de bigonoff j'ai mis ça :

    OPTION = 0x00;
    INTCON=0x90;

    Mais sa marche toujours pas..

  5. #4
    Groumpif

    Re : Métronome PICDEM 2 plus

    Désolé d'insister mais même si j'essaye un programme que j'ai trouvé sur site et qui devrait marcher sa fonctionne pas.
    Voici le programme normalement il ne doit pas y avoir d'erreur.

    Code:
    #pragma config = 0x3F39
    
    #include "int16CXX.H"
    
    #define Led		PORTB.0
    #define Led1	PORTB.1
    
    #pragma origin 4
    
    interrupt int_server( void)
    {
        int_save_registers    // W, STATUS (and PCLATH)
    
        if (T0IF)  {
            /* TMR0 overflow interrupt */
            TMR0 = 0 ;
            Led1=Led1^1 ;
            T0IF = 0 ;  /* reset flag */
        }
    
        int_restore_registers // W, STATUS (and PCLATH)
    }
    
    void main( void)
    {
      TRISB=0x00 ;
      PORTB=0x00 ;
    
        OPTION = 0 ; /* prescaler divide by 2 */
        TMR0 = 0 ;  
        T0IE = 1 ;   /* enable TMR0 interrupt */
        GIE = 1 ;    /* interrupts allowed */
    
    	Led1=0 ;
        while (1)
        {
    
    	}
    }
    Quand j'appuie sur RB0 sa fait rien du tout.
    Quelqu'un aurait une idée? Merci d'avance.

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    vede

    Cool Re : Métronome PICDEM 2 plus

    Citation Envoyé par Groumpif Voir le message
    Désolé d'insister mais même si j'essaye un programme que j'ai trouvé sur site et qui devrait marcher sa fonctionne pas.
    Voici le programme normalement il ne doit pas y avoir d'erreur.

    Code:
    #pragma config = 0x3F39
    
    #include "int16CXX.H"
    
    #define Led		PORTB.0
    #define Led1	PORTB.1
    
    #pragma origin 4
    
    interrupt int_server( void)
    {
        int_save_registers    // W, STATUS (and PCLATH)
    
        if (T0IF)  {
            /* TMR0 overflow interrupt */
            TMR0 = 0 ;
            Led1=Led1^1 ;
            T0IF = 0 ;  /* reset flag */
        }
    
        int_restore_registers // W, STATUS (and PCLATH)
    }
    
    void main( void)
    {
      TRISB=0x00 ;
      PORTB=0x00 ;
    
        OPTION = 0 ; /* prescaler divide by 2 */
        TMR0 = 0 ;  
        T0IE = 1 ;   /* enable TMR0 interrupt */
        GIE = 1 ;    /* interrupts allowed */
    
    	Led1=0 ;
        while (1)
        {
    
    	}
    }
    Quand j'appuie sur RB0 sa fait rien du tout.
    Quelqu'un aurait une idée? Merci d'avance.
    Salut,

    par contre la led sur B1 devrait clignoter...
    et celle sur B0 rester allumée...

    car dans ce code, le port B0 n'est pas configuré en entrée (regarde TRISB),
    et à aucun moment il n'y a un "test" du PortB.0 (bouton)... donc ça ne peut pas fonctionner...

    tu as un lien vers la carte que tu utilises?
    pour voir le schéma des boutons et sa doc...

    vede
    ;O]
    _________________
    ...

  9. #6
    Groumpif

    Re : Métronome PICDEM 2 plus

    Euh t'es sur que RB0 est sencé être allumée? Je pensais plutôt éteinte en fait. Et l'autre sencé clignoter.
    Et je pense qu'elle clignote trop vite pour que je puisse le voir. Et dans ce cas sa marche en fait. Mais c'est juste que l'interruption ne fonctionne pas avec le bouton RB0.

    Sinon voici un lien vers un guide de ma carte :

    http://www.kamami.pl/dl/dm163022_user_guide.pdf

    Page 25, 26 il y a les schéma.

    Et j'ai une autre question. Si j'ai une variable qui appartient au programme principal, comment est ce que je suis sencé faire si je veux la modifier lors de mon interruption?
    Parce que c'est mon cas ici. Merci !

  10. Publicité
  11. #7
    vede

    Cool Re : Métronome PICDEM 2 plus

    Salut,

    oui en neffet je me suis trompé, la Led sur RB0 reste éteinte...

    pour utiliser un BP sur RB0 en utilisant son interruption (RB0 INT)
    tu peux lire ce cours : http://pagesperso-orange.fr/fabrice..../interrupt.htm
    (pour 16F84 mais le fonctionnement est pareil sur tous les 16Fxxx)

    vede
    ;O]
    _________________
    ...

  12. #8
    vede

    Cool Re : Métronome PICDEM 2 plus


  13. #9
    vede

    Cool Re : Métronome PICDEM 2 plus

    re ps :

    Citation Envoyé par Groumpif Voir le message
    (...)
    Et j'ai une autre question. Si j'ai une variable qui appartient au programme principal, comment est ce que je suis sencé faire si je veux la modifier lors de mon interruption?(...)
    rien de special, exemple en pseudo code:
    Code:
    int mavar = 0;  // déclare une variable
    
    void interrupt
    {
      mavar = mavar + 1; // incrémente mavar à chaque interruption
    }
    
    void main
    {
      // active interruption
      mavar = 1;
      while(1) PORTA = mavar;  // allume des leds sur PORTA selon mavar
    }

  14. #10
    Groumpif

    Re : Métronome PICDEM 2 plus

    D'accord merci beaucoup pour tout ça je vais regarder ça !

    J'ai juste une dernière petite question qui me perturbe un peu.
    Comment faire pour activer quelque chose si un bouton poussoir et maintenant appuyé au moins 3 secondes?
    Avec des if, des while et des delay? Mais je vois mal comment faire.

  15. #11
    Groumpif

    Re : Métronome PICDEM 2 plus

    Euh je me suis un peu trompé dans ma phrase sa veut pas dire grand chose.
    Je voulais dire que si on garde le bouton appuyé au moins 3 secondes sa fait quelque chose. Sinon rien.

  16. #12
    vede

    Cool Re : Métronome PICDEM 2 plus

    re ;O]

    une méthode, en "pseudo-code" :

    Code:
    int var_temps = 0;
    TRISB = 0b00000001; // RB0 en entrée (BP), RB1 en sortie (LED)
    
    While(1)
    {
    
    While (PortB.0 == 0) { ; }  // attente d'un appui
    
    Delay_ms(25);               // anti-rebonds
    
    var_temps = 0;
    
    While (PortB.0 == 1)        // teste si encore appuyé
    {
      Delay_ms(25);
      var_temps++;              // "compte" le temps
    }
    
    Delay_ms(25);               // anti-rebonds
    
    // "traitement"
    if (var_temps > 120)
    {
      PortB.1 = !PortB.1; // inverse etat led seulement si appui long (>120x25ms=3s)
    }
    
    }

  17. Publicité
  18. #13
    Groumpif

    Re : Métronome PICDEM 2 plus

    Ah ben c'est ce à quoi je venais de penser.
    Mais j'avais un peu du mal a le mettre en forme mais la c'est bon.

    Merci pour tout !
    Tu me sauve vraiment !

    PS : Il faut remettre le var_temps à 0 a la fin non?
    Parce que sinon on peut le faire en plusieurs fois, si j'ai bien compris.

  19. #14
    vede

    Cool Re : Métronome PICDEM 2 plus

    re re ;O]

    oui, moi je l'ai mis "au milieu" (avant le comptage) mais tu peux le mettre "à la fin"...

  20. #15
    RISC

    Re : Métronome PICDEM 2 plus

    Salut,

    Un petit conseil...
    Il faut prendre la bonne habitude de toujours déclarer en volatile les variables globales qui sont modifiées dans les interruptions (voir un bon livre de C) sans quoi un jour il y a aura des soucis...

    Code:
    volatile int mavar = 0;  // déclare une variable
    a+

  21. #16
    vede

    Cool Re : Métronome PICDEM 2 plus

    Salut RISC,

    un petit conseil mais une très très bonne suggestion ;O]
    heureusement qu'il y en a pour me repérer mes erreurs;O]
    ...
    à la fin de ce récent fil j'écris que 2 condos 100pF avec un Quartz 4Mhz
    "ça pourrait marcher" ;O] qu'en penses-tu?
    http://forums.futura-sciences.com/el...on-16f877.html

    vede
    ;O]
    _________________
    ...

  22. #17
    RISC

    Re : Métronome PICDEM 2 plus

    Salut Vede,

    Je pense que ...il ne faut jamais tenter le diable ;=)
    On a tellement facilement des PB avec les oscillateurs que je ne m'amuserai JAMAIS à utiliser des condensateurs qui n'ont pas la bonne valeur sous peine d'être puni au plus mauvais moment...la veille de la validation du produit ;=)

    Travailler dans les specs c'est une règle qu'il mieux respecter pour tout les paramètres des micros.
    Donc mon point de vue est de ne MEME pas essayer avec des condos de 100pF et d'attendre sagement les 22pF commandés (autant en prendre 100 d'un coup...c'est toujours les même valeurs qui reviennent).

    a+

Discussions similaires

  1. [Divers] métronome lumineux
    Par JB41 dans le forum Dépannage
    Réponses: 2
    Dernier message: 22/02/2010, 09h54
  2. Picdem 2plus
    Par enrique1 dans le forum Électronique
    Réponses: 6
    Dernier message: 13/12/2009, 03h29
  3. [Projet] - The Great Métronome -
    Par LevLev dans le forum Électronique
    Réponses: 9
    Dernier message: 12/02/2009, 19h41
  4. Metronome à LED/ampoule Problemes
    Par FouFF dans le forum Électronique
    Réponses: 9
    Dernier message: 06/12/2007, 20h53
  5. metronome gerant led
    Par patricia777 dans le forum Électronique
    Réponses: 7
    Dernier message: 02/05/2006, 12h54
Découvrez nos comparatifs produits sur l'informatique et les technologies.