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

[PIC] Header ??



  1. #1
    La Praline

    [PIC] Header ??


    ------

    Bonjour à tous,

    Me revoici encore dans une de mes, maintenant nombreuses, péripécies ^^

    Encore et toujours dans le cadre de mon projet d'afficheur de boite automobile, j'ai, je pense, un soucis avec mes ".h" !!

    Alors voilà... J'utilise un PIC16F819 (pour l'instant, je vais utiliser des PIC16F684 d'ici la semaine prochaine... délai de livraison oblige :s) et un compilateur C gratuit et libre de droits pour les prototype CC5X.
    Ce compilateur inclus de nombreux XXXX.h dont le pic16f819.h... seulement lorsque je compile des erreurs sont générées parce qu'il ne reconnait pas l'utilisation de "RB0, RB1, ..., RA0, RA1, etc..." ni même les "TRISA, TRISB"... et effectivement il n'y a pas de déclarations de ces composantes dans le .h ...

    Alors je me demande si c'est moi qui doit "compléter" le .h ou si simplement je ne sais pas correctement m'en servir...

    Je suppose(espère ^^) que vous ens avez un peu plusque moi sur le sujet pour me diriger vers une carte qui marche lol...

    D'avance merci........

    -----
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  2. Publicité
  3. #2
    Toufinet

    Re : [PIC] Header ??

    S'ils ne sont pas déclarés dans le .h, tu peux les déclarer toi même.
    Les adresses sont stipulées dans la datasheet page 13
    ( PORTA : 0x05 (bank 0), PORTB : 0x06 (bank 0), TRISA : 0x85 (bank1), TRISB : 0x86 (bank 1) ).

    Tu ne peux pas utiliser RA0 RA1 etc .., mais uniquement PORTA et PORTB.
    ( PORTA = RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 )

  4. #3
    La Praline

    Red face Re : [PIC] Header ??

    D'accord...
    Mais comment estce que je dois faire pour tester, par exemple, quel niveau logique est présent sur la patte RA0 (en utilisant PORTA=??) ???

    Parce que je me suis douté que j'allais avoir des problèmes de ce genre... donc j'ai juste écris ceci pour tester:

    void main(void)
    {
    ADCON1=0x06; // <RA0...RA7> entrées numérique
    TRISA=0b11111101; // RA1 en sortie
    for( ; ; )
    {
    if(RA0==0)
    {
    RA1=0;
    }
    else
    {
    RA0=1;
    }
    }
    }

    juste un p'tit programme qui allume et éteind une led apres appui sur un bouton poussoir... basic ^^
    ... Bon forcément si je ne dois pas utiliser RA0 et RA1 ça ne risque pas de marcher ^^ même si j'ai déclaré quelques chose qui s'appelle RA0 et RA1 ^^ dans mon .h :

    #pragma bit RA0 @ 5.0
    #pragma bit RA1 @ 5.1

    ... mais si je ne dois me servir que de PORTA et PORTB, comment le manipuler pour pouvoir contrôler un niveau sur telle ou telle entrées ???
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  5. #4
    verdifre

    Re : [PIC] Header ??

    bonjour
    pour faire un test de RA0 tu peux peut etre faire
    if ((PORTA && 0x01)==0)

    fred

  6. #5
    La Praline

    Re : [PIC] Header ??

    Salut Fred,
    Merci de ta réponse.

    Ce que tu me propose de faire c'est bien ce qu'on appel un masque ???(pour être sûr ^^)
    Quel que soit le nom que ça porte je vais essayer tout de suite
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  7. A voir en vidéo sur Futura
  8. #6
    La Praline

    Re : [PIC] Header ??

    ... hum je me rend compte que je suis assez crétin certaines fois ^^ lol

    Maintenant je sais comment tester une broche e particulier(entrée) avec un masque... mais je ne sais pas comment imposer un niveau logique sur une patte particulière(sortie) ...
    Si quelqu'un peut m'aiguiller ce serait gentil ^^
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  9. Publicité
  10. #7
    verdifre

    Re : [PIC] Header ??

    bonjour,
    Oui c'est bien ce que l'on appelle un masque
    pour la lecture tu positionnes a 1 dans le masque les bits que tu veut lire et tu fait un "et" avec la variable
    pour l'ecriture , si tu veux forcer un bit a 1 sans toucher aux autres, tu positionnes le bit que tu veux modifier dans le masque et tu fait un "ou" avec ta variable
    pour mettre un bit a 0 sans toucher aux autres c'est un peu plus compliqué
    mais si c'est sur un pic l'assembleur te permet d'acceder directement aux divers bits, si ton c ne te le permet pas facilement, une instruction assembleur inline resoudra le pb plus elegament

    fred

  11. #8
    verdifre

    Re : [PIC] Header ??

    j'avais pas fini,
    pour mettre un bit quequonque a 0 sans toucher aux autres , tu prepares un masque ou tous les bits sont a 1 sauf celui que tu veux changer qui est a 0
    tu fais un "et" avec ta variable
    et le tour est joué.

    fred

  12. #9
    La Praline

    Re : [PIC] Header ??

    D'accord et encore une fois merci de me remémorer certains cours trop lointains ^^

    Mais voilà, j'ai tout de même encore un pb !!!

    Voilà ce que me dit mon compilateur:


    if( (PORTA && 0x01) == 0)
    --------------^
    Error[1] C:\Progr\test\test.c 10 : Syntax error
    (The expression must be corrected. The marker ------------^ shows
    the approximate position where CC5X gives up. The documentation
    should be checked if the cause is not obvious)

    Donc à mon avis il ne supporte pas les masques !!! Ou n'aime pas ça tout au moins !!!


    Sinon j'ai fouillé longuement la doc de mon compilateur et voilà ce que je trouve dans un exemple d'utilisation:
    /* assign names to port pins */
    bit in @ PORTB.0;
    bit out @ PORTB.1;
    Et plus loin dans le programme ils se servent directement de l'appelation "in" et "out":
    if (in == 0)

    J'ai donc essayer cette méthode et... pas de changement !! Rien ne marche !!! Bon je vous rassure, mon "montage" avec mon bouton poussoir et ma résistance de rappel est correct ainsi que le cablage du PIC ^^
    Donc le problème est essentiellement logiciel :s

    ... une idée ??? tout est bon à prendre
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  13. #10
    etienneh

    Re : [PIC] Header ??

    Salut,

    L'idée d'utiliser des masques est bonne, mais en langage C, la comparaison avec un masque se fait avec un seul & :
    if (PORTA & 0b00001000) retournera TRUE si le bit n°3 (RA3) est à 1.

    Le problème, si tu tapes if (PORTA && 0b0001000), c'est que le && est l'opérateur booléen AND, donc ta comparaison retournera en fait le résultat de l'opération PORTA AND 8. Or, comme 8 ne vaut pas zéro, tu peux simplifier ton expression, ce qui te donne au final if (PORTA != 0), ce qui, je pense, n'était pas le but

    Voili voilou, j'espère que c'est assez clair

    Amicalement,
    E.

  14. #11
    La Praline

    Re : [PIC] Header ??

    C'est très clair... et pour l'instant le compilateur ne me génère pas d'erreur...
    Par contre je n'arrive pas à imposer un niveau logique sur une sortie...


    (PORTA || 0x02)=0;
    ------------------^
    Error[1] C:\Progr\test\test.c 12 : Unable to generate code
    (The C syntax is correct. However, CC5X is unable to generate code.
    The workaround is often to split the code into simpler statements,
    using an extra variable to store temporary results. Sometimes it is
    enough to change the sequence of operations)
    J'ai aussi essayé "(PORTA | 0x02)" qui me génère la même erreur !





    PS: question bête, mais bon il s'agit d'être sûr ! alors je vous montre mon programme test en entier... histoire de ne pas avoir fait des bêtises dans une autre partie ...

    void main(void)
    {
    PORTA=0b11111101;
    ADCON1=0x06;

    for( ; ; )
    {
    if( (PORTA & 0x01) == 0)
    {
    (PORTA | 0x02)=0;
    }
    else
    {
    (PORTA | 0x02) =1;
    }
    }
    }

    Voilà si vous trouvez des erreurs horribles, non seulement je vous demande de me trasher mais presque de me foueter pour ma crétinerie ^^


    D'avance merci
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  15. #12
    etienneh

    Re : [PIC] Header ??

    Cher Praline,

    Tu touches du doigt le fond de l'algèbre de Boole... Et c'est très très, casse tête !

    Si tu veux DEFINIR la valeur de portA (en fait, juste un bit !), il faut dans un premier temps savoir ce que tu veux faire.

    Si tu veux effacer le bit, alors tu veux en fait faire passer la valeur de porta par un masque troué:
    PORTA = PORTA & 0b11111011 ==> le bit 2 est effacé.

    En effet, tu utilises ici un ET logique, dont la comparaison de fait bit à bit entre le masque et PORTA !

    Je te laisse imaginer pour définir la valeur, l'idée est (presque) la même

    Amicalement,
    E

  16. Publicité
  17. #13
    La Praline

    Re : [PIC] Header ??

    Arf ca y est j'ai le neuronne en feu !!!

    Bon attend, je suis pas un crétin (encore que^^) mais il faut reprendre depuis le début si tu veux bien ^^Sinon c'est pas sûr que j'arrive à quelques chose !!

    Déjà ce programme de test... Très simple bien évidemant, j'aimerais qu'une led soit éteinte en permanence sauf lors de l'appui sur le bouton poussoir.
    Le bouton serais cablé sur RB0 et la led sur RB1.

    Donc lorsque j'écris, au début:
    "PORTA=0b11111101;" je défini seulement les entrées/sorties du Port A ???

    Ensuite le "ADCON1=0x06;" me sert à configurer les entrées comme étant numérique(pour ne pas utiliser le CAN du pic)???

    Après dans ma boucle infinie je fais(enfin je voudrais^^) un test sur le bouton poussoir(qui renvoi +5V à l'appui) et allume la led si le bouon est activé....

    Voilà pour moi, ce que fais, devrais faire, mon programme !!!





    Donc le coup du masque je comprend bien... enfin le masque pour tester une valeur... Par contre je ne vois pas comment atribuer une valeur sur une sortie(pour allumer la led ici)...
    Désolé ^^ et merci pour tant de patience ^^
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  18. #14
    verdifre

    Re : [PIC] Header ??

    bonsoir,
    ca fait queques années que je n'ai pas touché au pic, mes souvenirs ne sont pas forcement complets.
    je crois que pour definir les entrées sorties sur le port c'est plutot le registre TRIS qu'il faut remplir
    ensuite pour faire bouger la valeur d'une pate de sortie (ici ra1), il faut faire quelque chose du genre PORTA = .......... et non (PORTA.....) = 0
    donc pour mettre le bit 2 a 0 il faut faire
    PORTA = PORTA & 0b11111101 ici tu affectes une nouvelle valeur à PORTA

    pour mettre le même bit a 1
    PORTA = PORTA | 0b00000010

    alors que pour tester la valeur d'un bit (ici ra0) tu vas faire
    if ((PORTA & 0b11111110) == 0) etc....
    dans ce cas tu lit la valeur de PORTA et tu ne la modifies pas

    fred

  19. #15
    etienneh

    Re : [PIC] Header ??

    verdifre a tout bon, je confirme

    TRISA est un mot dont chaque bit te donne la direction de chaque bit du port A. 1 pour input (entrée), 0 pour output. Selon le nombre d'entrées/sorties de ton PIC, tu as aussi TRISB, TRISC, etc etc etc.

    En gros, si ton bouton est connecté à RB1, et ta LED à RA0.

    Au début du programme, tu vas (admettons), mettre TOUS les bits du port B en entrée, et tous les bits du port A en sortie:
    TRISB = 0b11111111;
    TRISA = 0b00000000;

    (Vérifie tout de même que tu n'as pas des bits utilisés autre part, pour un LCD ou autre).

    Puis, dans ta boucle:

    while(1)
    {
    if (PORTB & 0b00000010) // on regarde si le bit 1 du port B est bien à 1
    {
    // on allume la LED *sans toucher au reste*
    PORTA = PORTA | 0b00000001;
    }
    else
    {
    // on éteint la LED sans toucher au reste
    PORTA = PORTA & 0b11111110;
    }
    }

    a partir de là, tu peux commander jusqu'à 8 LED, en changeant simplement le numéro de bit "utile" dans tes masques.

    Pour le ADCON, c'est un mot qui sert à configurer le convertisseur analogique numérique. Je ne me souviens plus du lien exact, mais tu as sur http://www.microchip.com un powerpoint où le fonctionnement du CAN des PIC est expliqué de manière très très compréhensible !
    Seul problème, leur site est vraiment mal foutu, et c'est une galère sans nom de trouver les datasheets

    J'espere en tout cas que le petit bout de code t'aidera.

  20. #16
    verdifre

    Re : [PIC] Header ??

    Bonsoir,
    J'espere que tu t'es sorti de ton probleme, mais, à mon avis, une bonne maitrise de l'algebre de boole est indispensable pour programmer efficacement un microcontroleur, cela peut te permettre beaucoup de simplifications dans tes programmes, ou quand tu as une routine vraiment critique cela peut te permettre de faire un code plus rapide ou plus court.
    quelques exemples,
    la mise a 0 d'un registre peut se faire par un "xor" entre la variable et elle même, sur certains microcontroleurs c'est beaucoup plus rapide que d'affecter 0 à la variable
    une multiplication par une puissance de 2 peut se faire par une rotation de bits ( ca marche dans un certain nombre de cas et c'est trés rapide)
    etc...
    fred

  21. #17
    La Praline

    Re : [PIC] Header ??

    Bon les gars,
    Ca y est j'arrive à allumer la led !!! Hé ben j'ai quand même mis deux jours :s !!
    Rhô j'ai honte ^^

    Malgré tout, je ne sais pas si cela viens de ma plaque de test(plaque à trou) ou de mon bouton ou autre mais ce n'est pas très très réactif, de temps en temps il y a quelques trous !! Mais bon pas de quoi d'affoler !


    Bon maintenant je vais tester mon afficheur 7 segments... je vous tiens au courant en cas de non fonctionnement ou si j'ai encore des questions

    Encore une fois merci !
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  22. #18
    La Praline

    Re : [PIC] Header ??

    Bon... je me disais aussi que c'était trop beau ^^

    Alors maintenant je n'arrive pas à allumer mon afficheur !!! Mais alors je ne comprend pas pourquoi !

    Et puis j'ai aussi ce problème, c'est que RA7 et RA7 me renvoie un zéro en permanence ce qui allume deux segments(anode commune) !!!

    Estce que lorsque j'écris:
    PORTA = PORTA & 0b00000000;

    cela va-t-il imposer un zéro sur les sorties du PORT A, et ainsi m'afficher "8" ??? ...parce que c'est comme cela que j'ai procédé dans tout mon programme(qui consiste simplement à faire défiler les chiffres de 1 à 9 à chaque appui sur le bouton poussoir...) !!!
    D'avance merci
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  23. Publicité
  24. #19
    verdifre

    Re : [PIC] Header ??

    Bonjour,
    tu enverrai un petit schéma de ton montage ce serait plus simple pour comprendre ou tu veux en venir

    bon courage
    fred

  25. #20
    La Praline

    Re : [PIC] Header ??

    Voilà donc un schéma de mon montage "de test"...
    Il s'agit simplement de faire défiler les chiffres de 1 à 9 sur un afficheur 7 segments. A chaque appui sur un bouton poussoir, le chiffre s'incrémente.


    Bien sûr ce n'est pas la finalité de mon projet.. mais bon je préfère tester mon montage point par point, pour être plus organisé !!!



    Donc voilà, j'aimerais donc commander plusieurs sorties à la fois pour allumer plusieurs segments(pour former des chiffres)...
    Merci d'avance... lol
    La Praline
    Images attachées Images attachées
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  26. #21
    verdifre

    Re : [PIC] Header ??

    bonjour,
    Pour ma part, je voie tout de suite un probleme, c'est le cablage du contact, "traditionellement ce genre de contact est souvent cablé a la masse avec une resistance de rappel au +5, je ne suis pas sur que les ports d'entrée du pic acceptent le cablage que tu as fait , ceci expliquerait une partie de tes problemes.
    une autre partie de tes problemes sont peut etre dus aux rebonds de ton contact,
    ces rebonds, tu peux les traiter materiellement (filtre rc) ou logicielement

    fred

  27. #22
    verdifre

    Re : [PIC] Header ??

    Bonsoir,
    Je crois que tu devrais essayer de passer ton programe dans un simulateur pour etre sur de t'affranchir des petits soucis de montage.
    de plus comme tu peut observer ce qui se passe dans le microp cela te permet une mise au point plus aisée

    fred

  28. #23
    La Praline

    Re : [PIC] Header ??

    Salut Fred,
    Pour le bouton poussoir je me suis posé la question... je vais changer ça pour ramener un zéro lors de l'appui, je vous tiendrez au courant du fonctionnement...

    Quant au simulateur, je m'étais dit exactement la même chose... seulement je ne sais absolument pas quoi faire... dois-je utiliser un simulateur de MPLab? si oui comment, ou alors estce qu'il y a des logiciels à télécharger qui font exclusivement de la simu????

    Merci d'avance...
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  29. #24
    La Praline

    Re : [PIC] Header ??

    C'est encore moi...
    Bon alors ca fonctionne correctement maintenant... ça fait plaisir quand même ^^

    Mais j'ai encore quelques peit soucis... je vais créer un nouveau post pour vous en parler parce que là on dérive
    *~~ Faluchardement ~~*
    *~~~~ La Praline ~~~~*

  30. Publicité

Sur le même thème :

Discussions similaires

  1. Header LaTeX
    Par nschweit dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 16/04/2009, 18h02
  2. Réponses: 0
    Dernier message: 18/03/2007, 16h43
  3. Qui connais logi pic & et question à propos des pic
    Par Floris dans le forum Électronique
    Réponses: 10
    Dernier message: 29/05/2006, 23h40
  4. Header images photo
    Par Bamoo dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 04/04/2005, 07h33
  5. traduction "page header"
    Par v_711 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 5
    Dernier message: 15/06/2004, 09h20
Découvrez nos comparatifs produits sur l'informatique et les technologies.