[C] PIC16F876 : Convert A/D program
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

[C] PIC16F876 : Convert A/D program



  1. #1
    Cotton

    Exclamation [C] PIC16F876 : Convert A/D program


    ------

    Bonjour à tous et à toutes,
    Je vous préviens d'entrée que je suis novice dans cette discipline.

    Je suis en ce moment, pour mon plaisir personnel, en train de concevoir un programme me permettant de convertir une tension analogique en entrée d'un PIC16F876.
    Cette tension, est modifiable via un potentiomètre.
    Dans mon programme, que je vais copier juste après, doit, en théorie, convertir cette tension. De plus, si la tension numérisée est plus élevée que 2,5V, alors j'allume une LED.
    Voici mon programme en C sous MPLAB IDE V2.00

    Code:
    #include<pic16f876.h>
    
    
    //
    //
    //
    
        
    void main (void)
    {
        unsigned int res;
        int resultat;
        float conversion;
        float q;
        
        resultat = 0;
        q = 0,004887;
    
        TRISA = 0b00000001;
        TRISB = 0b00000000;
        ADCON0 = 0b11000001;
        ADCON1 = 0b00000000;
       
       
        while(1)
        {
             
        GO = 1;
        while (GO == 1);
    
    
        res = ADRESH;
        res = res<<8;
        resultat = res+ADRESL;
    
        conversion = resultat*q;
    
        
        if (conversion > 2,5)
        {
            RB1 = 1;
        }
        else
        {
            RB1 = 0;
        }
                
        }
    
    }
    
    Selon MPLAB, je n'ai aucune erreur de syntaxe. Néanmoins, lorsque je le test avec Proteus ISIS, rien ne se passe. Pourtant la simulation se déroule sans erreurs.

    Pouvez vous m'aider ?

    Je vous remercie.

    Cotton

    -----
    Dernière modification par JPL ; 14/02/2014 à 15h16. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    Jack
    Modérateur

    Re : [C] PIC16F876 : Convert A/D program

    pourquoi ne lisez-vous pas les regles participatives du forum infi/programmation???

    Les pics c'est pour le forum electronique!

  3. #3
    Cotton

    Re : [C] PIC16F876 : Convert A/D program

    Merci d'avoir déplacé mon message. Je ne savais pas que la rubrique était réservée qu'à la programmation or composants PIC.

    Je retourne à mon message de base.

  4. #4
    freepicbasic

    Re : [C] PIC16F876 : Convert A/D program

    GO est défini comme un bit adresse 31 et bit 2
    voir comment le compilo interprète GO=1 et GO==1
    seul le code asm généré peut le dire...

    pour le calcul float avec un int il est préférable de mettre un cast (float) devant le int
    A+, pat

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : [C] PIC16F876 : Convert A/D program

    Citation Envoyé par Cotton Voir le message
    Merci d'avoir déplacé mon message. Je ne savais pas que la rubrique était réservée qu'à la programmation or composants PIC.
    C'est bien pour cela que nous avons déposé cette note:
    http://forums.futura-sciences.com/pr...eau-forum.html

  7. #6
    Cotton

    Re : [C] PIC16F876 : Convert A/D program

    Malheureusement, cela n'a rien changé. Le PIC ne répond toujours pas.

  8. #7
    Gérard

    Re : [C] PIC16F876 : Convert A/D program

    Citation Envoyé par freepicbasic Voir le message
    GO est défini comme un bit adresse 31 et bit 2
    voir comment le compilo interprète GO=1 et GO==1
    seul le code asm généré peut le dire...

    pour le calcul float avec un int il est préférable de mettre un cast (float) devant le int
    Je ne comprends pas bien ce que tu dis.
    Le "GO" sort d'où ?

    Une idée :

    debut:
    RESULT = resultat de la conversion ;sur 10 bit
    if RESULT > 512 then LED = 1 else LED = 0
    goto debut


    ;ne pas oublier les initialisations et pas besoin de float

  9. #8
    freepicbasic

    Re : [C] PIC16F876 : Convert A/D program

    GO/DONE
    dans ADCON0
    ça lance la conversion et repasse à zéro quand c est terminé
    A+, pat

  10. #9
    freepicbasic

    Re : [C] PIC16F876 : Convert A/D program

    ADFM = 0 justification à gauche

    res = ADRESH;
    res = res<<2;
    res = res+ (ADRESL>>6);
    resultat = (float) res ;
    A+, pat

  11. #10
    paulfjujo

    Re : [C] PIC16F876 : Convert A/D program

    bonjour,


    Rajoute un delai de quelques mS dans la boucle while(1)
    delai minimum à respecter entre les conversions ADC ...

    Code:
      if (conversion > 2,5)
    c'est 2.5 pour le flottant...

    mais il vaudrait mieux faire un test sur la valeur brute integer > 512
    comme proposé par Gerard.

  12. #11
    Cotton

    Exclamation Re : [C] PIC16F876 : Convert A/D program

    C'est bon, j'ai obtenu ce que je voulais !

    #include<pic16f876.h>

    //
    //
    //

    void main (void)
    {
    int res;
    int resultat;
    float conversion;

    TRISA = 0b11111111;
    TRISB = 0b00000000;
    ADCON0 = 0b11000001;
    ADCON1 = 0b10000000;

    while(1)
    {

    GO = 1;

    while (GO == 1);

    res = ADRESH;
    res = res<<8;
    resultat = res+ADRESL;


    if (resultat > 511)
    {
    RB0 = 1;
    }
    else
    {
    RB0 = 0;
    }

    }


    }



    Pour une valeur de tension > 2.5 V, une LED sur RB0 s'allume et s'éteint lorsque qu'on est en dessous.

    @paulfjujo: pour la fonction delay, j'ai regardé mais sous MPLAB v2.00 avec un compilateur XC8 je n'ai pas la librairie. Quand je fais #include<delay.h>, c'est considéré comme une erreur.

  13. #12
    spown

    Re : [C] PIC16F876 : Convert A/D program

    La fonction délai ne sert à rien dans ton cas, le déroulement du programme même s'il est rapide par rapport à la conversion, il va toujours lire la dernière valeur de résultat.
    L'essentiel tu dois respecter le Tad, qui est typiquement 4us pour ton pic ( se calcul à partir d'oscillateur )
    Et pour mettre du délai , tu peux faire juste un for(0...4000) pour perdre du temps. ( tu peux l'estimer bien sur )

  14. #13
    Gérard

    Re : [C] PIC16F876 : Convert A/D program

    Citation Envoyé par freepicbasic Voir le message
    GO/DONE
    dans ADCON0
    ça lance la conversion et repasse à zéro quand c est terminé
    OK pour GO.

    En Proton, c'est transparent.

  15. #14
    minioim

    Re : [C] PIC16F876 : Convert A/D program

    Citation Envoyé par Cotton Voir le message

    @paulfjujo: pour la fonction delay, j'ai regardé mais sous MPLAB v2.00 avec un compilateur XC8 je n'ai pas la librairie. Quand je fais #include<delay.h>, c'est considéré comme une erreur.
    ce n'est pas la bonne librairie (enfin il me semble ^^)
    si tu regardes la doc du compilo XC8, tu as une fonction delay dont l'exemple est :

    Code:
    #include <xc.h>
    void
    main (void)
    {
    control |= 0x80;
    _delay(10); // delay for 10 cycles
    control &= 0x7F;
    }
    c'est donc xc.h qu'il faut appeler.

    ici la fonction perd le nombre de cycles spécifiés. donc le temps varie selon ce que tu utilises comme fréquence.

    tu as des fonctions delay en ms et en µs ce qui te dispense des calculs etc... par contre faut juste indiquer la fréquence de ton micro avant avec (par exemple pour du 4MHz):

    Code:
    #define _XTAL_FREQ 4000000
    au début du code, après les include par exemple.
    Dernière modification par minioim ; 15/02/2014 à 16h11.

  16. #15
    Cotton

    Exclamation Re : [C] PIC16F876 : Convert A/D program

    Dans ma lancée je décide de me compliquer la tâche.
    Maintenant, en fonction de la tension d'entrée à numériser, je veux que plusieurs LED s'allument : Pour 1V, une LED s'allume; pour 2V, deux LED s'allument; pour 3V, 3 LED s'allument etc jusqu'à 5V.

    #include<pic16f876.h>

    //
    //
    //

    void main (void)
    {
    int res;
    int resultat;

    TRISA = 0b11111111;
    TRISB = 0b00000000;
    ADCON0 = 0b11000001;
    ADCON1 = 0b10000000;


    while(1)
    {

    GO = 1;

    while (GO == 1);

    res = ADRESH;
    res = res<<8;
    resultat = res+ADRESL;


    if (resultat > 409)
    {
    RB0 = 1;
    RB1 = 1;
    }

    if (resultat > 614)
    {
    RB0 = 1;
    RB1 = 1;
    RB2 = 1;
    }

    if (resultat > 818)
    {
    RB0 = 1;
    RB1 = 1;
    RB2 = 1;
    RB3 = 1;
    }

    }

    }


    Je ne sais pas si je dois utiliser des tempo' dans ce cas là. Sous ISIS, en permanence, les trois premières LED sont allumées qu'importe la tension d'entrée. Bizard.

    Pouvez vous m'expliquer où est ma faute ?

    Je vous remercie.

    Cotton

  17. #16
    Gérard

    Re : [C] PIC16F876 : Convert A/D program

    Tu ne les éteints jamais les LED.

    PORTB = 0 après la conversion.

  18. #17
    paulfjujo

    Re : [C] PIC16F876 : Convert A/D program

    bonsoir,

    bien plus rapide

    Code:
    while(1)
    {
    
    GO = 1;
    
    while (GO == 1);
    PORTB=ADRESH;
    }

  19. #18
    freepicbasic

    Re : [C] PIC16F876 : Convert A/D program

    */ éteindre tout */
    RB0 = 0;
    RB1 = 0;
    RB2 = 0;
    RB3 = 0;

    /* PORTB = 0; ne prend qu'une ligne s'il y a rien d'autre sur portb */


    if (resultat > 409)
    {
    RB0 = 1;
    RB1 = 1;
    }

    if (resultat > 614)
    {
    RB2 = 1;
    }

    if (resultat > 818)
    {
    RB3 = 1;
    }

    delay ... /* pour que le temps d'allumage soit plus long que le temps d'extinction. */
    A+, pat

  20. #19
    freepicbasic

    Re : [C] PIC16F876 : Convert A/D program

    Code:
    /* s'il y a rien d'autre sur portb !!!!!!!!!! */
    /* plus rapide */
    
    */ éteindre tout */
    PORTB = 0;
    
    if (resultat > 818) {PORTB=15;
    else { 
         if (resultat > 614) {PORTB=7;
        else {
              if (resultat > 409) {PORTB=3;
              }
        }
    }
    delay ... /* */
    Dernière modification par freepicbasic ; 16/02/2014 à 18h07.
    A+, pat

Discussions similaires

  1. Program Matlab
    Par invite55e20eee dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 12/10/2011, 05h42
  2. convert movie 8
    Par invite84fc5566 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 12/03/2010, 12h05
  3. HOW TO CONVERT STRING * 16 (ASCII coded HEXADECIMAL) TO DECIMAL NUMBER?
    Par invite977903b4 dans le forum Électronique
    Réponses: 3
    Dernier message: 01/05/2008, 06h51
  4. un site de convert trés parfait!!
    Par invite78942dcd dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 27/04/2007, 00h54
  5. program TI82
    Par invite3ab9a992 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 26/11/2004, 19h58
Découvrez nos comparatifs produits sur l'informatique et les technologies.