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

Nie mogę skoczyć do sekcji BootLadera z programu :(

prokopcio 22 Kwi 2009 16:27 1207 14
  • #1 6444361
    prokopcio
    Poziom 29  
    Witam.
    Procesorek Atmega8 -> na początku wszystkie procesory "uzbrajam" w Bootloader i fusebami blokuję dostęp przes spi (potrzebuję wyjście reset do innych celów) i teraz programuję sobie procesor poprzez bootloader proaidłowo ale tylko po załączeniu zasilania kiedy automatycznie rozpoczyna od programu bootloadera ale jeśli chcę pod ten adres BootLoadera z poziomu programu poprzez rjmp to po prostu program wykonuje się od adresu 0 a nie od wskazanego przez rjmp.
  • #2 6445451
    MarcinKawka
    Poziom 12  
    Nie jestem pewien czy dobrze zrozumiałem, chodzi ci o to że robisz rjmp z programu do sekcji bootloadera i zamiast tego spada ci na 0? Napisz jak masz ustawione BOOTSZ i BOOTRST oraz jeśli to możliwe podaj wartość rejestru SPMC(S)R przed i po tym skoku.
  • #3 6445531
    prokopcio
    Poziom 29  
    Tak, dobrze zrozumiałeś... właśnie mam problem bo już nie odczytam fusebitów ponieważ nie mam możliwości już programowania/odczytu przez spi. zaraz wymyślę jak sprawdzić SPMC(S)R - cokolwiek to jest :). w sumie chodzi o to, żebym nie musiał wyłączać i załączać zasilania aby modyfikować program - dlatego program wykrywa komunikację poprawnie z programatorem PC i powinien przejść do sekcji bootloader ale nie przechodzi - musze wyłączyć i włączyć zasilanie procka.
  • #4 6445594
    zolciak
    Poziom 15  
    Może program aplikacji uruchamia jakieś przerwanie, które nie jest obsłużone w programie bootloadera i następuje restart proca.
  • #5 6445705
    prokopcio
    Poziom 29  
    przed skokem do sekcji bootloadera mam CLI a na początku sekcji Botloadera inicjowanie stosu itp... więc to nie to.

    Dodano po 2 [minuty]:

    poza tym restart procka powinien i tak ustawić wskaźnik programu na początek sekcji bootloadera więc reset byłby dobrym rozwiązaniem ... mi to wygląda tak jakby program skoczył do bootladera ale nie odczytywał programu tylko leciał aż do końca pamięci programu a później licznik się przekręca i zaczyna od zera... ale nie jestem pewien.
  • #6 6445868
    Dr_DEAD
    Poziom 28  
    prokopcio napisał:
    przed skokem do sekcji bootloadera mam CLI a na początku sekcji Botloadera inicjowanie stosu itp... więc to nie to.

    Co oznacza "itp..."?? Ustawiasz wszystkie rejestry uP do stanu jak po wykonaniu POR'a?? Bo na przykład jeżeli aplikacja uruchomiła Timery lub ADC to one po skoku do Bootloadera nadal działają i zgłaszają swoje flagi przerwań.
  • #7 6445883
    Konto nie istnieje
    Poziom 1  
  • #8 6446434
    prokopcio
    Poziom 29  
    Dr_DEAD -> skoro wyłączam globalne przerwania (CLI) to nieważne jakie flagi są zgłaszane ponieważ przerwania w sekcji BootLoader nie są odblokowywane. Itp w tym przypadku oznacza ustawienie rejestrów i bitów używanych w BootLoaderze.

    atom1477 --> piszę w assemblerze

    początkowe linijki sekcji bootloadera:
    .org SECONDBOOTSTART
    
    Boot_loader:
    	ldi_wsk x,ramend
    	out	SPH, xh
    	out	SPL, xl
    	sbi DDR_RS485,Pin_RS485
    	sbi PORT_RS485,Pin_RS485
    

    i to działa po włączeniu zasilania tzn. ustawiany jest stan wysoki na pinie zdefiniowanym przez Pin_RS485

    a to jest skok z programu głównego i wtedy nie jest ustawiany stan wysoki :( :
    
          cli
    		rcall czysc_lcd
    		ldi_wsk z,txt_pfw<<1
    		rcall text
    		ldi czas,80
    		rcall delay
          rjmp Boot_loader
    


    LCD wyświetla tekst "BootLoader" zdefiniowany pod txt_pfw ale już nie włazi do bootloadera (nie ustawia stanu wysokiego na Pin_RS485) tylko zaczyna od 0. Adres kompilowany jest na poprawną wartość liczbową dla komendy rjmp.
  • #9 6446456
    Konto nie istnieje
    Poziom 1  
  • #10 6446462
    prokopcio
    Poziom 29  
    nie, nie, to moje podprogramy i je znam, nic nie psują a w emulatorze wszystko działa...
  • #11 6446671
    BoskiDialer
    Poziom 34  
    Ja pisząc w C zawsze miałem problemy ze skokiem do bootloadera przez rjmp - podając adres był on liczony względem początku aktualnie kompilowanego modułu. Przy linkowaniu adres początkowy modułu się zmieniał, a więc skok relatywny również. Wtedy doszedłem do prostego wniosku: najbardziej niezawodnym sposobem skoku do bootloadera (lub do aplikacji z bootloadera) jest załadować właściwy adres do Z i wykonać skok przez ijmp. Jeśli możesz, to wrzuć hex'a, może pomieszałeś adresy. Pod deasemblerem dobrze widać takie rzeczy (nawet, jeśli kod jest napisany w asemblerze). Ile jest równe SECONDBOOTSTART?
  • #12 6446856
    Konto nie istnieje
    Poziom 1  
  • #13 6446913
    GienekS
    Poziom 32  
    Ja z wywołaniem BootLoadera nie miałem żadnych problemów wchodzi tam gdzie go lokuję i realizuje mi program bez problemu. Teraz nie podam Ci jak to robię bo jestem przy innym kompie.
  • #14 6446957
    BoskiDialer
    Poziom 34  
    Czy wada C to raczej nie jest, raczej użycie niewłaściwej instrukcji. Co do adresu - adresy do pamięci flash w avr'ach są liczone w dwojaki sposób - jako adresy na bajt(dla lpm) i jako adresy na słowo (2B) (dla skoków i wywołań). Może się okazać, że adres wydaje się być dobry(np.wskazuje na bajt), ale w rzeczywistości prowadzi do złego miejsca. Stąd warto wskazać ile tamta stała jest równa lub wrzucić hex'a, żeby można było myśleć dalej.
  • #15 6448015
    Konto nie istnieje
    Poziom 1  
REKLAMA