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

[ATmega32][C] - Złe działanie bez kolejnego resetu po właczeniu zasilania

dzidav8 04 Lis 2015 21:00 1389 17
  • #1 15123076
    dzidav8
    Poziom 9  
    Witam, mam jakiś błąd w sofcie, który powoduje, że po odłączeniu i włączeniu zasilania program nie działa prawidłowo. Zresetowanie atmegi bez odłączenia zasilania powoduje że wszystko chodzi już dobrze. Próbowałem różne ustawienia fuse'ów, kwarc 12MHz, CKOPT włączony, ustawiony najdłuższy możliwy czas opóźnienia włączenia. Testowałem na wewnętrznym oscylatorze 8MHz, jest tak samo.
    Wgrałem inny program na ten sam sprzęt i uruchamia się dobrze, więc błąd jest na pewno w sofcie.
    Po włączeniu zasilania na ekranie pojawiają się śmieci, program nie wchodzi w przerwania. Co ciekawe watchdog jest włączony a go nie resetuje?! Ręczny reset i układ działa dobrze. Problem pojawił się po dodaniu obsługi ekranu HD44780. Testowałem już kilka różnych bibliotek do jego obsługi i na każdej jest tak samo.

    Poniżej program główny z wyświetlaniem na ekranie w pętli głównej i plik ADC.c z obsługą przerwań.

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


    ADC.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 15123139
    Jaca
    Poziom 31  
    Włącz BOD'a z odpowiednim progiem napięcia...
  • #3 15123144
    dzidav8
    Poziom 9  
    Jaca napisał:
    Włącz BOD'a z odpowiednim progiem napięcia...


    Zapomniałem napisać - BOD włączony, próg 4V, VCC=5V.

    Na tej samej konfiguracji fusebitów inne, proste programy testowe (bez obsługi LCD) działają.
  • #4 15123231
    Konto nie istnieje
    Konto nie istnieje  
  • #5 15123255
    Jaca
    Poziom 31  
    Stwórz najprostszy program testowy z obsługą LCD - będzie prościej znaleźć przyczynę.

    ps. Jak długa jest taśma do LCD ?
  • #6 15123299
    dzidav8
    Poziom 9  
    Zostawiłem w main tylko obsługę wyświetlacza i jest to samo. Hardware jest OK, program typu hello world na ekranie działa.

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


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


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


    Po zakomentowaniu funkcji lcd_init() i ekrany() w głównej pętli i pozostawieniu reszty układ wstaje od razu - natychmiast zaczyna gadać po modbusie.
    Zmieniałem biblioteki lcd na autorstwa radzio.dxp i jeszcze klika innych, teraz mam te: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
  • #7 15123323
    Konto nie istnieje
    Konto nie istnieje  
  • #8 15123351
    dzidav8
    Poziom 9  
    [ATmega32][C] - Złe działanie bez kolejnego resetu po właczeniu zasilania

    Tak na szybko fragmenty schematów. Piszę nowy soft do sprzętu który już ileś lat działał i jest sprawdzony więc hardware na pewno jest OK.

    Edit:
    Przypuszczam ze problem jest związany z inicjalizacją zmiennych. Dodałem instrukcję kolejnego resetu po właczeniu zasilania:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Widać że układ się raz resetuje ale nic to nie daje.

    Układ wisi na głównej pętli, czasami działają przerwania a czasami nie. Po wgraniu programu albo po zewnętrznym resecie ZAWSZE pracuje dobrze.
  • #9 15123405
    Konto nie istnieje
    Konto nie istnieje  
  • #10 15123412
    dzidav8
    Poziom 9  
    Piotrus_999 napisał:
    A bez BODa?


    Tak samo.
  • #11 15123521
    Konto nie istnieje
    Konto nie istnieje  
  • #12 15123968
    dzidav8
    Poziom 9  
    Po zakomentowaniu funkcji ekrany() program zawsze działa dobrze. Dopisanie w głównej pętli wyświetlania jakiś kontrolnych znaków też jest ok. Błąd jest gdzieś w funkcji ekrany(), ale ja go nie widzę. Co ciekawe program wisi na tej funkcji w taki sposób że watchdog go nie resetuje?!

    Zdarzyło mi się kilka razy że po resecie bez wyłączenia zasilania program też źle chodził... Nie wiem, może mi gdzieś losowo pamięć wycieka?

    EDIT:

    Wyrzuciłem funkcję przełączającą ekrany i dałem do głównej pętli wprost wyświetlanie ekranu głównego:

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


    Teraz program wisi cały czas i watchdog go resetuje... po czym po jakimś czasie przestaje resetować... Jakieś cuda się dzieją?!
  • #13 15123991
    dondu
    Moderator na urlopie...
    dzidav8 napisał:
    Co ciekawe watchdog jest włączony a go nie resetuje?!

    Od tego są bity w rejestrze MCUCSR.

    dzidav8 napisał:
    Układ wisi na głównej pętli, czasami działają przerwania a czasami nie.

    Na jakiej podstawie taki wniosek?

    dzidav8 napisał:
    Po wgraniu programu albo po zewnętrznym resecie ZAWSZE pracuje dobrze.

    W programie na początku main() odczytujesz EEPROM ... może tutaj leży problem?

    Poza tym pokaż cały schemat, PCB, zdjęcia, itp., bo przekaźniki stosujesz ...
  • #14 15124054
    dzidav8
    Poziom 9  
    OK, udało mi się wyizolować problem - wysypuje się dodawanie znaków do stringa żeby zawsze miał identyczną długość:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po zakomentowaniu zawsze działa dobrze. Wygląda mi na to że gdzieś w tej funkcji wycieka mi pamięć.

    Funkcja append:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #15 15124172
    grko
    Poziom 33  
    Funkcja append powoduje bledy. Wywolujesz ja z parametrem
    pos rownym 0 wiec:

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


    Z dokumentacji strncpy:

    
    No null-character is implicitly appended at the end of destination if source is longer than num. Thus, in this case, destination shall not be considered a null terminated C string (reading it as such would overflow).
    
  • #16 15125141
    dzidav8
    Poziom 9  
    OK, teraz wszystko jasne, dzięki. W takim razie jak prawidłowo dokleić znaki na początku stringa? Formatowanie z zerami z przodu mogę zrobić printf'em, ale ze spacjami już nie bardzo.
  • Pomocny post
    #17 15125176
    grko
    Poziom 33  
    Oczywiscie że możesz zrobic ze spacjami printf:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #18 15125403
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA