Automate programmable PIC - Page 2
Répondre à la discussion
Page 2 sur 7 PremièrePremière 2 DernièreDernière
Affichage des résultats 31 à 60 sur 188

Automate programmable PIC



  1. #31
    invite7a49d0d5

    Cool Re : Automate programmable PIC


    ------

    Salut,

    ça c'est pas bon : temp = ADC_Read(2);

    car comme je te l'ai écris précédemment, les sondes 1Wire
    ne "donnent" pas une tension en fonction de la température,
    mais utilisent le protocole 1Wire pour envoyer les octets
    correspondants à la température...

    donc faut pas utiliser le module ADC...
    mais plutôt une "librairie" OneWire...
    ce qui donnera un code du genre:
    Code:
    OW_Reset();
    OW_Write(commande); // commande = demande la température
    temp1 = OW_Read();
    temp2 = OW_Read();
    temp =  temp1 + temp2 >> 4
    vede
    ;O]
    ________
    ...

    .

    -----

  2. #32
    Thetimax

    Re : Automate programmable PIC

    Bonjour!

    Merci pour cette reponse mais depuis j'ai refait un nouveau programme, de ma main cette fois:

    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;

    unsigned ADC_Read(unsigned short channel);
    unsigned txt;

    void main() {


    TRISB = 0; //LCD
    PORTB = 0xFF;
    TRISB = 0xff;
    ANSEL = 0x04; //entrée AN
    ANSELH = 0;
    TRISA = 0xFF; //entrée CAN
    PORTC = 0; //sorties relais
    C1ON_bit = 0; // Disable comparators
    C2ON_bit = 0;

    Lcd_Init(); // Initialize LCD
    Lcd_Cmd(_LCD_CLEAR); // Clear LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, "Poids");
    Lcd_Out(1, 7, "Eau");
    Lcd_Out(1, 12, "Temps");


    do {
    Lcd_Out(2, 1, txt);
    delay_ms(250);
    txt = ADC_Read(2);

    }while(1);
    }


    Mon probleme est toujours le meme => afficher la valeur a l'ecran

    Qu'en pensez vous?

  3. #33
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re ;O]

    comme je te l'ai déjà écris, pour pouvoir afficher le nombre (0-1023)
    sur le LCD il faut d'abords le convertir en texte ASCII...

    d'abords isoler chaque chiffre :

    milliers = adc div 1000;
    vartmp = adc mod 1000;
    centaines = vartmp div 100;
    ...

    puis "convertir chaque chiffre en ASCII...
    là je sais plus, je crois que DAUDET parlais d'ajouter 30...
    milliers = milliers + 30;
    ...

    et là après tu peux l'envoyer au lcd...
    string = milliers + "" + centaines + "" +...;
    lcd_out(1,1,string);

  4. #34
    Thetimax

    Re : Automate programmable PIC

    Comment dois je declarer milliers, vartmp et centaines?

    Merci

  5. #35
    Thetimax

    Re : Automate programmable PIC

    Comme cela?

    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;

    unsigned int ADC_Read(unsigned short channel);
    int milliers;
    int vartmp;
    int centaines;
    unsigned int ADC;
    int string;

    void main() {


    TRISB = 0; //LCD
    PORTB = 0xFF;
    TRISB = 0xff;
    ANSEL = 0x04; //entrée AN
    ANSELH = 0;
    TRISA = 0xFF; //entrée CAN
    PORTC = 0; //sorties relais
    C1ON_bit = 0; // Disable comparators
    C2ON_bit = 0;

    Lcd_Init(); // Initialize LCD
    Lcd_Cmd(_LCD_CLEAR); // Clear LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, "Poids");
    Lcd_Out(1, 7, "Eau");
    Lcd_Out(1, 12, "Temps");
    milliers = ADC, div (1023, 1000);
    vartmp = modf(1000, &ADC);
    centaines = vartmp, div (1023, 100);

    do {
    milliers = milliers + 30;
    vartmp = vartmp + 30;
    centaines = centaines + 30;
    ADC = ADC_Read(2);
    string = milliers + centaines + vartmp;
    Lcd_Out(2, 1, string);


    }while(1);
    }

    Je l'ai programmer dans le pic et a l'afficheur ca me fait un peu comme matrix

  6. #36
    Thetimax

    Re : Automate programmable PIC

    C'est bon ca marche j'obtiens une valeur entre 0 et 1023 selon la position d'un potar sur la broche AN2... Un petit pas...


    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;

    unsigned ADC_Read(unsigned short channel);
    signed int milliers;
    signed int vartmp;
    signed int ADC;
    signed int centaines;
    void IntToStr(signed int input, char *output);
    char LCD[7];




    void main() {


    TRISB = 0; //LCD
    PORTB = 0xFF;
    TRISB = 0xff;
    ANSEL = 0x04; //entrée AN
    ANSELH = 0;
    TRISA = 0xFF; //entrée CAN
    PORTC = 0; //sorties relais
    C1ON_bit = 0; // Disable comparators
    C2ON_bit = 0;

    Lcd_Init(); // Initialize LCD
    Lcd_Cmd(_LCD_CLEAR); // Clear LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, "Poids");
    Lcd_Out(1, 7, "Eau");
    Lcd_Out(1, 12, "Temps");
    milliers = ADC, div, 1000;
    vartmp = ADC, modf, 1000;
    centaines = vartmp, div , 100;

    milliers = milliers + 30;
    vartmp = vartmp + 30;
    centaines = centaines + 30;

    do {
    delay_ms(500);
    ADC = ADC_Read(2);

    IntToStr(ADC, LCD);
    Lcd_Out(2, 1, LCD);


    }while(1);
    }

  7. #37
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re ;O]

    un grand pas tu veux dire ;O]
    bien joué...
    c'est pratique le IntToStr(); ;O]

    vede
    ;O]
    _________________
    ...

  8. #38
    Thetimax

    Re : Automate programmable PIC

    Merci!

    Le reste du programme etant flou pour moi, j'ai penser que c'etait un petit pas... Maintenant j'aimerais me pencher sur le debimetre a impulsion. Que dois je utiliser sur le PIC?

  9. #39
    Thetimax

    Re : Automate programmable PIC

    Je ne parviens pas a mettre la valeur sur le bord de l'ecran (position 2, 1) comment puis je faire??

    Est il possible d'avoir une virgule? (000.00)

    Merci
    Images attachées Images attachées

  10. #40
    Thetimax

    Re : Automate programmable PIC

    Bon j'ai essayer un prog a l'aide du TIMER1 du pic pour faire un compteur mais cela ne fonctionne pas, ca m'indique n'importe quoi sur le LCD.... J'ai du louper une etape!

    unsigned ADC_Read(unsigned short channel);
    signed int milliers;
    signed int vartmp;
    signed int ADC;
    signed int DEB;
    signed int centaines;
    void IntToStr(signed int input, char *output);

    char LCD[7];
    char LCD_DEB[3];


    void main() {
    TRISB = 0; //LCD
    PORTB = 0xFF;
    TRISB = 0xff;
    ANSEL = 0x04; //entrée AN
    ANSELH = 0;
    TRISA = 0xff; //entrée CAN
    PORTC = 0; //sorties relais
    C1ON_bit = 0; // Disable comparators
    C2ON_bit = 0;
    T1CON = 1000111;


    Lcd_Init(); // Initialize LCD
    Lcd_Cmd(_LCD_CLEAR); // Clear LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    Lcd_Out(2, 7, "Kg");
    milliers = ADC, div, 1000;
    vartmp = ADC, modf, 1000;
    centaines = vartmp, div , 100;
    milliers = milliers + 30;
    vartmp = vartmp + 30;
    centaines = centaines + 30;

    do {
    delay_ms(500);
    ADC = ADC_Read(2);
    DEB = TMR1H;
    IntToStr(ADC, LCD);
    IntToStr(DEB, LCD_DEB);
    Lcd_Out(2, 1, LCD);
    Lcd_Out(1, 1, LCD_DEB);


    }while(1);
    }

  11. #41
    Thetimax

    Re : Automate programmable PIC

    Il n y a que Vede qui peut me repondre???

  12. #42
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    Salut,

    pour le débitmètre, faut compter les impulsions
    (via une entrée numérique) pendant une période
    de temp (dite "fenêtre"), exemple pendant 1s...
    pour pouvoir ensuite déduire : nbr_impuls/sec = litre/mn

    pour compter les impulsions j'ai tendance à utiliser l'entrée RBO/INT, interruptible...
    pour définir une "fenêtre" j'ai tendance à utiliser le Timer1...
    je t'envoye un exemple quand je peux...

    pour le bord du LCD je sais pas... j'en utilise jamais...
    pour la virgule, tu as FloatToStr();...
    sinon faut décomposer manuellement (genre : string = entier + "," + décimales)...

    je jette maintenant un oeil à ton code...
    vede
    ;O]
    ______________
    ...

  13. #43
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re ;O]

    tu peux déjà supprimer les variables milliers, centaines et vartmp
    et leurs calculs qui ne servent plus à rien grâce à la "fonction" IntToStr();...

    ensuite que je comprenne bien :
    tu veux utiliser l'entrée RB6 et le Timer1 pour compter les impulsions? c'est bien ça?
    tu dis que ça affiche n'importe quoi...quel genre? des chiffres?

    la prochaine fois mets ton code entre des balises (code), c'est plus lisible...

  14. #44
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re re ;O]

    ta config du Timer est erronée...
    T1CON = 1000111;
    c'est pas bon...

    faut signifier au compilo que ta valeur est binaire avec le "préfixe" 0b...
    car là (par défaut), c'est décimal... soit "100 mille 111"...
    faut écrire :
    T1CON = 0b1000111;

    sinon tu convertis d'abords 1000111 en décimal ou en hexadécimal...soit:
    T1CON = 71
    ou
    T1CON = 0x47

  15. #45
    paulfjujo

    Re : Automate programmable PIC

    bonsoir,

    Attention à la transformation valeur en ascii
    Code:
    milliers = ADC, div, 1000;
    vartmp = ADC, modf, 1000;
    centaines = vartmp, div , 100;
    milliers = milliers + 30;
    vartmp = vartmp + 30;
    centaines = centaines + 30;
    c'est + 30h ou +48 en decimal ou + '0'

  16. #46
    Thetimax

    Re : Automate programmable PIC

    Bonjour,

    - Pour ce qui est des variables et de leurs calculs je les avais deja supprimer car entre 2 j'ai réelement compris a quoi servait IntToStr.

    - J'ai voulu utiliser le timer1 car un membre de ce forum m'avais dit dans l'ancien post que le debimetre utiliserait cette fonction. Si je me souviens bien, le debimetre placé sur la conduite d'eau envoie une impulsion tout les 1/2 litres. le programme a besoin de cette info pour compter le volume d'eau dans la cuve... Je pense qu'un simple compteur ferais l'affaire, avez vous une idée?

    - J'ai tenter de mettre FloatToStr a la place de IntToStr ce qui m'affiche bien un chiffre a virgule mais les chiffres apres la virgule donnent du chinois avec un peu de grec il me semble lol!!

    Merci pour vos reponses...

  17. #47
    Thetimax

    Re : Automate programmable PIC

    Bon j'ai essayer ceci mais les chiffres apres la virgules sont a present que des "9"


    Code:
    unsigned int ADC_Read(unsigned short channel);
    float ADC;
    void FloatToStr(signed int input, char *output);
    char LCD[10];
    
    void main() {
    
    ANSEL = 0x04;
    ANSELH = 0;
    C1ON_bit = 0;
    C2ON_bit = 0;
    
    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1, "Poids");
    Lcd_Out(2, 9, "Kg");
    
    do {
    
    delay_ms(500);
    ADC = ADC_Read(2);
    FloatToStr(ADC, LCD);
    Lcd_Out(2, 1, LCD);
    
    
    }while(1);
    }
    Merci

  18. #48
    Thetimax

    Re : Automate programmable PIC

    Bon je viens d'en savoir plus sur le peson, avec une tension a l'exitation de 24V j'obtiens en signal 1mV / kg
    J'ai l'impression que cela pose probleme?
    Merci

  19. #49
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    Bonjour,

    pour compter les impulsions, tu as raison, le Timer1 est une bonne solution...
    l'entrée du compteur Timer1 est RC0 sur le 887...

    pour tes décimales, elles devraient toujours être à 0, car ADC est toujours un entier...
    exemples 16.000 ou 128.000 ou 1023.000...

    pour la résolution (1mv/Kg) ça me semble ingérable, vu que la
    précision de l'ADC est d'environ 5mV/5V, soit 25mV/25V... précision : 25Kg ;O[
    faudrait réussir à atteindre au moins 5mV/Kg /5V...
    ou mieux 10mV/Kg /5V... cad précision 500g... et poids maxi 500Kg...

    vede
    ;O]
    ___________
    ...

  20. #50
    Thetimax

    Re : Automate programmable PIC

    Ok, j'aimerais donc savoir comment integrer la fonction du timer1 dans mon programme? que dois je utiliser?? do, if ???

    Pour le ADC serait il possible d'utiliser un ampli OP ?

    Merci

  21. #51
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re ;O]

    pour le Timer1 je t'envoye un exemple fonctionnel rapidement...

    et oui, un "pré-traitement" de la tension (via AOP, filtres, diviseurs...) serait sûrement une très bonne solution... voir indispensable... mais là je suis beaucoup moins calé (en nélectronique analogique...)...

  22. #52
    Thetimax

    Re : Automate programmable PIC

    Ok merci, je vais me renseigner a propos de ces betites bettes!

    J'aimerais realiser une structure a menu(simple), est ce possible??

  23. #53
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re ;O]

    oui c'est possible de faire un menu... là c'est que de la programmation/logique...

    pour le Timer1 je vois que le registre T1CON est un peu différent
    des 877... notamment bits 6 et 7 (gate)... comme j'ai pas de 887
    sous la main pour tester, ben faudra que t'expérimentes...

    idéalement avec un tout petit programme...
    juste pour mettre au point le principe...

    un exemple de petit programme testé sur un 877...
    avec un BP sur l'entrée pour générer les impulsions...
    et 8 leds sur le PortB pour visualiser l'état du TMR1L
    (TMR1H lui s'incrémente toutes les 256 impulsions)...
    chaque appui incrémente TMR1L...

    Code:
    main:                  ' init. le PIC
        ADCON1= %00000111  ' ADC OFF
        TrisB = %00000000  ' PortRB en sorties
        TrisC = %00000001  ' PortRC0 en entrée (impulsions)  
        T1CON =  %1000111  ' active TMR1 counter sur RC0              
        TMR1L = 0          ' init. val. TMR1L
        while true            ' LE PROGRAMME (dans une boucle infinie)                  
           PortB = TMR1L      ' change l'état des leds selon valeur TMR1L   
        wend
    end.
    ps : remplaces PortB = TMR1L par LCD_OUT(1,1,TMR1L); pour "voir" TMR1L...

    .

  24. #54
    Thetimax

    Re : Automate programmable PIC

    Ok, je vais essayer ca de suite... Et concernant le menu, peut tu me guider???

    Merci pour ton aide

  25. #55
    Thetimax

    Re : Automate programmable PIC

    bon je viens de tenter cela...


    [CODE]
    unsigned int ADC_Read(unsigned short channel);
    signed int ADC;
    void IntToStr(signed int input, char *output);
    signed int timer;
    char LCD[10];
    char timer_lcd[4];

    void main() {


    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR);
    ADCON1= 0b00000111; // ADC OFF
    TRISB = 0b00000000; // PortRB en sorties
    TRISC = 0b00000001; // PortRC0 en entrée (impulsions)
    TMR1L = 0; // init. val. TMR1L
    // LE PROGRAMME (dans une boucle infinie)
    // change l'état des leds selon valeur TMR1L



    do {
    delay_ms(500);
    IntToStr(timer, timer_lcd);
    timer = TMR1L;
    Lcd_Out(1, 8, timer_lcd);


    }while(1);
    }

    [CODE]

    Mais rien ne ce passe, a par les leds allumées sur RC7, RC6, RC4, RC2.

    merci

  26. #56
    Qristoff
    Animateur Électronique

    Re : Automate programmable PIC

    Salut à tous,
    pour le peson, il faut effectivement ajouter un ampli mais pas n'importe lequel !
    mais je ne comprends pas bien, je croyais que tu voulais utiliser celui indiqué au post #16 alimenté en 10V et non pas 24V ?
    Pour l'ampli, il faut se tourner vers un AD623 par exemple et brancher le peson entre +5V et -5V. Le gain de l'ampli sera de 250 car ton peson fournit 2mV/V soit 20mV pour la pleine échelle 0-300Kg, soit 66µV/Kg (et non pas 1mV/Kg comme on a pu te le dire !)
    Donc, en applicant un gain différentiel de 250, tu obtiendras 20mV x 250 = 5V (magique !) ce qui revient à une résolution de 290gr théorique.
    Tout existe, il suffit de le trouver...!

  27. #57
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    re ;O]

    il manque la ligne T1CON = ...
    je l'ai rajoutée après dans mon exemple...

  28. #58
    Thetimax

    Re : Automate programmable PIC

    J'ai decouvert par moi meme que le peson devait etre alimenté en 24V et une resolution de 30mA (a confirmer avec la feuille scannée).
    A mon avis, en 10V la resolution est plus basse, peut etre de 20mA???

    Merci

    ps: J'ajoute de suite TICON...

  29. #59
    invite7a49d0d5

    Cool Re : Automate programmable PIC

    Hi Qriss,

    merci pour toutes ces infos précises...
    les "1mV/Kg" c'est ce qu'il à "mesuré"...
    cf POST #48...

    vede
    ;O]
    ____________
    ...

  30. #60
    Thetimax

    Re : Automate programmable PIC

    dsl, petit oubli...
    Images attachées Images attachées  

Page 2 sur 7 PremièrePremière 2 DernièreDernière

Discussions similaires

  1. Automate programmable
    Par invitee11f8059 dans le forum Technologies
    Réponses: 4
    Dernier message: 04/09/2009, 13h54
  2. Automate programmable
    Par invitea96edd4e dans le forum Technologies
    Réponses: 6
    Dernier message: 25/12/2008, 12h17
  3. automate programmable
    Par invite13e724e8 dans le forum Électronique
    Réponses: 0
    Dernier message: 17/07/2008, 23h57
  4. Automate programmable
    Par inviteffb08c52 dans le forum Électronique
    Réponses: 11
    Dernier message: 15/05/2007, 09h56
  5. automate programmable
    Par invite4ce7f495 dans le forum Électronique
    Réponses: 4
    Dernier message: 25/12/2006, 23h16
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...