Besoin d'un coup demain (PIC) .
Répondre à la discussion
Affichage des résultats 1 à 26 sur 26

Besoin d'un coup demain (PIC) .



  1. #1
    invite52a78f30

    Besoin d'un coup demain (PIC) .


    ------

    Bonjour,
    J'aurais besoin d'un coup de main, mon code ne fonctionne pas
    Réalisé avec MikroC et mon environnement de teste est l'easypic4.


    Code:
    void antirebond();
    void init_pic();
    void interrupt();
    unsigned char tempo=0;
     
    void antirebond(void){
    for (tempo=0;tempo<2000;tempo++);
    }
    
    void init_pic(void)
    {
    TRISB=0b11111111; //Rbx en entrée
    TRISA=0b00000000;          //RA en sortie
    PORTA=0x00;
    PORTB=0x00;
    INTCON=0b10001000; // activation des interruption RBIE
    }
     void interrupte(void)  // routine d'interruption
    {
       if(RBIF){
       void antirebond();
       PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
       INTCON.RBIF=0;
       }
    }
    void main(void)
    {
    init_pic();
    for(;;){
     }
    }
    Merci d'avance poru votre aide !

    Cordialement,
    Quicky

    -----

  2. #2
    invite74b5b8f7

    Re : Besoin d'un coup demain (PIC) .

    Salut,

    Déjà tu déclare Tempo comme un char (donc max 256) et tu l´incrémente jusqu´a 2000!

    Ensuite, t´es sur que ta routine d´interruption est déclarée correctement, il n´y a pas de vecteur associé!?

    Ensuite:
    Prototype : void interrupt();
    fonction déclarée : void interrupte(void) donc petite erreur de frappe aussi...

    Sinon ca marchera avec tempo en int (si tu geres correctement ton interruption)

  3. #3
    Seb.26

    Re : Besoin d'un coup demain (PIC) .

    Hello ...

    Plusieurs choses :

    C'est quoi ton PIC ?
    Mets le code dans des [CODE [/CODE ...

    Code:
    unsigned char tempo=0;
     
    void antirebond(void){
    for (tempo=0;tempo<2000;tempo++);
    }
    Problème, tempo est un unsigned char, donc de 0 à 255 ...
    Avis perso : utilise plutôt un delay_ms(xx), c'est plus fiable ...

    Essaye de remplacer :
    Code:
       PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
    par :
    Code:
       PORTA.F3 = !PORTA.F3;  // Toggle sur RA3
    NB: c'est quoi F3 ? ... c'est pas RA3 tout simplement ?
    ( tu as oublié il #define dans ton post ? )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  4. #4
    invite74b5b8f7

    Re : Besoin d'un coup demain (PIC) .

    Avis perso : utilise plutôt un delay_ms(xx), c'est plus fiable ...
    Encore un round "delay_ms() VS boucle for()"
    (Même conseil si tu veux éviter de te prendre la tête et avoir une tempo precise)

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

    Re : Besoin d'un coup demain (PIC) .

    Citation Envoyé par Seb.26 Voir le message
    Hello ...

    Plusieurs choses :

    C'est quoi ton PIC ?
    Mets le code dans des [CODE [/CODE ...

    Code:
    unsigned char tempo=0;
     
    void antirebond(void){
    for (tempo=0;tempo<2000;tempo++);
    }
    Problème, tempo est un unsigned char, donc de 0 à 255 ...
    Avis perso : utilise plutôt un delay_ms(xx), c'est plus fiable ...

    Essaye de remplacer :
    Code:
       PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
    par :
    Code:
       PORTA.F3 = !PORTA.F3;  // Toggle sur RA3
    NB: c'est quoi F3 ? ... c'est pas RA3 tout simplement ?
    ( tu as oublié il #define dans ton post ? )
    Avec MikroC, c'est la notation d'usage (PORTA bit3->PORTA.F3), le PIC utilisé n'apparait pas dans le code mais est déclaré dans l'éditeur de projet avec les bits de config.
    Rien n'interdit de faire un #define RA3 PORTB.F3

  7. #6
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    Pour compléter lil vince et Seb.26 qui ont presque tout dit, il manque une chose importante: l'activation globale des interruptions -> GIE=1, car bien que RBIE soit activé, il faut également l'activer dans INTCON.

  8. #7
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    Tout d'abord merci pour votre aide !
    Le PIC utilisé est le 16F877A, la déclaration du pic ainsi que la fréquence d'horloge est déclaré dans l'éditeur de projet.
    PORTA.F3 = RA3 , c'est la syntaxe utilisé par mikroC.

    Code:
    void init_pic();
    void interrupt();
    
    void init_pic(void)
    {
    TRISB=0b11111111; //Rbx en entrée
    TRISA=0b00000000;          //RA en sortie
    PORTA=0x00;
    PORTB=0x00;
    INTCON=0b10011000; //GIE=1 , INTE=1,RBIE=1 ,
    }
     void interrupt(void)  // routine d'interruption
    {
       if(RBIF){
       delay_ms(1000);
       PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
       INTCON.RBIF=0;
       PORTB=0b0000000;
       }
    }
    void main(void)
    {
    init_pic();
    for(;;){
     }
    }
    Avec les modifs de tempo-> Delay_ms ca ne fonctionne toujours pas .
    Hulk, je pense avoir activé les bon registre (GIE et RBIE), y a t-il autre chose à faire ?

    Quicky

  9. #8
    Seb.26

    Re : Besoin d'un coup demain (PIC) .

    Le delay_ms() c'etait plus pour la "beauté" du code ...

    Citation Envoyé par Qweaky Voir le message
    Code:
    PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
    Tu as essayé avec "PORTA.F3 = !PORTA.F3;" ? ... ça marche toujours pas ?

    Tu as bien vérifié que tes IT soient actives ?

    Sinon, pour tester, essaye une autre IT, genre un Timer et fait clignoter une LED ... juste pour voir si les IT tournent ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  10. #9
    Seb.26

    Re : Besoin d'un coup demain (PIC) .

    Ton PORTA est en sortie, mais n'est il pas multipléxé avec le CAN ? ... Si oui, tu as mis tes pins en mode I/O ?
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    Comme tu as du le remarqué Seb.26 je suis débutant Mais je peux te dire que
    PORTA.F3 = !PORTA.F3 ne marche pas mieux que "PORTA.F3 = ~PORTA.F3
    Hier ca a marché avec cet interruption là :

    Code:
    if (INTF){....}
    mais j'avais un prob, les leds s'allumait mais ne s'éteignait pas. De toute facon mon but premier était d'utilisé les interruptions avec RBIF.(qui me semblait les plus simple à mettre en oeuvre).

    Les remarques sont toujours les bienvenues car ca ne marche toujours pas

  12. #11
    invite0e5af214

    Re : Besoin d'un coup demain (PIC) .

    Qu'entends tu par "Ca ne marche pas" ?

    Ca ne compile pas ? Ca fait n'importe quoi ? Ca ne fait rien ?

    Quelqu'un t'a suggéré de remplacer
    PORTA.F3 =~PORTA.F3; // Toggle sur RA3
    par
    PORTA.F3 =!PORTA.F3; // Toggle sur RA3
    Tu peux aussi désactiver le convertisseur analogique numérique qui parfois cause des soucis
    Code:
    ADCON1 = 0xFF;
    Es tu au moins sur que le PIC tourne ?
    Si tu as une led à disposition, fait la clignoter avec ta boucle infinie du main.

  13. #12
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    J'ai mis mes pins du PORTA en sortie avec TRISA=0b00000000; De là a dire si le prob vient du multiplexage avec les CAN... comment puis-je désactivé le CAN , pour en etre sur ?

  14. #13
    Seb.26

    Re : Besoin d'un coup demain (PIC) .

    Citation Envoyé par Qweaky Voir le message
    J'ai mis mes pins du PORTA en sortie avec TRISA=0b00000000; De là a dire si le prob vient du multiplexage avec les CAN... comment puis-je désactivé le CAN , pour en etre sur ?
    ADCON1 et CMCON

    Mais surtout :

    PCFG <3:0> = 011x ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  15. #14
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    Voilà, j'ai fait les quelques modif a mon code que vous m'avez dictée. Celà ne fonctionne toujours pas. Le code ce compile bien et j'arrive à l'exporter sur mon PIC sans problème. Chose plus inquiètent, ma LED du port RA2 ne clignote pas alors que celle du RA1 clignote... J'ai essayé de mettre RA1 dans mon code d'interruption car je suis sur qu'elle peut clignoter, ça marche toujours pas

    Code:
     void init_pic();
     void interrupt();
    
    void init_pic(void)
    {
    ADCON1 = 0xFF;     // desactivation du CAN
    TRISB=0b11111111; //Rbx en entrée
    TRISA=0b00000000;          //RA en sortie
    PORTA=0x00;
    PORTB=0x00;
    INTCON=0b10011000; //GIE=1 , INTE=1,RBIE=1 ,
    }
     void interrupt(void)  // routine d'interruption
    {
       if(RBIF){
       delay_ms(1000);
       PORTA.F3 =!PORTA.F3;  // Toggle sur RA3
       INTCON.RBIF=0;
       PORTB=0b0000000;
       }
    }
    void main(void)
    {
    init_pic();
    for(;;){
    Delay_ms(1000);
    PORTA.F1=!PORTA.F1;     // led RA1 clignote
    PORTA.F2=!PORTA.F2;      //Clignote pas :(
    Delay_ms(1000);
     }
    }

  16. #15
    Seb.26

    Re : Besoin d'un coup demain (PIC) .

    Tu as testé la piste de mon msg #13 ?
    ( je vois pas le code correspondant ... )

    Avec ADCON1 = 0xFF, RA3 est en mode "VREF+" pour le CAN il me semble ... ... mets le plutôt à 0xF7 ( ou F6 peut importe )
    Dernière modification par Seb.26 ; 08/03/2008 à 16h32.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  17. #16
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    Alors ya du changement !
    avec :
    Code:
    ADCON1 = 0xF7;    
    CMCON=0xFF;
    mes 2 leds clignotent ! (c'est dejà ca!). (avec le ADCON1=0xFF , j'avais selement 1 led qui clignotait)

    Maintenant que j'appuie sur mon bouton poussoir RB5 mes 2 LEDS de ma boucle infinie ne change plus d'état (plus de clignotement), elle reste allumée.

  18. #17
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    Pas de solution à mon problème ?
    ma led RA3 ne s'allume toujorus pas quand j'appuie sur RB4->RB7

  19. #18
    RISC

    Re : Besoin d'un coup demain (PIC) .

    Salut,

    Je ne connais pas la carte easyPIC4 mais il faut faire très attention aux broches RB6 et RB7 car elles sont nécessaires pour flasher ET deboguer les PIC (mode exclusif).
    Vérifie le schéma de ta carte

    Je te déconseille en général d'utiliser ces broches car elles sont nécessaires pour programmer /déboguer sur la plupart des PICs.

    a+

  20. #19
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    Citation Envoyé par Qweaky Voir le message

    Code:
     void init_pic();
     void interrupt(); // on ne déclare pas cette fonction en protoytpe, inutile
    
    void init_pic(void)
    {
    ADCON1 = 6;     // desactivation du CAN
    [COLOR="red"]PORTA=0x00;
    TRISA=0;          //RA en sortie
    PORTB=0;
    TRISB=0b11111111; //Rbx en entrée
    INTCON=0b10011000; //GIE=1 , INTE=1,RBIE=1 ,
    }
     void interrupt(void)  // routine d'interruption
    {
       if(RBIF){
       delay_ms(1000); // pas de tempo dans une IT!!
       PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
       
       PORTB=0; // inutile
       INTCON.RBIF=0; // à la fin
       }
    }
    void main(void)
    {
    init_pic();
    for(;;){
    Delay_ms(1000);
    PORTA.F1=~PORTA.F1;     // led RA1 clignote
    PORTA.F2=~PORTA.F2;      //Clignote pas :(
    Delay_ms(1000);
     }
    }
    essaye avec ces corrections.
    @+

  21. #20
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    Le bouton poussoir est en entrée sur RB4 à RB7 donc la déclaration du portB est fausse si tu déclares le portB en sortie.
    Comment est câblé le B.P, relié à la masse ou au +Vcc?
    De plus si le B.P est à la masse il faut déclarer les pull-up internes activés (RBPU=0 dans le registre OPTION_REG bit7)
    Si le BP est relié au +Vcc il faut mettre une 10K reliée à la masse (entre l'entrée et la masse).


    @+

  22. #21
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    Voici un prog fonctionnel avec B.P sur PORTB.F4 relié à la masse:

    Code:
    void init_pic(void);
    char var;
     
    void init_pic()
    {
    ADCON1 = 6;     // désactivation du CAN
    PORTA=0x00;    // portA fixé à 0
    TRISA=0;          //RA en sortie
    OPTION_REG.F7=0; // activation des pull-up
    PORTB=0;
    TRISB=0b11111111; // portB en entrée
    INTCON=0b10001000; //GIE=1 , RBIE=1
    }
    
    void interrupt()  // routine d'interruption
    {
       if(RBIF)
         {
          var=~var;    
          INTCON.F0=0; // le flag RBIF est remis à 0
         }
    }
    void main(void)
    {
    var=0;
    init_pic();
    while(1)
         {
          Delay_ms(1000);
          if(var>0) PORTA.F2=1;                
          if(var==0) PORTA.F2=0;
            
    }

  23. #22
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    Bonjour Hulk,
    J'ai corrigé mon et code et essayé le tiens, rien à faire ca ne fonctionne toujours pas

    J'ai ma led RB7 qui s'allume a l'initialisation du pic (why ??) et quand j'appuie sur RB5 elle s'éteint. Il ne se passe rien sur mes LEDS RAx ..

  24. #23
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    Dans mon code le portB est en entrée donc pas de led qui peut s'allumer.

    Fais un peu voir ton schéma et le code que tu as entré dans ton PIC.

    @+

  25. #24
    invite52a78f30

    Re : Besoin d'un coup demain (PIC) .

    J'aimerais bien te fournir le schéma mais je le trouve pas. Il s'agit enfaite de la carte de devellopement easypic4.

    Alors quand je debug avec ICD debugger de mikroC, mes 2leds RA1 et RA2 clignotent bien a l'infini (si j'enlève le delay_ms) mais par contre il ne rentre jamais dans ma routine d'interuption.

    Lorsque je ne débug pas, le pic s'initialise avec Rb7 allumé et si j'appuie sur RB6 elle s'éteint... Conclusion , rien ne va ;(

    Code:
     void init_pic();
     
    void init_pic(void)
    {
    ADCON1 = 6;     // desactivation du CAN
    PORTA=0x00;
    TRISA=0;          //RA en sortie
    PORTB=0;
    TRISB=0b11111111; //Rbx en entrée
    INTCON=0b10001000; //GIE=1 ,RBIE=1 ,
    }
     void interrupt(void)  // routine d'interruption
    {
       if(RBIF){
       PORTA.F3 =~PORTA.F3;  // Toggle sur RA3
       INTCON.RBIF=0;
       }
    }
    void main(void)
    {
    init_pic();
    for(;;){
    Delay_ms(1000);
    PORTA.F1=~PORTA.F1;
    PORTA.F2=~PORTA.F2;
    //Delay_ms(1000);
     }
    }

  26. #25
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    A tout hasard essaye avec

    if(RBIF==1) dans la routine d'interruption.
    Ou bien avec if(INTCON.RBIF)

    MikroC n'utilise pas la variable bit...

  27. #26
    invite5637435c

    Re : Besoin d'un coup demain (PIC) .

    Si le PortB7 s'allume il est aussi fort possible qu'un dip-switch de ta carte soit mal configuré.
    Une dernière chose, pour que RBIF puisse être détectée il faut être bien certain que le port où se trouve ton bouton poussoir change bien d'état, vérifie ce point avec un voltmètre.
    Je te rappelle que ce bouton doit être branché sur un des ports RB4~RB7.

Discussions similaires

  1. mouvement d'un solide besoin d'un coup de main
    Par invite09cf1489 dans le forum Physique
    Réponses: 15
    Dernier message: 13/11/2007, 20h09
  2. Besoin d'un coup de main
    Par inviteee07f670 dans le forum Électronique
    Réponses: 3
    Dernier message: 19/08/2006, 20h26
  3. Réponses: 24
    Dernier message: 11/05/2006, 15h07
  4. besoin d'un coup de main
    Par invite1259817c dans le forum [ARCHIVE] Psychologie / Sociologie
    Réponses: 2
    Dernier message: 15/11/2004, 21h43
  5. besoin d'un ptit coup de main pour commentaire d'un petit texte de Kant
    Par invite8725fb77 dans le forum [ARCHIVE] Philosophie
    Réponses: 4
    Dernier message: 30/10/2004, 12h40
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...