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

Dokładam NOP, nie działa, dokładam drugiego NOPa i działa

bolek 23 Maj 2007 17:57 1581 20
REKLAMA
  • #1 3913970
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Wyglada na to że funkcjonowanie programu ściśle zależy od długości jego kodu. Ogólnie chodziło ok, teraz mam coś dopisać i takie różne dziwne rzeczy wychodzą. Wiem że kiedyś miałem taki myk, ale nie pamiętam jakie było rozwiązanie.
    Ktos pamięta taki objaw?
    jak by ktoś pytal to chodzi mi asm i 51
  • REKLAMA
  • #2 3914095
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Mogę się założyć o skrzynkę piwa, że masz błąd w programie.
  • #3 3914150
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    ja sie założe o kszynke vódki że byk jest. Tylko jakiego typu.
    Mam dwa źródła przerwań, timer i UART. ACC, PSW i to co używam leci na stos w każdym z nich. Nie idzie tego przesymulować za bardzo, bo układ rozmawia z otoczeniem w czasie rzeczywistym...
    Byk jest bardzo specyficzny ;/

    NOPy wkładane sa w przypadkowych miejscach (gdzieś na początku programu), Z resztą nie wnoszą nic do programu. Jednach całość zachowuje sie dziwnie. Zamiast nich oczwyisce moge dać inne polecenia i efekt będzie ten sam.
  • Pomocny post
    #4 3914211
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    A co to znaczy nie działa?. Program sie zapętla czy wyskakując z funkcji nie powraca już tam gdzie powinien. W takich sytuacjach przeważnie chodzi i powrót programu po zdjęciu danych PC ze stosu. Możliwe że gdzieś się "gubi" jedna dana z adresem powrotu a akurat Twój "nop przesuwa" cały kod w odpowiednią stronę i program idzie dalej. Ot taki "traf" :)
  • #5 3915009
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    No i dokładnie tak sie dzieje. Różne cuda się dzieją, raz zdarzyło się tak że program zwisł gdzieś na poczatku- szkoda że go w tedy nie symulowałem ;/
    Choć program ma swoje ulubione miejsca, niestety musi trochę popracować aby sie wywrócić, czyli symulacja odpada. Stos jest stosunkowo duzy, początek na 05h, koniec na 19h. Z tego co kiedyś patrzyłem to dochodzi do 12h
    Będe to musiał dac komuś do sprawdzenia żywym okiem.
  • #6 3915097
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Cytat:
    Stos jest stosunkowo duzy, początek na 05h, koniec na 19h

    Ja bym stos ulokował trochę wyżej w pamięci :wink:
    Jezeli działasz na tablicach i przełączając się miedzy bankami rejestrów które znajdują się "na dole" RAM'u to możesz niechcący wchodzić właśnie na stos....i stos idzie w maliny.
    Jeżeli jest dostępna pamieć IDATA to lepiej jest go tam upakować.
  • REKLAMA
  • #7 3915148
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    kurcze, nie mam tego programu tutaj bo bym wkleił.
    Chodzi o to że bawie się tylko R0...R3(4?), potem zmienne i bity od 20h do 39h. reszta do samego SFR to bufor danych- wiec ten stos nie bardzo mam gdzie dać (procek to 2051).
    Tablice mam,ale jeżdze po nich tak jak mówiłem- conajwyżej bawie się R4. Byczek jest bardzo subtelny. Gdyby to był typowy bład odkładania na stos to program musowo leciał by w maliny. Tymczasem wygląda to tak że stos jest tylko "delikatnie" modyfikowany.
    Wszystkiego co napisałem jestem prawie pewien, a prawie robi wielką różnice :)

    Chyba że coś mi modyfikuje SFR własnie, ale jak się bawiłem to takie proste to nie jest (np poprzez adresowanie pośrednie @)
  • #8 3915202
    arturssp
    Poziom 16  
    Posty: 292
    Pomógł: 7
    Ocena: 23
    Tylko ze rejestry R0...R3 zajmuja pamiec od 0 do 20h.... wiec jesli stos zaczyna sie od 5h to modyfikujac te rejestry jednoczesnie modyfikujesz stos - stad problem. Musisz przeniesc stos wyzej, nie ma wyjscia.
    Pozdrawiam
  • #9 3915218
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    A robisz coś na PSW? Jakiś wskaźnik CY?? Może przypadkowo przełączasz sobie bank rejestrów? No wklej kod bo rzeczywiście błąd wydaje się być "nie ksiązkowy" :)
    Kolego arturssp rejestrów jest "8szt". W zależności który bank się wybierze zajmują pamieć odpowiednio 00-07h, 08-0fh,10-17h i 18-1Fh.
    Cały czas autor programu bazuje na rejestrach 1-szego banku a więc domyślnie nie wychodzi (nie zamierza) poza adres rejstru 4-tego (03h). :)
  • #10 3915253
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    ->arturssp
    Jeśli chodzi o ścisłość to one siedzą do adresu 31 (są przecierz 4ry przełączane banki)
    PSW... pewnie, kłade i sciągam w jednym z przerwań. Umyślnie nie zmieniam banków
    Tak teraz czytam o tych rejestrach i pisze mi co innego o np R0, a co innego o AR0. Jako tako w przerwaniu kożystam z np R0, ale na stosł mogę posadzić AR0. Może tu jest coś nie tak?
  • #11 3915294
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Mówisz że bufor danych masz aż do SFR. Nie dojeżdzasz omyłkowo aż do SP (81H)?. A AR0 - to nie ma takiego rejestru w nomenklaturze standardowej '51 :)
  • REKLAMA
  • #12 3915311
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    mam to tak zmajstrowane że nie wychodzi wyżej niż do 80. Co do AR0, spróbuj odłożyć na stos R0, zobacz co powie kompilator. Potem spróbuj dać AR0
    Ja na dziś robie turn offfffffffffffff. Tak że jutro napisze cos więcej
  • #13 3915777
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    bolek napisał:
    Tak teraz czytam o tych rejestrach i pisze mi co innego o np R0, a co innego o AR0. Jako tako w przerwaniu kożystam z np R0, ale na stosł mogę posadzić AR0. Może tu jest coś nie tak?

    AR0...AR7 to nie rejestry mikrokontrolera, a specjalne symbole asemblera, oznaczające adresy rejestrów R0...R7. O tym z którego banku będą to rejestry decyduje dyrektywa USING. Oto jej opis z dokumentacji kompilatora ASEM-51:
    Cytat:
    USING <expr> using register bank

    Sets the register bank used to <expr>, which must be in the range
    of 0...3. The USING instruction only affects the values of the
    special assembler symbols AR0, ... , AR7 representing the direct
    addresses of registers R0, ... , R7 in the current register bank.
    The value of <expr> must be known on pass 1!
    The default value for the register bank is 0.

    Example: USING 1


    A może masz wybrany inny bank i wcale nie odkładasz na stos zawartości R0 z banku 0, i stąd się biorą problemy?

    Jacek
  • REKLAMA
  • #14 3915812
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    patrze na wszytskie możwlie sposoby i noo nic nie widze. jak ktoś ma ochoto to prosze zyrknąć, rozwiązanie zagadki nagrodzone zostanie piwkiem

    (sory, musiałem usunac załącznik)
  • #15 3916228
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    NO_5S:	DJNZ DOG_U, NDG			;JESLI ZOSTANIE ODLICZONE 25 SEKUND BEZ ODEBRANIA ZNAKU KONCA LINI TO URUCHOM RESTART SYSTEMU
    	CLR ERR_OUT			;LINIA WYJCIA BLEDU NA ZERO	
    	CLR F0				;ZEBY NIE WYSYLA SMS O RESTERCIE
    	POP PSW
    	POP ACC
    	MOV R0, SP
    	MOV @R0, #0
    	DEC R0
    	MOV @R0, #0
    	RETI


    Niepodoba mi się to co robisz z danymi z SP :). Konkretnie 4 przedostatnie rozkazy przed RETI. Do czego to miało służyć??
  • #16 3916264
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    ot taki wirtualny reset. Jak tam wpadnie to wyskakuje pod adresem 0h- czyli tak jak po resecie sprzetowym

    program sie wysypuje zanim do tego dojdzie
  • #17 3920288
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    No i chyba naprawione. Nie wiem jak, ale wygląda na to że jest gitara (oby)
    Jak ktoś ma coś do dodania to zapraszam, bo jutro zamykam temat.
  • #18 3920311
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    A podzielisz się informacją co poprawiłeś ? :)
  • #19 3920799
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    no właśnie nie wiem, bo zrobiłem za jednym zamachem kilka rzeczy. Ale z tego co zauwazyłem to do ramu wpisywały mi się dziwne rzeczy (układ wypluwał je po uarcie). Teraz profilaktycznie go czyszcze, ale co było tak naprawde przyczyną... nie wiem
  • #20 3922820
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Przecież masz na Elektrodzie starą wersję (bez poprawek) więc pobierz ja i porównaj z obecną.
  • #21 3922895
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Stara wersję mam tez u siebie, musze jednak nabrac ochote żeby to wszytsko przesymulowac. Póki co mam dość ;)

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z działaniem programu w asemblerze dla mikrokontrolera 8051, gdzie dodanie jednego NOP nie rozwiązuje problemu, a dopiero drugi NOP powoduje poprawne działanie. Problem wydaje się być związany z nieprawidłowym zarządzaniem stosem i bankami rejestrów, co prowadzi do błędów w powrocie z funkcji i niestabilności programu. Użytkownik korzysta z dwóch źródeł przerwań (timer i UART) i stosuje rejestry R0-R3 oraz zmienne w pamięci od 20h do 39h, a stos jest umieszczony nisko w pamięci RAM (05h-19h), co może powodować kolizje z rejestrami i danymi. Sugerowano przeniesienie stosu wyżej w pamięci lub użycie pamięci IDATA. Wskazano również na możliwe błędy związane z przełączaniem banków rejestrów i nieprawidłowym odkładaniem na stos, zwłaszcza w kontekście symboli asemblera AR0-AR7, które nie są fizycznymi rejestrami 8051, lecz symbolami adresowymi zależnymi od dyrektywy USING. Autor przyznał, że problem był subtelny i trudny do symulacji, a ostateczna poprawka polegała na czyszczeniu pamięci RAM, co zapobiegło zapisywaniu niepożądanych danych przez układ i ustabilizowało działanie programu.
Wygenerowane przez model językowy.
REKLAMA