logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][C] Problem z użyciem bibliotek rklibavr + ds18b20

demeus 18 Lip 2008 00:39 5325 9
REKLAMA
  • #1 5353354
    demeus
    Poziom 18  
    Witam

    Od kilku dni męczę sie z próbą odczytu temperatury z czujnika DS18B20 przy pomocy bibliotek rklibavr.

    Czujnik jest podpięty do portu PB0 w procesorze amtega8, rezystor podciągający ma wartość 4,74K dane zczytane z czujnika są wyświetlane na standardowym wyświetlaczu 2x16.
    Atmega pracuje na wewnętrznym oscylatorze 1Mhz, całość jest zasilana ze stabilizowanego zasialcza 5V.

    Otóż przy użyciu biblioteki ds18x20.h z rklibavr wartość temperatury pokazywana na wyświetlaczu wynosi ~195 jednostek oraz po przekroczeniu ok ~250jednostek na wyświetlaczu wartość jest zerowana i leci od 0 w górę. Oczywiście sprawdzałem inny czujnik i jest ten sam problem.

    Kod programu jest wyjątkowo prosty i wygląda następująco:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/eeprom.h>
    #include <string.h>
    #include "delay.h"
    #include "lcd.h"
    #include "ds18x20.h"
    
    uint8_t gSensorIDs[OW_ROMCODE_SIZE];
    
    int main( void )
    {
    	uint16_t decicelsius;
    	uint8_t diff, i, subzero, cel, cel_frac_bits;
    
    	LCD_init();
    
    #ifndef OW_PORT
    	OW_set_bus(&PORTB,0);
    #endif
    
    	
    	while(1)
    	{
    
    
    		DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL) ;
    		delayms( DS18B20_TCONV_12BIT );
    		DS18X20_read_meas_single( 0x10, &subzero, &cel, &cel_frac_bits );
    		decicelsius = DS18X20_temp_to_decicel( subzero, cel, cel_frac_bits );
    
    		LCD_xy(0,0);
    		LCD_putstr_P(PSTR("Temp: "));
    		LCD_putchar( (subzero)?'-':'+' );
     		LCD_putint( ((decicelsius/10)),10) ;
    		LCD_putchar(',');
    		LCD_putchar( (decicelsius%10) + '0');
    	}
    		
    }
    


    Pliku config.h nie będę przytaczał gdyż zawiera on jedynie definicję wyprowadzeń do LCD

    Plik ds18x20.h wygląda następująco:
    
    #include <stdlib.h>
    #include <inttypes.h>
    #include "onewire.h"
    
    /* return values */
    #define DS18X20_OK          0x00
    #define DS18X20_ERROR       0x01
    #define DS18X20_START_FAIL  0x02
    #define DS18X20_ERROR_CRC   0x03
    
    #define DS18X20_POWER_PARASITE 0x00
    #define DS18X20_POWER_EXTERN   0x01
    
    /* DS18X20 specific values (see datasheet) */
    #define DS18S20_ID 0x10
    #define DS18B20_ID 0x28
    
    #define DS18X20_CONVERT_T	0x44
    #define DS18X20_READ		0xBE
    #define DS18X20_WRITE	0x4E
    #define DS18X20_EE_WRITE	0x48
    #define DS18X20_EE_RECALL	0xB8
    #define DS18X20_READ_POWER_SUPPLY 0xB4
    
    #define DS18B20_CONF_REG    4
    #define DS18B20_9_BIT       0
    #define DS18B20_10_BIT      (1<<5)
    #define DS18B20_11_BIT      (1<<6)
    #define DS18B20_12_BIT      ((1<<6)|(1<<5))
    
    // indefined bits in LSB if 18B20 != 12bit
    #define DS18B20_9_BIT_UNDF       ((1<<0)|(1<<1)|(1<<2))
    #define DS18B20_10_BIT_UNDF      ((1<<0)|(1<<1))
    #define DS18B20_11_BIT_UNDF      ((1<<0))
    #define DS18B20_12_BIT_UNDF      0
    
    // conversion times in ms
    #define DS18B20_TCONV_12BIT      750
    #define DS18B20_TCONV_11BIT      DS18B20_TCONV_12_BIT/2
    #define DS18B20_TCONV_10BIT      DS18B20_TCONV_12_BIT/4
    #define DS18B20_TCONV_9BIT       DS18B20_TCONV_12_BIT/8
    #define DS18S20_TCONV            DS18B20_TCONV_12_BIT
    
    // constant to convert the fraction bits to cel*(10^-4)
    #define DS18X20_FRACCONV         625
    
    #define DS18X20_SP_SIZE  9
    
    // DS18X20 EEPROM-Support
    #define DS18X20_WRITE_SCRATCHPAD  0x4E
    #define DS18X20_COPY_SCRATCHPAD   0x48
    #define DS18X20_RECALL_E2         0xB8
    #define DS18X20_COPYSP_DELAY      10 /* ms */
    #define DS18X20_TH_REG      2
    #define DS18X20_TL_REG      3
    
    
    /* for description of functions see ds18x20.c */
    
    extern void DS18X20_find_sensor(uint8_t *diff, 
    	uint8_t id[]);
    	
    extern uint8_t	DS18X20_get_power_status(uint8_t id[]);
    
    extern uint8_t DS18X20_start_meas( uint8_t with_external,
    	uint8_t id[]);
    extern uint8_t DS18X20_read_meas(uint8_t id[], 
    	uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits);
    extern uint8_t DS18X20_read_meas_single(uint8_t familycode,
    	uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits);
    
    extern uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp, 
    	uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits);
    extern	uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel, 
    	uint8_t cel_frac_bits);
    extern int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1, 
    	uint8_t subzero2, uint16_t cel2);
    
    // write th, tl and config-register to scratchpad (config ignored on S20)
    uint8_t DS18X20_write_scratchpad( uint8_t id[], 
    	uint8_t th, uint8_t tl, uint8_t conf);
    // read scratchpad into array SP
    uint8_t DS18X20_read_scratchpad( uint8_t id[], uint8_t sp[]);
    // copy values th,tl (config) from scratchpad to DS18x20 eeprom
    uint8_t DS18X20_copy_scratchpad( uint8_t with_power_extern,
    	uint8_t id[] );
    // copy values from DS18x20 eeprom to scratchpad
    uint8_t DS18X20_recall_E2( uint8_t id[] );
    
    #endif
    


    Niestety nie mam za dużego doświadczenia w programowaniu i nie potrafię sobie poradzić z tym problemem zapewne dość błachym.

    Jeśli ktoś widzi błąd lub spotkał się z podobnym problemem to prosiłbym o rady lub sugestie.

    P.S. Wyświetlacz 2x16 obsłużyłem za pomocą rklibavr bez problemu.

    z góry dzięki :)


    --
    pozdrawiam
    demeus
  • REKLAMA
  • #2 5367495
    demeus
    Poziom 18  
    Problem rozwiązany, jak widać niewiedza zawsze wychodzi na wierzch.

    Z powyższym programem wszystko jest ok tylko jest on (program i biblioteka) pod czujnik DS18S20, a ja próbowałem używać DS18B20.

    A tak przy okazji może ktoś wie jak przekonfigurować tę bibliotekę pod czujnik DS18B20?



    --
    pozdrawiam
    demeus
  • REKLAMA
  • #4 5367702
    demeus
    Poziom 18  
    No cóż napewno to uczynię :)
    Dzięki za chęci ;)
  • REKLAMA
  • Pomocny post
    #5 5368563
    JmL(TM)
    Poziom 24  
    Jesli twierdzisz, ze biblioteka byla pisana tylko pod wersje 'S' to ciekaw jestem dlaczego w kodzie znajduje sie to:

    /* DS18X20 specific values (see datasheet) */
    #define DS18S20_ID 0x10
    #define DS18B20_ID 0x28
    
    {...}
    
    #define DS18B20_9_BIT_UNDF       ((1<<0)|(1<<1)|(1<<2))
    #define DS18B20_10_BIT_UNDF      ((1<<0)|(1<<1))
    #define DS18B20_11_BIT_UNDF      ((1<<0))
    #define DS18B20_12_BIT_UNDF      0
    
    // conversion times in ms
    #define DS18B20_TCONV_12BIT      750
    #define DS18B20_TCONV_11BIT      DS18B20_TCONV_12_BIT/2
    #define DS18B20_TCONV_10BIT      DS18B20_TCONV_12_BIT/4
    #define DS18B20_TCONV_9BIT       DS18B20_TCONV_12_BIT/8
    #define DS18S20_TCONV            DS18B20_TCONV_12_BIT 
  • REKLAMA
  • #6 5368668
    demeus
    Poziom 18  
    Tego Ci nie powiem, ale wiem że po włożeniu czujnika DS18S20 zamiast DS18B20 wszystko zaczeło działać jak należy. Widocznie nie chodzi tu może no nazwy w bibliotece co o jej konfigurację.
    Niestety nie jestem w tym biegły i nie znalazłem konkretnej przyczyny.
  • Pomocny post
    #7 5368681
    JmL(TM)
    Poziom 24  
    Biblioteka jest dobra i obsluguje oba modele a ja juz widze Twoj blad!

    DS18X20_read_meas_single( 0x10, &subzero, &cel, &cel_frac_bits );


    masz na stale wpisany ID DS18S20 [popatrz w pliku ds18x20.h]

    zmien to na:
    DS18X20_read_meas_single(DS18B20_ID, &subzero, &cel, &cel_frac_bits );


    a w razie potrzeby korzystania z DS18S20 wpisz:
    DS18X20_read_meas_single(DS18S20_ID, &subzero, &cel, &cel_frac_bits );


    I po problemie! :D
    Pozdrawiam!
  • #8 5369944
    demeus
    Poziom 18  
    Tak zgadza się już po problemie :)
  • #9 5370240
    JmL(TM)
    Poziom 24  
    demeus napisał:
    Tak zgadza się już po problemie :)


    Teraz do pelni szczescia brak tylko zamkniecia tematu, wiec kliknij na ta klodke zaraz obok przycisku Odpowiedz...
  • #10 5370268
    demeus
    Poziom 18  
    Już sie robi :)
REKLAMA