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

atmega +ds1820 biblioteki rklibavr

pawelek1053 14 Paź 2008 22:28 5345 10
  • #1 5632449
    pawelek1053
    Poziom 10  
    Juz byl taki temat ale został zamknięty. Moj problem polega na tym ze nie moge ruszyc ds1820 w C z wykorzystaniem bliotek rklib do obslugi ds.

    #include <avr/io.h>
    #include<avr/interrupt.h>
    #include<avr/eeprom.h>
    #include<string.h>
    #include "lcd.h"
    #include "ds18x20.h"
    #include "delay.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(&PORTD,0);
    #endif
       
       while(1)
       {
          DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL);
          delayms( DS18B20_TCONV_12BIT );
          DS18X20_read_meas_single(0x28, &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');
       }
          
    }
    


    pliki make oraz config
    make:
    # Nazwa pliku z funkcją main() - BEZ ROZSZERZENIA!
    TARGET = bibl
    CONFIG=config.h
    # typ mikrokontrolera
    #MCU = at90s2313
    #MCU = at90s8515
    #MCU = atmega163
    MCU = atmega8
    #MCU = atmega128
    
    # Katalog z bibliotekami użytkownika
    USRLIB	= ../../lib
    
    # Lista plików źródłowych bibliotek w języku C
    SRCLIB =
    #include $(USRLIB)/adc_pwm/sources
    #include $(USRLIB)/conv/sources
    include $(USRLIB)/lcd/sources
    #include $(USRLIB)/i2c/sources
    #include $(USRLIB)/led7seg/sources
    #include $(USRLIB)/kbd/sources
    include $(USRLIB)/delay/sources
    #include $(USRLIB)/pcf8583/sources
    #include $(USRLIB)/uart/sources
    include $(USRLIB)/onewire/sources
    include $(USRLIB)/ds18x20/sources
    
    # Lista plików źródłowych w języku C
    SRC = $(TARGET).c
    
    # Lista plików źródłowych w asemblerze (rozszerzenie S - DUŻE S !)
    ASRC = 
    
    # Format pliku wyjściowego (srec, ihex)
    FORMAT = ihex
    
    # Poziom optymalizacji (0, 1, 2, 3, s) 
    # (Uwaga: 3 nie zawsze jest najlepszym wyborem)
    OPT = s
    
    # Dodatkowe biblioteki
    #
    # Minimalna wersja printf
    #LDFLAGS += -Wl,-u,vfprintf -lprintf_min
    #
    # Zmiennoprzecinkowa wersja printf (wymaga biblioteki matematycznej)
    #LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
    #
    # Biblioteka matematyczna
    #LDFLAGS += -lm
    
    include $(USRLIB)/avr_make

    config
    #define F_CPU		8000000 //częstotliwość zegara w Hz
    
    #define OW_PORT		PORTD
    #define OW_BIT 		0
    
    
    
    //----------------------
    // LCD 
    //----------------------
    
    #define LCD_PORT	PORTC	//port wyświetlacza
    #define LCD_RS 		5	//bit linii RS
    #define LCD_EN 		4	//bit linii EN
    #define LCD_X		16	//liczba znaków w linii wyświetlacza
    #define LCD_Y		2	//liczba wierszy wyświetlacza
    //#define LCD_BIT_SWAP		//zamiana bitów danych LCD D3<>D0, D2<>D1
    #define LCD_WRAP		//zawijanie tekstu
    #define LCD_WIN1250		//polskie znaki wg WIN1250
    


    podlaczony jest do PORTU D.0 wogole nic nie reaguje na lcd tylko 0.0. standardowe podlaczenie jak w nocie. Dodam ze napisalem program w Bascomie i wszystko dobrze smiga. Oscylator wewnetrzny ustawiony na 8MHz. Prosze o pomoc bo nie wiem co źle robie

    plik do obslugi ds

    #ifndef DS18X20_H_
    #define DS18X20_H_
    
    /*! \file ds18x20.h \brief Obsługa termometru 1-wire DS18x20 */
    /*
      Copyright (c) 2005 Robert Krysztof
      robert.krysztof@wp.pl
      http://www.avr-gcc.prv.pl
    */
    /** \defgroup ds18x20 Termometr 1-wire DS18x20
     
     Obsługa termometru 1-wire DS18x20.
     
     \code
     #include "ds18x20.h "
     \endcode 
     \ref config:
     
     W pliku \c "config.h" znajdującym się w katalogu projektu należy umieścić następującą zawartość:
        	     
     \code
     #define OW_PORT	PORTD
     #define OW_BIT		2
     \endcode
     
     \note Wartości z \c #define można zmieniać w celu dostosowania 
     biblioteki do tworzonego urządzenia i oprogramowania.
    */
    
    #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
    
  • #2 5632471
    marek-c
    Poziom 19  
    header
    
    #include <avr/io.h>
    #include <inttypes.h>
    #define pin_1w      0
    #define dir_1w      DDRC
    #define out_1w      PORTC
    #define in_1w       PINC
    
    
    #define write_1w	dir_1w |= _BV(pin_1w)  
    #define read_1w		dir_1w &= ~_BV(pin_1w) 
    
    #define write_one	out_1w |= _BV(pin_1w)  
    #define write_zero	out_1w &= ~_BV(pin_1w) 
    
    #define set_1w      bit_is_set(in_1w,pin_1w)
    #define clear_1w    bit_is_clear(in_1w,pin_1w)
    uint8_t reset_1w(void);
    void send_1w(unsigned char data); 
    unsigned char get_1w(void);
    


    source
    
    #define F_CPU 14000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <inttypes.h>
    #include "1wire_lib.h"
    
    /*********************************************************************************/
    // Reset interfejsu 1-Wire
    //1-Wire reset
    uint8_t reset_1w(void)
    {
    unsigned char presence=1;
    
    	write_1w;
    	write_zero;
    	_delay_us(330);
    	read_1w;
    	_delay_us(70);
    	if(clear_1w) presence=0;
    	_delay_us(400);
    	return presence;
    }
    
    /*********************************************************************************/
    // Zapis bajtu
    // Write byte to 1-wire device
    void send_1w(unsigned char data) 
    {
      unsigned char u;
      unsigned char x;
      for(u=0; u<8; u++)
      {
       x=0x01&data; 
       if (x==0) 
       {
         write_1w;
    	 write_zero;
         _delay_us(60);
         read_1w;
         _delay_us(5);
       }
       else 
       {
         write_1w;
    	 write_zero;
         _delay_us(5);
         read_1w;
         _delay_us(60);
       }
       data>>=1; 
      }
    }
    
    /*********************************************************************************/
    // Odczyt bajtu
    //Read byte from 1-Wire device
    unsigned char get_1w(void) 
    {
      unsigned char x=0x00;
      unsigned char u;
      for(u=0; u<8; u++)
      {
        x>>=1;
        write_1w;
    	write_zero;
        _delay_us(4);
        read_1w;
        _delay_us(6);
        if(set_1w)
        {
          x=x+0x80;
        }
    	_delay_us(90); 
      }
      return x;
    }
    


    Chodzi!

    NIE MOJE!!!!!!!!!!!! I autora przepraszam że nie zamieściłem (bo nie wiem kto zacz - ale piwo mu się należy)


    Marek
  • #3 5632628
    pawelek1053
    Poziom 10  
    a ten plik z kad wziasc?? 1wire_lib.h
  • Pomocny post
    #4 5632798
    JmL(TM)
    Poziom 24  
    Zmien ten fragment:

     \code
     #define OW_PORT   PORTD
     #define OW_BIT      2
     \endcode 


    na:

     \code
     #define OW_PORT   PORTD
     #define OW_BIT      0
     \endcode 


    bo bylo ustawione na Port D.2 - chyba, ze tam podepniesz DS'a to bedzie smigac...

    Pozdro!

    Dodano po 3 [minuty]:

    pawelek1053 napisał:
    a ten plik z kad wziasc?? 1wire_lib.h


    To jest wlasnie ten fragment:
    #include <avr/io.h>
    #include <inttypes.h>
    #define pin_1w      0
    #define dir_1w      DDRC
    #define out_1w      PORTC
    #define in_1w       PINC
    
    
    #define write_1w   dir_1w |= _BV(pin_1w) 
    #define read_1w      dir_1w &= ~_BV(pin_1w)
    
    #define write_one   out_1w |= _BV(pin_1w) 
    #define write_zero   out_1w &= ~_BV(pin_1w)
    
    #define set_1w      bit_is_set(in_1w,pin_1w)
    #define clear_1w    bit_is_clear(in_1w,pin_1w)
    uint8_t reset_1w(void);
    void send_1w(unsigned char data);
    unsigned char get_1w(void); 
  • #5 5632822
    pawelek1053
    Poziom 10  
    wielkie dzieki wlasnie to trzeba bylo zmienic
  • #6 5632828
    JmL(TM)
    Poziom 24  
    Ciesze sie, ze moglem pomoc...

    Ten fragment:
    #ifndef OW_PORT
       OW_set_bus(&PORTD,0);
    #endif 


    powinien to zrobic ale nigdzie nie widze funkcji OW_set_bus() wiec... 8)

    Temat do zamkniecia?

    Aha!
    I uwazaj na ten fragment:

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


    bo masz tam na stale wpisane ID DS18B20:
    #define DS18B20_ID 0x28


    a jesli zajdzie potrzeba uzycia DS18S20 to zmien na DS18S20_ID lub 0x10.

    Pozdro!
  • #7 5632838
    pawelek1053
    Poziom 10  
    jeszcze pytanie bo ja podlaczylem do portuD.2 i dziala ale zmienilem tak jak mowiles i dalej dziala na pinie 2 a nie na 0 I nie wiem jak zmienic zeby dzialalo na pinie0
  • #8 5632857
    JmL(TM)
    Poziom 24  
    Cytat:
    W pliku \c "config.h" znajdującym się w katalogu projektu należy umieścić następującą zawartość:

    \code
    #define OW_PORT PORTD
    #define OW_BIT 2
    \endcode


    Tak zrobiles? Zmieniles w pliku config.h? Najlepiej podeslij swoje pliki to bedzie znacznie latwiej...
  • #9 5632866
    pawelek1053
    Poziom 10  
    tak zmienilem tam na pin 0 portu D jest to ma pierwszym poscie na samej gorze
    config.h
    
    #define F_CPU      8000000 //częstotliwość zegara w Hz
    
    #define OW_PORT      PORTD
    #define OW_BIT       0
    
    
    
    //----------------------
    // LCD
    //----------------------
    
    #define LCD_PORT   PORTC   //port wyświetlacza
    #define LCD_RS       5   //bit linii RS
    #define LCD_EN       4   //bit linii EN
    #define LCD_X      16   //liczba znaków w linii wyświetlacza
    #define LCD_Y      2   //liczba wierszy wyświetlacza
    //#define LCD_BIT_SWAP      //zamiana bitów danych LCD D3<>D0, D2<>D1
    #define LCD_WRAP      //zawijanie tekstu
    #define LCD_WIN1250      //polskie znaki wg WIN1250 
  • #10 5661381
    rozumek
    Poziom 10  
    Mam mały problem z inicjalizjacja DS18B20. Mój program jest analogiczny do tego z podanego wyzej.

    Przy inicjalizacji zaraz po przejsciu 1_WIRE w stan receive (u mnie DDRC) czyli bezposrednio przed momentem kiedy powinien wystąpic sygnał presence czujnika, rezystor (w nocie katalogowej opisane na 5k ja mam 3.3k) chyba nie ustawia 1_WIRE w stan wysoki. Nie wiem jak to sprawdzic.

    Powienien to o ile mi sie wydaje zrobic to automatycznie po przejsciu magistrali sta receive. Bo po wykryciu stanu wysokiego na magistrali 1_WIRE powinien automatycznie ustawic stan niski i zarazem zglosic ze jest dostępny.

    To w takim razie mam pytanko, czy po sygnale reset i po ustawieniu magistrali w stan receive (DDRC = 0) to ja mam automatycznie wprowadzac magistale 1_WIRE w stan wysoki, czy rezystor ma to robic?

    Bardzo prosze o pomoc
  • #11 5697187
    Dave_Masters
    Poziom 14  
    Po ustawieniu portu w stan wysokiej impedancji
    
    DDRC &=  ~_BV(PIN_1WIRE);
    PORTC &= ~_BV(PIN_1WIRE);
    

    , a po ludzku pisząc - port jako wejście, wew. pull-up wyłączony, port powinien być automatycznie podciągany zewnętrznym rezystorem pull-up (o wartości 4,7k).
REKLAMA