L'instruction"sleep" réinitilise ma variable de comptage
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

L'instruction"sleep" réinitilise ma variable de comptage



  1. #1
    michel5002

    L'instruction"sleep" réinitilise ma variable de comptage


    ------

    Bonjour à tous,
    voilà mon problème:
    j'ai réalisé un programme en langage C avec un PIC12F629 + MPLAB + CCScompiler.
    J'utilise une variable de temps que j'appelle "bipled" pour gérer l'allumage d'une led.
    Comme je souhaite que la led s'allume toutes les 5 x 2304ms, j'initialise "bipled=5".
    Pour économiser les piles j'utilise le mode "sleep".
    La sortie du mode "sleep" se déroule normalement. A chaque cycle du watchdog (2304ms) je décrémente la variable "bipled" de 1
    et lorsque "bipled=0" la led s'allume.
    A chaque sortie du mode "sleep" provoquée par le compteur du watchdog, la variable "bipled" décrémentée reste bien en mémoire.
    Donc, jusqu'ici tout va bien, pas de conso excessive grâce au mode "sleep" , la led s'allume bien toutes les 11520ms.
    Tout OK.
    Maintenant par souci d'économie je veux utiliser un PIC10F202 ou un PIC12F509 et là...problème.
    A chaque fin de cycle du watchdog, l'instruction "sleep" me remet la variable "bipled" à sa valeur initiale (bipled=5) et de ce fait
    il n'y a jamais d'allumage de la led puisqu'il faut que "bipled=0" pour qu'elle s'allume.
    Est-ce qu'il me manque une instruction ou est-ce que ces PICs n'acceptent pas le mode "sleep"???
    merci d'avance pour votre aide.
    A+
    michel.

    -----

  2. #2
    michel5002

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Bonjour,
    personne pour me répondre??
    voici le programme:

    //////////////////////////////////////////////////////////
    #include <12F509.h>
    #use delay(clock=4000000)

    #fuses WDT,INTRC,NOPROTECT,NOMCLR
    #define GP0 PIN_B0
    #define GP1 PIN_B1
    #define GP2 PIN_B2
    #define GP3 PIN_B3
    #define GP4 PIN_B4
    #define GP5 PIN_B5

    byte bipled=5;

    void main() // programme principal gestion du démarrage
    {
    debut:

    setup_wdt(WDT_2304MS);
    {
    if (bipled>0)
    {
    bipled-=1;
    }
    if (bipled==0)
    {
    output_high (GP0);
    delay_us(1000); // largeur du pulse (pin à 1)
    output_low (GP0);
    }
    bipled=5;
    }
    sleep();
    goto debut;
    }
    /////////////////////////////////////////////////////////

    A+
    michel

  3. #3
    Brice88

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Bonjour,
    Je ne sais pas si vous l'avez déjà fait, mais le mieux à faire je pense et de lire les documentations relatives à ces différents microcontrôleurs ; et plus particulièrement le § dédié au mode sleep, ce que deviennent les variables, etc...
    Peut être que sur les deux plus anciens, il faut activer un bit dans un des registres pour avoir le même fonctionnement que sur le PIC12F629.
    Voilà, @+
    Brice

  4. #4
    Seb.26

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Pourquoi donc utiliser le WD pour faire un timer ?!

    Mais en bref : RTFM !

    Citation Envoyé par PIC12F629/675
    9.6 Watchdog Timer (WDT)
    The Watchdog Timer is a free running, on-chip RC
    oscillator, which requires no external components. This
    RC oscillator is separate from the external RC oscillator
    of the CLKIN pin and INTOSC. That means that the
    WDT will run, even if the clock on the OSC1 and OSC2
    pins of the device has been stopped (for example, by
    execution of a SLEEP instruction). During normal
    operation, a WDT time-out generates a device RESET.
    If the device is in SLEEP mode, a WDT time-out
    causes the device to wake-up and continue with normal
    operation. The WDT can be permanently disabled by
    programming the configuration bit WDTE as clear
    (Section 9.1).
    Citation Envoyé par PIC10F200/202/204/206
    9.6 Watchdog Timer (WDT)
    The Watchdog Timer (WDT) is a free running on-chip
    RC oscillator, which does not require any external
    components. This RC oscillator is separate from the
    internal 4 MHz oscillator. This means that the WDT will
    run even if the main processor clock has been stopped,
    for example, by execution of a SLEEP instruction.
    During normal operation or Sleep, a WDT Reset or
    wake-up Reset, generates a device Reset.
    The TO bit (Status<4>) will be cleared upon a
    Watchdog Timer Reset.
    Tout est là ...

    @+
    Seb.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

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

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Bonjour,
    j'ai essayé de modifier les bits<3> et <4> du registre "status",
    mais rien ne change.
    Voici le programme:
    #include <12F509.h>
    #use delay(clock=4000000)

    #fuses WDT,INTRC,NOPROTECT,NOMCLR
    #define GP0 PIN_B0
    #define GP1 PIN_B1
    #define GP2 PIN_B2
    #define GP3 PIN_B3
    #define GP4 PIN_B4
    #define GP5 PIN_B5

    #BYTE status=0x03

    byte bipled=0;

    void main()
    {
    debut:
    setup_wdt(WDT_2304MS);
    status=0x08; // j'ai essayé aussi 0x10, 0x18
    set_tris_b(0x2c);
    {
    if (bipled>0)
    {
    bipled-=1;
    }
    if (bipled==0)
    {
    output_high (GP4);
    delay_ms(100);
    output_low (GP4);
    bipled=3;
    }
    }
    sleep();
    goto debut;
    }

    Pour répondre à Seb26,
    en fait il s'agit d'un morceau de programme pour expliquer le problème,
    mon application est beaucoup plus longue et nécessite le "watchdog".
    Pouvez-vous vérifier si je n'ai pas fait d'erreur d'écriture??
    merci par avance,
    A+
    michel

  7. #6
    michel5002

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Bonjour,
    personne pour une petite aide ?
    malgré que je ne sache pas le faire, je ne pense pas que ce soit un problème difficile à régler!
    je compte sur vous et merci.
    michel

  8. #7
    herrmattoon

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Salut,
    Je ne sais pas si ma contribution à ce post te donnera satisfaction. Cependant, j'ai remarqué que dans le premier code que tu y as mis, la variable bipled est mise à 5, que bipled>0 ou non car la ligne "bipled = 5;" se trouve à l'extérieur des deux conditions. Ce n'est pas le cas par contre dans le deuxième code que tu as présenté.
    Si elle n'est pas l'erreur qu'on cherche, est-ce que le fait de la déclarer static ne l'empêcherait-t-elle pas d'être réinitialisée à 5 à chaque réveil? Peut-être qu'il faut enregistrer les variables ailleurs qu'en RAM.
    En espérant avoir été utile...

  9. #8
    freepicbasic

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    set_tris_b(0x2c);

    portb B ????
    Il y a qu'un portA !
    en plus il s'apelle GPIO...
    A+, pat

  10. #9
    michel5002

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Bonjour herrmattoon,
    dans le premier programme on attribut au départ la valeur "5" à la variable "bipled".
    Normalement à chaque passage (WTD) toutes les 2304ms, on décrémente de "1" la variable "bipled" jusqu'à la valeur "0".
    A cette valeur, la led s'allume pendant 1000µs et la variable se réinitialise à "5"et repart pour un autre cycle.
    Ce programme fonctionne parfaitement (en l'adaptant), avec un PIC12F629 ou 675, mais ne fonctionne plus avec un PIC10F200/202/204 ou un PIC12F508/509 (2 fois moins chers). Le problème semble être dans le réglage de TO et PD bits <3> et <4> dans le registre "STATUS" comme l'a précisé Seb.26.
    Et c'est çà que je ne parviens pas à faire...
    ... quelle galère...
    merci à vous
    michel
    Dernière modification par michel5002 ; 05/06/2010 à 15h12. Motif: précisions

  11. #10
    michel5002

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Bonjour freepicbasic,
    pour le PIC12F509:
    OK pour GPIO...
    pas OK pour port A, il a bien un port B.
    A force de faire des essais avec différents PICs, j'ai fini par m'emméler les pinceaux (comme les bleus hier).
    Mais çà ne marche toujours pas (comme les bleus hier).
    J'ai quand même de l'espoir!!!!
    A+
    michel

  12. #11
    RISC

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Salut,

    Je suis d'accord avec seb. Redémarrer par un RESET pour une simple tempo c'est violent...
    De plus il y a une différence importante entre les PIC10F2xx et les PIC12F629 : la pile hardware !!
    Les PIC10 n'ont que 2 niveaux de pile alors que les 12F629/675 ont 8 niveaux de piles !!!!
    En clair, il va falloir faire très attention aux appels de fonctions emboitées.

    En langage C, il existe un attribut spécial qui permet à une variable (après un reset) de garder sa valeur : persistent.
    Je ne sais pas si CCS gère cet attribut dans le startup file qui s'exécute (normalement) avant ton programme après un RESET

    a+

  13. #12
    freepicbasic

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Citation Envoyé par michel5002 Voir le message
    Bonjour freepicbasic,
    pour le PIC12F509:
    OK pour GPIO...
    pas OK pour port A, il a bien un port B.
    GPIO est TRSIO sont sur l'adresse 05h et 085h. (PORTA sur la série 16F)

    Sur la série 16F PORTB est sur 06h et 86H.
    non umplemented sur le 12F629 !

    bizarre, a moins que le compilateur comprenne cette subtilité à mon avis c'est faux...

    en cas de doute faire une procédure asm, ou vérifier le code généré par le compilo, voir s'il s'agit bien de l'adresse 85H
    .
    A+, pat

  14. #13
    herrmattoon

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Ouf! En tous cas je seche. Je ne vois pas ce que ça peut être, je ne connais pas assez les pic 12 ou 16. Alors je vous laisse. Bonne chance!

  15. #14
    michel5002

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Bonjour à tous,
    on ne va parler que du PIC12F508/9.
    1°) Je ne comprends pas ce qu'à écrit frepicbasic:
    GPIO est TRSIO sont sur l'adresse 05h et 085h. (PORTA sur la série 16F)
    Sur la série 16F PORTB est sur 06h et 86H.
    non umplemented sur le 12F629 !
    bizarre, a moins que le compilateur comprenne cette subtilité à mon avis c'est faux...
    en cas de doute faire une procédure asm, ou vérifier le code généré par le compilo, voir s'il s'agit bien de l'adresse 85H

    Sur le datasheet du PIC12F506/9, il est écrit:
    GPIO est à l'adresse 06h.
    TRISGPIO à l'adresse N/A (I/O - Control Register).

    2°) Suite à ce qu'à écrit "RISC"

    En langage C, il existe un attribut spécial qui permet à une variable (après un reset) de garder sa valeur : persistent.
    Est-il possible d'avoir le nom de cet attribut spécial ou de cette instruction?

    merci par avance,
    michel

  16. #15
    freepicbasic

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Sur le datasheet du PIC12F506/9, il est écrit:
    GPIO est à l'adresse 06h.
    TRISGPIO à l'adresse N/A (I/O - Control Register).
    Il faudrait savoir si c'est le 629 ou le 509.
    C'est pas le même processeur ....

    629 => GPIO adresse 5H
    509 => GPIO adresse 6H

    normalement en prenant le .H qui va bien et le nom qui va bien (GPIO) le compilo devrait le faire correctement.
    A+, pat

  17. #16
    michel5002

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Bonjour freepicbasic,
    mon problème n'est pas le positionnement des entrées ou sorties des pins avec GPIO ou TRISIO ou TRISGPIO, ça... ça marche.
    Je vous renvoie à mon 1er post,
    où je dis que mon programme fonctionne parfaitement bien avec un PIC12F629 et que lorsque je passe à un PIC12F508/9 (~2 fois moins cher) la ou les variables sont réinitialisées à chaque réveil WTD du mode sleep.
    Ma seule question: comment empêcher celà.
    Par ailleurs je n'ai pas trouvé dans la data du PIC12F508/9 combien il possède de niveaux de piles (nombres de fonctions emboîtées).
    A+
    michel

  18. #17
    freepicbasic

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    2 adresses en stack du 509 seulement.

    508 25 octets de ram
    et
    509 41 octets de ram

    utilise un pointeur afin d'éviter que le compilo initialise la variable.
    Mais il faudra bien l'initialiser quelque part...
    A+, pat

  19. #18
    Seb.26

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Toujours pas réglé ce problème ???!!!

    Je re-cite les doc :

    During normal operation, a WDT time-out generates a device RESET.
    If the device is in SLEEP mode, a WDT time-out causes the device to wake-up and continue with normal operation.
    During normal operation or Sleep, a WDT Reset or wake-up Reset, generates a device Reset.

    Soit c'est moi qui suis à coté de la plaque, soit c'est juste que ton PIC reboot à chaque fin du WD ...

    ... un WD n'est pas fait pour ça ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #19
    freepicbasic

    Re : L'instruction"sleep" réinitilise ma variable de comptage

    Citation Envoyé par Seb.26 Voir le message
    soit c'est juste que ton PIC reboot à chaque fin du WD ...
    ou le stack se crash avec un 629 8 niveaux et seulement 2 avec le 509...
    A+, pat

  21. #20
    RISC

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Salut,
    Citation Envoyé par michel5002 Voir le message
    2°) Suite à ce qu'à écrit "RISC"[/COLOR]
    En langage C, il existe un attribut spécial qui permet à une variable (après un reset) de garder sa valeur : persistent.
    Est-il possible d'avoir le nom de cet attribut spécial ou de cette instruction?
    Je l'avais dit dans la phrase..l'attribut est "persistent" (voir un tuto sur le C pour l'utilisation et les détails).

    Pour bien comprendre ce qui se passe dans le PIC12F508/9, je te recommande de regarder la figure 7-7 de la datasheet qui montre le circuit de RESET interne.

    Ensuite paragraphe 7.6.2 :
    ==============================
    7.6.2 WDT PROGRAMMING CONSIDERATIONS
    The CLRWDT instruction clears the WDT and the postscaler, if assigned to the WDT, and prevents it from timing out and generating a device Reset.
    The SLEEP instruction resets the WDT and the postscaler, if assigned to the WDT. This gives the maximum Sleep time before a WDT wake-up Reset.
    ============================== ============================== ==============================

    Puis voir la figure 7-11 pour la programmation des bits de configuration, et surtout le chapitre 7-9 section 7.9.2 :

    =====================
    7.9.2 WAKE-UP FROM SLEEP
    The device can wake-up from Sleep through one of the following events:
    1. An external Reset input on (GP3/RB3)/MCLR/VPP pin, when configured as MCLR.
    2. A Watchdog Timer time-out Reset (if WDT was enabled).
    3. A change on input pin GP0/RB0, GP1/RB1, GP3/RB3 or RB4 when wake-up on change is enabled.
    These events cause a device Reset. The TO, PD and GPWUF/RBWUF bits can be used to determine the cause of device Reset. The TO bit is cleared if a WDT time-out occurred (and caused wake-up). The PD bit, which is set on power-up, is cleared when SLEEP is invoked. The GPWUF/RBWUF bit indicates a change in state while in Sleep at pins GP0/RB0, GP1/RB1, GP3/RB3 or RB4 (since the last file or bit operation on GP/RB port).

    Note: Caution: Right before entering Sleep, read the input pins. When in Sleep, wakeup occurs when the values at the pins change from the state they were in at the last reading. If a wake-up on change occurs and the pins are not read before reentering Sleep, a wake-up will occur immediately even if no pins change while
    in Sleep mode.


    The WDT is cleared when the device wakes from Sleep, regardless of the wake-up source.
    ============================== ============================== =

    En testant ces flags au RESET tu peux éviter la réinitialisation car tu sauras que tu sors d'un WDT RESET.
    Mais attention...si utilises un compilateur C, il se peut que du code soit exécuté AVANT ton main(). Il faut donc modifier le "startup" si tu as le fichier source.

    Quel compilateur utilises-tu et quelle version ?

    a+

  22. #21
    michel5002

    Re : L'instruction"sleep" réinitialise ma variable de comptage

    Bonjour RISC,
    merci pour tes explications, laisses-moi un peu de temps pour digérer tout celà.
    Je compile mes programmes avec "CCS version 4.105".
    Mon pogrammateur est un "PICKIT-1" de Microchip.
    A+
    michel

Discussions similaires

  1. "fondamentales", "dures", "molles" ... : comment classer les sciences ?
    Par Arvirik dans le forum Epistémologie et Logique (archives)
    Réponses: 13
    Dernier message: 22/04/2017, 22h41
  2. programmation cherche commande pour "vider" ou effacer variable
    Par invite4828afd1 dans le forum Électronique
    Réponses: 19
    Dernier message: 26/02/2009, 08h46
Découvrez nos comparatifs produits sur l'informatique et les technologies.