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.

[Rozwiązano] [ATmega8][C][7segment] - Termometr pokazuje 85/127 °C

odrzyw 17 Cze 2015 18:44 1431 11
  • #1 17 Cze 2015 18:44
    odrzyw
    Poziom 11  

    Witam forumowiczów,
    zacząłem realizować projekt zegarka, kalendarza i termometrów z owego linku: Link i jak to nieraz się zdarza napotkałem po drodze problem. Cały układ zbudowałem, wgrałem skompilowany program i w trybach mierzenia temperatury wyświetlacze 7-segmentowe pokazują 85°C lub 127°C po podgrzaniu 1 palcem a 2 zapalniczką (bo dopiero od wyższej temp. niż 1 się przełącza). Już na początku musiałem poprawnie skonfigurować segmenty wyświetlaczy bo w załącznikach schemat nie pokrywa się z konfiguracją pinów segmentów w programie. Jako że program potrzebuje "na sztywno" ROM-kodów obydwu DSów toteż dzięki koledze M. S. zczytałem je programem z tego linku: Link. Zegarek i kalendarz działają poprawnie oraz ich ustawianie też tylko problem jest z temp. Między zasilaniem czujników a linią danych mam rezystor 4,7kΩ, próbowałem też kombinować z czasami po użyciu instrukcji CONVERT_T ale nic to nie dało. Mikrokontroler pracuje na wewnętrznym kwarcu 8MHz. Całość kompiluję w Eclipse z WinAVR. Czujniki są dobre bo pokazują temp. w innym układzie. Poniżej zamieszczam program który aktualnie mam w µP:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    A oto schemat: [ATmega8][C][7segment] - Termometr pokazuje 85/127 °C
    Proszę o porady i sugestie jak można rozwiązać ten problem :P

    0 11
  • #2 18 Cze 2015 18:17
    BlueDraco
    Specjalista - Mikrokontrolery

    Na schemacie rezystory 4k7 nie są połączone z liniami OW i I2C, co jest dobrym powodem do niedziałania. Odczyt 85 stopni wskazuje jednak na poprawną pracę OW i brak polecenia konwersji temperatury (czytasz bez uprzedniego pomiaru).

    0
  • #3 18 Cze 2015 19:17
    zumek
    Poziom 39  

    W takim przypadku, zwykle pod lupę biorę funkcję _ow_reset() i ... "nie zawiodłem" się :)
    ZAWSZE zwróci wartość różną od zera czyli do poprawki.

    0
  • #4 23 Cze 2015 11:50
    odrzyw
    Poziom 11  

    Wydaje mnie się że OW_RESET jest w porządku, porównywałem z proponowaną konfiguracją: Link. Gdy odłączę czujniki to dostaję po prostu "0" na wyświetlaczu. Mam jeszcze jedno pytanie, całkowite opóźnienie w tym fragmencie kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    wynosi 255*3us? Często widziałem czasy rzędu 750ms.

    0
  • #5 24 Cze 2015 09:32
    BlueDraco
    Specjalista - Mikrokontrolery

    A jaką wartość opóźnienia widziałeś w dokumentacji technicznej układu DS18B20?

    0
  • #6 24 Cze 2015 12:02
    odrzyw
    Poziom 11  

    Czasy konwersji temperatury wg noty katalogowej dla konkretnych rozdzielczości:
    9-bitowa 93.75ms,
    10-bitowa 187.5ms,
    11-bitowa 375ms
    i 12-bitowa 750ms.

    0
  • #7 04 Lis 2015 04:12
    ZeeWolf
    Poziom 27  

    Witam.
    Wydaje mi się, że brakuje deklaracji szybkości zegara F_CPU. Moja wersja działała na wewnętrznym zegarze 1 MHz, więc domyślnym dla delay.h - tutaj, przy 8 MHz, bez deklaracji mogą się dziać cuda z czasami opóźnień - konwersja nie zdąża się zakończyć przed czytaniem scratchpada.
    Proponuję na próbę oczekiwanie na zakończenie konwersji wbić na sztywno

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i sprawdzić, czy program się zawiesza w tym miejscu (wieczna pętla - czujnik nie dokonuje konwersji lub brak komunikacji).
    Bardzo możliwe, że pomyliłem się i zamiast _delay_us powinno być _delay_ms.

    0
  • #8 05 Lis 2015 21:20
    odrzyw
    Poziom 11  

    Termometr zadziałał! :D Projekt mam w Eclipse i nie deklaruję w kodzie programu częstotliwości pracy poprzez komendę F_CPU tylko ustawiam to w opcjach projektu. Od pewnego czasu termometr uruchamiałem tylko z 1 czujnikiem temp. i dopiero po tym zmieniłem częst. F_CPU w projekcie a nie dolutowałem 2 czujnika więc może dlatego program nie działał. Całość działa na wewn. kwarcu 8MHz, nie na 1MHz ale to chyba można przestawić preskalerem w rej. TCCR1B. Nie wiem jednak co się dzieje z temp ujemnymi bo gdy temp. jest pon. 0°C to mam wynik kolejno na wyświetlaczach "1-9C" dla -9°C, "112C" dla -12°C (chciałbym wygasić "1" na początku) i od -13°C mam coś takiego: "-81C"; "-82C" (-14°C) itd. Pod lupę biorę f-cję "DSReadTemp" ale jej końcówki nie rozumiem :(

    0
  • #9 05 Lis 2015 22:48
    ZeeWolf
    Poziom 27  

    Przyznam, że nieszczególnie testowałem termometr dla ujemnych temperatur (latanie z układem do zamrażarki i z powrotem było dosyć uciążliwe :P). Z tego co udało mi się przeanalizować, musisz zmienić:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    na
    Kod: c
    Zaloguj się, aby zobaczyć kod

    oraz skasować linijki, które zaznaczyłem komentarzem
    Kod: c
    Zaloguj się, aby zobaczyć kod

    dla APP_MODE_TEMPOUT i APP_MODE_TEMPIN, bo będziesz miał znak minus w dwóch pozycjach na raz, np: "--4".

    0
  • #10 20 Lis 2015 08:35
    odrzyw
    Poziom 11  

    Witam, wprowadziłem proponowane poprawki ale program nie kompiluje się i wyrzuca błąd w miejscu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    dlatego zamieniłem miejscami operatory na:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    i kompilacja przebiega prawidłowo lecz poniżej 0°C mam ciągle "0" na wyświetlaczu aż do najniższej temp.

    0
  • #11 20 Lis 2015 09:46
    BlueDraco
    Specjalista - Mikrokontrolery

    Bo robisz jakieś przedziwne rzeczy z temperaturą. Napisz po prostu:

    if (temp < 0)
    {
    znak = '-';
    temp = - temp;
    }

    temp_calk = temp >> 4;
    temp_ulam = (temp & 0xf) * 5 / 8;

    A jeśli dalej będzie źle, to wklej sam kod odpowiedzialny za przeliczanie i wyświetlanie.

    0
  • #12 17 Maj 2018 15:51
    odrzyw
    Poziom 11  

    Witam po krótkiej :lol: przerwie, oto zmiany które trzeba było wprowadzić by termometr poprawnie wyświetlał ujemne temperatury:
    zamienić

    Kod: c
    Zaloguj się, aby zobaczyć kod

    na
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dziękuję wszystkim za zainteresowanie moim problemem.
    Temat zamykam.

    Dodano po 5 [minuty]:

    Problem rozwiązałem poprzez kilkukrotne przeanalizowanie fizyczne połączenie układu, zweryfikowałem kod oraz wprowadziłem konieczne zmiany.

    0