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

[atmega32][C] bootloader. Po zaprogramowaniu nic się nie dzieje. Ustawienia?

bananita 11 Kwi 2011 17:27 2337 10
REKLAMA
  • #1 9387709
    bananita
    Poziom 11  
    Dzien dobry. Piszę bootloader do procesora atmega32. Bootloader ma dzialać w terminalu więc konwersja ascii -> hex jest przeprowadzana w mikrokontrolerze. Po uruchomieniu, program ładnie się przesyła, wszystko wydaje się być OK. Po resecie jednak nic się nie dzieje. Skopiowałem całą zawartość pamięci i zauważyłem, że drugi bajt jest nieprawidłowo zapisany, chociaż na pewno dociera do mikrokontrolera w dobrej postaci. Reszta programu jest skopiowana idealnie. Dodam,że próbowałem z kilkoma atmegami.

    Proszę o pomoc, bo już naprawdę nie mam pojęcia co może być z tym nie tak. Wydaje się, że to nie jest wina programu tylko hmm.. jakiś ustawień, lockbitów itp? Może ktoś już miał podobny problem.

    Poniżej zamieszczam kod. Jest zlinkowany pod adresem 0x7000. Fusebity: low: cf, high: d8.

    Pozdrawiam

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • Pomocny post
    #2 9388449
    Szumlus
    Poziom 17  
    Witam,

    Fusebit-y są zaprogramowane poprawnie.
    Ale kolega nic nie wspomniał o zabezpieczeniu bootloadera przed samonadpisaniem. Nalezy ustawić w tym celu odpowiednie Lockbit-y
    i tym samym uniemożliwić wykonanie operacji SPM w sekcji bootloadera.
    Kolejna sprawa, dlaczego kolega lokalizuje bootloader pod adresem7000??
    Przy rozmiarze sekcji boot flash 2048 słów adres bootloadera to 3800.
    Nie za duży ten adres? Chyba że to tylko pomyłka w poście i chodziło o adres 700 albo 3700.
    Zastanawia mnie tez jak koledze udało się z czytać cokolwiek z uP? Jeśli program jest poprawmy to bootlaoder sam się skasował przy próbie zapisu czegokolwiek.
    Jedyne słuszne wytłumaczenie to takie że kolega kasuje każdą stronę przed zapisem a nie cała pamięć procesora i program ładowany nie zjamował tyle miejsca aby nadpisać adresy od 700 czy też 3700 w zwyż.
    Pozdrawiam,
    Marcin
  • REKLAMA
  • #3 9388557
    bananita
    Poziom 11  
    Dziękuję za odpowiedź. Wyraziłem się nie do końca precyzyjnie. Oczywiście po resecie bootloader uruchamia się i nie jest skasowany. Nie dzieje się nic, gdy dojdzie do momentu uruchomienia wgranego programu.

    edit: wszystko działa poprawnie poza tym jednym bajtem.
  • #4 9388590
    Szumlus
    Poziom 17  
    Bardzo proszę sprawdź poprawność adresów, bootloader umieszczony pod adresem 0x00 uruchomi się poprawnie tylko wszystko weźmie w łeb przy próbie ładowania programu.

    Dodano po 4 [minuty]:

    Może jest gdzieś błąd w aplikacji ładującej z PC? Bardzo nietypowa ta dysfunkcja bootloadera. Przerabiałem już kilka bootlaoderów do swoich potrzeb od UART-u aż do USB i nigdy nie spotkałem się z takim błędem.
  • REKLAMA
  • #5 9388666
    bananita
    Poziom 11  
    Nie ma aplikacji na PC, wszystko leci z terminala. Jest możliwość wykrycia błędu transmisji, bo program odsyła bajt, który przyjął.

    Poprawiłem adres, dalej bez zmian. Program ładuje się bez szkody dla bootloadera, drugi bajt dalej niepoprawny.

    edit: sprawdzalem program milion razy, naprawde wydaje się być ok, dlatego zasugerowalem ze moze to jednak wina czegos niezaleznego od programu
    edit2: bo skoro kopiuje calutki program, zostawia w spokoju samego siebie, to co z nim jecze moze byc nie tak?
  • #6 9388760
    Szumlus
    Poziom 17  
    Proponuje zrobić proste debugowanie. Jeśli odsyłany bajt jest poprawny przy odbiorze to należało by wysłać go z powrotem po każdej funkcji która coś z nim robi. Tak wytypujesz funkcję która wprowadza błąd

    edit: proponuje również podglądnąć wygenerowany kod assemblera tam może kryć się odpowiedz na temat tego błędu.
  • REKLAMA
  • #7 9388843
    bananita
    Poziom 11  
    Faktycznie, ten moj debug byl troche bez sensu
    zmienilem fragment:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na taki zeby odsylal po zapisie

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


    Niestety odsyla prawidlowa wartosc, wiec nic w zmiennej sie nie zmienia.

    Mam inne pytanie, czy da sie jakos pobrac z pamieci ten bufor od funkcji boot_page_fill() ?

    EDIT:
    zrobilem eksperyment. wpisalem na sztywno te dwa pierwsze bajty w programie, potem przeslalem program bez nich. dalej to samo, nie dziala cos na poziomie ponizej programu.
  • Pomocny post
    #8 9388927
    Szumlus
    Poziom 17  
    Raczej to jest nie bardzo możliwe, gdyż nie znamy adresu spod jakiego jest zapisywana strona. Możliwe że jest coś na ten temat w datasheet.Ewentualnie trzeba by po pierwszym zapisie strony wysłać cała zawartość RAM procesora prze uart. Może trochę żmudne ale powinno być skuteczne. Wtedy będzie porównanie co tak naprawdę jest zapisywane do flash.
  • #9 9389018
    bananita
    Poziom 11  
    Jak to zrobic?
  • Pomocny post
    #10 9390233
    Szumlus
    Poziom 17  
    Przykładowa funkcja powinna być poprawnie napisana.

    [code]
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 9393981
    bananita
    Poziom 11  
    Chyba jednak problem tkwil w programie ale naprawde nie wiem,w którym miejscu. Przepisałem go w inny sposób. Dziękuję za pomoc. Pozdrawiam
REKLAMA