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

Atmega8 i DS18B20 - pomiar temperatury poniżejk 10st. Celsjusza.

leonsocio 01 Mar 2012 09:43 5547 47
  • #1 10618158
    leonsocio
    Poziom 28  
    Witam:) Złożyłem układ z linku: https://www.elektroda.pl/rtvforum/topic811706.html
    Moje dzieło pracuje jednak z dwoma czujnikami a nie czterema, oto kod kolegi Duch__ :

    Duch__ napisał:
    Można...

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Po wgraniu HEX-a do procka wyświetlacz pięknie pokazuje odczyt dwóch temperatur, jednak poniżej 10st. na plusie, program się resetuje i zaczyna od nowa procedurę.

    Robstar napisał:
    Nie wiem jak u was ale wydaje mi się że Formatowanie trzeba zmienić ponieważ przy pomiarze poniżej 10 C wszystko znika i ja zrobiłem tak że z tego:

    Ss = Format(ss , " 0.0")

    zrobiłem tak

    Ss = Format(ss , "00. ") i chyba teraz jest OK ale trzeba by dokładnie sprawdzić przy minusie.

    Jeśli się myle to proszę o poprawkę :)


    Zmieniłem program wg zaleceń wyżej, jednak bez rezultatu. Znalazłem w sieci kilka innych, podobnych programów do pomiaru temperatury, wszystkie działały w podobny sposób, jednak każdy z nich poniżej 10st. Cejslusza zachowuje się tak samo, odnoszę więc wrażenie, że to nie jest kwestia błędnego oprogramowania tylko może coś źle podłączyłem. Czy to może by np brak kondendsatora 100n przy AREF do masy? Pin 5 (R/W) od wyświetlacza podpięty do masy.

    EDIT: przypomniało mi się jeszcze coś, być może to nieistotny szczegół: mianowicie używam programatora USBasp i nie miałem zdjętej zwory umożliwiającej programowanie 1,5Mhz, aczkolwiek samo wgrywanie kodu mimo założonej zwory przebiegło bez problemów, więc pewnie ten fakt nie ma znaczenia... Fusebity mam ustawione fabrycznie a z tego wynika, że Watchdog jest włączone.
    Balu napisał:

    Jeśli procesor działa, ale zawiesza się / resetuje/ nie działa część pinów(portów):
    1) Czy są kondensatory 100nF?
    2) Czy nie masz włączonego watchdoga?
    3) Czy masz zasilanie na AVCC?
    4) Czy masz dobrze ustawione rejestry DDRxn?
    Pozdrawiam:)


    Należy go WYŁĄCZYĆ?
  • #2 10619889
    kamil1cos7
    Poziom 14  
    Wydaje mi się że gdyby watchdog był włączony to uP resetował by się przy każdej dłuższej funkcji opóźniającej i dla wszystkich temperatur a nie tylko dla tych poniżej 10 stopni...
  • #3 10620286
    leonsocio
    Poziom 28  
    Manewry z Watchdogiem nic nie dały,. wyświetlacz w ogóle nie inicjalizował się po włączeniu zasilania.
  • #4 10622749
    kamil1cos7
    Poziom 14  
    Wyłącz watchdog, to na pewno. Nie programowałem nigdy w Bascom, ale nie widzę żebyś przed inicjacją wyświetlacza miał opóźnienie o kilkanaście-kilkadziesiąt ms a musi być. Jeśli to nie pomoże to sprawdź ciągłość połączeń... Jeśli masz czujniki w trybie zasilania pasożytniczego to zmień rezystor podciągający na ok 2k.
  • #5 10622785
    snnaap
    Poziom 25  
    a czy temperaturę powyżej 10 st pokazuje prawidłowo? Wyniki są prawidłowe?

    Dodano po 10 [minuty]:

    Pierwsze co to wyświetl na ekranie co masz w zmiennej Ss po odczycie wprost z czujnika przy tem poniżej 8 stczyli :

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #6 10623195
    leonsocio
    Poziom 28  
    kamil1cos7 --->, tak, czujniki mam w trybie pasożytniczym, po pracy podmienię rezystor na 2k;
    snnaap ----> tak, powyżej 10st. Celsjusza wyświetla prawidłowo, wg termometru, w pokoju mam 22st, więc raczej nie przekłamuje.

    snnaap napisał:

    Pierwsze co to wyświetl na ekranie co masz w zmiennej Ss po odczycie wprost z czujnika przy tem poniżej 8 stczyli :

    Ss = Str(i1)
    Locate 1 , 1
    Lcd "Zew" ; Ss ; Chr(0) ;

    Nie bardzo rozumiem to zdanie.

    Wkładając czujnik do zamrażarki, temperatura zaczyna spadać stopniowo do 10, poniżej natychmiast się resetuje i wyskakuje mi znów napis powitalny i tak w kółko.
  • Pomocny post
    #7 10623267
    snnaap
    Poziom 25  
    leonsocio napisał:
    kamil1cos7 --->, tak, czujniki mam w trybie pasożytniczym, po pracy podmienię rezystor na 2k;
    snnaap ----> tak, powyżej 10st. Celsjusza wyświetla prawidłowo, wg termometru, w pokoju mam 22st, więc raczej nie przekłamuje.

    snnaap napisał:

    Pierwsze co to wyświetl na ekranie co masz w zmiennej Ss po odczycie wprost z czujnika przy tem poniżej 8 stczyli :

    Ss = Str(i1)
    Locate 1 , 1
    Lcd "Zew" ; Ss ; Chr(0) ;

    Nie bardzo rozumiem to zdanie.

    Wkładając czujnik do zamrażarki, temperatura zaczyna spadać stopniowo do 10, poniżej natychmiast się resetuje i wyskakuje mi znów napis powitalny i tak w kółko.


    Chodzi mi o to abyś nie wykonywał tej instrukcji : Ss = Format(ss , " 0.0")
  • #8 10623299
    leonsocio
    Poziom 28  
    Aha, rozumiem, dzięki. Czyli usunąć ją z programu dla obu czujników tak?
  • #10 10626095
    leonsocio
    Poziom 28  
    A więc snnaap- po usunięciu instrukcji wymienionej przez Ciebie, wynik jest pokazany bez przecinka, czyli np 23,1st wyświetla jako 231. Po zejściu poniżej 10stopni (czyli wyświetlanego jako 100), termometr pracuje nadal prawidłowo i schodzi liniowo coraz niżej. Jednakże im bardziej 'brakuje' cyfer, czyli np jak wynik schodzi poniżej '100', w miejsce ostatniej cyfry wyświetla się znak stopnia, czyli np 9st jest wyświetlane jako 90 st st Celsjusza (znak st. zdublowany), natomiast 0,6st określa jako 6 st st st Celsjusza ([potrojony znak stopnia).
    Gdy zmienię kod z

    Ss = Format(ss , " 0.0")

    na

    Ss = Format(ss , "0.0")

    mierzy mi temperaturę elegancko z odpowiednim przecinkiem, jednak poniżej 10st znów jest historia ze zdublowanym znakiem stopni.
  • #11 10627449
    adambehnke
    Poziom 24  
    A może pokażę jak ja to robiłem:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    I tym sposobem zawsze mi wszystko ładnie pokazywało na LCD.


    A że tak zapytam.. to dlaczego tak usilnie walczysz z tym znakiem stopni i przesuwa ci się on jak popadnie? Nie lepiej (prościej) ładowac go w określoną pozycję na LCD za pomocą LOCATE x,x ? Tak samo wynik temperatury po prostu ładuj także w określoną i tą samą pozycję na lcd.
    Po co ładować i kasować na LCD te dane które są wyświetlane zawsze i na dodatek w tych samych miejscach? Rozumiem że przy małym i nie wymagającym kodzie nie ma za bardzo sensu przyśpieszać jego działania eliminując bez sensowne operacje ale jak piszesz już prawdziwy (czy. duży) kod to zrozumiesz o czym piszę.

    Dla mnie z Twoim kodem jest wszystko ok. Problemem jest sposób w jaki to wyświetlasz.
    A jak już Chcesz całkiem uprościć tego upierdliwego byka to zrób np. tak :

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 10628845
    leonsocio
    Poziom 28  
    Kod Basic4GL - [zwiń]
    Lcd "Zew" ; Ss ; Chr(0) ;" "

    Ta zmiana niestety nie zdało egzaminu, natomiast jak miałby wyglądać moj wcześniejszy kod wraz z Twoimi zmianami?
  • #13 10628891
    adambehnke
    Poziom 24  
    Jak mogła nie zdać egzaminu ?Tzn. wyświetlanie powinno być prawidłowe(dalej nie wiem dlaczego się restartuje program). Skoro przy każdym odświeżaniu wyświetlacza wyświetlane są na nowo dane i ostatni znak po (stopniu) jest czyszczony. I nie ważne ile znaków będzie miał wynik temperatury. Zawsze wyświetli się to poprawnie.
    A zmiana jaką zaproponowałem przedstawiłem dla temperatury zewnętrznej. Sprawdziłeś dokładnie czy i jak to działa także dla
    Lcd "Wew" ; Ss ; Chr(0) ;" "
  • #14 10628933
    leonsocio
    Poziom 28  
    Miałem na mysli, że nie zdała egz względem wyświetlania temperatury poniżej plus 10st, wtedy dzieje się to co wcześniej, tj resetuje mi program witając oknem powitalnym.
    Lcd "Wew" ; Ss ; Chr(0) ;" ";

    po tym także następuje reset poniżej 10st.
  • #17 10629588
    leonsocio
    Poziom 28  
    Działa :) Jak to jednak bywa, poniżej 10st. pokazuje z zerem przedtem, czyli np. 9,7st pokazuje jako 09,7 st. Jak zniwelować to zero przez 9 żeby był czysty wynik oraz jak oddzielić spacją między 'wew' a odczyt, tj teraz pokazuje np: 'wew23,0st' a chciałbym żeby wyświetlało 'wew 23,0st'.

    EDIT: przedwczesna radość... poniżej 10st, rzeczywiście nie resetuje się, niestety, znak stopni się dubluje i mam wynik np 'wew09,1st st'
  • #18 10631343
    WOBI
    Poziom 19  
    Przykład kolegi Duch pokutuje na tym forum różnymi błędami, jest wiele postów i ciągle użytkownicy forum wzorujący sie na tym przykładzie maja kłopoty ;).


    Pierwszy błąd jaki masz to że się resetuje to przyczyną jest za mała definicja zmiennej string Ss As String * 6

    zobacz: masz string 6 znaków Ty formatujesz tak Ss = Format(ss , " 0.0")
    czyli masz spację przed zmiennna którą formatujesz czyli to juz jest jeden znak do tego temperatura - 1 0 , 0 C to masz 6 znaków plus ta spacja na początku i przekraczasz 6 znaków bo masz 7 znaków, albo skasuj spacje z komendy format a dodaj ją po napisie "zew " i "wew " albo

    zmień na co najmniej 7 czyli Ss As String * 7, nadpisujesz gdzieś zmienne w ramie procesora bo zmienna string jest u Ciebie 6 i ją przekraczasz właśnie poniżej -10 C i wtedy program leci w krzaki i resetuje się procesor ;)

    Zmień też częstotliwość procesora na wyższą niż 1MHz bo czasami wskakują zera zamiast prawidłowej wartości temperatury, dzieje sie to tylko na 1MHz taktowania procka (prawdopodobnie czasowo zależne procedury nie nadążaja w obsłudze 1Wire, to błąd komplilatora, też opisany w poście) inni koledzy też to obserwowali.

    Źle jest rozwiązane pozycjonowanie temperatury na LCD.

    tu masz post z problemem tez opartym na "DUch" Link

    a tak powinno być to zrobione prawidłowe pozycjonowanie, jest tez dodane wyświetlanie kresek gdy nie ma czujnika lub jest uszkodzony/rozłączony a o tym też się zapomina, poczytaj post co podałem.

    Kod: text
    Zaloguj się, aby zobaczyć kod



    a tak powinien wyglądać prawidłowy program bez zbednych bajerów ale uwaga!!! 2 MHz

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #19 10631815
    leonsocio
    Poziom 28  
    Wgrałem Twój ostatni program, elegancko wyświetla i schodzi poniżej 10st, jednak gdy ma pokazać temperaturę minusowa, na LCD pokazuje się ciąg niezrozumiałych znaków, zupełnie przypadkowa kolejność znaków. Gdy odetnę zasilanie i znów je podłącze, wyświetlacz pokazuje np -6st, gdy wyjmę czujnik na zewnątrz i temperatura rośnie, w momencie gdy się zbliża do zera, znów następuje niekontrolowany ciąg znaków. Czy przyczyną może być brak kondensatorów 100nF na zasilaniu? Mam je tylko między Avcc i GNd, bo na więcej juz nie mam miejsca na płytce stykowej;/
  • #20 10631843
    WOBI
    Poziom 19  
    A jak masz podłączony LCD? Czy pin R/W masz do masy podłączony, to ważne. W zasilaniu vcc procesora kondensator elektrolityczny 10u też musi być.
  • #21 10631866
    leonsocio
    Poziom 28  
    Tak, oczywiście pin R/W jest podpięty do masy. Zasilanie jest realizowane za pomocą LM7805 i elektrolita 1000uF.
  • Pomocny post
    #22 10631905
    WOBI
    Poziom 19  
    Jaką masz częstotliwość taktowania? 1MHz czy 2MHz? W mojej płytce wszystko działa bez problemu, jak masz fusebity ustawione?
  • #23 10631919
    leonsocio
    Poziom 28  
    Częstotliwośc mam 2Mhz, fusy ustawione CKSEL3..0="0010". U mnie też działa, ale tylko do momentu gdy temperatura jest powyżej 0st.
  • #24 10631943
    WOBI
    Poziom 19  
    A zmien deklaracją zmiennej na Dim Ss As String * 7 lub 8.

    i dodaj za crystal

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jaki masz numer wersji Bascoma?
  • #25 10631964
    leonsocio
    Poziom 28  
    Mój Bascom to 1.11.8.3, ale w nim tylko kompiluje, HEX-a wgrywam programem AVR8 Burn-O-Mat v2.
  • #27 10632038
    leonsocio
    Poziom 28  
    Jest poprawa, jednak gdy temperatura spada do 0, LCD wyświetla nr seryjne DS-a, 4 razy mignie tymi cyframi, po czym wyświetla temperaturę ujemną. Przy wzroście temperatury jest tak samo, gdy z ujemnej się zbliża do zera, ok 3-4 razy migną cyfry z odczytem nr. seryjnego DS-ów po czym pokazuje poprawną temperaturę.
  • #29 10632110
    leonsocio
    Poziom 28  
    Niekoniecznie, na ostatnim programie, cały czas wyświetla mi 85st. z obu czujników.
  • #30 10632181
    WOBI
    Poziom 19  
    Myślę że to wina Twojego kompilatora. Poprawiłem kod powyżej sprawdź teraz, lub drugi wariant poniżej masz tu hex wgraj go bo to może kompilatror Twój coś szwankuje, 11.8.3 to stara wersja i miała troche błędów, jeśli ten hex będzie działał poprawnie to znaczy że błąd też leży po stronie kompilatora.

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA