Mplab entrée analogique d'un pic 16f877a
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Mplab entrée analogique d'un pic 16f877a



  1. #1
    invite0ffce202

    Mplab entrée analogique d'un pic 16f877a


    ------

    Bonjour,

    Je suis actuellement en terminale Sti2d et je suis en pleine réalisation de mon projet de bac.
    Dans celui ci je code avec mplab v8 un pic 16f877a.

    Le problème est que je n'arrive pas à récupérer la tension analogique que je reçois sur RA0 (qui est un CAN intégré au pic).
    Les autres entrées numériques fonctionnes, c'est juste celle-ci qui devrait récupérer la tension d'une ldr qui ne fonctionne pas.

    Est-ce que quelqu’un sait comment dire dans le programme: prendre la valeur de RA0 (pour pouvoir ensuite la comparer à un seuil sous forme de float)?
    J'ai déjà cherché et trouvé pleins de solutions avec une commande ADCON1 mais il me dit: bibliothèque adc.h inconnue.

    Merci d'avance pour votre réponse.

    Iza

    -----

  2. #2
    antek

    Re : Mplab entrée analogique d'un pic 16f877a

    Une bibliothèque n'apporte rien, programmer une CAN c'est quelques lignes en assembleur.
    Fait voir ton code.
    Ton cablâge est identique pour toutes les entrées CAN ?

  3. #3
    invite0ffce202

    Re : Mplab entrée analogique d'un pic 16f877a

    Déjà merci de ta réponse si rapide!
    Pour le cablage j'ai une entrée analogique sur RA0/AN0 qui pose problème, 2 entrées analogiques sur RB0 et RB1 et la sortie numérique sur RB4.
    Donc j'ai utililsé: TRISB = 6; pour initialiser le port B.


    Voici le code complet:

    #include <stdio.h>
    #include <stdlib.h>
    //On include la bibliothèque gérant le pic
    #include <PIC16F877a.h>

    //Define changeant la valeure qui fixe la limite de tension reçus par la ldr, à partir de laquelle on passe du jour à la nuit et inversement.
    #define A_TensionLuminosite_mediane 2.5

    //Initialisation de la variable globale: lumière reçus naturelle
    float A_Lumire_recus_T0=0;

    //Prototypes des fonctions
    int FA_fonctionLuminosite (int A_s1_fonction, float A_difference_de_lux);
    int FA_fonctionPresence (int A_s2_fonction);
    float FA_difference_lux (float A_difference_de_lux);
    void FA_tempo_1ms(unsigned long k);


    void main()
    {
    //Configuration des entrées/sorties
    // RB1 et RB2 en entrée
    // RB4 en sortie

    TRISB = 6;
    // RA0 en entrée
    TRISA = 1; //C'est ici que je devrai mettre une instruction pour dire: RA0 entrée analogique.

    //Initialisation des variables
    int A_s1_main=0, A_s2_main=0;
    float A_difference_de_lux=0;

    do //Boucle principale
    {
    //Vérification de l'état de chaque capteur
    A_s1_main = FA_fonctionLuminosite(A_s1_mai n, A_difference_de_lux);
    A_s2_main = FA_fonctionPresence(A_s2_main) ;

    //Si les conditions sont rempli, allumer la lampe
    if ((A_s1_main == 1) && (A_s2_main == 1))
    {
    //Mise a 1 de la sortie pour donner l'odre d'allumer la lampe
    RB4=1;
    //Temporisation pour ne pas griller la lampe
    FA_tempo_1ms(10000); //Temportisation 10sec
    //Récupérer la valeure de luminosité émise par le lampadaire lorsqu'il est allumé (lumière artificielle)
    A_difference_de_lux = FA_difference_lux(A_difference _de_lux);

    }
    //Sinon éteindre la lampe
    else
    {
    RB4=0;
    //Remise à 0 de la lumière émise par la lampe (lumière artificielle)
    A_difference_de_lux=0;
    }

    }while (1==1);

    }


    //Fonction calcule de la lumière émise par la lampe du lampadaire allumé
    float FA_difference_lux (float A_difference_de_lux)
    {
    //Prise de mesure au niveu du capteur de luminosité
    //Calcule de la luminosité émise par la lampe

    A_difference_de_lux = RA0 - A_Lumire_recus_T0;
    //retour de la valeure de luminosité non solaire
    return A_difference_de_lux;
    }


    //Fonction analysant la luminosité ambiante C'est ici qu'intervient l'entrée RA0, en fonction de sa valeur il fait jour ou nuit.
    int FA_fonctionLuminosite (int A_s1_fonction, float A_difference_de_lux)
    {
    //Prise de mesure du capteur de luminosité
    //Et calcule retirant la lumière éventuelle venant de la lampe (lumière naturelle = lumière reçus - lumière artificielle)

    A_Lumire_recus_T0 = RA0 - A_difference_de_lux;

    //Si il fait nuit: sortie à 1, sinon à 0;
    if (A_Lumire_recus_T0>A_TensionLu minosite_mediane)
    {
    A_s1_fonction=0;
    }
    else
    {
    A_s1_fonction=1;
    }

    //retour de l'information au main
    return A_s1_fonction;
    }



    //Fonction analysant la présence
    int FA_fonctionPresence (int A_s2_fonction)
    {
    //Si il y au moins un capteur qui capte une préence, envoyer du 1, sinon 0
    if ((RB1==0)&&(RB2==0))
    {
    A_s2_fonction=0;
    }
    else
    {
    A_s2_fonction=1;
    }

    //Retour de l'information au main
    return A_s2_fonction;
    }


    // Temporisation de 1ms
    void FA_tempo_1ms(unsigned long k)
    {
    unsigned long i, j;
    for (i=0; i<k; i++)
    for (j=0; j<147; j++);
    }

  4. #4
    antek

    Re : Mplab entrée analogique d'un pic 16f877a

    Dans l'ordre de tes réponses :
    - pour que RA0 soit une entrée ANA il faut TRISA,0 = b'1' / ADCON0, 3 à 5 = b'000' / ADCON1, 1 à 3 différent de b'110'
    - il n'y a pas d'entrée analogique sur le portb
    - TRISB=6 : en hexa, décimal ?

    Je n'ai pas vu où tu paramètres le CAN ni où tu fais la conversion

    Et puis met ton code entre balises pour la lisibilité

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

    Re : Mplab entrée analogique d'un pic 16f877a

    Donc si j'ai bien compris je dois écrire:

    TRISA,0=b'1';
    ADCONO, 3=b'000'; ADCONO, 4=b'000'; ADCONO, 5=b'000';
    ADCON1, 1 != b'110'; ADCON1, 2 != b'110'; ADCON1, 3 != b'110';

    Avec ça j'aurai un RA0 initialisé en entrée analogique et je pourrai utiliser la variable RA0?

    Pour le port b tout fonctionne c'est uniquement numérique j'ai pas de soucis pour ça.
    TRISB=6; en décimale pour mettre le bit 1 et 2 en entrée (2+4) et le reste valant 0 c'est en sortie. Mea culpa j'ai écrit RB0 et RB1 alors que c'est RB1 et RB2 mes entrées ^^"

    Pour le CAN je n'arrivais justement pas à le paramétrer en entrée AN. Mais maintenant tout devrait marcher!

    Je pourrai tester ça mercredi prochain sur les ordi du lycée qui ont les logiciels de simulation.

    En tout cas merci beaucoup pour ton aide très précieuse!
    Je te tiendrai au courant.
    Encore désolé pour le code illisible j'ai pas l'habitude des forums ^^'

  7. #6
    antek

    Re : Mplab entrée analogique d'un pic 16f877a

    Citation Envoyé par Izaya Voir le message
    Donc si j'ai bien compris je dois écrire:
    TRISA,0=b'1';
    ADCONO, 3=b'000'; ADCONO, 4=b'000'; ADCONO, 5=b'000';
    ADCON1, 1 != b'110'; ADCON1, 2 != b'110'; ADCON1, 3 != b'110';
    Avec ça j'aurai un RA0 initialisé en entrée analogique et je pourrai utiliser la variable RA0?
    - oui, mais comme c'est la valeur après reset et si tu l'as pas modifiée depuis . . .

    - ADCON0 = b'xx000xxx' pour sélectionner le canal AN0

    - Non, ADCON1 configure le choix des entrées possibles pour le CAN et ses tensions de référence
    Pour le paramétrer il faut savoir : 1) quelles entrées AN0 à AN7 du CAN tu veux utiliser en entrées analogiques 2) quelles références de tension tu veux utiliser pour le CAN (internes ou externes)
    Après un reset ADCON1 est à 0 ce qui correspond à toutes les entrées AN0 à 7 en entrées analogiques et références de tension internes

    Ces 2 registres ont aussi d'autres fonctions
    Images attachées Images attachées

  8. #7
    invite0ffce202

    Re : Mplab entrée analogique d'un pic 16f877a

    Donc pour dire: tu utilises la valeur de ce port là j'écris:
    ADCON0 = b'xx000xxx';
    c'est bien ca?

    Après pour ADCON1:
    1) J'utilise seulement AN0 en entrée analogique (les autres bits du port à ne sont pas utilisés donc peut importe l'état).
    2) La tension que AN0 récupère est de 0 à 5V

  9. #8
    antek

    Re : Mplab entrée analogique d'un pic 16f877a

    ADCON0 = b'xx000xxx'
    concerne la sélection de AN0, les bits "x" veut dire état indifférent pour la sélection du canal analogique

  10. #9
    invite0ffce202

    Re : Mplab entrée analogique d'un pic 16f877a

    Si je résume bien:

    Initialisation du CAN:

    ADCON1 = 0b00001110; RA0=AN0 analogique
    ADCON0 = 0b01000001; AN0 CAN=activé
    TRISAbits.RA0 = 1; RA0 = AN0 en entrée


    Fonction d'utilisation du CAN

    unsigned char convertir(void)
    {
    une tempo pour l'acquisition du résultat;
    ADCON0bits.GO = 1; lancement conversion
    while(ADCON0bits.GO); attente fin de conversion
    return (ADRESH); retour du résultat
    }

    J'ai trouvé ça, est-ce que ça correspond bien?
    Si j'utilise ensuite:

    if (ADRSHE>128)
    {....}


    il comprendra que c'est si la tension à l'entrée de AN0 est supérieure à 2.5V alors j’exécute la suite du code?

  11. #10
    antek

    Re : Mplab entrée analogique d'un pic 16f877a

    Initialisation du CAN:

    ADCON1 = 0b00001110; RA0=AN0 analogique - oui, avec justification à gauche
    ADCON0 = 0b01000001; AN0 CAN=activé - oui / les bits ADCON0,6 et 7 et ADCON1,1 paramètrent l'horloge du CAN
    TRISAbits.RA0 = 1; RA0 = AN0 en entrée - oui, c'est par défaut


    Fonction d'utilisation du CAN

    unsigned char convertir(void)
    {
    une tempo pour l'acquisition du résultat;
    ADCON0bits.GO = 1; lancement conversion
    while(ADCON0bits.GO); attente fin de conversion
    return (ADRESH); retour du résultat - je ne sais pas comment fonctionne une conversion sur 8 bits avec ton langage, normalement ce CAN converti sur 10 bits
    }

    J'ai trouvé ça, est-ce que ça correspond bien?
    Si j'utilise ensuite:

    if (ADRSHE>128)
    {....}


    il comprendra que c'est si la tension à l'entrée de AN0 est supérieure à 2.5V alors j’exécute la suite du code? - si la conversion est sur 8 bit et le résultat dans ADRESH alors oui

  12. #11
    invite0ffce202

    Re : Mplab entrée analogique d'un pic 16f877a

    ok super merci beaucoup!
    Je vais tester ça mercredi et je continue de chercher comment fonctionne la conversion du CAN, mais ça dervait marcher.
    Au pire je teste avec ADRES et je vois si il l'accepte.

    En tout cas merci de ton aide! Je te tiens au courant de l'avancement des choses

  13. #12
    invite0ffce202

    Re : Mplab entrée analogique d'un pic 16f877a

    Tout fonctionne parfaitement!
    Merci infiniment!

    Le CAN était effectivement sur 10 bits mais utiliser ARESH à fonctionné parfaitement quand même. Il n'a juste pas prit les 2 lbs restants.

  14. #13
    antek

    Re : Mplab entrée analogique d'un pic 16f877a

    Merci pour le retour

Discussions similaires

  1. message d'erreur avec MPlab avec PIC 16F877A
    Par invitecff0728c dans le forum Électronique
    Réponses: 7
    Dernier message: 15/02/2010, 09h32
  2. Réponses: 10
    Dernier message: 31/05/2008, 09h11
  3. simulation changement d'état sur entrée MPLAB
    Par invite5396f733 dans le forum Électronique
    Réponses: 0
    Dernier message: 18/03/2008, 18h08
  4. émuler un signal sur une entrée PIC avec MPLAB
    Par invite5396f733 dans le forum Électronique
    Réponses: 3
    Dernier message: 24/02/2008, 07h15
  5. PIC 16F877A : Problème MPLab/Tmr2
    Par invite75aa5783 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/04/2007, 16h19
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...