Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

problem z termometrem ds18b20

Janek_mkl 24 Lip 2007 13:32 2899 17
  • #1 24 Lip 2007 13:32
    Janek_mkl
    Poziom 9  

    Witam,
    mam płytkę z atmega8 LCD 2x16 i ds18b20, wszystko podłączone w moim mniemaniu prawidłowo, sprawdzałem, oglądałem schematy w necie i wygląda ok.

    ściągnąłem m.in z tego forum procedury do obsługi LCD i DS18B20, ale chyba to ze soba nie współpracuje bo wyswietla mi na lcd cały czas
    "temperatura
    127,9375"

    gdyby ktoś był tak uczynny i przyjrzał się temu programowi byłbym zobowiązany :)

    kod wygląda następująco:

    Code:

    #define F_CPU 8000000

    #include <avr/io.h>
    #include <avr/delay.h>

    #define DDR_DB4  DDRB
    #define PORT_DB4 PORTB
    #define DB4      PB0

    #define DDR_DB5  DDRB
    #define PORT_DB5 PORTB
    #define DB5      PB1

    #define DDR_DB6  DDRB
    #define PORT_DB6 PORTB
    #define DB6      PB2

    #define DDR_DB7  DDRB
    #define PORT_DB7 PORTB
    #define DB7      PB3


    #define DDR_RS   DDRB
    #define PORT_RS  PORTB
    #define RS       PB5

    #define DDR_E    DDRB
    #define PORT_E   PORTB
    #define E        PB4

    #define SET_DB4 PORT_DB4 |= _BV(DB4)
    #define CLR_DB4 PORT_DB4 &= ~_BV(DB4)

    #define SET_DB5 PORT_DB5 |= _BV(DB5)
    #define CLR_DB5 PORT_DB5 &= ~_BV(DB5)

    #define SET_DB6 PORT_DB6 |= _BV(DB6)
    #define CLR_DB6 PORT_DB6 &= ~_BV(DB6)

    #define SET_DB7 PORT_DB7 |= _BV(DB7)
    #define CLR_DB7 PORT_DB7 &= ~_BV(DB7)

    #define SET_E PORT_E |= _BV(E)
    #define CLR_E PORT_E &= ~_BV(E)

    #define SET_RS PORT_RS |= _BV(RS)
    #define CLR_RS PORT_RS &= ~_BV(RS)

    //ds18b20
    #define OWPORT PORTD
    #define OWPIN 0
    #define OWPININ PIND
    #define OWDDR DDRD
    #define OWIN 1 // 2^OWPIN

    #define delay_us(x) _delay_loop_2(x*2)
    #define ow_lo() OWDDR |= _BV(OWPIN)
    #define ow_hi() OWDDR &= ~_BV(OWPIN)


    // funkcja wystawiająca na szynę danych połówkę bajtu
    // pod uwagę brana jest młodsza połówka parametru
    void out_nibble(char x)
    {
    if(x & _BV(0)) SET_DB4; else  CLR_DB4;
    if(x & _BV(1)) SET_DB5; else  CLR_DB5;
    if(x & _BV(2)) SET_DB6; else  CLR_DB6;
    if(x & _BV(3)) SET_DB7; else  CLR_DB7;
    }

    // funkcja zapisująca do LCD bajt danych
    void write_to_lcd(char x)
    {
       SET_E;




       out_nibble(x >> 4); // wystawienie na szynę danych starszej połówki bajtu
       CLR_E; // opadające zbocze na E powoduje zapis do wyświetlacza
       SET_E;
       out_nibble(x); // wystawienie na szynę danych młodszej połówki bajtu
       CLR_E; // opadające zbocze na E powoduje zapis do wyświetlacza
       _delay_ms(1); // opóźnienie ok 1 ms
    }

    // funkcja zapisująca do LCD rozkaz
    void write_command(char x)
    {
       CLR_RS; // niski stan na RS -> zapis instrukcji
       write_to_lcd(x); // zapis do LCD
    }

    // funkcja zapisujaca do LCD znak
    void write_char(char x)
    {
       SET_RS; // wysoki stan na RS -> zapis danej
       write_to_lcd(x); // zapis do LCD
    }

    // funkcja zapisu tekstu do wyświetlacza LCD
    void write_text(char * s)
    {
       while(*s) // do napotkania 0
         {
         write_char(*s); // zapisz znak wskazywany przez s na LCD
         s++; // zwiększ s (przygotuj nastepny znak)
         }
    }

    // funkcja inicjująca LCD
    void lcd_init(void)
    {
       // ustawienie wszystkich linii sterujących LCD jako wyjścia
       DDR_DB4 |= _BV(DB4);
       DDR_DB5 |= _BV(DB5);
       DDR_DB6 |= _BV(DB6);
       DDR_DB7 |= _BV(DB7);
       DDR_E |= _BV(E);
       DDR_RS |= _BV(RS);
       //
       _delay_ms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
       CLR_E; // E = 0
       CLR_RS; // RS = 0
       char i; // zmianna licznikowa
       for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
       {
          SET_E; // E = 1
          out_nibble(0x03);
          CLR_E; // E = 0
          _delay_ms(5); // czekaj 5ms
       }
       SET_E; // E = 1
       out_nibble(0x02);
       CLR_E; // E = 0

       _delay_ms(1); // czekaj 1ms
       //write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
       write_command(0x28);
       write_command(0x08); // wyłącz LCD, kursor i miganie
       write_command(0x01); // czyść LCD
       write_command(0x06); // bez przesuwania w prawo
       write_command(0x0C); // włącz LCD, bez kursora i mrugania
    }


    void lcd_goto(unsigned char column, unsigned char line)
    {
      unsigned char addr;
      line--;
      column--;
      addr = (line * 64) + column;
      write_command(addr | 0x80);
    }

    //ds18b20
    uint8_t ow_reset(void){
       uint8_t a;
       ow_lo();
       delay_us(480);
       ow_hi();
       delay_us(70);
       a = OWPININ & OWIN; // 0 - obecny, else - nieobecny
       delay_us(410);
       return a;
    }

    void ow_wrbit(uint8_t bit)
    {
       ow_lo();
       if(bit == 0)
       {
          delay_us(60);
          ow_hi();
          delay_us(10);
       }
       else
       {
          delay_us(6);
          ow_hi();
          delay_us(64);
       }
    }

    uint8_t ow_rdbit(void)
    {
       uint8_t a;
       ow_lo();
       delay_us(6);
       ow_hi();
       delay_us(9);
       a = OWPININ & OWIN; //0 - 0, else -1
       delay_us(55);
       return a;
    }

    uint8_t ow_rdbyte(void)
    {
       uint8_t a, b;
       a = 0;
       for(b = 0; b <8; b++)
       {
          a >>= 1;
          if (ow_rdbit()) a += 128;
       }
       return a;
    }

    void ow_wrbyte(uint8_t data)
    {
       uint8_t a;
       for(a = 0; a < 8; a++)
       {
          ow_wrbit(data & 1);
          data >>= 1;
       }
    }

    void lcd_putuint8(uint8_t a)
    {
       uint8_t b;
       char c;
       b = a / 100;
       c= b + 0x30;
       if (b) write_char(c);
       a -= b * 100;
       b = a / 10;
       c= b + 0x30;
       write_char(c);
       a -= b * 10;
       c= a + 0x30;
       write_char(c);
    }

    void lcd_putuint16(uint16_t a)
    {
       uint8_t b;
       char c;
       
       b = a / 10000;
       // write_char(b + 0x30);
       a -= b * 10000;
       b = a / 1000;
       c = b + 0x30;
       write_char(c);
       a -= b * 1000;
       b = a / 100;
       c = b + 0x30;
       write_char(c);
       a -= b * 100;
       b = a;
       lcd_putuint8(b);
    }

    int main(void)
    {
       uint8_t a =0, b =0, c =0;
       uint16_t e =0;

       lcd_init();
       
       OWPORT &= ~_BV(OWPIN);
       ow_hi();
       for(;;)
       {
          if( ow_reset() != 0 )
          {
             lcd_goto(1,1);
             write_text("brak dallasa");
             return 1;
          }
          
             ow_wrbyte(0xCC); //SKIP ROM
             ow_wrbyte(0x44); //CONVERT T
             for(a = 1; a <100; a++)
             {
                delay_us(10000);
             }

             if( ow_reset() != 0 )
             {
                lcd_goto(1,1);
                write_text("brak dallasa");
                return 1;
             }

             ow_wrbyte(0xCC); //SKIP ROM
             ow_wrbyte(0xBE); //READ SCRATCHPAD
             a = ow_rdbyte();
             b = ow_rdbyte();
             c = a & (0x0F); // wartości dziesiętne (po przecinku)
             a >>= 4;
             b <<= 4;
             a = a | b;
             e = 625 * c;
             write_command(0x01); // czyść LCD
             lcd_goto(1,1);
             write_text("temperatura");
             lcd_goto(1,2);
             lcd_putuint8(a);
             write_text(",");
             lcd_putuint16(e);
       
       }
       return 0;
    }

  • #2 24 Lip 2007 19:18
    szod
    Poziom 33  

    Najpierw posprawdzaj dokładnie czy wszystko masz w porządku ze stroną
    sprzętową. Zobacz przede wszystkim jaką masz częstotliwość taktowania
    ATmegi. Jak będzie inna niż zakłada program to zmienią Ci się opóźnienia
    a na te DS18B20 jest czuły. Dobrze też zastosować kwarc zewnętrzny
    zapewniający bardziej precyzyjne odmierzanie opóźnień niż generator
    wewnętrzny.

  • #3 24 Lip 2007 23:18
    Janek_mkl
    Poziom 9  

    Częstotliwość ustawiłem na 8MHz - wewnętrzny, raczej już mi się nie uda podłączyć kwarcu

    jeszcze posprawdzam, ale raczej wszystko podłączone dobrze

    z tego co się zorientowałem to funkcja resetująca ds'a działa i wykrywa go.. a poza tym, co jest źle :/ to już nie wiem

  • #4 25 Lip 2007 20:20
    Paweł Es.
    Pomocny dla użytkowników

    Przeczytaj dokładnie specyfikację transmisji z termometrem z tym termometrem Dallasa:

    wstępnie wyświetl te zmienne (zdaje się a i b) na lcd i zobacz czy zmieniają wartość przy zmianie temperatury, jeżeli nie to znaczy, że albo masz walniętego Dallasa albo coś jest z transmisją nie tak (np. odczytem czy zapisem bitów z/do termometru). Sądząc z tego co widzę w programie to masz czasy w funkcjach transmisji na dolnej granicy dopuszczonej przez producenta.

    To, że program wykrywa termometr nic nie znaczy, bo zgłoszenie jest inne czasowo niż sama trasmisja danych po 1-Wire, gdzie bity są kodowane w szczelinach bitowych i kodowane niejako szerokością impulsu.


    0. Nie wiem czy zasilasz Dallasa normalnie czy z linii danych, bo jak to 2 to tam trzeba specyficznie sterować (jakiś mosfet podciągający linię danych przez odpoiwdni czas dla doładowania kondensatora podtrzymania zasilania w Dallasie.

    1. Wydaje mi się, że stałe czasowe są na dolnej granicy (szczelina czasowa zapisu czy odczytu bitów może być minimum 60 µs) daj z zapasem np. 70 czy 80 (w funkcjach zapisu i odczytu).

    2. Czytaj ze Scratchpada wszystkie 9 bajtów (np. do tablicy) tak jak zaleca producent.

    3. Po odczytaniu tych 2 bajtów temperatury umieść je w zmiennej integer (16 bitów ze znakiem), np: Temp.

    4. Sprawdź czy temp nie jest ujemna jeżeli jest to Temp=-Temp, oraz zapamiętaj fakt zmiany znaku.

    5. Rozbijaj na grupy całkowitą i ułamkową dopiero tak opracowaną wielkość (temperatura z ds18b20 jest podawana w systemie uzupełnienia do 2 a twoje funkcje chyba tego nie uwzględniają.

  • #5 26 Lip 2007 21:11
    Janek_mkl
    Poziom 9  

    Pozmieniałem czasy wg dokumentacji dallasa i teraz dostaję 85.00 stopni - cały czas :/

    a układ mam podłączony w ten sposób:

    problem z termometrem ds18b20

    takie podłączenie zobaczyłem na jednym ze schematów w internecie

    Dodano po 1 [godziny] 10 [minuty]:

    Jak długi może być kabel na którym jest podłączony termometr dallasa ??

    Dodano po 1 [godziny] 29 [minuty]:

    Jak korzystam z gotowych bibliotek, gotowe funkcje do komunikacji z 1wire(definiuje się tylko z jakim clk pracuje kontroler) mam to samo. Czyli ta jedyna wartość jaką pokazuje to na pewno nie temperatura :/

    czy to że uzywam wewnętrznego clk 8MHz moze mieć jakiś wpływ na to ??

    Dodano po 1 [godziny] 18 [minuty]:

    Długość kabla odpada , podłączyłem bez kabla i tez nie działa :/

  • #6 27 Lip 2007 14:58
    Paweł Es.
    Pomocny dla użytkowników

    Aaaa ! bo ty masz układ z tzw. pasożytniczym zasilaniem, to wymaga trochę innej obsługi.

    Te wersje oprogramowania co zamieściłeś to obsługują transmisję w przypadku gdy Dallas jest normalnie zasilany, tj.

    GND - Masa
    DIO - dwukierunkowa linia danych (podciągnięte do +5V przez 4.7k
    Vdd - +5V

    W twoim przypadku stosuje się zasilanie z linii danych co wymaga "mrugania" jedynką na tym porcie co tę diodę zasila (tylko muszą być zachowane odpowiednie czasy), bo to doładowuje kondensator podtrzymania zasilania w Dallasie.[/b]

    Przy stosowaniu tej metody zasilania masz zablokowaną magistralę na czas konwersji (lub kopiowania danych z pamięci notatnikowej do EEPROM) a więc brak możliwości "rozmowy" np. z innymi układami na tej samej magistrali.

    Poza tym możesz uszkodzić porty mpsora jak się rąbniesz w programowaniu.


    A propos, jakiego używasz zestawu oprogramowania (nazwa, wersja) i jaki z tym współpracuje programator ?

    Mozesz sprawdzić czy ten kompilator co masz obsługuje Atmegę162, bo muszę coś napisać pod niego i szukam narzędzi ?

    Tu jest przetłumaczony fragment z karty katalogowej
    http://acquerra.com.au/astro/equipment/temp-logger/ds18b20.pdf

    o zasilaniu Termometrasa od Dallasa. ;))

    Zasilanie DS18B20

    DS18B20 może być zasilany z zewnętrznego źródła zasilania przez końcówkę Vdd lub działać w trybie „zasilania pasożytniczego”, który pozwala na funkcjonowanie bez lokalnego zewnętrznego zasilania. „Zasilanie pasożytnicze” jest bardzo użyteczne w zastosowaniach, które wymagają zdalnego pomiaru temperatury lub mają duże ograniczenia co ilości miejsca. Rysunek nr 1 pokazuje układ sterowania zasilaniem „pasożytniczym”, które „kradnie” prąd z magistrali 1-Wire, przez końcówkę DQ, kiedy linia jest w stanie wysokim. „Skradziony” ładunek zasila DS18B20 kiedy linia jest w stanie wysokim i trochę ładunku jest przechowywane w pojemności Cpp, dla dostarczania zasilania kiedy linia jest w stanie niskim. Jeżeli termometr jest używany w trybie „pasożytniczym”, to końcówka Vdd musi być podłączona do masy.
    W trybie pasożytniczym, linia 1-Wire i Cpp są w stanie dostarczyć wystarczająco duzo prądu do DS18B20 dla większości operacji, jak długo zachowane są odpowiednie wymagania co do taktowania i napięć zasilających (patrz: DC ELECTRICAL CHARACTERISTICS i AC ELECTRICAL CHARACTERISTICS).

    Jednak kiedy DS18B20 wykonuje pomiar temperatury lub kopiuje dane z pamięci notatnikowej do EEPROM, prąd roboczy może osiągnąć 1.5mA. Prąd ten może spowodować nieakceptowalny spadek napięcia na słabym rezystorze podciągającym linię 1-Wire i więcej prądu musi być dostarczone do Cpp. Dla zapewnienia, że DS18B20 ma wystarczającą ilość prądu, niezbędne jest silne podciąganie kiedy ma miejsce konwersja temperatury lub dane są kopiowane z pamięci notatnikowej do EEPROM.
    Można to uzyskać prze użycie tranzystora MOSFET, podciągającego magistralę bezpoścednio do linii zasilającej, tak jak to pokazano na rysunku, nr 4.

    Linia 1-Wire musi być przełączona na silne podciąganie 10us (max) po wydaniu komend Convert T (44h) lub Copy Scratchpad (48h) i magistrala musi być utrzymywana przez czas konwersji (tconv) lub czas transmisji danych (twr=10ms). Żadne inne działanie nie może mieć miejsca na magistrali 1-Wire kiedy włączone jest silne podciąganie.

    DS18B20 może być także zasilany metoda konwencjonalną przez podłączenie zewnętrznego zewnętrznego zasilania do końcówki Vdd, jak to pokazano na rysunku 5. Zaletą tego rozwiązania jest to, że nie jest potrzebny MOSFET do podciągania linii a magistrala 1-Wire nie jest blokowana na czas konwersji temperatury.

    Użycie zasilania „pasożytniczego” nie jest zalecane przy pomiarze temperatur powyżej 100 stopni Celsiusa, ponieważ DS18B20 może nie być w stanie utrzymać komunikacji z powodu większego prądu upływu, który może wystąpić przy tych temperaturach. Na takie przypadki zalecane jest standardowe zasilanie przez końcówkę Vdd.

    W niektórych sytuacjach sterownik zarządzający magistralą może nie wiedzieć jak są zasilane układy DS18B20 na magistrali. Sterownik potrzebuje tej informacji dla określenia czy powinien uruchomić silne podciąganie podczas konwersji temperatury. Dla uzyskania tej informacji, sterownik może wysłać polecenie Skip ROM (CCh), po niej polecenie Read Power Supply (B4h) a następnie odczyt „szczeliny czasowej”. Podczas szczeliny czasowej odczytu, układy zasilane „pasożytniczo” wymuszają stan niski na magistrali a układy zasilane normalnie pozostawią magistralę w stanie wysokim. Jeżeli na magistrali został wymuszony stan niski to sterownik wie, że musi wymusić silne podciąganie podczas konwersji temperatury.

  • #7 27 Lip 2007 19:42
    Janek_mkl
    Poziom 9  

    Cytat:

    A propos, jakiego używasz zestawu oprogramowania (nazwa, wersja) i jaki z tym współpracuje programator ?

    Mozesz sprawdzić czy ten kompilator co masz obsługuje Atmegę162, bo muszę coś napisać pod niego i szukam narzędzi ?


    Używam najnowszego AVR Studio 4 do pisania programów, a do programowania PonyProg2000 oba obsługują (z tego co tu widzę) Atmegę162
    Programator to jest taki podłaczany do portu drukarki LPT - to się chyba nazywa programator ISP

    Cytat:

    Poza tym możesz uszkodzić porty mpsora jak się rąbniesz w programowaniu.


    To zabrzmiało groźnie :/ - możesz powiedziec czego mam nie robić ? ;P

    Zobaczę czy mi się uda coś wykombinować :]

  • #8 27 Lip 2007 20:56
    Paweł Es.
    Pomocny dla użytkowników

    Nie ustawiać jako wyjście bitów obsługujących magistralę i diodę symulującą podciąganie w stanach różnych w szczególności pinu diody na 1 i pinu magistrali na 0.

    A czym kompilujesz te programy w C, bo AVR studio to zdaje się tylko assembler trawi ?

  • #9 27 Lip 2007 21:08
    Janek_mkl
    Poziom 9  

    Tak, AVR Studio kompiluje i w c, i w asm, i chyba jeszcze w czymś

    Tzn, czy to co do tej pory robiłem z PD0, czyli miejscem podłączenia magistrali, nie zagrażało mojemu ukontrolerowi?? (tam było tylko ustawianie tego jako wejście i jako wyjście - rejestr DDR), z wyjściem na diodę jeszcze nic nie robiłem.

  • #10 27 Lip 2007 23:39
    Paweł Es.
    Pomocny dla użytkowników

    Nie, tylko trzeba uważać by bitów portach nie zewrzeć gdy są w różnych stanach.

  • #11 27 Lip 2007 23:44
    Janek_mkl
    Poziom 9  

    Mniej więcej zrozumiałem.. ideę zrozumiałem

    Cytat:

    Linia 1-Wire musi być przełączona na silne podciąganie 10us (max) po wydaniu komend Convert T (44h) lub Copy Scratchpad (48h) i magistrala musi być utrzymywana przez czas konwersji (tconv) lub czas transmisji danych (twr=10ms). Żadne inne działanie nie może mieć miejsca na magistrali 1-Wire kiedy włączone jest silne podciąganie.


    to tak po komendzie Convert T (44h) lub Copy Scratchpad (48h)na czas 10ms mam włączyc silny pull-up - ale co to znaczy ?? wystawić 1 na linię z diodą, czy może na ta drugą, na obie ??

    p.s. wcześniej jak czytałem dokumentację to jakoś, tak tylko przejrzałem ta część o zasilaniu, nie koncentrowałem się na tym, tylko na czasach :P

  • #12 27 Lip 2007 23:59
    Paweł Es.
    Pomocny dla użytkowników

    W ciągu mniej niż 10us musisz wystawić jedynkę na linii z diodą i utrzymać ją przez cały czas trwania konwersji (tyle ile w karcie katalogowej podano) i przez ten czas magistrala jest zablokowana dla jakich kolwiek transmisji. Potem kasujesz jedynkę z wyjścia z diodą i działasz normalnie dalej.

    Przez tę diodę podawane jest zasilanie potrzebne do pracy DS18B20 w czasie konwersji czy przepisywania danych do EEPROMU.

  • #13 28 Lip 2007 00:42
    Janek_mkl
    Poziom 9  

    ok sprawdzę .. :) wielkie dzięki za pomoc :)

    Dodano po 40 [minuty]:

    nic z tego dodałem ustawianie strong pull-up i dalej mam to samo co wcześniej

    Code:

    ..
             ow_wrbyte(0xCC); //SKIP ROM
             ow_wrbyte(0x44); //CONVERT T
             // OWPORT - port od 1wire
             // OWPIND - linia z dioda
        OWPORT |= _BV(OWPIND);   // wlacz silny pull-up
                _delay_ms(20000);
             OWPORT &= ~_BV(OWPIND);  // wylacz silny pull-up
    ..

  • Pomocny post
    #14 28 Lip 2007 14:28
    Paweł Es.
    Pomocny dla użytkowników

    Chyba już wiem co może być, tylko nie wiem gdzie jest źródło problemu.

    Doczytałem się, że po zerowaniu po włączeniu zasilania bajty odczytu temperatury są ustawiane na wartość 85.00 stopni i tę wartość udaje ci się odczytać z rejestrów DS18b20 (co świadczy, że procedury odczytu działają poprawnie).

    Doczytałem się jednak też, że w układzie zasilania "pasożytniczego" zerowanie DS18B20 sygnałem dłuższym niż 960µs może wystąpić efekt podobny jak zerowanie po włączeniu zasilania. Ponieważ każdy cykl poleceń zapisu czy czytania DS18B20 zaczyna się od polecenia Reset

    problem z termometrem ds18b20

    Sprawdź czy twój procesor pracuje rzeczywiście z zegarem 8MHz a nie z 1,2 lub 4 MHz (zmiana wymaga ustawienia Fusebitów).

    Napisz prosty fragment zapalający diodę na 10 sekund (tak by to zmierzyć zegarkiem) będziesz wiedział czy pętle opóźniające dają tyle ile mają dawać.

    Zapal_LED
    Delay_ms(10000)
    Zgaś_LED

    Możliwe, że w pkt. 7, Reset jest zbyt długi i daje efekt taki jakby to był reset po włączeniu zasilania, co powoduje ustawienie bajtów temperatury na 85.00 stopni, którą to wartość odczytujesz.


    Ta informacja o tych 960 µs jest podana na dole 19 strony tej karty katalogowej:

    http://acquerra.com.au/astro/equipment/temp-logger/ds18b20.pdf

    pkt. 2 uwag pod tabelą AC ELECTRICAL CHARACTERISTICS

    2) Under parasite power, if tRSTL > 960µs, a power on reset may occur.

  • #15 28 Lip 2007 18:22
    Janek_mkl
    Poziom 9  

    Cytat:

    Zapal_LED
    Delay_ms(10000)
    Zgaś_LED


    Zrobiłem takie coś za pomocą _delay_ms() z #include <avr/delay.h>

    Code:

            cd_init();

       lcd_goto(1,1);
       write_text("*");
       for(i=0; i<40; i++)
           _delay_ms(250);        // 10 000 ms = 10s
       
          
       write_text("<*>");


    i wykonyje się to w około 1 - 2 s

    bity CKSEL mam ustawione tak: 0 1 0 0 -> czyli zegar wewn. 8MHz i tak tez definiuję
    #define F_CPU 8000000

    Dodano po 22 [minuty]:

    :D :D :D -E U R E C A- :D :D :D

    Działa !! a problem był w jednej wrednej linijce tego kodu który już wcześniej pokazałem, czasy, oczywiście, też w międzyczasie poprawiałem, no i dodałem strong pullup, ale zadziałało dopiero po usunięciu tej linijki z kodu :

    ...
    lcd_init();

    OWPORT &= ~_BV(OWPIN);
    ow_hi();
    for( ; ; )
    ...

    Własciwie to sam nie wiem po co ja tam umieściłem :P

    Teraz mi pokazuje ładnie temperaturę 27 stopni z jakimś przecinkiem,.. heh trochę gorąco dzisiaj :P

    Jeszcze raz dzięki wielkie za pomoc i czas spędzony przy moim drugim już problemie.

    pozdr

  • #16 29 Lip 2007 11:18
    Paweł Es.
    Pomocny dla użytkowników

    Ale czym ten lcd_init gryzie się z Dallasem ? Ma jakieś wspólne linie czy jak ?

  • #17 29 Lip 2007 11:28
    Janek_mkl
    Poziom 9  

    Nie :), chodzi tylko o ta pogrubioną linijkę :P, tamte wypisałem tak żeby było widać w którym miejscu się znajduje, żeby nie szukać.

  • #18 20 Lut 2009 13:09
    SzymonHK
    Poziom 20  

    Podłączę się pod temat, czy DS18B20, mogę zasilać pasożytniczo, jeśli na magistrali 1-wire potrzebuję umieścić 5 dallasów?

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME