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

DS18B20 ATMega8 LED w C - Na wyświetlaczu wyrzuca mi śmieci

strzala456 10 Lis 2013 12:49 2103 16
  • #1 12935242
    strzala456
    Poziom 10  
    Nie wiem czy dobrze wybrałem dział, ale nie wiem czy błąd tkwi w oprogramowaniu czy w podłączeniu :D
    Na razie podłączałem jeden czujnik do portu D0 docelowo mają być dwa czujniki temp jeden przy całym układzie a drugi dalej by móc mierzyć temp na zewnątrz, wyświetlacz 8-segmentowy razy 2, temp będzie mierzył od 0 do 99 stopni, za pomocą przełącznika będzie można wybrać jaką temp ma podawać czy w wewnątrz domu czy na zewnątrz.
    Projekt banalny :D To jest moja pierwsza zabawa z takimi rzeczami.
    Co nie działa??
    Wyświetlacz jest sprawny to mogę zagwarantować. Chodzi o to, że pokazuje mi jakieś śmieci, program jest ściągnięty z internetu na wyświetlacz LCD :D
    Stwierdziłem, że wystarczy zmienić tylko dwie linijki :D zamiast wyrzucać temp na LCD to można na LED z tą konwersją temp / 10 i temp % 10 by wybrać element tablicy, bla bla bla wiadomo o co chodzi.

    Szczerze to nie mam pojęcia dlaczego tak się dzieję, proszę o pomoc.
    W załączniku jest plik C i zdjęcie schematu ;)

    DS18B20 ATMega8 LED w C - Na wyświetlaczu wyrzuca mi śmieci

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 12935617
    excray
    Poziom 41  
    Masz sporo błędów w swoim kodzie ale najbardziej smutne jest to że nawet nie wysiliłeś się żeby ich poszukać. Podziel program na drobniejsze etapy i na poziomie etapów sprawdzaj poprawność. Spróbuj wpisać jakieś stałe do zmiennych "dziesiatki" i "jednosci" i zobacz czy się wyświetlą na Twoim wyświetlaczu. Itd.
  • #3 12935642
    strzala456
    Poziom 10  
    to znaczy wyświetlacz działa bo sobie napisałem taki prosty licznik co sekundę wzrasta jeden (od 0 do 99) i działało, generalnie chodziło mi o to, że podpinam te funkcję do obsługi czujnika temperatury i po prostu odczytuje tą temperaturę a tam są jakieś śmieci :/
  • #4 12935664
    BlueDraco
    Specjalista - Mikrokontrolery
    Wyświetlacz nie działa poprawnie, bo jest obsługiwany w pętli ze zmiennym okresem, a nie w przerwaniu timera ze stałym okresem. Błędów masz sporo, ale ten jest najgrubszy - jest to błąd w założeniach. O obsłudze wyświetlacza multipleksowanego napisano tysiące artykułów w sieci i setki postów na tym forum - czytaj.
  • #5 12935952
    excray
    Poziom 41  
    Zastanów się też nad deklaracjami typu unsigned/signed i operacjami na tych typach.
  • #6 12936035
    strzala456
    Poziom 10  
    BlueDraco napisał:
    Wyświetlacz nie działa poprawnie, bo jest obsługiwany w pętli ze zmiennym okresem, a nie w przerwaniu timera ze stałym okresem. Błędów masz sporo, ale ten jest najgrubszy - jest to błąd w założeniach. O obsłudze wyświetlacza multipleksowanego napisano tysiące artykułów w sieci i setki postów na tym forum - czytaj.


    Tak, zgadzam się, ale nawet w takiej konfiguracji powinien wyświetlić jedną poprawną liczbę a druga powinna migać przez ułamek sekundy i znowu przerwa.

    A on wyrzuca śmieci tak gdyby się przekręciła tablica, ale to jest nie możliwe (w przypadku jedności) gdzie jest modulo 10 a tablica z segmentami ma 10 elementów ;) więc to jest co najmniej dziwne.

    Chaos z tymi jest :) ale myślę, że one nie ma aż tak dużo do tego :)
    Myślałem, że jest problem z taktowaniem i jest za mały czas by wygenerować temperaturę w danym cyklu, ale sprawdziłem jeszcze raz i jest taktowanie 8MHz, dla pewności zwiększyłem znacznie odstępy czasowe i nadal to samo :/
  • #7 12936713
    BlueDraco
    Specjalista - Mikrokontrolery
    Parę dni temu już ktoś pokazywał ten kod. temp1 i temp2 muszą być zadeklarowane jako uint8_t.

    Z powodu błędnej deklaracji obliczona później cyfra dziesiątek może mieć dowolną wartość przekraczającą 9, co skutkuje śmieciami na wyświetlaczu. Pozy tym jest jeszcze parę innych błędów w tym kodzie.

    Może też źle działać z tego samego powodu wyliczenie cyfry jedności.
  • #8 12936749
    grko
    Poziom 33  
    Przyjrzyj się dokładnie tej linii.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik operacji (temp2 * 256) będzie zawsze równy zero. Użyj prawidłowo rzutowania lub zadeklaruj temp1 oraz temp2 jako uint16_t.
  • #9 12936771
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie masz racji, GrzegorzuKostko. gdyż standard języka C określa, że wszystkie operacje mają być wykonywane tak, jak gdyby były wykonywane na typie nie krótszym niż int.
  • #10 12936808
    grko
    Poziom 33  
    Racja. Mój błąd.
  • #11 12936853
    strzala456
    Poziom 10  
    Poprawiłem wszędzie deklarację typów zmiennych które mają powiązanie z temperaturą :)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I pokazuje mi teraz cały czas 15 :/

    Zrobiłem kilka testów:
    1) wyciągłem przewód czujnik->ATMega (pokazało 00)
    2) wyciągłem czujnik i dalej mi pokazywało 15, może ten rezystor jest tam za słaby, albo coś (nie wiem czy to tak ma pokazywać po prostu zacząłem tak próbować :D )
  • #12 12936860
    grko
    Poziom 33  
    Temp zadeklaruj jako uint16_t.
  • Pomocny post
    #13 12936870
    slx
    Poziom 19  
    Na pewno masz źle zrobioną obsługę 1wire:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Odczyt należy wykonać do 15us od chwili wystawienia 0 na magistralę. Poza tym nie zachowany czas trwania slotu >60us

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tutaj też bym, dla pewności odczekał przynajmniej 1us po SET_1Wire;
  • #14 12936921
    strzala456
    Poziom 10  
    Zwiększyłem do 65 z 15
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodałem 1
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dalej to samo ;/
  • Pomocny post
    #15 12937042
    slx
    Poziom 19  
    Tylko że powinieneś przyspieszyć, a nie opóźnić moment odczytu.
    DS18B20 ATMega8 LED w C - Na wyświetlaczu wyrzuca mi śmieci
    Chodziło mi raczej o coś takiego:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 12937082
    strzala456
    Poziom 10  
    Poprawione i dalej mi wyrzuca 15 :/
  • #17 12937605
    zumek
    Poziom 39  
    strzala456 napisał:
    Poprawione i dalej mi wyrzuca 15 :/

    No to ja też dołożę parę(czytaj dwie) uwag.
    1.Funkcja RESET_PULSE() - zawsze zwróci "1", za wyjątkiem magistrali OW zwartej do GND.
    2.Funkcja send_byte() - zawsze tracisz najmłodszy bit.
REKLAMA