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

ATMEGA16[C] - Nie za każdym razem układ uruchamia się

rav88pl 10 Cze 2014 21:30 2091 14
  • #1 13696452
    rav88pl
    Poziom 10  
    Witam wszystkich. Może ktoś pomoże znaleźć mi błąd w kodzie .

    Otóż zlutowałem układ do pomiaru temperatur , ciśnienia, oraz wilgotności , zaprogramowałem na Atmedze 16 oraz wyświetlam wyniki na LCD 2x16.

    Po podłączeniu zasilania układ nie zawsze rusza, widać czarny ekran, kilkukrotne podłączenie i odłączenie zasilania, sprawia ze układ rusza i pokazuje się ekran powitalny oraz wyniki z czujników.

    Jak usunąć tą usterkę?
    Trochę przypał na obronie pracy jak mi się układ nie będzie chciał włączyć

    ATMEGA16[C] - Nie za każdym razem układ uruchamia się


    Kod main.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 13696513
    slawko_k
    Poziom 35  
    Może jakiś kondensator na reset daj.
    A czy a pewno układ nie rusza?
    Może procek i czujniki działają tylko wyświetlacz szwankuje
  • #3 13696580
    adamz74
    Poziom 32  
    Bardziej to wygląda na problemy z elektroniką niż z oprogramowaniem. Takie objawy może dawać np.: niestabilne zasilanie (m.in. brak kondensatorów filtrujących), źle zaprojektowany układ resetu, problemy z zegarem (kwarcem), itd.

    Pozdr!
  • #4 13696638
    rav88pl
    Poziom 10  
    Z tym że wgrywałem inny program ktory tylko napis wyświetlał i wszystko startuje za każdym razem.

    Jest kondensator na resecie

    Dodano po 1 [minuty]:

    ATMEGA16[C] - Nie za każdym razem układ uruchamia się


    @slawko_k znaczy podaje zasilanie na czujniki układ bo dodałem diody przed każdym czujnikiem i świeca. Wyświetlacz nie rusza
  • #5 13696722
    zby

    Poziom 15  
    Może przed zainicjowaniem wyświetlacza dać niewielkie opóźnienie _delay_ms(200), aby wyświetlacz był już gotowy na przyjmowanie danych gdy zacznie pracować procesor.
  • #6 13696802
    rav88pl
    Poziom 10  
    Widać efekt delaya - zapalone segmenty potem inicjowanie wyświetlacza.

    Lecz problem wciąż ten sam, czasem czarny ekran kompletnie
    Czasem odpala rusza z ekranem powitalnym

    Dodam że w takiej sytuacji czarnego ekranu pomaga wciśniecie resetu na atmedze i rusza program.
  • #7 13696813
    zby

    Poziom 15  
    To zwiększ jeszcze to opóźnienie, np. do 500mS.
  • #8 13696882
    rav88pl
    Poziom 10  
    niestety, wciąż to samo .... :(

    wciśnięcie resetu pomaga zawsze za pierwszy razem ... hmmm
  • #9 13696945
    zby

    Poziom 15  
    A jakim zegarem taktujesz procesor. Ja kiedyś miałem problem przy taktowaniu 1MHz i po zwiększeniu do 8MHz wszystko ruszyło. Może problem jest w ustawieniach kompilatora i źle wylicza opóźnienia w procedurach obsługi lcd.
  • #11 13697058
    rav88pl
    Poziom 10  
    Taktowałem 1MHZ przestawiłem na 8MHz wciąż to samo z tym że jak już program pójdzie to strasznie powoli chodzi wyświetlanie na lcd
  • #12 13697188
    Bielak_solid
    Poziom 14  
    Jeśli MCU nie zawsze startuje po (p)odłączeniu zasilania proponuję włączyć funkcjonalność "Brown Out Detection" za pomocą fuse'ów.

    Miałem kiedyś podobne zachowanie gdy ponownie załączane było zasilanie w momencie kiedy na procesorze napięcie było jeszcze powyżej 0 ale niższe od zasilania nominalnego.
  • #13 13697405
    GanzConrad
    Poziom 25  
    Korzystam z podobnych procedur (Mirek Kardaś + DHT11) i moim zdaniem problem leży w obsłudze DHT11, którą przerabiałem na swoje potrzeby, bo oryginalna nie działa jak powinna (choćby dlatego, że dwa razy czyta to samo i za każdym razem ignoruje połowę danych).
    Obsługa DHT11 ma w sobie pętlę while, która czeka na zmianę stanu portu, która to zmiana nie zawsze występuje lub czasy odczytu nie są właściwe.
    co ja bym zrobił:
    - sprawdził czy masz w projekcie poprawnie zadeklarowane F_CPU
    - wywalił tymczasowo obsługę DHT i sprawdził czy pomogło
    - odczytywał go rzadziej (czas reakcji jest pomiędzy 6-15 sekund). Ja odczytuję go co 15 sek (minimum to chyba sekunda). Aby tego dokonać zrezygnuj z tych nieszczęsnych delay_ms() i zastosuj licznik, a pętlę główną możesz uzależnić od stanu licznika (zmiennej, flagi itp).
    Obowiązkowo zastosowałbym WatchDoga (jak Ci się zawiesi podczas "prelekcji" to dopiero będzie tragedia)
    Mam nadzieję, że to obrona pracy w technikum, bo na wyższym stopniu to trochę się nie nadaje...(ale to inny temat)
    Czy przy DS18B20 jest dioda LED? Załącz całość schematu, to może znajdziemy inne problemy.
    PS. ten bajerek "pomiar" nie nadaje się na obronę pracy - chyba, że za wszelką cenę nie pokażesz źródła...

    Dodano po 9 [minuty]:

    Chyba trochę się pośpieszyłem... doczytałem, że on nie startuje, a na starcie nie ma odczytu DHT. Tak czy inaczej, będziesz miał problemy z tym czujnikiem, więc warto zwrócić na niego uwagę.
    Dlaczego usunąłeś przerwę na konwersję temperatury ? (750ms)
  • #14 13699189
    rav88pl
    Poziom 10  
    usunąłem tą przerwę gdyż wszystkie pomiary wyświetlanie jednocześnie po przejsciu całego kodu , i delay jest i tak już długi po dht tak więc starczy mu czasu na konwesję temperatury..

    zaraz sprawdzę poradę wyżej

    Dodano po 1 [minuty]:

    obrona pracy inżynierskiej to jest , taki temat dostałem. Jeszcze muszę skomunikować to z labview i jeszcze prawdopodobnie dodam czujnik pomiaru kierunki i siły wiatru.

    czemu się nie nadaje na nic nic na obrone w technikum?
    mój kolega takie coś bronił na mgr.

    ten bajerek przerobię go na wyświetlanie SPRAWDZ CZUJNIKI, jeśli ktoryś z czujników będzie odłączony to program wyświetli to, a jeśli wszystko bedzie OK to przejdzie do wykonywania pomiarów, oraz wyświetlanie mojego nazwiska


    Tak przy każdym czujniku jest dioda LED
  • #15 13704119
    SylwekK
    Poziom 32  
    Bardzo często pomaga w takich sytuacjach przestawienie fuse SUT (to te połączone z ustawianiem zegara) np SUT:10 (65ms) co da spore opóźnienie startu samego procka i pozwoli ustabilizować się jego "bebechom" przed wykonaniem właściwego programu.
REKLAMA