Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

atmega8 + DS18B20 + 2x 7seg

tomzi 17 Lut 2012 21:30 3361 18
  • #1 17 Lut 2012 21:30
    tomzi
    Poziom 8  

    Witam, przekopałem się przez wiele tutoriali, postów, wątków, i nie znalazłem rozwiązania, więc postanowiłem opisać własny problem.

    Mianowicie:
    mam podłączone do Atmegi8 dwa wyświetlacze 7seg multipleksowane, oraz termometr cyfrowy DS18B20. Chciałem aby zmierzona temperatura była wyświetlana na tych 7seg, oczywiście ze względu na dwa wyświetlacze jedynie wartości całkowite bez znaku.

    Problem jest taki ze po podłączeniu wszystkiego, wgraniu programu na wyświetlaczach pojawia się na chwilę coś na wzór liczby 5.4 a dokładnie to takie cos:

    atmega8 + DS18B20 + 2x 7seg

    a po chwili wszystko się zeruje i zostaje jedynie 00, nic się nie zmienia przy przytrzymaniu w palcach termometru, ani wystawienie go na działanie temperatury ani zimna...

    Dodam ze działanie wyswietlaczy jest prawidłowe, bo po wpisaniu w zmienna liczba dowolna liczbę 2cyfrową od 00 do 99 wyświetla ją poprawnie...
    moj schemat:

    atmega8 + DS18B20 + 2x 7seg

    kod main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod



    kod ds18b20.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    kod ds18b20.h
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 18
  • #2 17 Lut 2012 23:59
    michalko12
    Specjalista - Mikrokontrolery

    Namieszałeś przy dekodowaniu temperatury z formatu DSa
    Przeczytaj to. Jak nie dasz rady sam tego poprawić to cię naprowadzimy. ;)

    0
  • #3 18 Lut 2012 00:20
    mirekk36
    Poziom 42  

    Najciekawszy jest w tym wszysrkim schemat podłączenia wyświetlaczy do procka, no a te 8 rezystorów do VCC to już mistrzostwo. Skąd ty bierzesz takie schematy?

    0
  • #4 18 Lut 2012 00:41
    tomzi
    Poziom 8  

    schemat sam skleciłem, może nie jest cudowny, może poprawny też nie jest do końca, przyznam że dopiero od niedawna zajmuję się elektroniką... że tak powiem dopiero się wdrażam. Co do tych rezystorów to czytałem ze potrzebne są rezystory podciągające do mocniejszego świecenia wyświetlaczy, no i... działa...


    @michalko12

    dzięki, przeczytam dokładnie i dalej próbuje :)

    0
  • #5 18 Lut 2012 15:57
    tomzi
    Poziom 8  

    Po przeanalizowaniu wszystkiego po raz kolejny, oraz analizując artykuł od michalko12 wygląda dla mnie to tak:

    skoro cały odczyt z ds'a zapisywany jest do tablicy ds18b20_pad to dwa pierwsze elementy jej to jest kolejno LSB i MSB, w LSB jest zapisywana wartość temp wraz z częścią ułamkową, a w MSB część wartości całkowitej temperatury oraz znak...
    i wyglada to tak Z Z Z Z Z Z C C | C C C C U U U U

    gdzie Z to znak, C to bity wartości całkowitej, U bity części całkowitej,

    więc:
    moja "temp" będzie składała się z 4rech najstarszych bitów LSB i MSB...

    w związku z tym:

    cała wartość temp => (ds18b20_pad[1] << 8) + (ds18b20_pad[0])
    a część całkowita jej to: ( (ds18b20_pad[1] << 8) + ds18b20_pad[0]) >> 4)

    tak więc kod będzie wyglądał tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    dobrze kombinuje?

    Hmmmm... po skompilowaniu i wgraniu na wyswietlaczu pokazuje sie 0u...
    ds dalej nie reaguje na zmiane temp...

    gdzie w pliku wyswietlacze.h mam zdefiniowane tylko i wyłącznie cyfry od 0 do 9...

    0
  • #6 18 Lut 2012 16:24
    mirekk36
    Poziom 42  

    tomzi napisał:
    schemat sam skleciłem, może nie jest cudowny, może poprawny też nie jest do końca, przyznam że dopiero od niedawna zajmuję się elektroniką...


    To nie o to chodzi, że ma być cudowny, ale niestety jest właśnie zły. Nie chodzi mi o to żeby się tu z ciebie broń Boże naigrywać, bo każdy musi zaczynać kiedyś. Ale zwracam ci po prostu uwagę, że takie podłączenie wyświetlacza jest po prostu nie to że "nie do końca może poprawne jak piszesz" - jest wręcz bardzo złe, a te rezystory to się daje w szereg z katodami np żeby ograniczać prąd. Tymczasem u ciebie procek działa na skraju możliwości i wydajności prądowej. Może nie ma to teraz bezpośredniego związku z twoim problemem ale pośrednio ma i na pewno będzie miało a szczególnie gdy procek w końcu nie wytrzyma i padnie.

    0
  • #7 18 Lut 2012 16:38
    michalko12
    Specjalista - Mikrokontrolery

    Przeanalizuj ten fragment kodu

    Kod: c
    Zaloguj się, aby zobaczyć kod


    A co do schematu, to uwierz, jest bardzo zły.

    0
  • #8 18 Lut 2012 17:08
    tomzi
    Poziom 8  

    Aż tak bardzo zły?

    To teraz przyznam ze schemat podłączenia tych wyświetlaczy dokładnie znalazłem tu na elektrodzie Link

    Tylko, ze w moim wypadku zamiast podłączyć pod masę, to katody podłączyłem do atmegi żeby sterować który ma być włączony...

    A podpowiecie jak miałoby to podłączenie wyglądać, żeby było prawidłowo i nie narobić sobie bałaganu ze coś spale / zniszczę?


    @michalko12

    Z tego kodu wynika, że jeżeli odczyt temp, jest ujemny to (dosłownie) "odwróć" go czyli zmień znak, następnie cały wynik przesuń w prawo tak aby pozbyć się ułamków... to rozumiem.. i to 100% racja...

    Jednak po zastosowaniu tego dalej nie śmiga... Może właśnie przez to błędne podłączenie??

    0
  • #9 18 Lut 2012 18:00
    michalko12
    Specjalista - Mikrokontrolery

    Pisanie programu to nie wszystko, trzeba jeszcze umieć usuwać błędy i go testować

    Sprawdź czy teraz coś Ci wyświetli:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 18 Lut 2012 18:14
    tomzi
    Poziom 8  

    Wiem, że metoda kopiuj wklej niczego nie zrobię, ani się nie nauczę. Nie na tym rzecz polega. Co do sugestii, sprawdzałem już wpisywanie ręcznie jakiejś wartości do zmiennej temp, oraz do tablicy, działa.
    W przypadku twojego wpisania danych na tablicy, wyświetla się 25, tak z resztą jak powinno być bo 0x01 to jest 00000001 a 0x09 to 0x10010000. Czyli po zastosowaniu kodu na przepisanie wartości do zmiennej temp i przesunięcie jej temp=11001 czyli 25. Wiemy teraz ze odczytywanie wartości temp z tablicy ds18b20_pad działa prawidłowo. Wiemy również teraz ze problem leży w kwestii zapisania danych do ds18b20_pad.

    Mam już jakiś trop, nie pozostało mi nic innego jak siąść na spokojnie i przemyśleć wszystko jeszcze raz... :)

    0
  • #11 18 Lut 2012 18:33
    michalko12
    Specjalista - Mikrokontrolery

    tomzi napisał:
    A podpowiecie jak miałoby to podłączenie wyglądać, żeby było prawidłowo i nie narobić sobie bałaganu ze coś spale / zniszczę?

    Np.
    atmega8 + DS18B20 + 2x 7seg

    0
  • #12 19 Lut 2012 14:22
    tomzi
    Poziom 8  

    No tak... Rzeczywiście schemat mam zły. Nie wiem czemu nie pomyślałem o tym sam... jak tylko dorwę sklep elektr. to się zaopatrzę w tranzystorki i poprawiam. Dzięki. A co do kodu to muszę go jeszcze raz przeanalizować.

    Edit:

    Mam jeszcze pytanie: czy jak nie chce używać kropki w jednym z wyświetlaczy to wystarczy że jej nie podepnę nigdzie czy lepiej ją do GND dać?

    0
  • #13 19 Lut 2012 15:22
    mirekk36
    Poziom 42  

    tomzi napisał:

    Mam jeszcze pytanie: czy jak nie chce używać kropki w jednym z wyświetlaczy to wystarczy że jej nie podepnę nigdzie czy lepiej ją do GND dać?


    No widzisz tak to jest gdy zamiast starać się zrozumieć schemat i to co się robi to się szuka jakichś gotowców. Przecież twoje pytanie świadczy, że nadal nie pochyliłeś się nad tym problemem. A jak podłączysz kropkę jak mówisz do GDN - to będzie ci każda świeciła dokąd nie przepali się albo - dioda LED w kropce, albo tranzystor albo jedno i drugie..... Jak zastanowisz się dlaczego to zrozumiesz w końcu jak to działa.

    0
  • #14 19 Lut 2012 21:54
    kamil1cos7
    Poziom 14  

    Witam,
    Można powiedzieć że jeszcze właściwiej było by gdybyś zastosował tranzystory PNP wtedy anody też byś sterował stanem niskim pinu.
    Pozdrawiam;)

    0
  • #15 20 Lut 2012 12:27
    tomzi
    Poziom 8  

    No tak... Teraz już wiem że głupszego pytania nie mogłem zadać co do podłączenia kropki do GND...

    Poczytałem i zasięgnąłem trochę wiedzy i poprawiłem schemat. Powiedzcie czy teraz jest w porządku?

    atmega8 + DS18B20 + 2x 7seg

    Zaraz udam się do elektronika po brakujące elementy i będę dalej próbował.

    @kamil1cos7
    W tamtym schemacie wyświetlacz zapalałem stanem 0 na katodzie. Zapalanie poszczególnych diod na anodzie była poprzez wpisanie stanu wysokiego na poszczególne piny uC i anod wyświetlacza.

    Teraz po poprawie schematu wyświetlanie cyfr sterowane będzie stanem wysokim na anodach, a sterowanie wł. wyświetlaczem również stanem wysokim podanym do tranzystora. Dobrze rozumiem?

    0
  • #16 20 Lut 2012 12:38
    mirekk36
    Poziom 42  

    Może i dobrze rozumiesz - zresztą co to za różnica jakim stanem będą sterowane anody czy katody - żadna z punktu widzenia programisty.

    Ale niestety schemat nadal masz zrąbany i to poważnie - chociaż z kropką już sobie poradziłeś... generalnie już jest prawie prawie dobrze tylko źle .... dlaczego ?

    Bo tak ze schematu wygląda mi to na wyświetlacz ze wspólną anodą - ale być może ty jeszcze się nie orientujesz co to znaczy jeśli chodzi o wyświetlacz tego typu. Jeśli zatem na prawdę masz COMMON ANODE - to musisz wspólne anody podłączyć tranzystorami PNP do VCC ale nie ze względu na to żeby sobie wybrać jakim poziomem będziesz je sterował bo uwierz, że to jest nieistotne i programowo to się załatwia.... Tylko dlatego żeby ci ten wyświetlacz w ogóle działał.

    No chyba, że jednak masz wyświetlacz COMMON CATHODE (wspólna katoda) - musisz to sprawdzić dokładnie sobie - to wtedy schemat będzie OK....

    0
  • #17 20 Lut 2012 12:42
    tomzi
    Poziom 8  

    Mój błąd... i to najgłupszy jaki mogłem popełnić... oczywiście mam wyświetlacze ze wspólną katodą. Nie wiem czemu wstawiłem w schemat z wspólną anoda... zwykłe niedopatrzenie:)

    już poprawiam schemat.

    Edit: już, żeby nie śmiecić po porostu zmieniłem obrazek post wcześniej.

    0
  • #18 20 Lut 2012 12:50
    mirekk36
    Poziom 42  

    A! no to w końcu dobry schemat w tym zakresie wyświetlacza - no może poza jednym ;) .... rezystory 10K na bazy tranzystorów są tragicznie za duże - daj tam 1K albo 2,2K góra ;)

    0
  • #19 21 Lut 2012 02:33
    tomzi
    Poziom 8  

    Po wielu bitwach stoczonych nad "projektem" zjedzonych nerwach i spalonym jednym czujniku, układ działa... pomijam fakt błędnego podłączenia wyświetlaczy, jednak główną przyczyną było zupełnie co innego - błędne odczytanie wartości temp z scratchpad'a oraz brak definicji F_CPU w pliku ds18b20.c

    Podczas walki z programem, po prawidłowym zapisaniu formuły odczytującej temperaturę DS'a na wyświetlaczu pojawiło się 85, i brak reakcji na zmianę temp... z datasheet'u wyczytałem że taka wartość jest zapisywana do DS'a po restarcie, a nienadpisywanie tej wartości wskazywało na błąd w komunikacji, lub nieprawidłowe czasy _delay_ms(). Wziąłem się więc w garść, i przekopałem się przez cały kod jeszcze raz, poprawiając timingi(? chyba tak to mogę nazwać). Poprawa kodu pomogła.

    Mam jeszcze jedno pytanie:
    Co jakiś czas odczyt wyskakuje poza prawidłową wartość np. 00, 43, 16, 46... ale ogólnie pokazuje 22 *C co jest w miarę poprawne. Czy to może być dalej błąd w odpowiednich czasach?

    Na wszelki wypadek wklejam główną pętlę programu, jak by miał ktoś podobny problem.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0