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

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

dzidav8 04 Lis 2015 21:00 1011 17
  • #1 04 Lis 2015 21:00
    dzidav8
    Poziom 6  

    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
    Zaloguj się, aby zobaczyć kod


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

    0 17
  • Relpol
  • #2 04 Lis 2015 21:20
    Jaca
    Poziom 28  

    Włącz BOD'a z odpowiednim progiem napięcia...

    0
  • Relpol
  • #3 04 Lis 2015 21:21
    dzidav8
    Poziom 6  

    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ą.

    0
  • #4 04 Lis 2015 21:43
    2675900
    Użytkownik usunął konto  
  • #5 04 Lis 2015 21:49
    Jaca
    Poziom 28  

    Stwórz najprostszy program testowy z obsługą LCD - będzie prościej znaleźć przyczynę.

    ps. Jak długa jest taśma do LCD ?

    0
  • #6 04 Lis 2015 22:00
    dzidav8
    Poziom 6  

    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
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: 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

    0
  • #7 04 Lis 2015 22:06
    2675900
    Użytkownik usunął konto  
  • #8 04 Lis 2015 22:13
    dzidav8
    Poziom 6  

    [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
    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.

    0
  • #9 04 Lis 2015 22:29
    2675900
    Użytkownik usunął konto  
  • #10 04 Lis 2015 22:32
    dzidav8
    Poziom 6  

    Piotrus_999 napisał:
    A bez BODa?


    Tak samo.

    0
  • #11 04 Lis 2015 23:04
    2675900
    Użytkownik usunął konto  
  • #12 05 Lis 2015 09:32
    dzidav8
    Poziom 6  

    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
    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ą?!

    0
  • #13 05 Lis 2015 09:49
    dondu
    Moderator Mikrokontrolery Projektowanie

    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 ...

    0
  • #14 05 Lis 2015 10:13
    dzidav8
    Poziom 6  

    OK, udało mi się wyizolować problem - wysypuje się dodawanie znaków do stringa żeby zawsze miał identyczną długość:

    Kod: 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
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #15 05 Lis 2015 11:04
    grko
    Poziom 33  

    Funkcja append powoduje bledy. Wywolujesz ja z parametrem
    pos rownym 0 wiec:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z dokumentacji strncpy:

    Code:

    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).

    0
  • #16 05 Lis 2015 18:24
    dzidav8
    Poziom 6  

    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.

    0
  • Pomocny post
    #17 05 Lis 2015 18:32
    grko
    Poziom 33  

    Oczywiscie że możesz zrobic ze spacjami printf:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #18 05 Lis 2015 19:45
    2675900
    Użytkownik usunął konto