Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.

Messages - olibou

Pages: [1]
1
Merci Curiosus pour ta proposition d'aide sur la DS1820B, mais je serais incapable d'exploiter ton code en assembleur...
Je vais suivre vos conseils et m'orienter vers d'autres capteurs... pourquoi pas un LM35! Je risque d'avoir un peu de mal pour m'en faire livrer par les temps qui courent, mais je ne vais pas m'acharner sur ma PT100... Je vais m'en faire un joli collier!
Sinon, je retourne sur Arduino et je fais mon application avec la DS1820B.

A+
Olivier

2
Bonjour,

merci pour vos réponses!

J'avais bien pressenti que la très faible variation serait un problème... je m'étais dit qu'il y aurait certainement un moyen de régler ça avec un ampli op ou autre, dans un second temps.
Je ne l'ai pas précisé, mais vous l'avez compris, je suis novice et ce montage a bien-sûr un but d'apprentissage, mais j'ai aussi un bricolage en cours qui nécessite la mesure de températures dans des liquides sur une gamme de 0 à  100°C (brassage de bière). La LM35 n'est dont pas très approprié.

J'ai des sondes DS1820B de Dallas Semiconductor que j'ai réussi à  faire fonctionner avec un Arduino (bibliothèque fournie), mais j'aimerais réaliser mon application avec un PIC car je trouve que cela permet de vraiment mieux comprendre l'électronique.
J'ai bricolé des Arduinos assez facilement sans rien comprendre à  la manipulation de bits ni au fonctionnement d'un microcontrôleur, alors que le PIC m'a demandé des heures de lecture de datasheets et de test avant de faire quelques bidouillages de base, mais j'ai beaucoup plus progressé.

Par contre, je suis, à  mon niveau, incapable de faire fonctionner une sonde DS1820B avec un PIC. C'est pourquoi je me suis tourné vers la PT100 dont le fonctionnement m'a paru plus simple.

Si je peux vous mettre encore à  contribution... je me heurte à  un autre petit problème :
Ma sonde n'enregistre aucune variation de température et reste bloquée à  "-259.70°C", ce qui correspond à  une tension mesurée de 0V.
Apparemment, le PIC ne prends pas en compte les décimales dans les calculs, alors que je stocke les différentes valeurs dans une variable "float" (vs= tension de sortie de la PT100; resist=valeur de résistance de la sonde).

Voici mon code :
/*
 * File:   PIC16F877A_Thermo.c
 


#include <xc.h>
#include<stdio.h>
#include<stdlib.h>
#include <pic16f877a.h>
#include "config.h"
#include "ADC_config.h"
#include "LCD_config.h"
#define _XTAL_FREQ 16000000

void main(void) {
 int result=0;
 float temperature=0;
 float vs=0;
 float resist=0;
 char result_string[15];
 ADC_config();
 Lcd_Init();
 __delay_ms(1000);
  Lcd_Clear();
  Lcd_Set_Cursor(1,1);
  TRISB=0;
  PORTB=0;
  CMCONbits.CM0=1;
  CMCONbits.CM1=1;
  CMCONbits.CM2=1;
   
  //message de demarrage-----------------------------------
        Lcd_Write_String("salut !");
       
        /*for (int n =0; n<16; n++){
            Lcd_Shift_Right();
            __delay_ms(300);
        }*/
        __delay_ms(1000);
        Lcd_Clear();
       
  //-------------------------------------------------------
   
       
       
    while(1){
       
     
     ADCON0bits.ADON=1;   
       
        if (ADCON0bits.GO_DONE==0){
        ADCON0bits.GO_DONE=1;
            while(ADCON0bits.GO_DONE==1){} // attend la fin de la conversion
            result=ADRESL+(ADRESH*256);
            vs=5*result/1023;//convertit la valeur lue en Volts
            resist=100*(vs/(5-vs));//calcul de la valeur de la résitance de la sonde à  partir de la tension
            temperature=(resist-100)/0.385055;//calcul de la température à  partir de la résitance de la sonde
        }
      if (temperature>25){
            PORTBbits.RB7=1;}
        if (temperature<=25 ) {
            PORTBbits.RB7=0;}
       
     //écrire le resultat sur écran LCD
        Lcd_Set_Cursor(1,1);
        Lcd_Write_String("Temperature : ");
        Lcd_Set_Cursor(2,1);
        sprintf(result_string, "%.2f", temperature);
        Lcd_Write_String(result_string);
        Lcd_Write_Char(223);
        Lcd_Write_String("C");
        __delay_ms(1000);
       
 
}
}

Encore merci!

3
Bonjour,

J'essaie de mesurer une température à  partir d'une sonde PT100 (2 fils) avec un PIC 6F877A.
Comme la sonde varie en résistance en fonction de la température, j'ai pensé faire un pont diviseur de tension pour mesurer la variation de tension avec le convertisseur analogique/numérique. Mon problème, c'est que mes cours de math sont un peu loin et je ne sais pas comment extraire la valeur de ma résistance (R1) à  partir de la mesure de tension faite par le convertisseur A/N sur le pont diviseur.
Pour être concret, ma sonde (R1) varie entre 100 et 200 ohm environ, je pense mettre une résistance (R2) dans les mêmes valeurs (disons 100 ohm) sur mon pont diviseur. La tension obtenue (Vs) sera donc Vs=(R1/(R1+R2)*Vin
je connais Vs car lu sur le convertisseur A/N, je connais R2(100 ohm) et Vin (5v)... Est-il possible d'en déduire R1?

Amicalement,

Olivier

4
Bien vu  :-[
C'est parceque je code en trinaire ;D

5
Bonjour à  tous,

J'ai enfin trouvé ce qui n'allait pas dans mon code : un bête erreur de débutant qui n'a pas relu attentivement son programme :-[
Ça se passe ici :  while(ADCON0bits.GO_DONE=1){}// attendre que la conversion soit terminée
Il fallait écrire "==" et non "=" ( c'est une condition et non une valeur assignée)

J'en ai profité pour faire quelques test :
L'activation -ou non- du comparateur (CMCON) n'a pas d'impact (ça fonctionne dans les deux cas)
La broche 3 (RA3 - MCLR) ne fonctionne pas comme sortie, bien que le MCLR soit désactivé dans les bits de configuration... si quelqu’un à  la clé du mystère, je suis preneur.

L'autre problème qu'il y a dans mon programme, c'est qu'au changement de valeur (lorsque le registre ADRESL atteint la valeur 100), j’éteins la LED allumée pour allumer l'autre à  son tour :
if (result>100){
            PORTAbits.RA1=1;//allume la LED1
            PORTAbits.RA2=0;//éteint la LED 2
Et c'est là  que ça bloque... je ne peux pas donner deux instructions en même temps. Le même problème se pose si j'essaie d'allumer les deux LED en même temps.

par contre, si je ne donne qu'une seule instruction, ça fonctionne :
if (result<100){
PORTAbits.RA1=1;}//allume la LED1

if (result>=100){
PORTAbits.RA1=2;}//allume la LED2

Ce qui est étrange, c'est que quand je change progressivement la valeur ADRESL à  l'aide du potentiomètre (de 0 à  255 par exemple), la LED1 devrait s'allumer en premier, puis la LED 2, mais sans éteindre la LED 1 puisque je n'ai pas donné l'instruction de l'éteindre... hors elle s'éteint!

Notez que ce sont des questions qui n'ont pas une grande importance... ce n'est même pas un vrai projet mais un petit test pour essayer de comprendre, donc, si la réponse vous paraît évidente et simple, n'hésitez pas à  partager, mais ne passez pas des nuits blanches juste pour ça!
En tous cas, merci beaucoup pour vos conseils et pour les liens!

A+,

Olibou

6
Bonjour à  tous,

Je n'ai absolument rien contre l'assembleur, et je te suis également très reconnaissant pour le temps que tu consacre à  mes questions :D
c'est juste que je suis au tout début de mon apprentissage (autant en électronique qu'en programmation) et j'ai déjà  passé pas mal de temps à  déchiffrer la datasheet et à  comprendre comment coder ces quelques lignes en C... qui ne fonctionnent pas d'ailleurs!
Mais j'ai bien compris l’intérêt de l'assembleur et je vais essayer de m'y mettre, mais au rythme ou j'apprends, ça va peut être prendre quelques semaines!
La première étape va être de creuser la question du comparateur (dont je ne connais pas la fonction :-[) pour voir si c'est l'origine de mon problème.
Peut être que si j'utilise une autre broche en entrée cela va contourner le problème?
Je vais faire quelques essais... et je vous tiens au courant! (5A maxi ;D)

A+
Olibou

7
Bonjour,

Super, ça fonctionne parfaitement!
Par contre l'assembleur, pour moi, c'est de l'hébreu!
Il ne me reste plus qu'a apprendre l'assembleur pour essayer de trouver où est le problème dans mon code en C...
Je regarde ça à  tête reposée ce soir...

Bonne journée!
Olibou

8
Bonjour Curiosus,

C'est vraiment super merci!
C'est vrai que j'aurais pu poster un schéma... :-[ mais ta proposition correspond tout à  fait à  ce que je voudrais faire. J'espère que quand j'aurais compris comment fonctionne un convertisseur A/N, j'arriverais à  utiliser différents capteurs... mais une étape à  la fois.
J'ai commencé à  lire les ressources de BigOnOff dont Yffig à  posté le lien : c'est vraiment très bien fait. J'y ai déjà  trouvé plein d'éclaircissements et je n'en suis qu'au début ;D

En tout cas merci

9
Bonjour Yffig,

Le PIC que j'ai choisi comporte effectivement peu de mémoire flash mais je l'utilise essentiellement à  des fins "pédagogiques" pour tenter de comprendre comment programmer un PIC.
Pour mes "vrai" projets, je tiendrais compte de ton conseil et choisirais un PIC mieux doté en mémoire.
je vais tester MicroC pour voir si j'y trouve une solution à  mon énigme...

Merci pour ta réponse!




10
Bonjour Curiosus et merci pour ta réponse.

Allons-y pour l'assembleur!
J'ai l'impression que la plupart des bidouilleurs de PIC programment en assembleur, ce sera peut être l'occasion de m'y mettre!
Merci ;D

11
Bonjour,

Je débute en électronique et j'essaie de comprendre le fonctionnement des microcontrôleurs PIC, mais je bloque depuis plusieurs semaines sur la conversion analogique/numérique. Pouvez-vous me mettre sur la voie?
Je travaille avec un PIC 16F676 (data sheet : http://ww1.microchip.com/downloads/en/DeviceDoc/40039F.pdf) sous MPLAB (en C).
Pour tester la conversion de signaux analogique en numérique, je voudrais simplement allumer deux LED en fonction de la valeur lue par le convertisseur... mais rien ne se passe : apparemment la conversion n'a pas lieu, mais je ne comprend pas pourquoi.
Voici mon code, pouvez-vous m'aider s'il vous plaît?



#include <xc.h>
#define _XTAL_FREQ 4000000


void main(void) {
//Selection canal Analog.  : AN0
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;
ADCON0bits.CHS2=0;

// Fréq opération= OSC/16
ADCON1bits.ADCS0=1;
ADCON1bits.ADCS1=0;
ADCON1bits.ADCS2=1;


ADCON0bits.VCFG=0;//Vref = VDD

//Format Resultat Convetion
ADCON0bits.ADFM=1;//justif. droite

//Selection A/D pins
ANSELbits.ANS0=1;//PIN 0 analog.
ANSELbits.ANS1=0;//PIN 1 digital

// selction I/O pins
TRISAbits.TRISA0=1;//PIN 0 entée
TRISAbits.TRISA1=0;//PIN 1 sortie
TRISAbits.TRISA2=0;//PIN 2 sortie


PORTAbits.RA1=0;//LED pin 1 eteinte
PORTAbits.RA2=0;//LED pin 2 eteinte


unsigned int result=0;



while(1){
    ADCON0bits.ADON=1;//initialiser Conv Analog-Num.
    if (ADCON0bits.GO_DONE==0){
        ADCON0bits.GO_DONE=1;//démarrer la conversion
    }
   
    while(ADCON0bits.GO_DONE=1){}// attendre que la conversion soit terminée
    result=ADRESL; //resultat sur 8 bits
       
   
   //Allumer LED 1 ou 2 en fonction du resultat
        if (result>100){
            PORTAbits.RA1=1;
            PORTAbits.RA2=0;
        }
        else if (result<100){
            PORTAbits.RA2=1;
            PORTAbits.RA1=0;
        }
   
}

    return;
}



Pages: [1]