[PIC] - déclaration de variables lors de l'utilisation des interruptions
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

[PIC] - déclaration de variables lors de l'utilisation des interruptions



  1. #1
    jorg1n

    [PIC] - déclaration de variables lors de l'utilisation des interruptions


    ------

    Bonjour,

    voila, je rencontre un problème que je n'avais pas eu encore...
    J'ai un programme qui me permet de gérer le fonctionnement d'un LCD128x64, il permet d'afficher un défilement de 2 images toutes les 5 secondes. Il tourne correctement pendant un certains temps, et ensuite il y a un "décalage" de l'image puis un plantage dans la librairie de gestion du GLCD.
    Le temps pour le défilement est gérer par le timer1 et une clock externe de 32Khz.

    Alors voila, je pense que le problème est du aux interruptions, car avec des delays, ça marche parfaitement. Et je pense que une des variables de la librairie doit prendre une valeur erronée durant l'affichage, et ça fausse tout...

    Alors comment déclarer correctement une variable pour quelle ne puisse pas être modifier dans les routines d'IT? Est - ce possible déjà?

    Je sais que c'est un peu farfelu comme problème... mais je suis coincé depuis ce matin, et je n'arrive pas a comprendre...

    Merci d'avance à tous ceux qui pourront m'aider

    -----

  2. #2
    Aurélien

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    Salut,
    Une routine d'IT doit être la plus courte possible. Dans ton cas, avec une fréquence de refresh si lente, je te conseille fortement de gérer l'actualisation dans ton programme principal et pas dans tes IT. Pour te synchroniser sur ton frame rate, tu peux :
    - paramétrer un timer et scruter le flag d'overflow et faire la mise à jour
    - tu peux aussi utiliser les IT, mais cette derniere ne doit rien faire directement pour l'afficheur : dans la routine d'IT tu mets un flag à 1 que tu viens checker dans ton programme principal. Flag que tu viens remettre à 0 une fois le pilotage du LCD réalisé, sans oublier de couper les IT pendant que tu accedes à la variable partagée avec la routine d'IT.

    La regle à respecter en IT pour minimiser les riques :
    - ne pas utiliser une fonction pouvant etre appelée à la fois en IT et en programme principal
    - couper les IT quand on accède à une variabkle d'IT en écriture, ou en lecture lorsque l'opération de lecture n'est pas atomique (lecture d'une variable 16 bits dans un micro 8 bits)

    Aurélien

  3. #3
    ragedBOYS

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    justement c'est ce que j'ai fait provisoirement come j'ai vous dit dans la publication:
    1** j'ai mis un flag à 1 dans l'interuption et j'ai le tester au niveau main.
    Mais puisque je suis engagé par d'autre utilisation plus tard dans le main je doit mettre mon traitement d'interruption ailleurs et c'est possible que au niveau de IT
    2** Pour l'nterruption over flow timer j'ai utilisé ca mais ca pa fonctionne ma fonction IT refuse tout type de timing !!!!!!
    y a pas de solution pour ca !??

  4. #4
    RicounetZap

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    Bonjour
    Ce que propose Aurelien me semble parfaitement logique et c'est d'ailleurs ce que j'essaye d'appliquer.
    Je déclare d'abord la variable en tant que volatile
    Dans mon interruption, je met la valeur de cette variable à 1
    Dans la boucle principale de mon programme, je teste si cette valeur == 1. Si oui, je fais mon long traitement et je remet ensuite la valeur à 0.
    Je n'ai jamais eu de soucis en appliquant cette méthode.
    Cordialement
    N'importe quoi, for ever :-)

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

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    oui ca marche paraitement pour moi aussi
    quoi pour mon cas particulier mon progrmae principale main ne fait un boucle :// que doit-je faire alors mon interruption n'accepte pas un long traitement !!!!!

  7. #6
    RISC

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    Salut,

    Attention. Sauf si c'est absolument nécessaire (ou impossible) de faire le traitement dans l'interruption (par exemple pour le controle moteur), il faut faire le minimum dans l'interruption car tous les registres modifiés devront être sauvés à l'entrée et restaurés à la sortie de l'interruption ce qui agrandi encore plus le temps de traitement...

    Si le temps de traitement de l'interruption est trop long il faut ...
    1/ essayer de le réduire au maximum (parfois certaines insctructions C sont moins gourmandes que d'autres. Un bonne connaissances du compilateur peut aider
    2/ utiliser l'optimisation. Généralement uniquement dispo dans les versions payantes
    3/ faire tourner le PIC plus vite. S'il est au max il faut envisager de monter en gamme.

    a+

  8. #7
    invite03481543

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    Bonsoir,

    il est possible que ton probleme vienne des timings de l'ecran, si tu utilises des delay et que ca fonctionne il faut que tu recuperes l'info busy flag de l'ecran, c'est lui qui doit donner le tempo au reste, pas le micro a l'ecran...
    Ne pas oublier qu'un ecran c'est un micro aussi qui le gere et que les deux doivent se coordonner, c'est justement le role du busy flag, trop souvent neglige dans les programmes d'affichage.
    Si le micro impose son rythme au bout d'un moment il va y avoir ecrasement des donnees si l'ecran recoit plus qu'il ne peut traiter, ou qu'il effectue une tache imprevue ou inhabituelle.
    Si je t'ai bien suivi tu as une horloge externe qui temporise le defilement des images.
    A quelle frequence tourne ton micro?
    Tes images sont stockees ou?
    Ton micro c'est quoi?
    @+

  9. #8
    ragedBOYS

    Re : [PIC] - déclaration de variables lors de l'utilisation des interruptions

    je travaille avec IAR workbench pour le chip cc2530

    je détecte une interruption de zéro cross d'un signal 50Hz c-à-d chaque 10ms j'ai une interurption et dés que l'interruption est captéje fais un delais ou timer et puis je commande un led.
    Le bizzarre c'est lorsque j'injecte le timer pour 5ms ou bien delay en quelques 5 ms dans la fonction de l'interruption du zéro cross elle ne fonctionne pas convenablement.
    Mais par contre lorsque j'affecte une variable intermédiaire booléan dés que j'entre dans la fonction d'interruption sans utiliser ni dela ni timer et j'injecte le timer ou delay au niveau du programme principale Main en testant le changement de la variable intermédiaire avec un boucle infinie dans le main ça fonctionne parfaitement !!!!??
    c-à-d ma fonction accepte que des instruction simple allumer led / incrémenter variable :/
    j'ai pensé que la durée des instructions des timer ou delay dépasse 10ms (le temps de recevoir une autre interruption zérocross )
    mais je suis trés loin de ca puisque j'utilise une horloge systéme de 32MHZ c'est quoi le probléme alors pourquoi au niveau main ca fonctionne !!!!
    Je peut pas optimiser une instruction de delay ou bien timer de valeur 5ms !!?

Discussions similaires

  1. [C]-Déclaration de variables
    Par jorg1n dans le forum Électronique
    Réponses: 3
    Dernier message: 29/04/2009, 12h57
  2. [PIC]-Aide déclaration variables
    Par jorg1n dans le forum Électronique
    Réponses: 17
    Dernier message: 03/06/2008, 09h36
  3. Déclaration des entrées sorties sur PIC 16fXXX
    Par invite2be78364 dans le forum Électronique
    Réponses: 4
    Dernier message: 24/05/2008, 16h36
  4. [PIC]gestion des interruptions
    Par ABN84 dans le forum Électronique
    Réponses: 9
    Dernier message: 07/05/2008, 09h17
  5. Interruptions & Variables
    Par joseph4008 dans le forum Électronique
    Réponses: 1
    Dernier message: 27/05/2006, 18h20
Découvrez nos comparatifs produits sur l'informatique et les technologies.