Qui reset mon 68HC11F1 ?
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Qui reset mon 68HC11F1 ?



  1. #1
    invite907bf651

    Qui reset mon 68HC11F1 ?


    ------

    Salut,
    Voila je modifie le firm d'un 68HC11F1. Et je traque un reset qui survient de temps en temps et de facon irrégulière (1 par 24h).
    Pour l'instant je n'ai aucune idée:
    1) ca peut etre l'alim avec le superviseur de tension (je penche pas trop sur cette hypothese)
    2) le watchdog (activé)
    3) le clock monitor CME (activé)
    4) un illegal OPCode sur lequel je provoque un STOP

    Comme ca ne se produit pas souvent j'aimerais faire une routine qui me garde en mémoire la raison du reset. Comment procéder ?

    J'utilise le compilo IAR et je programme en C.
    J'ai bien essayé de mettre une routine d'interruption qui piège un watchdog et avant de faire le STOP je mets une variable EEPROM à une certaine valeur.
    Je génère une boucle sans fin à la suite d'une commande, ca reset mais la valeur de la variable ne change pas. C'est comme si ca ne passait pas dans la routine qui piège le WD. Je ne sais meme pas si c'est possible de passer dans cette routine avant que le reset se fasse.

    Comment feriez-vous ca ?

    Merci pour votre aide
    Julien

    -----

  2. #2
    Jack
    Modérateur

    Re : Qui reset mon 68HC11F1 ?

    Le CME et le COP ne possèdent pas le même vecteur. Il est donc facile de les distinguer du RESET externe ou du POR.

    Tu as déjà regardé de ce côté?

    A+

  3. #3
    invite907bf651

    Re : Qui reset mon 68HC11F1 ?

    Salut et merci,
    C'est justement ca que j'aimerais loggé d'une facon ou d'une autre mais pour l'instant je ne sais pas comment faire.
    Avant d'augmenter la durée pour le COP j'aimerais etre sur que c'est lui qui me fait le reset.
    (je rappel que je programme en C sous le compilo IAR).

    Des lors que le reset s'est produit est-il possible de lire un registre (au redemarrage) qui me dirait qui en est la cause ? le COP, le CME...

    Lors d'une interruption du COP: j'essaye d'écrire une valeur en EEPROM mais ca ne fonctionne pas. C'est comme si la routine d'interruption du COP ci-dessous n'était pas appellée. Je ne sais meme pas si une fois l'interruption du COP activée si je peux faire quelque chose (ecrire dans un registre, ...)



    Sous IAR pour les interruptions il faut procéder comme ca:


    interrupt void
    SCI_interrupt(void)
    {
    }

    interrupt void
    IOT_interrupt(void) /* Illegal Opcode Trap */
    {
    Stop();
    }

    /****************************** ****************************** *******************/

    interrupt void
    NOCOP_interrupt(void)
    {
    EEWR11_16(&STORE11.GERROR,2); /*Routine ecriture en EEPROM*/
    Stop();
    }

    /****************************** ****************************** *******************/

    interrupt void
    CME_interrupt(void) /*COP Monitor Failure*/
    {
    Stop();
    }


    void Stop(void)
    {
    di(); /* disable interrupt*/
    OPTION|=CME; /* clock monitor on */
    _opc(0x07); /* TPA : transfer CCR to A, CCR: condition code register (flag overflow...)*/
    _opc(0x84); /* ANDA # */
    _opc(0x7f); /* 0x7f : le AND permet le reset du bit 8 du CCR. Il s'agit du bit S (disable stop bit), si = 0 ca permet l'instruction STOP
    si = 1 STOP est considéré comme un NOP*/
    _opc(0x01); /* NOP */
    _opc(0x06); /* TAP: Transfer ACCU to CCR*/
    stop_CPU(); /* Spécifique à IAR: correspond à l'instruction STOP*/
    }

  4. #4
    Toufinet

    Re : Qui reset mon 68HC11F1 ?

    Salut,

    Si ton reset intervient de façon "aléatoire", ça ne peut venir que de l'alimentation !
    J'ai déjà eu ça lorsque j'alimentais des LED en multiplexage .. j'ai du rajouter un condo sur l'alim.

    A+

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

    Re : Qui reset mon 68HC11F1 ?

    Salut toufinette et merci mais pour moi ca n'est pas une preuve suffisante.
    Il faut que je mette hors de cause le COP et le CME.
    Pour ca je pourrais tres bien désactiver ces interruptions mais il va falloir que je laisse tourner la bete pendant des jours, et je n'ai pas envie d'attendre aussi longtemps.

    Vos solutions sont toujours les bienvenues.

  7. #6
    invite907bf651

    Re : Qui reset mon 68HC11F1 ?

    Bon alors je génère 2 types d'interruptions:

    -je génère un illegal opcode. Ca passe bien dans la routine d'interruption et je mets une sortie à 1 puis je reset. Ca fonctionne.

    Par contre:
    -je génère une boucle sans fin. Dans la routine d'interruption du watchdog : je mets à 1 une sortie. Ici le programme est bien reseté mais pas contre la sortie ne passe pas à 1 ?!

    C'est comme si je ne pouvais pas influer sur le vecteur d'interruption du COP. Est-ce normal ?

    //je génère un code illegal dans le main pour entrer ici
    interrupt void
    IOT_interrupt(void) /* Illegal Opcode Trap */
    {
    PORTG|=BIT2; //OK ca commute à oscillo
    Stop(); //RESET SOFT
    }

    /****************************** ****************************** *******************/

    //Interruption du watchdog
    interrupt void
    NOCOP_interrupt(void)
    {
    PORTG|=BIT2; //je ne vois rien à oscillo
    Stop();
    }

  8. #7
    invitef86a6203

    Re : Qui reset mon 68HC11F1 ?

    Des resets aléatoires peuvent aussi être des bugs !

    Si une interruption est appelé aléatoirement par un phénoméne externe , ex; "le battement de queue du chat"

    Cette procédure procédure contient un bug qui peut apparaitre que sur 1 ligne des 100 de la procédure, et si en plus un second événement aléatoire se produit ex: "aboiement du chien".
    Le risque de plantage devient une simple satistique du genre de 1/24h.
    évidement aléatoires puisque les 3 événements plantant devront remplir les conditions.
    Mais les 2 évenements aléatoires arrivant forcément un nombre fois par jour en meme temps , il restera 1 chance sur 100 (la ligne bogguées) de planter.

    Cela arrive plus facilement avec Microchip que Motorola avec le PCLATH mais le raisonnement est universel.
    Et pas facile à trouver !

  9. #8
    Jack
    Modérateur

    Re : Qui reset mon 68HC11F1 ?

    Code:
    //Interruption du watchdog
    interrupt void
    NOCOP_interrupt(void)
    {
    PORTG|=BIT2; //je ne vois rien à oscillo
    Stop();
    }
    Je n'ai rien trouvé dans la doc, mais puisque le cop génère un RESET, les registres reviennent peut-être à leur état initial. Du coup, le PTG2 est peut-être revenu en entrée.

    A+

  10. #9
    invite907bf651

    Re : Qui reset mon 68HC11F1 ?

    Salut et merci,
    Oui le port G est réinit mais meme si je mets une boucle d'attente (das le cas du COP) il ne se passe rien à l'oscillo.

    De plus pour l'interruption du COP: dans ma routine, si je retire le Stop() qui génère le reset : ca reset tout de meme ! Donc il y a un mécanisme interne qui fait que ca ne tient pas compte de ma routine (comme si je ne passais pas dedans).

    Je suis toujours ouvert pour savoir comment différencier un reset COP, CME et hard.
    (Autres que de désactiver le COP ou le CME...).

    Merci
    Julien

  11. #10
    Jack
    Modérateur

    Re : Qui reset mon 68HC11F1 ?

    De plus pour l'interruption du COP: dans ma routine, si je retire le Stop() qui génère le reset : ca reset tout de meme !
    Je ne te suis pas.Lorsque le cop déborde, il génère automatiquement un reset.

    Je suis toujours ouvert pour savoir comment différencier un reset COP, CME et hard.
    (Autres que de désactiver le COP ou le CME...).
    A ta place, selon la source du reset (cop ou cme), je modifierai un octet en ram.
    Au por (le reset à la mise sous tension), je lirais l'état de ces octets et j'allumerais une led correspondant à l'état des ces 2 octets.

    A+

  12. #11
    invite907bf651

    Re : Qui reset mon 68HC11F1 ?

    Salut
    Citation Envoyé par Jack Voir le message
    Je ne te suis pas.Lorsque le cop déborde, il génère automatiquement un reset.
    A+
    Exact. Mon code n'a pas d'influence. C'est comme si ca n'était pas le bon vecteur.
    Pourtant c'est définit selon le fichier int6811.h

    /* - INT6811.H -

    $Id: int6811.h r1.3 1998/06/06 17:31:12 dan Exp $

    This file defines the interrupt vector addresses of the 68HC11
    and appropriate function names that can be used with the interrupts.
    It is assumed that the segment INTVEC is located at address 0xFFC0.

    The vector addresses specified in this file is only the offset of
    the vector from the start of the interrupt vector block, 0xFFC0.
    The start of the vector block is specified in the linker command
    file used, e.g. in LNK6811.XCL, and the size of the block is
    specified in CSTARTUP.S07.
    */

    #ifndef _INT6811_H_
    #define _INT6811_H_

    #pragma language=extended

    #ifndef INTVEC_START
    #define INTVEC_START 0 /* Baseoffset from start of */
    #endif /* interrupt vector block. */


    /*=======================*/
    /* Interrupt Definitions */
    /*=======================*/

    /* SCI Serial Communication Interface */
    interrupt [INTVEC_START + 0x16] void SCI_interrupt(void);

    /* SPI Serial Transfer Complete */
    interrupt [INTVEC_START + 0x18] void SPI_interrupt(void);

    /* Pulse Accumulator Input Edge */
    interrupt [INTVEC_START + 0x1a] void PAIE_interrupt(void);

    /* Pulse Accumulator Overflow */
    interrupt [INTVEC_START + 0x1c] void PAO_interrupt(void);

    /* Timer Overflow */
    interrupt [INTVEC_START + 0x1e] void TO_interrupt(void);

    /* Timer Output Compare 5 */
    interrupt [INTVEC_START + 0x20] void TOC5_interrupt(void);

    /* Timer Output Compare 4 */
    interrupt [INTVEC_START + 0x22] void TOC4_interrupt(void);

    /* Timer Output Compare 3 */
    interrupt [INTVEC_START + 0x24] void TOC3_interrupt(void);

    /* Timer Output Compare 2 */
    interrupt [INTVEC_START + 0x26] void TOC2_interrupt(void);

    /* Timer Output Compare 1 */
    interrupt [INTVEC_START + 0x28] void TOC1_interrupt(void);

    /* Timer Input Compare 3 */
    interrupt [INTVEC_START + 0x2a] void TIC3_interrupt(void);

    /* Timer Input Compare 2 */
    interrupt [INTVEC_START + 0x2c] void TIC2_interrupt(void);

    /* Timer Input Compare 1 */
    interrupt [INTVEC_START + 0x2e] void TIC1_interrupt(void);

    /* Real Time Interrupt */
    interrupt [INTVEC_START + 0x30] void RTI_interrupt(void);

    /* Interrupt ReQuest */
    interrupt [INTVEC_START + 0x32] void IRQ_interrupt(void);

    /* eXtended Interrupt ReQuest */
    interrupt [INTVEC_START + 0x34] void XIRQ_interrupt(void);

    /* SoftWare Interrupt */
    interrupt [INTVEC_START + 0x36] void SWI_interrupt(void);

    /* Illegal Opcode Trap */
    interrupt [INTVEC_START + 0x38] void IOT_interrupt(void);

    /* COP Failure */
    interrupt [INTVEC_START + 0x3a] void NOCOP_interrupt(void);

    /* COP Monitor Failure */
    interrupt [INTVEC_START + 0x3c] void CME_interrupt(void);


    #endif /* _INT6811_H_ */




    Citation Envoyé par Jack Voir le message
    A ta place, selon la source du reset (cop ou cme), je modifierai un octet en ram.
    Au por (le reset à la mise sous tension), je lirais l'état de ces octets et j'allumerais une led correspondant à l'état des ces 2 octets.
    En fait je l'ai fait avec modif de la sortie du port G2, je l'ai fait avec une variable en EEPROM: pour la source d'interruption type "illegal opcode" ca le fait bien mais pour ce COP ca ne fait rien. Comme si ma routine ne servait à rien.

    A+

  13. #12
    Jack
    Modérateur

    Re : Qui reset mon 68HC11F1 ?

    tu as modifié une variable en EEPROM? Tu as récipéré une routine existante, parce ce que ça demande un peu d'expérience.

    Le plus simple est d'utiliser la RAM et de faire que je te l'ai conseillé. Au point ou tu en es, une demi-heure de plus ou de moins ne devrait pas te déranger.

    Vérifie dans le fichier binaire (en général *.s19) ou dans le fichier listing ou map que les vecteurs sont corrects

    A+

  14. #13
    invite907bf651

    Re : Qui reset mon 68HC11F1 ?

    Re,
    Bon alors j'ai carrément retiré la routine d'interruption pour le COP.
    Je génère ensuite une boucle sans fin.
    Ca reset automatiquement. Donc ma routine ne sert à rien !
    J'ai essayé avec la RAM mais ca ne change rien il y a donc une astuce pour ce vecteur d'interruption mais lequel ???

    Je pense que finalement je vais faire une version qui désactive toutes mes sources de reset et je verrai bien si ca reset. Je pourrai mettre en cause le superviseur de tension. En meme temps je mets l'oscillo en mode trig et je verrai bien la durée de l'état bas du signal reset.

    Julien

Discussions similaires

  1. logiciels pour le 68hc11f1
    Par invite1424a162 dans le forum Électronique
    Réponses: 1
    Dernier message: 23/10/2005, 20h31
  2. interuptions du 68hc11f1
    Par invite1424a162 dans le forum Électronique
    Réponses: 0
    Dernier message: 23/10/2005, 14h13
  3. Microprocesseur 68HC11F1
    Par invite42a33d41 dans le forum Électronique
    Réponses: 2
    Dernier message: 22/07/2005, 19h12
  4. IRQ sur le 68HC11F1
    Par invite06909014 dans le forum Électronique
    Réponses: 21
    Dernier message: 10/05/2004, 09h39
  5. 68hc11F1
    Par invite13f9896d dans le forum Électronique
    Réponses: 1
    Dernier message: 16/05/2003, 10h02
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...