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

Sécurité PIC 16F



  1. #1
    narf

    Question Sécurité PIC 16F


    ------

    Bonjour,

    Voila mon problème. J'ai un système constitué d'une télécommande gérée par un PIC 16F et d'un circuit de réception lui aussi géré par un 16F. Le problème, c'est que si il y a plantage, je n'ai aucune sécurité.

    J'aimerais savoir si il est possible d'ajouter une sécurité pouvant remettre à zéro le système dans le software ? et si oui comment fait-on ? J'ai entendu parler du watchdog mais je ne l'ai jamais utilisé.

    J'attends vos suggestions.

    -----

  2. Publicité
  3. #2
    f6bes

    Re : Sécurité PIC 16F

    Bjr Narf,
    La broche MCLR permet de faire un reset du systéme .
    là:
    http://f5ad.free.fr/16F84/Reset.html
    A+

  4. #3
    narf

    Re : Sécurité PIC 16F

    oui ça je sais f6bes. Mais je demandais au niveau software, pas hardware. Quelque chose d'autonome.

  5. #4
    f6bes

    Re : Sécurité PIC 16F

    Bjr à toi,
    Si il est planté , comme "tourne le soft" ???
    A+

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

    Re : Sécurité PIC 16F

    NARF,

    Il y a plusieurs types de sécurités que tu peux implémenter. Suivant le type de PIC (PIC16/18/24/32) que tu utilises tu trouveras une ou plusieurs de ces sécurités :

    * WATCHDOG : cas du soft planté dans une boucle)
    * BOR : Brown Out Reset : détection de chute ou disparition d'alimentation
    * CLOCK MONITORING : détection de disparition de l'horloge externe
    * STACK OVERFLOW / UNDERFLOW : détection de débordement de la pile
    * ILLEGAL OPCODE FETCH : détection de tentative d'exécution d'une instruction inexistante
    * UNALIGNED ACCES : détection de tentative d'accès non aligné (pour les 16/32 bits)
    ...

    Une chose que tu peux implémenter dans ton logiciel et qui résoud déjà beaucoup de PB c'est un TIMEOUT dans CHAQUE BOUCLE (TEST) de type WHILE.
    Cette technique est pa exemple obligatoire chez certains sous-traitants automobiles, quelque soit le micro utilisé.

    Explication : on a souvent dans le logiciel des tests qui attendent un évènement (cas de la scrutation d'un bit) . Exemple : tant que la liaison série n'a pas reçu un caractère on attend que le flag TX full soit positionné. Le PB c'est que si cette condition n'arrive pas ou plus le logiciel tourne en rond à l'infini. Le Watchdog reset permettra de détecter cette condition mais il existe une meilleur alternative : associer a CHAQUE test de condition un timeout.
    De cette manière, si la condition d'un test ne se produit pas on sortira TOUJOURS au bout d'un certain temps (TIMEOUT) décidé par l'utilisateur.

    Lafonction anti-plantage de base est bien sur le WATCHDOG qui est facile à mettre en oeuvre : mesurer / estimer le temps maximum d'exécution de la boucle principale du logiciel et programmer le watchdog avec un temps supérieur à ce temps là. Si le watchdog n'est pas réinitialisé à chaque boucle du programme principal, il provoque automatiquement un RESET car cela veut dire que le programme est planté ou tourne en rond...

    Dans les PICs le watchdog possède sa propre horloge RC intégrée donc on est sur d'aller en RESET ;=)

    a+
    Dernière modification par RISC ; 02/06/2008 à 16h16. Motif: correction

  8. #6
    invite03481543

    Re : Sécurité PIC 16F

    Bonsoir,

    RISC à raison, pour plus de sécurité encore on peut faire un watchdog externe, il m'est arrivé de constater lors de tests CEM des plantages de µC (80C552) malgré un watchdog interne bien calibré, il est vrai uniquement sur des normes exigeantes mais quand même.

  9. Publicité
  10. #7
    f6bes

    Re : Sécurité PIC 16F

    Bsr à tous,
    Avec la méthode RISC on se prémunie contre les plantages de boucles.
    Déjà pas mal.
    Question :s'il plante (ou peut il planter) pour une autre cause (hors boucle) on est toujours coincé,non ?
    Ou alors on relance le WD en tenant compte de l'événement le plus long, mais ca risque de faire long en attente suivant le cas.
    A+

  11. #8
    invite03481543

    Re : Sécurité PIC 16F

    Quand j'évoquais la CEM, c'est juste que la directive oblige qu'un équipement ne doit pas être "dangereux" en cas de blocage ou provoquer un fonctionnement anormal ou inattendu au cas ou l'appareil est "submergé" par le niveau des champs induits.

    Lorsque c'est le cas, le watchdog qui est intimement lié à la base de temps du µC peut être "masqué" ou être impuissant à provoquer le "reset" attendu.
    Avec un watchdog externe ça ne peut pas arriver car on est câblé physiquement sur le reset.

  12. #9
    RISC

    Re : Sécurité PIC 16F

    HULK,

    Ce que tu dis est correct mais les PICs possèdent une horloge interne RC dédiée au WATCHDOG et complètement indépendante de l'horloge du micro.
    De cette manière on peut se passer d'un watchdog externe, sauf si on doit avoir des boucles très longues incompatibles avec celles proposées par le watchdog interne.

    Mon post plus haut recommande l'utilisation conjointe de :
    a/ timeout utilisant un timer interne pour chaque while ou boucle de test d'attente d'un évènement
    b/ watchdog interne

    a+

  13. #10
    invite03481543

    Re : Sécurité PIC 16F

    Oui tu as raison RISC, dans un PIC le watchdog est bien indépendant, ta méthode est la bonne.
    @+

  14. #11
    gohtan

    Re : Sécurité PIC 16F

    Salut tout le monde !

    Je n'ai pas d'info à ajouter mais plutôt une question...
    Il me semble qu'elle a sa place dans ce topic vu que c'est au sujet du WATCHDOG d'un PIC 16F685.

    Contexte :
    Pour tester le reset via Watchdog, j'ai fait un petit programme qui suit ce pseudo-algo :

    fonction principale
    {
    _ _ init()
    _ _allumer une LED durant 100ms

    _ _boucle infinie
    _ _{
    _ _ _ _éteindre la LED
    _ _}
    }


    Je ne remets pas le WatchDog à zéro (commande CLRWDT) car je souhaite justement voir à quelle fréquence se font les RESET.



    Problème :
    Je vois bien ma LED clignoter. ça c'est OK

    Elle s'allume durant 100ms. ça c'est OK aussi

    Par contre, le temps durant lequel la LED est OFF est beaucoup trop long ! Il semble multiplié par 200 voir 250 par rapport au donnée technique de la doc.


    Exemple :
    En me basant sur la fréquence de base de 31Kz et le préscaler 16bits tel qu'il est décrit, en divisant ma fréquence par 32768 je devrais voir ma LED s'allumer toutes les secondes. Au lieu de ça elle s'allume toutes les 200-250 sec Et le coef multiplicateur semble constant car si je divise la fréquence par 128, je vois ma LED clignoter environ toutes les secondes.

    Je ne comprends pas


    Config :

    Je vous balance la config du Watchdog...

    // Oscillator
    // IRCF<2:0> = 111 => 8MHz
    // SCS = 1 => Internal oscillator

    OSCCON = OSCCON | 0b01110001;

    // WatchDog
    // PSA = 0 => Prescaler and TIMER0 not assigned to the WDT
    // SWDTEN = 1 => Enabled
    // WDTPS<3:0> = 1010 => 31Khz/32768 => 1sec

    OPTION_REG = OPTION_REG & 0b11110000;
    WDTCON = WDTCON | 0b00010101;
    WDTCON = WDTCON & 0b11010101;



    Désolé pour la longueur mais j'espère qu'avec toutes ces info vous arriverez à me dépatouiller...

    Merci, A+
    2B OR NOT 2B = FF

  15. #12
    sdec25

    Re : Sécurité PIC 16F

    Salut et bienvenue sur le forum,

    Essaie de mettre PSA à 1 et PS<2:0> à 000 dans OPTION_REG pour voir si le délai change.

  16. Publicité
  17. #13
    gohtan

    Re : Sécurité PIC 16F

    Re,
    ... et merci pour ta réponse

    J'avais déjà fait le test de forcer PSA mais cette fois-ci je l'ai refait en mesurant le temps entre 2 RESETs :



    Config utilisant le prescaler du timer0 (PSA = 1) et prescaler 16 bits = 32768

    OPTION_REG = OPTION_REG | 0b00001000;
    OPTION_REG = OPTION_REG & 0b11111000;

    WDTCON = WDTCON | 0b00010101;
    WDTCON = WDTCON & 0b11010101;


    Resultat : 150 sec



    Config n'utilisant pas prescaler du timer0 (PSA = 0° et prescaler 16 bits = 32768

    OPTION_REG = OPTION_REG & 0b11110111;

    WDTCON = WDTCON | 0b00010101;
    WDTCON = WDTCON & 0b11010101;


    Resultat : 150 sec


    Config n'utilisant pas prescaler du timer0 (PSA = 0) et prescaler 16 bits = 8192

    OPTION_REG = OPTION_REG & 0b11110111;

    WDTCON = WDTCON | 0b00010001;
    WDTCON = WDTCON & 0b11010001;


    Resultat : 38 sec



    Déduction :

    - Le prescaler du Timer0 forcé à 1:1 n'a pas d'influence.

    - 32768/4=8192 et 150/4=38 l'erreur se présente sous la forme d'un coef multiplicateur constant de l'ordre de 150.



    Je reste perplexe sur ce coup-là...

    Si quelqu'un a une autre idée, je suis preneur
    2B OR NOT 2B = FF

  18. #14
    RISC

    Re : Sécurité PIC 16F

    Salut,

    Peux-tu faire voir tout ton programme et ton schéma électrique ?
    Comment as-tu programmé le registre de configuration CONFIG (datasheet page 195), en particulier le bit WDTE ?

    a+

  19. #15
    gohtan

    Re : Sécurité PIC 16F

    Salut,

    Dans l'immédiat, je n'ai ni le matériel, ni le programme sous les yeux...

    Cependant voici quelques autres info en attendant demain :

    CABLAGE
    - Vdd et Vss fourni au PIC par le PicKit2
    - En série : RB7 => 1Kohm => LED => GND (Vdd)

    PORTB
    TRISB configuré en sortie

    WDTE
    J'ai mis WDTE à 0 pour garder la main sur le watchDog à l'aide du bit WSTEN du registre WDTCON.
    Pour ça j'utilise la macro "__CONFIG(...,...,...,WSTDIS,. ..)" du compilo HI-TECH CPro Lite.
    Et ça fonctionne correctement : je l'ai testé.

    Mode Sleep
    En trichant sur les valeur du prescaler 16bits, j'arrive à avoir un RESET chaque sec... mais cette bidouille ne me plait pas
    Cependant j'ai pu tester le bit WDTE et WSTEN.
    En mode Sleep, le watcdog continu de tourner et bien qu'il ne crée pas de RESET, il réveille le PIC. alors j'ai fais le test d'arrêter le WD juste avant le SLEEP pour qu'il laisse dormir tranqu'il mon PIC et de le revalider lors du réveil du PIC.

    Et ça marche !!! Mon seul soucis c'est ce p... de coef multiplicateur de 150 ! ça me rend fou...


    Mon programme
    En fait, j'ai une appli finalisée qui tourne correctement (du moins elle fait ce que je veux).
    J'ai simplement voulu y ajouter une sécurité via le WatchDog mais comme ça ne marche pas comme la doc le dit, je me suis retrouvé à commenter tout mon code pour ne garder que ma LED qui clignote et ainsi isoler la fonction WatchDog...


    En espérant que ça t'éclaire un peu... en tout cas merci de te pencher sur mon soucis
    2B OR NOT 2B = FF

  20. #16
    RISC

    Re : Sécurité PIC 16F

    Salut,

    J'ai l'impression que ton interprétation du role du WDT est fausse...
    Relis la datasheet section 14-6 :
    en mode SLEEP le WDT ne provoque PAS un reset mais une sortie du mode SLEEP. Il faut alors aussitot tester le bit TD pour savoir si le réveil est bien du au watchdog.
    Si ce n'est pas TD qui t'a réveillé c'est que c'est une source d'interruption...

    Donc n'arrête surtout pas le WDT avant le mode SLEEP. Si tu en sors actuellement c'est que tu es réveillé par autre chose (ULPWU ?)

    Relis bien la section 14-6. La solution a ton problème est là...

    a+
    Dernière modification par RISC ; 29/09/2009 à 22h11. Motif: addition

  21. #17
    gohtan

    Re : Sécurité PIC 16F

    Salut !

    J'ai bien compris qu'en mode SLEEP :
    • le watchdog ne crée pas de RESET
    • le watchdog ne fait que sortir le PIC du mode veille
    • il lève un flag

    On est d'accords là-dessus
    Et justement, en admettant que mon watchdog dure 1sec, je ne veux pas que mon pic soit réveillé toute les sec pour rien... du moins pas par le watchdog.

    Tu voulais mes sources, les voici :
    • J'ai enlevé les parties commentées qui ne servait à rien pour le test du watchdog.
    • Je t'ai mis 2 programmes : le premier est tout simple et ne test que le Watchdog, le deuxieme permet de voir l'influence du bit WSTEN en cas de mode SLEEP


    SOURCE 1 :

    #include <htc.h>
    #include"delay.h"



    // Configuration bits
    // Fail-Safe Clock Monitor is disabled
    // Internal External Switchover mode is disabled
    // BOD and SBOREN disabled
    // Code is not protected
    // MCLR functions as IO
    // Power Up Timer OFF
    // Watchdog Timer not forced to ON
    // Oscillator configurations => Internal RC No Clock

    __CONFIG(FCMDIS & IESODIS & BORDIS & UNPROTECT & MCLRDIS & PWRTDIS & WDTDIS & INTIO);



    // Init Function
    void init(void)
    {
    // Oscillator
    // IRCF<2:0> = 111 => 8MHz
    // SCS = 1 => Internal oscillator

    OSCCON = OSCCON | 0b01110001;

    // WatchDog
    // PSA = 0 => Prescaler and TIMER0 not assigned to the WDT
    // SWDTEN = 1 => Enabled
    // WDTPS<3:0> = 1010 => 31Khz/32768 => 1sec

    OPTION_REG = OPTION_REG & 0b11110111;
    WDTCON = WDTCON | 0b00010001;
    WDTCON = WDTCON & 0b11010001;

    // PORTB
    // RB4 => RB7 in output for debug
    // AN10 and AN11 disable

    TRISB = TRISB & 0b00001111;
    ANSELH = ANSELH & 0b11110011;
    PORTB = 0x00;
    }



    // Main function
    void main(void)
    {
    init();

    // Une LED verte sur RB7 clignote à chaque RESET
    RB7 = 1;
    DelayMs(100);

    while (1)
    {
    // c'est dans la boucle infinie qu'on éteint la LED verte
    RB7 = 0;
    }
    }


    Résultat du SOURCE 1 :
    La LED verte devrait clignoter toutes les secondes. Au lieu de ça, elle clignote toutes les 150 secondes



    SOURCE 2 :

    #include <htc.h>
    #include"delay.h"



    // Configuration bits
    // Fail-Safe Clock Monitor is disabled
    // Internal External Switchover mode is disabled
    // BOD and SBOREN disabled
    // Code is not protected
    // MCLR functions as IO
    // Power Up Timer OFF
    // Watchdog Timer not forced to ON
    // Oscillator configurations => Internal RC No Clock

    __CONFIG(FCMDIS & IESODIS & BORDIS & UNPROTECT & MCLRDIS & PWRTDIS & WDTDIS & INTIO);


    // Special function
    #define sleep() asm("sleep")
    #define clrwdt() asm("clrwdt")



    // Variables
    unsigned char ON_OFF = 0;




    // Init Function
    void init(void)
    {
    // Oscillator
    // IRCF<2:0> = 111 => 8MHz
    // SCS = 1 => Internal oscillator

    OSCCON = OSCCON | 0b01110001;

    // WatchDog
    // PSA = 0 => Prescaler and TIMER0 not assigned to the WDT
    // SWDTEN = 1 => Enabled
    // WDTPS<3:0> = 1010 => 31Khz/32768 => 1sec

    OPTION_REG = OPTION_REG & 0b11110111;
    WDTCON = WDTCON | 0b00010001;
    WDTCON = WDTCON & 0b11010001;

    // Comparators
    // C1ON = 1 => C1 enable
    // C1OE = 1 => C1OUT is present on the C1OUT (need TRISA2 = 0)
    // C1POL = 0 => C1OUT logic is not inverted
    // C1R = 0 => C1VIN+ connects to C1IN+ pin
    // C1CH<1:0> = 00 => C1VIN- of C1 connects to C12IN0- pin
    // C2ON = 0 => C2 disable (consumption minimized)

    CM1CON0 = CM1CON0 | 0b10100000;
    CM1CON0 = CM1CON0 & 0b11101000;
    CM2CON0 = CM2CON0 & 0b01011111;

    // PORTA
    // C1IN+ on RA0 (analog input)
    // C12IN0- on RA1 (analog input)
    // AN0 and AN1 enable
    // CIOUT on RA2 (output)
    // OUTPUT_1 on RA4 (output)
    // OUTPUT_2 on RA5 (output)
    // AN2 and AN3 disable

    TRISA = TRISA & 0b11001011;
    TRISA = TRISA | 0b00000011;
    ANSEL = ANSEL | 0b00000011;
    ANSEL = ANSEL & 0b11110011;
    PORTA = 0x00;

    // PORTB
    // RB4 => RB7 in output for debug
    // AN10 and AN11 disable

    TRISB = TRISB & 0b00001111;
    ANSELH = ANSELH & 0b11110011;
    PORTB = 0x00;

    // PORTC
    // TRISC<7:0> = 1 => all PORTC pin configured as input
    // AN4 => AN9 disable

    TRISC = TRISC | 0b11111111;
    ANSEL = ANSEL & 0b00001111;
    ANSELH = ANSELH & 0b11111100;

    // Enable IT only on Comparator 1
    INTCON = INTCON & 0b11000111;
    INTCON = INTCON | 0b11000000;
    PIE1 = PIE1 & 0b10000000;
    PIE2 = PIE2 & 0b00101111;
    PIE2 = PIE2 | 0b00100000;
    }





    // Main function
    void main(void)
    {
    init();

    // Une LED verte sur RB7 clignote à chaque RESET
    RB7 = 1;
    DelayMs(100);

    while (1)
    {
    if(ON_OFF)
    {
    // c'est dans la boucle infinie qu'on éteint la LED verte
    RB7 = 0;

    }
    else
    {
    // Une LED rouge sur RA4 clignote avant chaque SLEEP
    RA4 = 1;
    DelayMs(100);
    RA4 = 0;

    // Disable the WatchDog before sleeping
    // Si je commente cette ligne et que je passe en mode SLEEP, c'est la LED rouge que le Watchdog fait clignoter
    WDTCON = WDTCON & 0b11111110;


    // Good night... Zzz Zzz...
    sleep();

    // Enable the WatchDog at the wake-up
    WDTCON = WDTCON | 0b00000001;
    }
    }
    }




    // Cette fonction d'IT positionne la variable ON_OFF en fonction de l'état du comparateur 1
    void interrupt my_isr(void)
    {
    // Disable IT on comparator 1
    C1IE = 0;

    // Comparator C1 IT
    if(C1IF)
    {
    // Rising edge
    if (C1OUT)
    {
    // Turn ON
    ON_OFF = 1;
    }
    else
    {
    // Turn OFF
    ON_OFF = 0;
    }

    // Reset the comparator IT flag
    C1IF = 0;
    }

    // Enable IT on comparator 1

    C1IE = 1;
    }



    Résultat du SOURCE 2 :

    Le comparateur et sa fonction d'IT associée fonctionnent correctement.

    Quand la variable ON_OFF est à "1", la LED verte clignote toutes les 150 secondes, exactement comme dans le SOURCE 1.

    Quand la variable ON_OFF passe à "0", la LED rouge clignote 1 seule fois et le PIC passe en mode SLEEP.
    Si un évènement apparait sur le comparateur 1, ça réveille le PIC.
    On saute alors à la fonction d'IT qui vérifie s'il faut ou nom positionner la variable ON_OFF à "1".

    Dans le cas où ON_OFF = "0" et que je ne dévalide pas le WATCHDOG avant le SLEEP, toute les 150 secondes, le watchdog réveille le PIC pour rien. Du coup, on repasse pour rien dans la boucle infinie, on reteste la variable ON_OFF pour se rendre compte qu'elle n'a pas bougé, on re-rentre dans le mode SLEEP en faisant clignoter la LED rouge au passage.




    Voilà, encore une fois, désolé pour la longueur de mes post mes je pense que + je fournirai d'info quelqu'un sera à même de voir où peut être mon erreur...

    Merci en tout cas
    2B OR NOT 2B = FF

  22. #18
    gohtan

    Re : Sécurité PIC 16F

    Alors ?

    plus d'idée ?

    2B OR NOT 2B = FF

  23. Publicité
  24. #19
    RISC

    Re : Sécurité PIC 16F

    Salut,

    J'ai l'impression que ton registre OPTION_REG est peut-être la source de ton ratio de 150...

    Dans ton exemple 1 tu programmes :
    OPTION_REG = = OPTION_REG & 0b11110111;
    Cette configuration sélectionne PS<2-0> = 111 c'est à dire un PREscaler de 128 pour le watchdog mais tu affectes le PREscaler au TIMER0, cela devrait donc ne pas intervenir.

    Pourrais-tu essayer de mettre PS<2-0> = 000 pour voir ci cela affecte ou non le taux de division du Watchdog. Si c'est le cas cela veut dire que malgré ton initialisation de OPTION_REG le PREscaler reste affecté au Watchdog.

    Relis OPTION_REG pour être sur qu'il a été programmé comme tu souhaites.

    Regarde aussi l'exemple 5.2. Il y a apparemment une procédure recommandée pour changer le PRESCALER du WDT au TMR0. C'est peut être important. Pourquoi ne pas essayer de faire cela en ASM pour être sur...

    Comme précisé dans mon post précédent je te recommande aussi de TESTER TD quand tu te réveilles du mode SLEEP pour être SUR que c'est bien le watchdog qui t'a réveillé.

    a+

  25. #20
    gohtan

    Re : Sécurité PIC 16F

    Salut !

    ... et encore et toujours merci de te pencher sur mon cas...

    J'ai suivi tes conseils à la lettre :


    Valeur de PS<2-0>

    Dans un premier temps j'ai mis 000 sur PS<2-0> même si PSA est dévalidé
    OPTION_REG = OPTION_REG & 0b11110000;


    TESTER LE FLAG /TO

    Ensuite j'ai modifié la partie ELSE contenant le sleep :
    - j'y ai dévalidé l'interdiction de WD afin que ce dernier continue de tourner
    - j'y ai aussi rajouté un test du flag /TO pour voir si c'est bien le WD qui me réveille

    else
    {
    _ _ _ RA4 = 1;
    _ _ _ DelayMs(100);
    _ _ _ RA4 = 0;

    _ _ _ // Disable the WatchDog before sleeping
    _ _ _ //WDTCON = WDTCON & 0b11111110;

    _ _ _ // Good night... Zzz Zzz...
    _ _ _ // This command set /TO flag to "1"
    _ _ _ sleep();

    _ _ _ // If /TO flag = "0"
    _ _ _ if (STATUS | 0b11101111 == 0b11101111)
    _ _ _ {
    _ _ _ _ _ _ RA5 = 1;
    _ _ _ _ _ _ DelayMs(100);
    _ _ _ _ _ _ RA5 = 0;
    _ _ _ }


    _ _ _ // Enable the WatchDog at the wake-up
    _ _ _ WDTCON = WDTCON | 0b00000001;
    }


    Y'a une LED sur RA4 et une sur RA5.
    Je vois bien clignoter RA5 puis RA4 ce qui signifie que c'est bien le WD qui me réveille.
    En entrant dans le else, on fait clignoter RA4 pui on attend et on fait clignoter RA5 et desuite après RA4 en réentrant dans le ELSE puis attente...etc...



    ATTRIBUER LE PRESCALER DU WDT AU TIMER0 VIA DES COMMANDES ASSEMBLEUR

    Dans ma fonction main(), juste après l'appel de la fonction init(), j'ai rajouté le code donné dans la doc pour passer "à la volée" du WD au TIMER0.

    Voici ce code :

    // CHANGING PRESCALER (WDT => TIMER0)
    asm("CLRWDT")
    asm("BANKSEL OPTION_REG")
    asm("MOVLW b’11110000’")
    asm("ANDWF OPTION_REG,W")
    asm("IORLW b’00000011’")
    asm("MOVWF OPTION_REG")




    Malheureusement, j'ai toujours ce rapport de 150.
    J'hallucine un peu...
    Dernière modification par gohtan ; 01/10/2009 à 10h10.
    2B OR NOT 2B = FF

  26. #21
    gohtan

    Re : Sécurité PIC 16F

    Toujours pas d'idée ?...
    Allez... y'a bien quelqu'un qui va me dire où est mon erreur...

    Perso, je n'arrête pas de chercher dans la doc, je ne trouve pas...
    J'ai même tenté de changer de PIC, pensant que l'horloge 31KHz était morte... mais le problème persiste... l'erreur vient donc bel et bien de mon code...
    2B OR NOT 2B = FF

  27. #22
    gohtan

    Re : Sécurité PIC 16F

    Hello !
    ça faisait un p'tit moment que j'avait mis de côté mon problème de watchdog et ce soir lors de ma dernière compilation avec HI-TECH C PRO une erreur apparaît :

    Error [192] .....; 76.1 identificateur "OPTION_REG" indefini

    Alors 1er réflexe :
    je vais voir s'il est listé dans les registres de fonction spéciales proposées par l'interface MPLAB IDE.

    Je le trouve.

    2ème réflexe :
    je cherche OPTION_REG dans le fichier
    C:\Program Files\HI-TECH Software\PICC\PRO\9.65\include \as16f685.h
    je le trouve aussi


    Je ne vais pas m'embarque dans le debug du compilo... cependant, dans mon code j'ai remplacé
    OPTION_REG = OPTION_REG & 0b11110000;
    par
    PSA = 0;

    et tout fonctionne nikel : mon watchdog se déclenche bien chaque seconde .
    WDTPS<3:0> = 1010 => 31Khz/32768 => 1sec

    Voilà... je me disais que ça pourrait peut-être servir d'en faire part.
    A+
    2B OR NOT 2B = FF

  28. #23
    RISC

    Re : Sécurité PIC 16F

    Salut,

    Merci de ton retour et content que ton PB soit résolu. La persistance est la seule chose qui paye dans la programmation.

    J'avais suspecté que tes masquages étaient peut-être aussi la cause de tes problèmes. Cela confirme qu'il vaut mieux écrire OPTION REG directement. Registre très "touchy"...

    a+

Discussions similaires

  1. programmation pic 16f 628+ acquisition max187
    Par pekeu dans le forum Électronique
    Réponses: 2
    Dernier message: 31/05/2007, 13h46
  2. pic 16F detection passage zero du secteur
    Par alainav1 dans le forum Électronique
    Réponses: 8
    Dernier message: 02/01/2007, 18h33
  3. USB sur PIC 16F
    Par minouche dans le forum Électronique
    Réponses: 1
    Dernier message: 20/09/2006, 19h08
  4. pCF 8583 ET PIC 16f 876
    Par jherve dans le forum Électronique
    Réponses: 5
    Dernier message: 15/09/2006, 08h50
  5. Instruction IF sur PIC 16F
    Par Adrian1903 dans le forum Électronique
    Réponses: 26
    Dernier message: 04/05/2006, 16h17
Découvrez nos comparatifs produits sur l'informatique et les technologies.