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

[C][ds1820][Atmega8] potrzebny kod

Piotr Kania 02 Gru 2008 11:20 3109 5
REKLAMA
  • #1 5808050
    Piotr Kania
    Poziom 15  
    Witam potrzebny jest mi sprawdzony chodzący kod do pomiaru temperatury na ds1820 znalazłem kilka owych ale żadem nie działa poprawnie tzn wyświetla 85,6 stopni podobno to wina opóźnień ale mimo poprawek i tak dalej to samo.
  • REKLAMA
  • #2 5808076
    Przemek_Kuchta
    Poziom 20  
    Jeśli jesteś zainteresowany to mam kod dla ds18B20.
    DS1820 już długo nie widziałem w sprzedaży.
  • REKLAMA
  • #3 5808263
    Piotr Kania
    Poziom 15  
    jeśli tylko działa to bardzo bym prosił.
  • REKLAMA
  • REKLAMA
  • #5 5811432
    Piotr Kania
    Poziom 15  
    Znalazłem coś takiego i działa świetnie ale mam parę pytań
    
    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 8000000UL  // 8 MHz
    
    #define LCD PORTD
    #define E 3
    #define RS 1
    
    #define SET_E   LCD |= _BV(E)
    #define CLR_E   LCD &= ~_BV(E)
    #define SET_RS  LCD |= _BV(RS)
    #define CLR_RS  LCD &= ~_BV(RS)
    
    void write_to_lcd(char x)   
    { SET_E; LCD = ((LCD & 0x0F) | (x & 0xF0)); CLR_E; SET_E; LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); CLR_E; _delay_ms(2); }
    void write_command(char x)  {CLR_RS;  write_to_lcd(x);   }
    void write_char(char x)    {SET_RS;  write_to_lcd(x);   }
    void write_text(char * s)  {while(*s)    {  write_char(*s);  s++;   }}
    void lcd_init(void)   {_delay_ms(25);  CLR_E; CLR_RS; SET_E; LCD &= 0x3F; CLR_E; _delay_ms(5); SET_E; LCD &= 0x2E; CLR_E;
       _delay_ms(2);  write_command(0x28);  write_command(0x08); write_command(0x01); write_command(0x06); write_command(0x0C); }
    
    
    #define DQ 2
    #define SET_DQ DDRB &= ~_BV(DQ)
    #define CLR_DQ DDRB |= _BV(DQ)
    #define IN_DQ PINB & _BV(DQ)
    
    void ow_reset(void)
    {
       CLR_DQ;                                    // stan niski na linii 1wire
       _delay_us(480);                            // opóźnienie 480us
       SET_DQ;                                    // stan wysoki na linii 1wire
       _delay_us(480);                            // opóźnienie 480 us
    }
    
    void ow_write_bit(char b)                  // procedura zapisu bitu na linię 1wire
    {
       CLR_DQ;                                    // stan niski na linii 1wire
       _delay_us(10);                             // opóźnienie 10us
       if(b) SET_DQ;                              // jeśli b<>0 to ustaw stan wysoki na linii
       _delay_us(100);                            // opóźnienie 100us
       SET_DQ;                                    // stan wysoki na linii 1wire
    }
    
    char ow_read_bit(void)
    {
       CLR_DQ;
       _delay_us(2);
       SET_DQ;
       _delay_us(12);
       if(IN_DQ) return 1; else return 0;
    }
    
    unsigned char ow_read_byte(void)
    {
       unsigned char i;
       unsigned char value = 0;
       for (i=0;i<8;i++)
       {
          if(ow_read_bit()) value|=0x01<<i;
          _delay_us(47);
       }
       return(value);
    }
    
    void ow_write_byte(char val)
    {
       unsigned char i;
       unsigned char temp;
       for (i=0; i<8; i++)
       {
          temp = val >> i;
          temp &= 0x01;
          ow_write_bit(temp);
       }
    }
    
    int main(void)
    {
       DDRD = 0xFE;
       lcd_init();
       char msb, lsb,  temp;
       float celcius;
       while(1)
       {
          ow_reset();
          ow_write_byte(0xCC);
          ow_write_byte(0x44);
          for (uint8_t a = 0; a < 25; a++) _delay_ms(40); // (30) =750ms (40) =1000ms
          ow_reset();
          ow_write_byte(0xCC);
          ow_write_byte(0xBE);
          lsb = ow_read_byte();
          msb = ow_read_byte();
          celcius =  msb << 8 | lsb ;
          celcius/=16;
          temp = msb << 4| lsb >> 4;
          write_command(0x01);
          unsigned char tab[6];
    	  write_text("Temp: ");
          write_text(dtostrf(celcius, 2, 4, tab));
       }
    return 0;
    } 
    

    co oznacza write_text(dtostrf(celcius, 2, 4, tab));

    Dodałem znaczniki [code]
    [zumek]
  • #6 5811659
    snow
    Poziom 31  
    Piotr Kania napisał:
    co oznacza write_text(dtostrf(celcius, 2, 4, tab));


    Oznacza wyświetlenie na wyświetlaczu wartości temperatury z dokładnością do czterech miejsc po przecinku

    Na przyszłość stosuj znacznik [code] bo post nieczytelny.
REKLAMA