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

Recommencer le programme au début après une interruption (PIC16f84A)



  1. #1
    _Flo_

    Recommencer le programme au début après une interruption (PIC16f84A)


    ------

    Bonjour,
    J'ai fait un programme qui incrémente une variable toutes les 10ms, avec une interruption sur RB0 qui s'occupe d'afficher la valeur de cette variable sur un 7 segments.
    Mon problème est qu'au retour de cette interruption, j'aimerais recommencer depuis le début (Main), même si l'interruption est arrivée en pleine Tempo, et ceci sans pour autant faire un reset (pour garder un temps précis pour ma boucle!)

    Merci d'avance pour vos propositions!

    -----

  2. Publicité
  3. #2
    Gérard

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    Bonjour,
    Il faudra en dire un peu plus sur ton programme, on ne peut pas tout deviner.

  4. #3
    _Flo_

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    Bonsoir,
    C'est tout simple, pour le programme principal j'incrémente d'abord une variable 'compteur', ensuite je fais une boucle Tempo (avec 3variables) de 10ms, puis si 'compteur' est à 255 je le remet à 0.

    Pour la fonction lors de l'interruption sur un flan montant (RBO) je mets la valeur de cette variable sur les sorties en passant par une table.
    Une fois cette opération faite, j'aimerai pouvoir recommencer le programme au tout début, sans pour autant repasser par les initialisations (je pense remettre mes variables à 0 dans mon interruption avant de recommencer).
    Le problème est que je ne sais pas comment faire pour ne pas reprendre le programme ou il a été interrompu mais lui indiquer un point précis ou revenir!

    Merci pour vos conseils!

  5. #4
    Gérard

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    Citation Envoyé par _Flo_ Voir le message
    Bonsoir,
    C'est tout simple, ...
    Bonjour,
    Si c'était simple, tu ne poserais pas de question sur le forum.

    Citation Envoyé par _Flo_ Voir le message
    pour le programme principal j'incrémente d'abord une variable 'compteur', ensuite je fais une boucle Tempo (avec 3variables) de 10ms, puis si 'compteur' est à 255 je le remet à 0.

    Pour la fonction lors de l'interruption sur un flan montant (RBO) je mets la valeur de cette variable sur les sorties en passant par une table.
    Une fois cette opération faite, j'aimerai pouvoir recommencer le programme au tout début, sans pour autant repasser par les initialisations (je pense remettre mes variables à 0 dans mon interruption avant de recommencer).
    Le problème est que je ne sais pas comment faire pour ne pas reprendre le programme ou il a été interrompu mais lui indiquer un point précis ou revenir!

    Merci pour vos conseils!
    Je ne suis pas sur que ce soit possible, les IRQ sont pas définition aléatoires et reprennent (heureusement) le programme où il a été interrompu.

  6. #5
    alainav1

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    bonjour,
    une piste (car je n'ai jamais essayé ) mais
    un goto (a l'adresse ou tu veux aller )en fin du programme d'interruption

    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  7. A voir en vidéo sur Futura
  8. #6
    Gérard

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    Citation Envoyé par alainav1 Voir le message
    bonjour,
    une piste (car je n'ai jamais essayé ) mais
    un goto (a l'adresse ou tu veux aller )en fin du programme d'interruption

    cordialement
    Alain
    Bonjour,
    Lors de l'instruction RETURN, on récupère l'adresse de retour au programme.
    Si tu fais un GOTO avant RETURN, on ne dépile pas la pile et je ne sais pas ce qui va se passer.
    C'est peut-être à essayer mais sans garantie.

  9. Publicité
  10. #7
    Toufinet

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    Modifier l'adresse de retour dans la pile ? ( l'adresse qui est appelée lors du RETFIE )

  11. #8
    DAUDET78

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    Citation Envoyé par Gérard Voir le message
    Si tu fais un GOTO avant RETURN, on ne dépile pas la pile et je ne sais pas ce qui va se passer.
    et il y a des flags qui sont pas restitués, donc ça plante le microprocesseur.
    Sur certain micro (je connais rien aux PICs), on a accès au pointeur de pile. On peux donc modifier sa valeur et le contenu de la pile pour y mettre le bon (futur) registre d'état, la bonne (future) adresse de retour. Mais c'est de la programmation scabreuse à l'Opinel et au mord moi le machin !

    Il est plus prudent de modifier une variable globale dans la routine d'interruption et de tester cette variable dans la routine de temporisation pour savoir qu'il faut retourner au début du programme
    J'aime pas le Grec

  12. #9
    RISC

    Re : Recommencer le programme au début après une interruption (PIC16f84A)

    _Flo_,

    Attention : il ne faut pas confondre un RESET et un branchement à l'adresse 000.
    Un Reset provoque l'initialisation de tout un tas de registres et démarre l'exécution à l'adresse 0.
    Un branchement à l'adresse 000 ne réinitialise pas les registres...
    Si tu veux vraiment faire un RESET, la méthode la plus simple est de connecter une sortie sur la broche MCLR ;=)

    Si tu veux retourner à un endroit précis, il faut mettre un flag à 1 dans ton interruption et tester ce flag dans ton programme principal puis te brancher à l'adresse que tu désires ;=)

    La pile est HW donc oublie cela.

    Il y a par contre plusieurs astuces possibles pour faire un RESET et ne pas passer par l'initialisation.
    Le registre STATUS contient plusieurs bits très intéressants : TO* et PD* (voir datasheet section 2.3.1).

    Il te suffit d'utiliser par exemple le watchdog (il y a d'autre possibilités) et de générer un reset dans ton interruption par le watchdog. Au RESET qui suit, tu testes si ton reset est un power on OU un watchdog reset ;=)
    Si c'est un watchdog reset il te suffit de sauter l'initialisation ;=)
    Car ce bit n'est PAS reinitialisé par un RESET.

    Lis bien le chapitre sur les RESET et surtout les tables 6.3 et 6.6 qui font voir comment exploiter les bits de STATUS qui sont positionnés en fonction du type de RESET.

    Si tu utilises le Watchdog et que tu veux minimiser le temps pour générer le RESET, regarde la figure 6.11.
    En choisissant TIMER0 avec la fréquence la plus élevée possible, sans prescaler et en démarrant à FF, je pense que le watchdog doit claquer très rapidement.

    Une autre méthode possible est d'utiliser la broche MCLR en la reliant à une sortie et au reset de tester 3,4,5 (ou plus en fonction de Murphy) octets en mémoire que tu as écrits au power on reset pour savoir si c'est un MCLR ou un power up reset.
    La probabilité d'avoir ces 3,4,5 ou plus octets avec la valeur que tu leur à donnée est statistiquement très très faible et tu peux en déduire de quel type de RESET tu sors et de faire l'initialisation ou pas...

    Ce genre de méthode est connue et éprouvée

    J'espère que mon explication est claire...

    a+

Sur le même thème :

Discussions similaires

  1. reprise de prog aprés interruption (pic16f877)
    Par patwice dans le forum Électronique
    Réponses: 13
    Dernier message: 18/03/2008, 21h58
  2. [Blanc] Lave-Vaisselle Brandt Vm300 A100 AAclass eau stagnante interruption programme
    Par Aristote2001 dans le forum Dépannage
    Réponses: 2
    Dernier message: 15/02/2008, 09h45
  3. [Blanc] Interruption programme lave-linge arthur AWW1407
    Par stilgar7 dans le forum Dépannage
    Réponses: 0
    Dernier message: 19/10/2007, 12h09
  4. Programme d'un PIC16F84A
    Par gaga2410 dans le forum Électronique
    Réponses: 7
    Dernier message: 25/08/2007, 07h45
  5. programme pic16F84A
    Par amgab2003 dans le forum Électronique
    Réponses: 0
    Dernier message: 26/03/2006, 12h14