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

PIC 18f4550 et sonde temperature DS18B20



  1. #1
    kixxxx

    Smile PIC 18f4550 et sonde temperature DS18B20


    ------

    Bonjour je galère en ce moment pour mettre en place un systeme pic 18f4550 avec une sonde DS18B20.

    je n'arrive pas a recuperer les bits de temperature.
    Tout le reste fonctionne bien car sur l'oscillo j'ai bien la valeur de la temperature de l'octet haut et bas qui correspondent.
    cependant je n'arrive pas a le recuperer sur la variable valeur du programme ci dessous. HELP!!!!

    Code:
    unsigned char _Readbyte(void)
    {
    unsigned char valeur=0;
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x01;
    }
    Delay10TCYx(5);//lecture premier bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x02;
    }
    Delay10TCYx(5);//lecture 2 bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x04;
    }
    Delay10TCYx(5);//lecture 3 bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x08;
    }
    Delay10TCYx(5);//lecture 4 bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x10;
    }
    Delay10TCYx(5);//lecture 5 bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x20;
    }
    Delay10TCYx(5);//lecture 6 bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x40;
    }
    Delay10TCYx(5);//lecture 7 bit
    
    
    TRISAbits.TRISA0 = 0;
    PORTAbits.RA0 = 0;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    TRISAbits.TRISA0 = 1;
    _asm
    nop nop nop nop nop nop nop nop nop nop nop nop nop nop
    _endasm//15us
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x80;
    }
    Delay10TCYx(5);//lecture 8 bit
    
    
    return valeur;
    
    }
    les tempos sont bonnes c'est juste que le code suivant ne me permet pas de capturer la valeur du bus a l'instant.
    Code:
    if (PORTAbits.RA0)
    {
    valeur=valeur|0x80; //ou 0x01,0x02,0x04,0x08,0x10,0x20,0x40
    }
    je joins aussi une photo du montage sous isis.

    merci de votre aide.18f4550 18b20.jpg

    -----

  2. Publicité
  3. #2
    kevin8z

    Re : PIC 18f4550 et sonde temperature DS18B20

    salut, si tu veut j'ai un exemple pour utiliser cette sonde de temperature mais c'est ecrit en C en PASCAL ou en BASIC, et c'est pour pic16f887. (c'est des exemple que j'ai eu quand j'ai acheter la easypic6).

  4. #3
    kixxxx

    Re : PIC 18f4550 et sonde temperature DS18B20

    plutot sympa.
    j'apprecierai vraiment tes exemples pour cette sonde.

    merci encore.

  5. #4
    kevin8z

    Re : PIC 18f4550 et sonde temperature DS18B20

    tu veut celui en quelle langage? ou tu veut les 3?

  6. #5
    kixxxx

    Re : PIC 18f4550 et sonde temperature DS18B20

    En C ca serait surement plus facile pour moi
    merci.

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

    Re : PIC 18f4550 et sonde temperature DS18B20

    Code:
    /*
     * Project name:
         OneWire (Interfacing the DS1820 temperature sensor - all versions)
     * Copyright:
         (c) Mikroelektronika, 2009.
     * Revision History:
         20080930:
           - initial release;
           - 20090720 - modified by Slavisa Zlatanovic;
     * Description:
         This code demonstrates one-wire communication with temperature sensor
         DS18x20 connected to RA5 or RE2 pin.
         MCU reads temperature from the sensor and prints it on the LCD.
         The display format of the temperature is 'xxx.xxxx°C'. To obtain correct
         results, the 18x20's temperature resolution has to be adjusted (constant
         TEMP_RESOLUTION).
     * Test configuration:
         MCU:             PIC16F887
                          http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
         Dev.Board:       EasyPIC6
                          http://www.mikroe.com/en/tools/easypic6/
         Oscillator:      HS, 8.0000 MHz
         Ext. Modules:    DS18x20, LCD 2x16
                          http://www.mikroe.com/en/tools/components/
         SW:              mikroC PRO for PIC
                          http://www.mikroe.com/en/compilers/mikroc/pro/pic/
     * NOTES:
         - Place DS1280 jumper (J11) in the right position(RE2).
         - Pulling up PORTE and turning off PORTE LEDs may be required.
    
    */
    
    // LCD module connections
    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;
    // End LCD module connections
    
    //  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
    //  18S20: 9  (default setting; can be 9,10,11,or 12)
    //  18B20: 12
    const unsigned short TEMP_RESOLUTION = 9;
    
    char *text = "000.0000";
    unsigned temp;
    
    void Display_Temperature(unsigned int temp2write) {
      const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
      char temp_whole;
      unsigned int temp_fraction;
    
      // Check if temperature is negative
      if (temp2write & 0x8000) {
         text[0] = '-';
         temp2write = ~temp2write + 1;
         }
    
      // Extract temp_whole
      temp_whole = temp2write >> RES_SHIFT ;
    
      // Convert temp_whole to characters
      if (temp_whole/100)
         text[0] = temp_whole/100  + 48;
      else
         text[0] = '0';
    
      text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
      text[2] =  temp_whole%10     + 48;             // Extract ones digit
    
      // Extract temp_fraction and convert it to unsigned int
      temp_fraction  = temp2write << (4-RES_SHIFT);
      temp_fraction &= 0x000F;
      temp_fraction *= 625;
    
      // Convert temp_fraction to characters
      text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
      text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
      text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
      text[7] =  temp_fraction%10      + 48;         // Extract ones digit
    
      // Print temperature on LCD
      Lcd_Out(2, 5, text);
    }
    
    void main() {
      ANSEL  = 0;                                    // Configure AN pins as digital I/O
      ANSELH = 0;
      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, " Temperature:   ");
      // Print degree character, 'C' for Centigrades
      Lcd_Chr(2,13,223);                             // Different LCD displays have different char code for degree
                                                     // If you see greek alpha letter try typing 178 instead of 223
    
      Lcd_Chr(2,14,'C');
    
      //--- Main loop
      do {
        //--- Perform temperature reading
        Ow_Reset(&PORTE, 2);                         // Onewire reset signal
        Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTE, 2, 0x44);                   // Issue command CONVERT_T
        Delay_us(120);
    
        Ow_Reset(&PORTE, 2);
        Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTE, 2, 0xBE);                   // Issue command READ_SCRATCHPAD
    
        temp =  Ow_Read(&PORTE, 2);
        temp = (Ow_Read(&PORTE, 2) << 8) + temp;
    
        //--- Format and display result on Lcd
        Display_Temperature(temp);
    
        Delay_ms(500);
      } while (1);
    }
    voila le code.

  9. Publicité
  10. #7
    kixxxx

    Re : PIC 18f4550 et sonde temperature DS18B20

    Merci mais la fonction Ow_reset et Ow_Write sont predefinie.

    Code:
    void main (void)
    {
    ADCON1=0;
    TRISAbits.TRISA1 = 1;
    TRISBbits.TRISB0 = 0;
    
    while(1)
    {
    if (PORTAbits.RA1)PORTBbits.RB0=1;
    }
    }
    la c'est pareil ca ne fonctionne pas il ya un truc que je ne pige pas sur "if (PORTAbits.RA1)PORTBbits.RB0=1 ;"

  11. #8
    kevin8z

    Re : PIC 18f4550 et sonde temperature DS18B20

    tu la trouver ou ce bout de code? car je ne voi pas de ou il vient

  12. #9
    kixxxx

    Re : PIC 18f4550 et sonde temperature DS18B20

    c'est juste un exemple de ce qui ne marche pas sur mon code a moi
    peux tu m'aider a comprendre pourquoi ca ne reagit pas en sortie RB0 lorsque le RA1 passe a 1?

  13. #10
    kixxxx

    Re : PIC 18f4550 et sonde temperature DS18B20

    probleme resolu
    si ca interrese qqun le probleme etait au niveau des registres adcon0 et adcon1
    il faut ADCON0=0 et ADCON1=0x0F
    merci

  14. #11
    RISC

    Re : PIC 18f4550 et sonde temperature DS18B20

    Salut,

    Les broches multiplexées analogique / digital sont toujours en analogique au reset, il faut programmer un registre pour dire que tu veux utiliser les broches en digital....
    Lis la datasheet du PIC18F4550, chapitres 10.1 et 10.2 et corrige ton programme

    a+
    Dernière modification par RISC ; 06/01/2012 à 00h51.
    Ma marotte ? les microcontrôleurs ;=)

Sur le même thème :

Discussions similaires

  1. probleme 2 interruption pic 18f4550 pic ->plante
    Par daid.wxcv dans le forum Électronique
    Réponses: 5
    Dernier message: 28/08/2010, 08h51
  2. pic 18f4550
    Par marco05 dans le forum Électronique
    Réponses: 3
    Dernier message: 06/04/2010, 22h41
  3. Sonde de température et PIC en I2C
    Par blacksword dans le forum Électronique
    Réponses: 8
    Dernier message: 09/12/2009, 00h26
  4. Pic 18f4550
    Par Gérard dans le forum Électronique
    Réponses: 8
    Dernier message: 07/06/2006, 00h42
  5. capteur de temperature dallas ds18b20
    Par Ryback08 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/02/2006, 01h06
Découvrez nos comparatifs produits sur l'informatique et les technologies.