minuteur marche/arret logiciel comment?
Répondre à la discussion
Affichage des résultats 1 à 30 sur 30

minuteur marche/arret logiciel comment?



  1. #1
    electra19

    minuteur marche/arret logiciel comment?


    ------

    Bonjour a tous,

    je suis en train de faire un programme en langage c pour un minuteur avec un PIC 18f45.... j'aimerai savoir comment réaliser une fonction marche/arrêt. c'est a dire le mettre sur pause lorsqu'il compte ou décompte par un bouton et le redemarrer la ou il s'est arrêté par le même bouton. je galere dessus si quelqu'un a une idée... merci d'avance.

    -----

  2. #2
    carcan

    Re : minuteur marche/arret logiciel comment?

    Hello !

    si tu fais ta base de temps avec un Timer, il suffit de désactiver/réactiver l'interruption de ce timer.

    A+
    Laurent

  3. #3
    gabuzo

    Re : minuteur marche/arret logiciel comment?

    J'espère que ça ne fait pas que minuteur parce qu'un 18F45.. pour si peu c'est un peu du gaspillage (c'est un point de vue perso).

    Sinon tu mets un bit à 1 ou 0 selon ce que fait le compteur (une sorte de flag) et lors de l'appui sur le bouton il suffit de tester le bit.
    Si bit à 1 faire ceci, si bit à 0 faire autre chose.
    Je suis Charlie

  4. #4
    electra19

    Re : minuteur marche/arret logiciel comment?

    ça ne marche vraiment pas, voila mon petit bout de programme:

    etq1
    rb1_bit= rb1_bit & 1; // surveille l’entrée du bit 1 du portb
    if (rb1_bit==1)
    {
    pause=rb1_bit; //met valeur de rb1 dans pause
    a++; //incrémentation de a
    }
    if (a==2)
    {
    goto suite; branchement a la suite du programme
    }
    if (pause==1)
    {
    goto etq1; // pause timer
    }

    suite:a=0;

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

    Re : minuteur marche/arret logiciel comment?

    Citation Envoyé par electra19 Voir le message
    ça ne marche vraiment pas, voila mon petit bout de programme:

    etq1
    rb1_bit= rb1_bit & 1; // surveille l’entrée du bit 1 du portb
    if (rb1_bit==1)
    {
    pause=rb1_bit; //met valeur de rb1 dans pause
    a++; //incrémentation de a
    }
    if (a==2)
    {
    goto suite; branchement a la suite du programme
    }
    if (pause==1)
    {
    goto etq1; // pause timer
    }

    suite:a=0;
    Hi All,

    @electra:Mes remarques:
    1. Mobiliser toute cette électronique pour un simple compteur (minuteur marche/arret) c'est du gaspillage :/, Okay on l'accepte comme exercices de débutants
    2. Ton petit programme ne sert pas à utiliser les Built-in Timer fournis par le HARDWARE. ce n'est qu'un simple comptage..si jamais tu en pense vraiment, tu devrais voir ces notions: config des paramètres du comptage du Timer, quartz, prescaler, gestion des flag d'interruption, etc.
    3. Anyway, let's go step-by-step: Commence tout d'abord par la maitrise des ports E/S du PIC avant d'entrer aux séquences de tests.
    4. une description du montage accompagné au code aurait faciliter le diagnostic du problème

    @+
    Dernière modification par Delared ; 15/12/2013 à 23h34.

  7. #6
    electra19

    Re : minuteur marche/arret logiciel comment?

    La je suis vraiment bloqué, voila commet je procede, ok J'utilise une interruption avec le timer0 donc je surveille tout le temps le bit rb1 s'il passe a un, si appui sur rb1, je met une variable a 1 par exemple b=1 et dans le programme principal il boucle si if (b==1).... pour faire la pause du minuteur. le probleme c'est comment remettre ce bit a 0 s'il y a un nouvel appui sur rb1 ? quelqu'un aurait il une idée?

  8. #7
    biloux911

    Re : minuteur marche/arret logiciel comment?

    Bonjour,

    Tu initialises b à 1 ou 0 et en cas d'appui, b = !b (b égale non b, si b valait 0 il vaut maintenant 1 et inversement)
    Dernière modification par biloux911 ; 19/12/2013 à 08h30.

  9. #8
    reda-21

    Re : minuteur marche/arret logiciel comment?

    Bonjour electra19;

    La meilleur solution est de mettre ton bouton sur une entrée d’interruption externe du µ-c, ton programme gérera deux modes START et PAUSE avec ( PAUSE = ~START).
    tu configures ton timer0 suivant ton Quartz, par exemple si t'as une interruption interne chaque 10ms (cf Programme ci-dessous) tu récupères une minute ( trop facile ).


    Code:
    // petit programme à la va vite :(
    static unsigned cpt;
    
    if( START ) {
    // ça compte
    .
    cpt++;
    } else {
    // ça se met en pause
    }
    
    IntExterne() {
    START = ~ START
    }

    Tu n'oublieras pas un condo de 220nF en parallèle avec ton bouton car l'entrée de l'interruption externe est très sensible.

    Réda.

  10. #9
    electra19

    Re : minuteur marche/arret logiciel comment?

    hmmm biloux911 comment ça b!=1??.... en ce moment ce que je teste c l entrée du portb soit si rb1_bit==1....peux tu m'expliquer stp.

    reda21 ton programme est trop a la va vite pour moi je ne suis qu'un petit debutant
    Dernière modification par electra19 ; 19/12/2013 à 11h12.

  11. #10
    reda-21

    Re : minuteur marche/arret logiciel comment?

    electra19;

    Sur la datasheet de ton µ t'as des pins appelées "External Interrupts", ta pause vient interrompre ton programme et le mettre en pause c'est la meilleure solution.
    Dans ton programme tu définis ce que ton Bouton doit faire, vu qu'il est sur la patte de l'interruption externe, il devra chager l'état sois de start à pause ou bien l'inverse ==> tu mets une variable start avec start = 1 marche, start = 0 pause.

    n'hésite pas à poser d'autres questions.

    Réda.

  12. #11
    reda-21

    Re : minuteur marche/arret logiciel comment?

    Citation Envoyé par electra19 Voir le message
    le probleme c'est comment remettre ce bit a 0 s'il y a un nouvel appui sur rb1 ? quelqu'un aurait il une idée?
    oui j'ai une idée.

    au lieu de le mettre à 0, tu l’initialise à 0 et tu lui fait changer d'état à chaque appuie sur le bouton. ex : si (appui sur bouton) { b = ~b }

    Réda.

  13. #12
    biloux911

    Re : minuteur marche/arret logiciel comment?

    Le programme que propose réda est une très bonne base à mon avis !

    Comme il l'a dit, il est grandement préférable de passer par des interruptions. Ça permet à ton microcontrôleur de ne pas passer son temps à vérifier l'état d'un port, il vit sa vie tranquilou et quand tu appuies sur le bouton, tu actives un bout de code : IntExterne() { ici }. Ce que tu cherches à faire c'est changer l'état d'une variable booléenne (vrai/faux) à chaque appui sur le bouton. Donc le code en cas interruption c'est b=!b ou start=~start c'est la même idée. (! et ~ sont des opérateurs "non" en C et C++, ça donne l'état opposé, si c'était vrai ça devient faux, si c'était faux ça devient vrai). Ensuite dans ton programme tu conditionnes ton compteur sur l'état de la variable (ici "start") et le tour est joué.

    Par contre le compteur va monter très très rapidement comme ça, il faudrait ajouter du délai ou utiliser une autre interruption interne à intervalle de temps régulier (sans doute mieux, mais je ne suis pas un spécialiste !) ce qui permet de ne pas utiliser le microcontrôleur à attendre, entre deux interruption interne il peut encore faire autre chose.

    A toi de jouer maintenant !

  14. #13
    electra19

    Re : minuteur marche/arret logiciel comment?

    Fiou! apres avoir passé l'apres midi dans 500 pages de datasheet, ça marche. enfin ça m'a permis de travailler un peu la langue de shakespeare aussi lol. merci les gars , finalement j'ai utilisé ta méthode reda-21 avec external interrupts. Il ne reste plus qu'a mettre tout ça en ordre.
    Dernière modification par electra19 ; 22/12/2013 à 02h00.

  15. #14
    reda-21

    Re : minuteur marche/arret logiciel comment?

    Bonne chance pour la suite.

    Réda.

  16. #15
    reda-21

    Re : minuteur marche/arret logiciel comment?

    En vrai t'auras des blêmes sur l'externalInterrupt.
    N'hesite pas à laisser un message si tu trouves des difficultés
    Réda.

  17. #16
    electra19

    Re : minuteur marche/arret logiciel comment?

    Merci, j'ai une autre petite question: Dans mon programme j'aimerai faire autre chose pendant que le minuteur continue a tourner derriere du genre changer de mode, afficher l'heure lors de l'appui d'un bouton poussoir sans arreter le minuteur qui fonctionne toujours de telle sorte que quand je reviens en mode minuteur il ne s'est pas arrete de compter. y'a t-il un mode spécial ou des configurations a faire pour ça dans le microcontroleur. Doit -on utiliser aussi les interruptions?
    Pour ceux qui rejoignent la file, j'utilse un pic18f45...pourquoi? ben j'ai acheté une carte et le 18f45...etait fourni avec..
    Dernière modification par electra19 ; 22/12/2013 à 18h09.

  18. #17
    electra19

    Re : minuteur marche/arret logiciel comment?

    N'hesiter pas a me repondre .
    Dernière modification par electra19 ; 22/12/2013 à 18h18.

  19. #18
    Delared

    Re : minuteur marche/arret logiciel comment?

    Citation Envoyé par electra19 Voir le message
    Merci, j'ai une autre petite question: Dans mon programme j'aimerai faire autre chose pendant que le minuteur continue a tourner derriere du genre changer de mode, afficher l'heure lors de l'appui d'un bouton poussoir sans arreter le minuteur qui fonctionne toujours de telle sorte que quand je reviens en mode minuteur il ne s'est pas arrete de compter. y'a t-il un mode spécial ou des configurations a faire pour ça dans le microcontroleur. Doit -on utiliser aussi les interruptions?
    tu utilise le TIMER hardware du µC.

    Citation Envoyé par electra19 Voir le message
    Doit -on utiliser aussi les interruptions?
    OUI, par exemple pour une config unitaire du timer de 1ms, le timer décompte (en bacckground), et à chaque fois il arrive à 0 un flag d'interruption est levé (sur la ISR du timer tu incrémente une variable initialisée à 0) donc cette variable va toujours contenir le nombre de milisecondes compté dès le lancement du timer...

  20. #19
    reda-21

    Re : minuteur marche/arret logiciel comment?

    Ah un PC sous la main

    Code:
    // Utilise un timer pour interrompre le programme configure le par rapport à ton quartz genre chaque 10ms
    // ton bouton sur l'intérruption externe
    
    ///////////////////////////////// Variables globales
    unsigned long dureeSecondes = 0;				
    unsigned dureeMinutes = 0;
    char dureeHeures = 0;
    ////////////////////////////////////////////
    
    void init_Ports() {
    
    // Tu initialise tes I/O standards
    
    }
    
    void main() {
    
    init_Ports();
    InterrupsEnable();		// Tu actives tes intérruptions
    
    	while(1) {
    	// Tu fais ce que tu veux ici indépendamment de tout
    	}
    }
    
    Interrupt_Timer1() {
    static char cpt = 0;
    	if(Start) {
    		cpt++;
    		if(cpt >= 100) {
    			dureeSecondes++;
    				if(dureeSecondes >= 60) {
    					dureeMinutes++;
    						if(dureeMinutes >= 60) {
    							dureeHeures++;
    							dureeMinutes = 0;
    						}
    					dureeSecondes = 0;
    				}
    			cpt = 0;
    		}
    	}
    }
    
    External_Interrupt() {    // Ton bouton de pause !!
    start = ~ start;
    }

  21. #20
    reda-21

    Re : minuteur marche/arret logiciel comment?

    G oublié

    dans tes variables globales

    tu ajoutes ceci
    avant la déclaration de tes variables globales
    typedef char bool;

    et ceci dans tes variables globales

    bool start = 1;

  22. #21
    electra19

    Re : minuteur marche/arret logiciel comment?

    reda-21, lol désolé mais j'ai oublié de dire que le programme de l'horloge est déja fait et il fonctionne donc la question c'est juste comment passer de l'un a l'autre sans les arrêter donc du minuteur a l'horloge et vice versa ou peut être que je ne comprend ton code explique un peu. que fais la fonction interrupt Timer1()?
    Dernière modification par electra19 ; 22/12/2013 à 22h29.

  23. #22
    reda-21

    Re : minuteur marche/arret logiciel comment?

    MON PROGRAMME FAIT EXACTEMENT CE QU'IL TE FAUT!!!

    Citation Envoyé par electra19 Voir le message
    que fais la fonction interrupt Timer1()?
    ce n'est pas une fonction mais une routine d’interruption, elle est appelée automatiquement chaque 10ms (pour cet exemple) depuis la mise sous tension de ton µ-C (start est initialisé à 1)

    Citation Envoyé par electra19 Voir le message
    j'ai oublié de dire que le programme de l'horloge est déja fait
    j'aimerai bien voir comment tu gères une horloge sans gestion fine du temps?????

    comprends que dans ta boucle infinie tu peux faire ce que tu veux ton horloge fonctionnera toute seule.

    J'espère que j'ai été bien clair, n'hésite pas si tu ne comprends pas.

    Réda.

  24. #23
    electra19

    Re : minuteur marche/arret logiciel comment?

    ben... delay(1s) a chaque comptage dansle programme principal ça marche aussi non?

  25. #24
    reda-21

    Re : minuteur marche/arret logiciel comment?

    Non psk tu STOPPE ton programme avec delay c une tempo !!!!

    En plus ton delay n'est pas fiable, sa valeur se degrade et diverge si tu la compares avec une vraie horloge testé
    Réda
    Dernière modification par reda-21 ; 23/12/2013 à 20h36.

  26. #25
    electra19

    Re : minuteur marche/arret logiciel comment?

    Ok, je vois, donc comment faire alors, il faut synchroniser le comptage des secondes avec la fréquence d'horloge du µc?c que tu fais dans dans ta fonction interruptimer1()?
    Dernière modification par electra19 ; 24/12/2013 à 20h53.

  27. #26
    reda-21

    Re : minuteur marche/arret logiciel comment?

    Citation Envoyé par electra19 Voir le message
    Ok, je vois, donc comment faire alors, il faut synchroniser le comptage des secondes avec la fréquence d'horloge du µc?c que tu fais dans dans ta fonction interruptimer1()?
    1/ Tu regardes la partie des interruptions sur Timer dans la Datasheet de ton µC
    2/ Tu configures les bits de l'octet d'interruption en te basant sur la fréquence de ton quartz externe, ainsi tu fixeras une période fixe pour tes interruptions
    3/ Une fois tes interruptions configurées, tu mets ce que tu veux dans ta routine d'interruption, ton µC l’appellera à la fréquence que t'auras définie ( Si 10ms par ex : un compteur++ à l'intérieur de ta routine qui passe à 100 => une seconde s'est écoulée).

    Réda.

  28. #27
    electra19

    Re : minuteur marche/arret logiciel comment?

    Ok reda je vais voir ça je te reviendrai la dessus.... merci

  29. #28
    electra19

    Re : minuteur marche/arret logiciel comment?

    Hello,

    Encore bloqué sur mon programme. Lors du réglage de l'heure, J'aimerai mettre dans mon programme un choix d'affichage de l'heure en mode 12h ou 24h avec un seul bouton sans utiliser les interruptions. Est ce possible? j'ai l'impression que sans interruption on ne peux rien faire avec les boutons.

  30. #29
    Forhorse

    Re : minuteur marche/arret logiciel comment?

    Il suffit de faire une boucle de "scrutation"
    tu viens vérifier régulièrement (a chaque boucle du programme, donc en therorie des centaines de fois par seconde si le programme n'est pas trop mal fait) si le bouton est appuyé ou non
    genre

    début:
    instruction
    ....
    instruction
    Si bouton =1 alors {
    instructions (ou appel du routine)
    }
    instruction
    ...
    instruction
    boucle début

    Tu peux alors surveiller ainsi tout un tas de chose sans bloquer le reste du programme (c'est quand même le b-à-ba de la programmation...)
    parce que excusez moi, mais utiliser une interruption externe pour surveiller un bouton poussoir c'est un peu comme d'utiliser une masse pour écraser une mouche !
    Tout projet flou conduit à une connerie précise !

  31. #30
    electra19

    Re : minuteur marche/arret logiciel comment?

    Grand test du programme, => Echec total,

    J'ai mon programme minuteur et horloge qui affiche du retard a la longue par rapport a d'autre montre. En fait il commence a la meme heure que les autres montres puis prend du retard. Au bout de quelques heures je me retrouve avec plusieurs minutes de retard et pourtant je vois les secondes défilés normalement sur mes afficheurs. Est ce dû aux interruptions qui gere trop de chose? je ne comprend pas d'ou vient l'erreur. C'est mon programme interruption qui gere l'incrémentation des secondes, minutes, heure et le multiplexage de mes 4 afficheurs et déclenche un bit du CAN (go/done) toutes les x secondes pour la température.
    Dernière modification par electra19 ; 01/04/2014 à 19h24.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2011, 22h06
  2. Réponses: 0
    Dernier message: 26/12/2011, 21h23
  3. [Divers] Touche "marche-arrêt" de mon clavier Casio Ctk-230 ne marche plus
    Par invite786b62a0 dans le forum Dépannage
    Réponses: 10
    Dernier message: 05/10/2011, 18h34
  4. [Blanc] comment remplacer bouton marche arret sur seche linge indesit is70c FR
    Par invitef47faa3a dans le forum Dépannage
    Réponses: 3
    Dernier message: 16/03/2011, 14h19
  5. Fabriquer un minuteur pour l'arrêt automatique d'une lampe
    Par Skippy le Grand Gourou dans le forum Électronique
    Réponses: 1
    Dernier message: 16/01/2010, 14h31
Découvrez nos comparatifs produits sur l'informatique et les technologies.