Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 43

PIC en C



  1. #1
    audemorel

    PIC en C


    ------

    Bonjour,

    Je suis en train de programmer en langage C une petite minuterie avec PIC 16F684...
    Seulement j'ai besoin de faire certaines actions que sous certines conditions. Bref, je veux pouvoir envoyer du courant dans les pattes AN0 et AN1 que si AN2 ou AN3 en recoivent...

    Or seule la patte AN3 semble fonctionner en input... Quelque soit l'état de AN2, il s'en fout... J'ai essayé sur d'autres pattes mais vraiment seule AN3 a l'air de faire qqch...

    Est-ce normal? Peut-on faire qqch pour AN2?
    Ou peut-être y'a-til un autre PIC dont les pattes AN0, AN1, AN2, AN3, alim et masse soient placées au même endroit, qui fonctionnerait mieux (s'il peut faire au max 14 pattes comme le 16F684, ca serait super)...

    Merci d'avance

    -----

  2. Publicité
  3. #2
    Shaiton

    Re : PIC en C

    Bonjour,
    si quelqu'un veut aider, proposer la datasheet c'est deja mieux
    http://ww1.microchip.com/downloads/e...202F-print.pdf

    premierement, on n'appel pas les pin AN0, AN1... mais RA0, RA1 etc. AN veut simplement signifier qu'li s'agit de l'entrée analogique etc
    Donc, prendre
    AN0 = RA0
    AN1 = RA1
    AN2 = RA2
    AN3 = RA4
    (voir datasheet, j'ai pu me tromper..)
    Toutes sont des I/O (Input/Output = Entrée/Sorties.
    on le voit pas les fleches a double sense sur la datasheet p.4.
    Donc le PIC est bon

    Ce que tu veux, c'est un truc du genre
    Code:
    RA2 = RA4;
    RA0 = RA1;
    pour la syntaxe, tout dépend du compilateur

    de cette maniere, on recopie l'entrée RA4 sur la sortie RA2, de meme pour RA1 et RA0.

    Apres, ton probleme doit etre la configuration en entrée ou sortie.
    Voir le registre OPTION (de memoire...)

    quel compilateur utilises-tu?
    Le Geek Sportif !

  4. #3
    audemorel

    Re : PIC en C

    J'ai peut-être pas été claire dans mon message. Je vous mets donc mon code... Comme vous pouvez le voir, j'utilise l'état des input(PIN_A3) et input(PIN_A2)... Avec la 3, fonctionne très bien mais pas la 2. Ce n'est pas la facon de coder puisque si je remplace les 2 et 3, le constat est toujours le même : seule la 3 fonctionne.


    Code:
    #include "MinPIC.h"
    
    int32 i=0;
    int32 j=0;
    
    void main()
    {
       setup_oscillator(OSC_8MHZ);
    
    // le jack est mis, la led jaune clignote rapidement
    
       while (0==input(PIN_A3) )
       {
          output_high(PIN_A0);
          delay_ms(250);
          output_low(PIN_A0);
          delay_ms(250);
       }
    
    // on enlève le jack
    
    // jusqu'à t0+8s, la led jaune clignote toutes les secondes
    
       while(i<800)
       {
          output_high(PIN_A0);
          delay_ms(250);
          output_low(PIN_A0);
          delay_ms(750);
          i+=100;
       }
    
    // jusqu'à t0+10s, si détection, il y a, on déclenche la led rouge
    
       while (i<1000 & 0==input(PIN_A2))
       {
          delay_ms(10);
          i+=1;
       }
    
       while (i<1000)
       {
          output_high(PIN_A1);
          j=1;
          delay_ms(100);
          i+=1;
       }
    
    // à t0+10s, on déclenche obligatoirement la led rouge
    
       while (i<1500)
       {
          output_high(PIN_A1);
          delay_ms(1000);
          i+=100;
       }
    
    // Si à la fin, la led jaune est allumée, la détection a fonctionné sinon non...
      
       if (j==1)   output_high(PIN_A0);
    
    }

  5. #4
    invite03481543

    Re : PIC en C

    Salut,

    c'est quoi le compilo?
    Qu'est-ce que contient MinPic.h?

    Compte tenu de la façon dont sont écrites les conditions de tests, je ne suis pas trop surpris que ton programme ne fonctionne pas.

    Par exemple: while (i<1000 & 0==input(PIN_A2))
    Dernière modification par HULK28 ; 19/04/2007 à 14h07.

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

    Re : PIC en C

    Pour le compilateur, j'utilise CCS PCWH.

    Sinon voilà le contenu de mon MinPIC.h:
    Code:
    #include <16F684.h>
    #device adc=8
    #use delay(clock=8000000)
    #fuses NOWDT,RC, NOPROTECT, BROWNOUT, NOMCLR, NOCPD, NOPUT, IESO, FCMEN
    Quand à la façon dont j'ai écrit mes conditions tests, c'est ce que j'essayais d'expliquer : si je mets while (i<1000 & 0==input(PIN_A3)) au lieu de A2, ca fonctionne... Ca ne vient donc pas de mon code, enfin je pense... Mais je ne comprends pas d'où ca peut venir...

  8. #6
    Shaiton

    Re : PIC en C

    [edit = Trop lent !!!]


    Alors avec le code c'est (presque) plus clair.
    Le compilateur on dirait CCS...

    il est vrai que les condition dans les while() sont a revoir.
    Un "ET" logique s'ecrit "&&"... c'ets du C ANSI... voir les crous sur google.. le premier: http://www.linux-kheops.com/doc/ansi...00000000000000

    de plus, je ne voix pas de boucle infinie... le programme ne s'execute qu'une seule fois... c'est normal?
    i n'est jamais réinitialisé... normal?

    while (i<1000 & 0==input(PIN_A2))
    {
    delay_ms(10);
    i+=1;
    }
    Si la PIN A2 ne vaut jamais 0, il y aura débordement... donc i vaudra + que 1500 (pour le while d'apres).
    en fait cela perturbe le "comptage" de temps...*

    mais peut etre est-ce que tu as voulu faire.
    Le Geek Sportif !

  9. Publicité
  10. #7
    umfred

    Re : PIC en C

    A mon avis, il doit y avoir un problème de configuration du port A (par défaut je crois que le port est mis en analogique). D'autre part, je ne vois nulle part que tu configure RA0 et RA1 en sortie et RA2 et RA3 en entrée.

    regarde les fonctions/directives "#use *_io", "set_tris_a(), "setup_adc_ports()" dans le manuel de CCS

    Et de plus un test 0== qqch me parait pas très catholique (on teste plutôt si qqch est égale à 0 et non sue 0 est égale à qqch )
    Dernière modification par umfred ; 19/04/2007 à 20h13.

  11. #8
    audemorel

    Re : PIC en C

    Alors pourquoi ca fonctionne si j'utilise la PIN_A3 au lieu de la PIN_A2? :
    while (i<1000 & 0==input(PIN_A3))

  12. #9
    audemorel

    Re : PIC en C

    de plus, je ne voix pas de boucle infinie... le programme ne s'execute qu'une seule fois... c'est normal?
    i n'est jamais réinitialisé... normal?
    Oui c'est normal, c'est une minuterie...

  13. #10
    audemorel

    Re : PIC en C

    Si la PIN A2 ne vaut jamais 0, il y aura débordement... donc i vaudra + que 1500 (pour le while d'apres).
    en fait cela perturbe le "comptage" de temps...*
    0 est l'état initial de la PIN_A2, elle est censé passée à 1 par la suite et mon jeu de led me permet justement à la fin de savoir si elle a bien changé d'état à un moment... Le pic est destiné à piloter une éxpérience pendant laquelle la carte élec sera enfermée...

  14. #11
    Shaiton

    Re : PIC en C

    Hum.. ok. (en tout cas bien la source, malgrés quelques erreur de syntaxe (eh oui ) elle est clair et bien commentée.

    Bon alors,
    Avec CCS on n'a pas forcement besoin d'initialiser les entrée/sortie...

    input(pin) configure la pin en entrée et renvoit ca valeur.
    output_low(pin) la configure en sortie à l'etat bas.

    Donc ce niveau la OK. Apres
    #device adc=8
    devrait etre ce qui fait que ca marche ou non.. non ?
    regarder l'aide de CCS pour desactiver les ADC...
    pour ne prendre que des niveaux logiques.

    Pour les erreurs de syntaxte, on ecrit (commme précisé par umfred)
    if( i == 0)
    et non
    if (0 == i)

    bon, si i est binaire, on peut ecrire simplement
    if (i)
    ou
    if(!i)
    ... apres c'est un choix de lisibilitée..

    Il faut imperativement changer tes conditions, dont celle la :
    while (i<1000 & 0==input(PIN_A2))
    si je l'ai bien comprise, ce serait
    while ( (i<1000)&&(input(PIN_A2)==0 )
    voir,
    while ( (i<1000)&&(!input(PIN_A2) )
    a moins que ce soit
    while ( (i<1000)||(input(PIN_A2)==0 )
    le seul danger avec les while, c'est de confondre la condition (OU ou ET)..

    Alors reecris-nous le code, donne nous les nouveaux resulats (en ayant désactivé les entrées analogiques)
    et on en reparlera

    Cordialement
    Le Geek Sportif !

  15. #12
    audemorel

    Re : PIC en C

    Ok merci beaucoup, je vais réecrire plus proprement mon code et essayer de ttrouver comment désactiver les ADC. Ma question va peut-être vous paraitre stupide mais c'est quoi exactement ADC?

    Sinon y'a quand même quelque chose qui m'intrige...
    Pourquoi ça fonctionne si j'utilise la PIN_A3 au lieu de la PIN_A2? :
    while (i<1000 & 0==input(PIN_A3))

  16. Publicité
  17. #13
    Shaiton

    Re : PIC en C

    heuuu l'ADC on peut dire Convertisseur Analogique Numerique (CAN en fr).
    Si l'adc n'est pas desactivé, le PIC attend une info analogique, or tu test sur du binaire.
    il est donc impossible d'exploiter des resultats.

    pourquoi ca fonctionne?
    ce n'est pas sensé fonctionner...
    ton test ne fait pas ce que tu voulais, mais c'est comme une patte en l'air : on peu la penser à 0V parce que souvent ca marche... mais comme par hazarre, une fois sur 10 il y aura un niveau haut dessus (voir CEM). Et voila,
    c'est ca un resultat non exploitable.

    regarde sur l'aide de CCS adc off ou un truc du genre.
    de plus, verifier que #device adc=8 n'active pas d'adc (je ne connais pas ca..)

    voila, a+
    Le Geek Sportif !

  18. #14
    umfred

    Re : PIC en C

    Pour désactiver les ADc il faut utiliser la fonction setup_adc_ports(NO_ANALOGS) (c'est indiqué dans le manuel de CSS )

    Pourquoi ça fonctionne si j'utilise la PIN_A3 au lieu de la PIN_A2? :
    while (i<1000 & 0==input(PIN_A3))
    Simplement parce que la pin A3 n'a pas de fonction analogique sur ce PIC

  19. #15
    audemorel

    Re : PIC en C

    Ben si, la PIN_A3 a une fonction analogique puisque j'utilise la patte 3 appelé AN3 ou RA4...

  20. #16
    Shaiton

    Re : PIC en C

    je pense plutot que pour CCS PIN_A3 = RA3 .. pas d'ADC.
    RA4 serait PIN_A4.

    Citation Envoyé par umfred
    Simplement parce que la pin A3 n'a pas de fonction analogique sur ce PIC
    +1
    Le Geek Sportif !

  21. #17
    umfred

    Re : PIC en C

    Si PIN_A3 correspond en effet à RA4, en effet ça me semble bizarre...

    Enfin beaucoup moins maintenant que j'ai vu que tu fonctionne en RC et donc que RA4 (appelons la par son vrai nom donc ) est en CLOCKOUT (donc sort un signal carré égale à Fosc /4).
    Il faut donc remplacer RC par RCIO sur la ligne #fuses du fichier MinPIC.h . Ainsi tu pourra ste servir de cette pin en entrée/sortie numérique.

  22. #18
    audemorel

    Re : PIC en C

    Mais RA4 est justement la seule qui marche... Ce n'est donc pas elle que je veux changer mais RA2...

    Sinon PIN_A3 est bien RA4 puisque j'utilise la patte n°3...

  23. Publicité
  24. #19
    umfred

    Re : PIC en C

    Citation Envoyé par umfred Voir le message
    Pour désactiver les ADc il faut utiliser la fonction setup_adc_ports(NO_ANALOGS); (c'est indiqué dans le manuel de CSS )
    Met le setup_adc_ports() au début du main()

    Citation Envoyé par umfred Voir le message
    Il faut donc remplacer RC par RCIO sur la ligne #fuses du fichier MinPIC.h .
    Au fait, ton horloge de PIC est bien un RC sur RA5?

    Si oui, effectue ces 2 modifications et dis nous si tu as encore le problème.

  25. #20
    audemorel

    Re : PIC en C

    Au fait, ton horloge de PIC est bien un RC sur RA5?
    Il n'y a rien sur ma patte 2 (RA5)...

    Quand à vouloir supprimer le mode CAN, je comprend pas pourquoi, puisque j'utilise les PIN en analogique : PIN_A3 = AN3 (=RA4)...
    De plus c'est bien de l'analogique, si j'ai une tension proche de 0V, je considère que c'est l'état 0; si j'ai une tension proche de 5V, je considère que c'est l'état 1... C'est absurde?

  26. #21
    umfred

    Re : PIC en C

    Citation Envoyé par audemorel Voir le message
    Il n'y a rien sur ma patte 2 (RA5)...
    Autant pour moi, tu utilises l'horloge interne...

    Quand à vouloir supprimer le mode CAN, je comprend pas pourquoi, puisque j'utilise les PIN en analogique : PIN_A3 = AN3 (=RA4)...
    Je te confirme que tu n'utilise pas le CAN (ça au moins c'est sûr ) puisque pour l'utiliser, il faut passer par les fonctions read_adc() et autres.
    Ce n'est pas parce que tu appelles la patte ANx qu'elle est utilisée en analogique (ça serait trop simple).

    De plus c'est bien de l'analogique, si j'ai une tension proche de 0V, je considère que c'est l'état 0; si j'ai une tension proche de 5V, je considère que c'est l'état 1... C'est absurde?
    C'est comme ça que fonctionne en fait le TTL (ou E/S numérique): si la tension est au dessus d'un certain seuil, il est lu comme un "1", si elle est en dessous d'un certain seuil, elle est lue comme un "0".
    Le CNA donnerait une valeur entre 0 et 1023, qui correspondrait une tension variant entre 0V et Vref.

  27. #22
    audemorel

    Re : PIC en C

    J'ai rajouté setup_adc_ports(ALL_ANALOG) et ca a l'air de fonctionner mais il me faut une tension suppérieure à 5V (6.5V) sur la PIN_A2 pour que ca marche alors que 2.5V suffise avec la RA4 ou PIN_A3... C'est bizarre... Et ca ne m'arrange pas trop, même si ca je dois pouvoir m'en débrouiller...

  28. #23
    umfred

    Re : PIC en C

    Citation Envoyé par audemorel Voir le message
    J'ai rajouté setup_adc_ports(ALL_ANALOG) ...
    euh je crois avoir dit de mettre NO_ANALOGS

  29. #24
    audemorel

    Re : PIC en C

    Ca change rien, ca fonctionne mais il faut que je mette au moins 6V sur la PIN_A2... Et c'est embetant parce que ma tension viendra d'un optocoupleur qui ne prendra pas plus de 5V...
    En fait, ca marchait peut-être déjà avant mais j'avais testé que avec 5V...

  30. Publicité
  31. #25
    umfred

    Re : PIC en C

    Ton PIC est alimenté avec quelle tension ? la datasheet indique que son alimentation ne doit pas dépasser 6.5V Maximum absolue (au delà ton PIC est quasi mort)

  32. #26
    audemorel

    Re : PIC en C

    il est alimenté en 5V

  33. #27
    umfred

    Re : PIC en C

    As-tu changé aussi les tests comme Shaiton te l'a dit ?

    Citation Envoyé par Shaiton Voir le message
    Pour les erreurs de syntaxte, on ecrit (commme précisé par umfred)
    if( i == 0)
    et non
    if (0 == i)

    bon, si i est binaire, on peut ecrire simplement
    if (i)
    ou
    if(!i)
    ... apres c'est un choix de lisibilitée..

    Il faut imperativement changer tes conditions, dont celle la :
    while (i<1000 & 0==input(PIN_A2))
    si je l'ai bien comprise, ce serait
    while ( (i<1000)&&(input(PIN_A2)==0 )
    voir,
    while ( (i<1000)&&(!input(PIN_A2) )
    a moins que ce soit
    while ( (i<1000)||(input(PIN_A2)==0 )
    le seul danger avec les while, c'est de confondre la condition (OU ou ET)..

    Alors reecris-nous le code, donne nous les nouveaux resulats (en ayant désactivé les entrées analogiques)
    et on en reparlera

    Cordialement
    Eventuellement reposte le nouveau code (en respectant ce qu'on t'a dit) et en nous disant si tu as vu des améliorations ou non.

  34. #28
    audemorel

    Re : PIC en C

    Code:
    #include "MinPIC.h"
    
    int32 i=0;
    int32 j=0;
    
    void main()
    {
       setup_adc_ports(NO_ANALOGS);
       setup_oscillator(OSC_8MHZ);
    
    // le jack est mis, la led clignote rapidement
    
       while (input(PIN_A3)==0)
       {
          output_high(PIN_A0);
          delay_ms(150);
          output_low(PIN_A0);
          delay_ms(150);
       }
    
    // on enlève le jack
    
    // jusqu'à t0+8s, la led clignote toutes les secondes
    
       while(i<800)
       {
          output_high(PIN_A0);
          delay_ms(250);
          output_low(PIN_A0);
          delay_ms(750);
          i+=100;
       }
    
    // jusqu'à t0+15s, si détection, il y a, on déclenche EV
    
       while ((i<1500) && (input(PIN_A2)==0))
       {
          delay_ms(10);
          i+=1;
       }
    
       while (i<1500)
       {
          output_high(PIN_A1);
          j=1;
          delay_ms(10);
          i+=1;
       }
    
    // à t0+15s, on force l'EV
    
       while (i<2000)
       {
          output_high(PIN_A1);
          delay_ms(1000);
          i+=100;
       }
    
    // Si à la fin du vol, la led jaune est allumée, la détection d'apogée à fonctionner sinon non...
    
       if (j==1) output_high(PIN_A0);
    }
    Voilà j'ai réécris le code et rajouter le setup_adc mais ca ne change rien... Il n'y a toujours que avec PIN_A3 (RA4) que ca fonctionne...

    En fait la PIN_A2 ne marche pas non plus avec 6V... Je ne sais pas trop pourquoi mais si j'injecte 6,5V sur cette pate où qu'en soit le programme, la led rouge s'allume... Le programme n'a pas fonctionné pour autant puisque j n'est pas passé à 1... Je vous mets en pièce jointe mon schéma élec...

    Mais bref, je suis toujours au point de départ... Ca fonctionne avec PIN_A3 et c'est tout...
    Images attachées Images attachées

  35. #29
    invite03481543

    Re : PIC en C

    Minpic.h déclare "RC" alors que tu es en mode quartz 8MHz.

    Quel est le modèle de ton photocoupleur et quel courant circule dans sa diode.

    La diode sur la gate du mos est à remplacer par un strap ou une résistance de quelques ohms.

    Où est le circuit de reset?

  36. #30
    Shaiton

    Re : PIC en C

    edit : Oups désolé, j'ai du rater une page !!


    Bon, alors on repprend
    le niveau haut est codé 5V, niveau bas 0V.
    tu n'a donc que deux niveaux.
    c'est donc du binaire!
    l'analogique = infinitée de valeurs! (en, tout dépend de la résolution mais c'est un autre probleme...)

    Sur tes entrée, si tu veux capter seulement 2 niveaux égaux à 0V ou 5V ca ne pose pas de probeme, ne passe pas par l'analogique!
    Si sur less entrées le signal est proche de 0 ou 5, alors la il te faut préciser le "proche".
    Si il varit vers les 1-2V pour le 0V et 3-4V pour le 5V il te faudrait le remettre en forme (trigger de schmitt).
    et ce serait Encore du binaire

    Donc pas de AN !

    pour le num des pin, ca m'ettone mais bon,
    on ne peut pas tout affirmer tant que tu n'ora pas reessayé comme on te le demande.
    Soit :

    0/ revoir le fuse... la dessus tu n'est pas clair.. tu travail avec un quartz il me semble.. resoudre le conflit soulevé par umfred (il t'aidera mieux que moi pour ca..)
    1/ setup_adc_ports(NO_ANALOGS);
    2/ revoir tes conditions genre while (i<1000 & 0==input(PIN_A2)) ... ca ous arrache les yeux!!
    mdr

    apres tu repost avec tes nouveaux commentaires, tes questions pour comprendre mieux ce qu'il se passe.
    nos réponse sur du code qui devrait fonctionner

    voila,
    bonne prog
    Le Geek Sportif !

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Pic et pic et colegram...
    Par abracadabra75 dans le forum Électronique
    Réponses: 8
    Dernier message: 25/04/2008, 19h46
  2. erreur 0X00 programmation PIC plus questions sur les PIC
    Par ROTT dans le forum Électronique
    Réponses: 4
    Dernier message: 22/07/2007, 14h36
  3. Réponses: 0
    Dernier message: 18/03/2007, 15h43
  4. Pic 16f877 Pic basic pro conseil
    Par ledinblue dans le forum Électronique
    Réponses: 10
    Dernier message: 04/01/2007, 17h26
  5. Qui connais logi pic & et question à propos des pic
    Par Floris dans le forum Électronique
    Réponses: 10
    Dernier message: 29/05/2006, 22h40
Découvrez nos comparatifs produits sur l'informatique et les technologies.