[Programmation C] - Interruption / Appui long
Répondre à la discussion
Page 1 sur 4 12 3 DernièreDernière
Affichage des résultats 1 à 30 sur 108

[Programmation C] - Interruption / Appui long



  1. #1
    jorg1n

    [Programmation C] - Interruption / Appui long


    ------

    Bonjour,
    bon voila, depuis peu j'arrive a gérer les interruptions, mais voila ce que je souhaite faire, en appuyant sur le BP en RB1(appui classique), cela allume la led en RA3 et si j'appuie sur RB1(appui long environ 2 sec), cela allume que la led RA5..
    Je réfléchi dessus encore...
    Pour l'instant l'interruption est sur un front descendant (BP actif=0, BP inactif = 5v)...mais je pense que je dois réaliser l'interruption sur un front montant pour tester le Bouton au relachement.. pouvez vous m'aiguiller un peu
    Merci d'avance

    -----

  2. #2
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Salut,

    Tu veux que ta LED s´allume quand?
    Quand tu appuis sur le BP ou quand tu relache?

    Si tu veux qu´elle s´allume quand tu relache, je mettrais les interruptions actives sur les 2 fronts et au premier (front descendant donc appui) je déclencherait un Timer et au deuxème front(relachement), je regarderait l´état du Timer et allumerait RA3 ou RA5 en fonction de la durée de l´appuis...

    Mais si tu fais ca, fais attention aux impulsions qui apparaissent quand tu appuis sur le BP car sinon tu va prendre une impulsion pour ton deuxième front et donc toujours avoir un temps d´appuis très court!
    Donc mets un petit délais entre la première impulsion et le déclenchement du Timer...

  3. #3
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Sinon, plus simple mais qui ferait que RA5 s´allumerais avant le relachement:

    Lors de l´interruption qui te prévient de l´appuis sur ton BP, tu laisse un petit délais (qui filtre tes impulsions et qui en même temps serait le seuil (en temps) de déclenchement de la diode RA5) et au bout de ce laps de temps, tu retournes voir l´état de ton BP:
    -s´il est relaché->tu allumes RA3
    -s´il est encore appuyé->tu allumes RA5...

    Donc en gros, il faut savoir quand est-ce que tu veux déclencher l´allumage de tes LEDs...

  4. #4
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Voila ce que j'avai fai avan que tu me reponde mais ça ne fonctionne pas...
    Code:
    	if (INTCON3bits.INT1IF)
    	{
    		Delay_ms(2000);
    		if(PORTBbits.RB1=0)
    			{
    			LEDA5=!LEDA5;	
    			}
    		else if(PORTBbits.RB1=1)
    			{
    			LEDA3=!LEDA3;
    			}
    	INTCON3bits.INT1IF=0;
    	}
    ca resemble a ta 2eme proposition non?
    Que l'interruption se fasse sur un front montant ou descendant,cela m'est égal, mais ce que je souhaite c'est que si j'appui normalement sur RB1, RA3 s'allume, et si je reste appuyer 2 secondes ,RA5 sallume..
    Je vais mettre en application tes explication et je revien vers toi
    merci encore
    Nicolas
    Dernière modification par jorg1n ; 22/02/2008 à 09h17.

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

    Re : [Programmation C] - Interruption / Appui long

    C´est quoi LEDA5 ou LEDA3? Ca n´est pas des variables qu´il faut mettres à 1 ou 0, ce sont les bits correspondants à l´état de tes sorties, comme dans post "Utilisation d´ADRESH et ADRESL"!

    À la place de
    LEDA5=!LEDA5;
    mets
    RA5 = !RA5;
    (ou dit moi ce que sont ces variables et ce que tu en fais après)

    D´ailleurs tu es sur de ton opérateur "!" moi j´utilise "~"(complément) donc : RA5 = ~RA5; (mais ca dépend peut-être des compilateurs...)


    Sinon, pour des économies de mémoire et de temps:
    if(PORTBbits.RB1=0)
    {
    XXXXXXX;
    }
    else if(PORTBbits.RB1=1)
    {
    YYYYYYYY;
    }
    Ton deuxième test est inutile (ca m´étonnerait que PORTBbits.RB1 puisse être égale à 2 ) donc :

    if(PORTBbits.RB1=0)
    {
    XXXXXXX;
    }
    else
    {
    YYYYYYYYY;
    }

    suffit...

  7. #6
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Ah, bah ca, ca m´est souvent arrivé aussi dans mes débuts:
    pour faire un test c´est :

    if(PORTBbits.RB1==0)

    sinon ca marche pas!

    (Je l´ais remarqué en me relisant car j´avais fait copier-coller de ton prog donc j´avais recopié les mêmes erreurs!)

  8. #7
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Donc tout d'abord, Pour ledA5,...
    Code:
    #define LEDA5 PORTAbits.RA5 
    #define LEDA4 PORTAbits.RA4 
    #define LEDA3 PORTAbits.RA3
    #define LEDA2 PORTAbits.RA2
    Pur le ! , c'est sur ça marche..
    Et pour mon erreur... trop nul....
    je vais tester ton code
    merci encore.

  9. #8
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Donc tout d'abord, Pour ledA5,...
    Code:

    #define LEDA5 PORTAbits.RA5 #define LEDA4 PORTAbits.RA4 #define LEDA3 PORTAbits.RA3 #define LEDA2 PORTAbits.RA2

    Pur le ! , c'est sur ça marche..
    Ok, donc ca c´est bon... ca doit venir du "==":

    Et pour mon erreur... trop nul....
    T´inquiète ca m´est souvent arrivé (jamais avec les opérateurs && ou || mais qu´avec == )

  10. #9
    Seb.26

    Re : [Programmation C] - Interruption / Appui long

    Bonjour à tous,
    Juste 2 petites choses :

    > Tu as le droit d'écrire :

    Code:
    if(!PORTBbits.RB1) // identique à if(PORTBbits.RB1==0)
    {
      ...
    }

    > C'est moi qui rêve ou tu mets un delay_ms() dans une interruption ?!!

    Drôle d'idée ... ... à la limite du blasphème ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    Seb.26

    Re : [Programmation C] - Interruption / Appui long

    Citation Envoyé par jorg1n Voir le message
    Voila ce que j'avai fai avan que tu me reponde mais ça ne fonctionne pas...
    Code:
    	if (INTCON3bits.INT1IF)
    	{
    		Delay_ms(2000);
    		if(PORTBbits.RB1=0)
    			{
    			LEDA5=!LEDA5;	
    			}
    		else if(PORTBbits.RB1=1)
    			{
    			LEDA3=!LEDA3;
    			}
    	INTCON3bits.INT1IF=0;
    	}
    Si tu corrige ton code ( les = à la place des == ) ... ça va marcher ... c'est une solution moche et mal foutue, mais ça va marcher ...

    > Que se passe t'il si je clique comme un fou sur ton BP ???
    > Que se pass t'il si tu as un glitch sur ton entrée ???

    Je vais sans doute un poil me répéter, mais une gestion correcte d'un bouton poussoir demande un filtrage dans le temps ... Genre lire 10 fois de suite le même état avec quelques ms d'intervale avant de valider une action ...

    Perso dans mes projets, les boutons poussoirs sont lissés sur 60ms ...

    J'espère que t'es pas en train de faire le module de pilotage du prochain TGV ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  12. #11
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    > C'est moi qui rêve ou tu mets un delay_ms() dans une interruption ?!!
    Non tu ne reve pas mai pour l'instant je ne voyai que cette solution la..
    Si tu corrige ton code ( les = à la place des == ) ... ça va marcher ... c'est une solution moche et mal foutue, mais ça va marcher ...
    ça marche, mais si je clic dessus comme un malade bein....les LED sont comment dire...un peu malade, ça déconne un peu..
    Perso dans mes projets, les boutons poussoirs sont lissés sur 60ms ...
    Bon je vais m'y mettre je crois...c'est préférable..
    Pourrais tu Seb26, me montrer ce que donne ta procédure?si c'est possible bien sur?
    J'espère que t'es pas en train de faire le module de pilotage du prochain TGV
    euh....non, je ne suis pas encore capable...
    Merci encore

  13. #12
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    > Que se passe t'il si je clique comme un fou sur ton BP ???
    > Que se pass t'il si tu as un glitch sur ton entrée ???
    C´est sur que ca dépend de l´utilisation: but personnel ou commerciale (dans ce cas il faut toujours considérer que les clients sont des c***)

    Moi je préfererais ma première solution mais pour une utilisation personnelle la deuxième suffit...

  14. #13
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    ça marche, mais si je clic dessus comme un malade bein....les LED sont comment dire...un peu malade, ça déconne un peu..
    C´est ben sur! comment ton PIC gère les interruptions qui se passent pendant que tu traites l´interruption d´avant?

    Et Seb.26 a raison, il vaut mieux n´utiliser l´interruption que pour son efft d´interruption, CAD en sortir tout de suite et faire ce que tu veux en dehors...

  15. #14
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Je commen ce a comprendre, mais comment je peut faire, apres avoir fait mon interruption, de faire un petit sous programme de traitement du bouton...comment lui dire daller a ce sous programme qui est hors du ss programme d'int?
    Merci d'avance

  16. #15
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Ca depend comment tu travail, que fais-tu en attendant l´appuis sur le BP?
    Sinon tu te mets en veille (ton CPU attend une interruption en mode faible conso donc il ne fait plus rien) et quand tu as une interruption tu sors du mode veille-> et ca relance ton prog...

    du genre:
    WAIT (mode veille); // Ton CPU attend ici
    Ss prog à exécuter après interruption();


    Routine d´interruption:
    Sortie du mode veille;
    (Je ne connait ni les PIC ni ton compilateur donc c´est très "imagé")

  17. #16
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    D´ailleurs, avec ca:
    if (INTCON3bits.INT1IF)
    {
    Delay_ms(2000);
    if(PORTBbits.RB1=0)
    {
    LEDA5=!LEDA5;
    }
    else if(PORTBbits.RB1=1)
    {
    LEDA3=!LEDA3;
    }
    INTCON3bits.INT1IF=0;
    }
    Je crois que tu ne te serts pas vraiment des interruptions mais seulement du flag d´interruption car tu ne fais que tester le flag d´interruption au lieu d´avoir une routine d´interruption à part! Non?

    De ce que je comprend, ton premier test pourrait presque être remplacé par "if(PORTBbits.RB1==1)".

  18. #17
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    [EDIT en retard]: De ce que je comprend, ton premier test pourrait être remplacé par "if(PORTBbits.RB1==0)" sauf qu´il te permet de savoir s´il l´a été (== 0) mais ne l´est plus!

    Une interrupütion dans son utilisation normale te permet d´interrompre ton programme n´importe quand ou de sortir d´un mode de veille...

  19. #18
    Seb.26

    Re : [Programmation C] - Interruption / Appui long

    Un début d'idée serait de positionner un flag dans ton interruption, puis de traiter ce flag dans ta boucle principale ...
    Mais tu vas arriver à la conclusion que ton IT du BP ne sert qu'a réveiller ton PIC si tu utilise le sleep ...

    Voici un autre piste (sans IT) en "pseudo C" :
    Code:
    uChar lissage = 0;
    while(1)
    {
      si( BP == appuyé )
        si( lissage != 0xFF )
          lissage ++;
          si( lissage > 20 )
            lissage = 0xFF;
            Action_BP_long();
      sinon
          si( lissage>10 && lissage<20 )
            Action_BP_court();
        lissage = 0;
    }
    Voila, c'est très incomplet, mais ça devrait te donner un bon début de piste ...

    Ce bout de code gère les appuis courts et les appuis longs ...

    Ensuite à toi de l'étoffer ... quand à te filer mes fichiers sources, désolé c'est pas possible : ils sont pas à moi ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #19
    Seb.26

    Re : [Programmation C] - Interruption / Appui long

    Citation Envoyé par lil-vince Voir le message
    C´est sur que ca dépend de l´utilisation: but personnel ou commerciale (dans ce cas il faut toujours considérer que les clients sont des c***)
    C'est surtout qu'il faut pas qu'il y ai un bug ...

    En même temps tout dépend de la criticité de ce que tu code ( plutôt un module d'arrimage de la NASA ou un timer pour cuire les œufs chez toi ? )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  21. #20
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    En même temps tout dépend de la criticité de ce que tu code ( plutôt un module d'arrimage de la NASA ou un timer pour cuire les œufs chez toi ? )
    Bien d´accord mais même si ton Timer pour les oeufs plante quand tu le remonte en cours d´utilisation, madame ne va pas être contente alors que si tu le fait pour toi, tu sais qu´il ne faut pas le faire!

    Donc ce que je voullais dire c´est que si c´est pour qu´il allume une lampe ou une autre chez lui, il n´a pas d´interêt à appuyer 15fois dessus et donc il ne le fera pas et ce n´est donc pas la peine d´en faire plus...

    Par exemple, j´ai bossé sur des caisses libres services et donc utilisées par Mr Toutlemonde et on a fait en sorte que si la personne met "un coup de fesse" dans le charriot qui est pesé, la balance n´envoie pas de nouveau poids à la caisse pour pas que ca plante tout! Alors que si c´était pour chez moi, je ne mettrais pas de coup sur la balance et pis c´est tout...

  22. #21
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Bonjour,

    bon j'ai du mal à réaliser la fonction que je veux...
    la je teste avec un timer mais cela ne fonctionne pas:
    Code:
    	if (INTCON3bits.INT1IF)
    		{
    		TMR0L=0x00;
    		T0CON=0x86;
    		
    		while(TMR0L!=0xFF)
    			{
    			if(TMR0L > 0x0F && PORTBbits.RB1==1)		//Appui long
    				{
    				LEDA5=!LEDA5;
    				T0CON=0x03;
    				TMR0L=0xFF;
    				}
    			if(TMR0L < 0x0F && PORTBbits.RB1==1)	//Appui court
    				{
    				LEDA3=!LEDA3;
    				T0CON=0x03;
    				TMR0L=0xFF;
    				}
    			}
    		INTCON3bits.INT1IF=0;
    		}
    (il s'agit de mon programme d'interruption.)
    Avez vous une idée...
    j'ai essayé ta méthode Seb26...j'arrive pas...(ah les débutants!!!)
    Merci d'avance
    Nicolas

  23. #22
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Salut,

    Déjà, tu ne te serts toujours pas de ton interruption comme une interruption! tu tests somplement le Flag d´interruption...(ou alors fait tu ce test dans une routine d´interruption? si c´est le cas, on t´avais conseillé de mettre ton prog en dehors des routines d´interruption...)

    Sinon, combien de temps met ton timer à arriver jusqu´a 0xFF?
    Pourquoi fais tu "TMR0L=0xFF;" ? (dsl c´est que je n´utilise pas de PIC donc c´est peut-être ce qu´il faut faire)
    Je jeterais un coup d´oeil demain mais est ce que t´as correctement initialisé ton timer?

    Sinon,même remarque que "je ne sais plus quand", je suis pas sur à 100% mais il me semble que si tu ne mets pas de paranthèses dans tes tests, ca ne marche pas!
    Donc:

    if((TMR0L > 0x0F) && (PORTBbits.RB1==1))
    Mais sinon, si ton timer est utilisé correctement (et qu´il n´arrive pas à 0xFF trop vite), ca devrais marcher (avec des paranthèses bien sur )

    Quand t´as un problème dit ce que t´obtiens (est-ce que les LED s´allument des fois quand même?)

  24. #23
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Bonjour,

    éjà, tu ne te serts toujours pas de ton interruption comme une interruption!
    Si, je me sert de mon interruption, c'est que je ne met pas mon programme entier..

    ou alors fait tu ce test dans une routine d´interruption? si c´est le cas, on t´avais conseillé de mettre ton prog en dehors des routines d´interruption...
    bon je l'ai fais je l'avoue...

    Et ce que j'obtiens, c'est que ma LED ne change pas détat...
    Mais je pense que ma méthode n'es pas bonne..ce n'est pas la bonne démarche.

    Et le principe de Seb26, jarrive pas à le mettre en oeuvre..
    Code:
    void main (void)
    {
    init_uc();				//Appel SP Initialisation du microcontroleur
    
    while(1)
    {
    
    if(PORTBbits.RB1==0)
    	{
    	if(lissage!=0xFF)
    		{
    		lissage++;
    		if(lissage>10)
    			{
    			lissage=0xFF;
    			LEDA5=!LEDA5;
    			}
    		else if(lissage<10)
    			{
    			LEDA3=!LEDA3;
    			}
    		}
    	lissage=0;
    	}
    
    //config_int();
    
    
    }//Fin While(1)
    }//Fin Programme Principal
    Le résultat est aléatoire, pour un appui court, autant ma LED va rester allumé, autant elle changera d'état...je suis perdu
    Une autre petite aide serait la bien venu...
    Merci d'avance

  25. #24
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    C´est sur que la, si tu suis le déroulement, à chaque fois que tu va incrémenter lissage et qu´il sera inferieur à 10, tu va changer l´état de ta LEDA3 donc a une fréquence que ton oeil ne verra pas donc pour toi LEDA3 doit surement restée éteinte (enfin des fois elle doit finir par rester allumée et des fois non...)!
    Et dés que tu arrives à 10, tu change l´état de LEDA5!

    D´ailleurs, dsl mais c´est un peu tout faux, je n´ai pas le temps d´écrire une tartine mais pendant le lissage il ne sert à rien de regarder l´etat de ton BP car le but de ce lissage est justement de ne pas prendre en compte les impulsions que va faire ton BP (quand tu appuis sur un BP, il en résulte pluseiurs transition haut-bas, bas-haut)!

    Je sais pas si c´est clair, je t´expliquerais mieux demain matin si j´ai du temps...

  26. #25
    Seb.26

    Re : [Programmation C] - Interruption / Appui long

    Citation Envoyé par jorg1n Voir le message
    Et le principe de Seb26, jarrive pas à le mettre en oeuvre..
    Je suis pas certain du tout que le pseudo code que je t'avais filé et ce que tu as écris soit identique ...

    Quand à savoir comment on lisse une entrée, le principe global c'est de ne valider un changement d'état que lorsque celui ci est constaté x fois de suite ...

    En fait, tu as un état logique et un état physique ... l'état logique = signal lissé, état physique = état de la pin ...

    Par exemple, on lisse sur 5 échantillons


    Code:
    Etat de la pin ; État logique ; Valeur du lissage
    0 ; 0 ; 0
    0 ; 0 ; 0
    1 ; 0 ; 1
    1 ; 0 ; 2
    1 ; 0 ; 3
    0 ; 0 ; 0
    1 ; 0 ; 1
    1 ; 0 ; 2
    1 ; 0 ; 3
    1 ; 0 ; 4
    1 ; 0 ; 5 -> * ; 1 ; FF
    1 ; 1 ; FF
    1 ; 1 ; FF
    0 ; 1 ; 0
    0 ; 1 ; 1
    0 ; 1 ; 2
    0 ; 1 ; 3
    1 ; 1 ; 0
    1 ; 1 ; 0
    0 ; 1 ; 1
    0 ; 1 ; 2
    0 ; 1 ; 3
    0 ; 1 ; 4
    0 ; 1 ; 5 -> * ; 0 ; FF
    ...ect...

    Cela te permet également de générer des événements sur les fronts ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  27. #26
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    Salut,

    Déjà: finalement, ce que tu veux c´est changer l´état d´un LED ou d´une autre selon si l´appui est long ou cours?

    Quand à savoir comment on lisse une entrée, le principe global c'est de ne valider un changement d'état que lorsque celui ci est constaté x fois de suite ...
    C´est vrai aussi, moi pour son application,j´aurais eu tendance à mettre un petit délais pour "sauter" les impulsions car si la résistance de Pull-up n´est pas trop grande, il n´y a pas de raison que le BP se déclenche tout seul!

    Sinon, déjà des remarques sur ton dernier prog:

    if(lissage!=0xFF)
    {
    lissage++;
    if(lissage>10)
    {
    lissage=0xFF;
    LEDA5=!LEDA5;
    }
    else if(lissage<10) //En rouge = inutile
    {
    LEDA3=!LEDA3;
    }
    }
    lissage=0;
    Déjà, la plus grosse erreur: à chaque passage dans ta boucle "if(PORTBbits.RB1==0)", tu incrémente lissage, tu le test et tu le remets à zero!
    Donc ce qui se passe quand PORTBbits.RB1=0:
    ~comme je suppose que lissage = 0 ton premier test est vrai...
    ~incrémentation de lissage...
    ~lissage > 10 ? est faux
    ~lissage < 10 ? est vrai donc tu changes l´état de LEDA3
    ~lissage = 0 ! Donc tu te retrouve dans la même configuration qu´au début (lissage = 0) tant que PORTBbits.RB1=0 et ta variable "lissage" ne dépassera jamais 1, tu rentreras donc à chaque fois dans ton test "if(lissage<10)" et tu va donc changer l´état de ta LEDA3 a une vitesse invisible à l´oeil nu (enfin je suppose ca depend de la frequence de ton horloge) et quand PORTBbits.RB1=1 tu as une chance sur 2 que ta LED reste allumée! Et (je t´ais dit une connerie hier) ta LEDA5 ne s´allumera jamais...

    La deuxieme erreur est que même s´il n´y avait pas ce problème, tu changes l´état de LEDA3 a chaque incrémentation de "lissage" entre 0 et 10 et parei pour LEDA5 pour lissage > 10 !

    Donc, si tu veux garder cette logique(compter le temps à l´etat bas), il faut faire:

    lissage = 0; // (dans les init.)
    while(1)
    {
    while( (PORTBbits.RB1==0) && (lissage !=0xFF) )
    {
    lissage++;
    }

    if (lissage != 0)
    {
    if (lissage > 10)
    {
    LEDA5=!LEDA5;
    }
    else
    {
    LEDA3 = !LEDA3;
    }
    lissage = 0;
    }
    }
    Donc la valeur 10 est ton seuil pour changer l´état d´une LED ou de l´autre! Mais je trouve ca faible, ca depend a quelle fréquence tourne ton uC mais tu risque de ne jamais allumer LEDA3 ! Tu devrais même prendre minimum 2 octets pour "lissage" car je dirais que même 0xFF (=255) risque aussi d´être trop court(ac tourne très vit un microC)!

    Mais moi j´aurais eu tendance à faire plus simple (enfin je trouve):

    // Dans la routine d´interruption

    if (INTCON3bits.INT1IF) // interruption front descendant du BP
    {
    for (lissage = 0; lissage < seuil; lissage++) {} // Délais proportionnel à "seuil"
    if (PORTBbits.RB1==0) // Si encore en appui->appui long
    {
    LEDA5 = !LEDA5;
    }
    else // Bouton relaché -> appui court
    {
    LEDA3 = !LEDA3;
    }
    INTCON3bits.INT1IF=0;
    }
    Et tu peux remplacer la boucle for() par un timer(juste plus précis)

    Au fait, pourquoi ce test?
    if (INTCON3bits.INT1IF)
    Si tu n´as que ce BP qui peu générer des interruptions, ca ne sert à rien de chercher de quel pin elle vient (car je suppose que c´est un vecteur d´interruption qui gere tout un port et qu´après tu tests pour savoir d´ou vient l´int.)

    Pfiou Un joli petit roman à lire (mais pas facile d´expliquer de la prog en 2 lignes!)
    J´espere qu´au moins c´est et ca va t´aider!

  28. #27
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Bon tout d'abord, je te remercie Seb26 pas ta petite explication sur le lissage, j'ai bien compris maintenant...
    Ensuite , LilVince, j'ai lu ton roman...et je te rassure, c'est peut etre long, mais c'est lisible, et très compréhensible..
    Je vais essayé de mettre en application tout ça et je vous tiens au courant..
    En ce qui concerne la taille de la variable lissage, je pense aussi qu'elle est petite car, je n'ai pas le temps de voir le changement d'état.
    Je fais mes petits tests et je vous tiens au courant

    Encore merci pour votre aide
    Bonne journée
    Nicolas

  29. #28
    invite74b5b8f7

    Re : [Programmation C] - Interruption / Appui long

    En ce qui concerne la taille de la variable lissage, je pense aussi qu'elle est petite car, je n'ai pas le temps de voir le changement d'état.
    Attention, tu confonds je pense, la variable lissage te permets (comme tu l´utilise) de définir le seuil de temps pour allumer une diode ou l´autre! A la base tu voullais par exemple que si on appuis plus de 1 seconde sur le BP, ca soit la diode LEDA5 qui s´allume donc dans mon exemple, il faut que la boucle "for(lissage = 0; lissage<seuil; lissage++)" puisse durer 1 seconde!

    Cela dépend principalement de la fréquence d´horloge de ton CPU et du nombre de cycles qu´il lui faut pour exécuter une instruction!

    Donc plus ton CPU est rapide, plus il te faudra une valeur de "seuil" élevée et ce que je voullais dire, c´est que si lissage est définit sur 2 octets, il ne pourra pas aller plus haut que 65535 ce qui sera à mon avis trop court!
    L´utilisation d´un timer t´évite de rentrer dans les détails de ton processeur si tu veux définir ce temps précisemment mais à mon avis, pour ton application fais des essais et détermine la valeur de seuil que tu veux par des essais! Seulement utilise au moins un long int pour ta variable lissage...

  30. #29
    Seb.26

    Re : [Programmation C] - Interruption / Appui long

    Pense aussi à cadencer tes tests ... par exemple faire boucler le uCPU sur un while(1) { } à fond de MHz, tu aura beau compter jusqu'a 100, ça ne fera toujours que quelques uS ... donc le lissage ne sert à rien ...

    Perso, mes soft sont en général cadencés à 10ms ( = mon "clock OS" ), et les filtrage des entrées style BP est fait sur 150ms ( 15 top "clock OS" ) ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  31. #30
    jorg1n

    Re : [Programmation C] - Interruption / Appui long

    Bonjour,
    après avoir fait quelques tests des autres fonctions de mon PIC, me revoila sur le sujet de l'appui long sur un BP...
    Perso, mes soft sont en général cadencés à 10ms ( = mon "clock OS" ), et les filtrage des entrées style BP est fait sur 150ms ( 15 top "clock OS" ) ...
    Seb26., comment tu fais ça, avec un timer?
    Car moi c'est sur, c'est beaucoup trop rapide..
    Merci d'avance.

Page 1 sur 4 12 3 DernièreDernière

Discussions similaires

  1. Réponses: 22
    Dernier message: 16/10/2007, 21h28
  2. Appui tête automobile
    Par inviteb4a31eef dans le forum Technologies
    Réponses: 0
    Dernier message: 06/08/2007, 19h55
  3. appui de fenêtre
    Par invitea8202b75 dans le forum Bricolage et décoration
    Réponses: 2
    Dernier message: 02/07/2007, 18h51
  4. Physicien cherche appui mathématique
    Par invitedfa92d8f dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 18/09/2006, 08h17
  5. Interruption et PIC18F4431
    Par invitec7ced588 dans le forum Électronique
    Réponses: 1
    Dernier message: 09/03/2006, 14h01
Découvrez nos comparatifs produits sur l'informatique et les technologies.