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

AT89S8252: Skoki do nieistniejącego adresu po RETI w debugerze Keil uVision2

clipie 24 Sty 2006 16:13 1372 13
  • #1 2214119
    clipie
    Poziom 16  
    Posty: 188
    Pomógł: 11
    Ocena: 1
    Program: w petli glownej wlsciwie oprocz incjalizacji timera i kilku inych rzeczy niema nic (malo kodu) na koncu petla nieskonczona.
    Wszystko odbywa sie w obsludze timera, siedzi tam sporych rozmiarow kod, jest duzo skokow i podprogramow (to czy beda wykonane zalezy od aktualnego stanu portow - WAZNE).

    Umiejscowienie w notatniku - od gory pierwsze w kolejnosci sa deklaracje Potem obsluga timera nastepnie program glowny, na koncu wszytkie podprogramy (z ktorych kozysta zarowno timer jak i program glowny)

    kompilator: keil uvision2

    Problem: po klikniciu run w debugerze, wszytsko jest ok dopuki stan portow bedzie taki sam, gdy sie przy nich zacznie majstrowac (brobujac zasymulowac dzialnie w rzeczywistosci). Po wyjsciu z przerwania (zaraz po RETI) zamiast kontynuowac petle nie skonczoną w programie glownym skacze do jakigos niestworzonego adresu(tutaj konczy zabawe i sie wykrzacza), przyczym ten adres jest taki sam dla okreslinej liczby wykonanych podprogramow (dla okreslonego stanu portow).

    kazdy podprogram ma ret i w ogole
    Ze wskaznikiem stosu jest wszytko wporzadku.

    Nie mam pojecia co robic.
  • #2 2214162
    ko_rex
    Poziom 19  
    Posty: 253
    Pomógł: 38
    Ocena: 2
    no..wygląda to tak, jakby coś sie działo z zawatością stosu... Nie nachodzi Ci stos przypadkiem na jakieś zmienne w RAM?
    Spróbuj przesymulować w jakimś innym programie.
  • #3 2215853
    clipie
    Poziom 16  
    Posty: 188
    Pomógł: 11
    Ocena: 1
    hmm zmienne w RAM (?), czyli kompilator nieprzewidzial miejsca na stos?
    i czy wogole stos jest wciskany w przestrzen pamieci dostepnej urzytkownikowi? Program nie wykozystuje zadnych tablic.

    ze stosem jest wszytko wporzadka, w przerwaniu nie ma podprogramow zagnierzdzonych (jesliby nie liczyc przerw. TO). Stos maksymalnie liczy sobie 5 (T0>acc>b>psw + podprogram).

    Dodam ze program zawsze po wyjsciu z przerwania skacze do poczatku samego programu glownego (!?) a powinien skoczyc do "sjmp $"
  • #4 2216092
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    W obsłudze przerwania T0 , cyklicznie zmieniasz stan bitu RS0 , co przy pierwszym wywołaniu przerwania ustawia bank rejestrów na 1 (08H-0Fh)
    
    	ORG	0BH
    
    	MOV	TH0,#0FDH
    	MOV	TL0,#00H
    
    	PUSH	ACC 		; save A,B i PSW
    	PUSH	B
    	PUSH 	PSW
    	
    	CPL	RS0             ;tu zmieniasz bank rejestrów z 0  na  1
    
    

    Stos domyślnie ustawiony jest na 07H.Przerwanie odkłada na stosie (08H i 09H) adres powrotu , który w procedurze przerwania nadpisujesz :(
    
    KREC:
    	MOV	B,K_S_SIL
    	MOV	A,K_S_SIL
    	RL	A
    	ANL	A,B
    	ANL	A,#10101010B
    	MOV	R0,A                  ;tu "zamazujesz" adres powrotu
    
    

    Symulator , to nieocenione narzędzie , jeśli pozwala kontrolować stos :D
    Symulato od razu wywalił ostrzeżenie , o nadpisaniu adresu powrotu z przerwania T0.

    Piotrek
  • #5 2216310
    Jellyeater
    Poziom 17  
    Posty: 246
    Pomógł: 6
    Ocena: 3
    Czyli on odkłada adres powrotu do rejestru R0? Ale ja u sibie korzystałem z timerów, z rejestrów i działało...
  • #6 2216599
    PePe996
    Poziom 15  
    Posty: 89
    Pomógł: 12
    Jellyeater napisał:
    Czyli on odkłada adres powrotu do rejestru R0? Ale ja u sibie korzystałem z timerów, z rejestrów i działało...


    ale moze miales stos w innym miejscu pamieci, anizeli rejestr do ktorego cos sam zapisujesz...
  • #7 2218047
    Jellyeater
    Poziom 17  
    Posty: 246
    Pomógł: 6
    Ocena: 3
    Nic nie zmieniałem. Nie ustawiałem mu stosu...
  • Pomocny post
    #8 2219071
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Jellyeater napisał:
    Czyli on odkłada adres powrotu do rejestru R0? Ale ja u sibie korzystałem z timerów, z rejestrów i działało...

    ON nie odkłada adresu powrotu do R0 , tylko do komórki , na którą wskazuje wskanik stosu . A że wskaźnik stosu po resecie wskazuja na 07H , a po zmianie banku rejestrów na 1 , rejestr R0 "przenosi się" pod adres 08H , to już programista powinien o tym wiedzieć , że stos "wlezie" na aktualnie używany bank rejestrów :( Powinieneś jeszcze troszkę się "dokształcić" w tej materii , bo możesz miec kłopoty :D Najprostrzym wyjściem jest ustawienie SP , powyżej pamięci używanej przez program i po kłopocie - w tym przypadku MOV SP,#4FH ;)

    Piotrek
  • #9 2219165
    clipie
    Poziom 16  
    Posty: 188
    Pomógł: 11
    Ocena: 1
    Jest pieknie, program juz nie stwarza problemow <happy>, mozna pracowac dalej.

    Gratulacje dla tego pana w czerwonym.
  • #10 3020062
    clipie
    Poziom 16  
    Posty: 188
    Pomógł: 11
    Ocena: 1
    Nowy problem

    Chce oprogramowac timer 2 tegoż uk.
    Kompilator (po staremu: keil2) nie widzi zadnego dodtakowego rejestru z SFR - nic ponadto co jest w golutkim 8051.
    Podczas kompilowania Bląd: UNDEFINED SYMBOL dla np. T2CON albo RCAP2H

    Jako device w opcjach projektu zaznaczony oczywiscie at89s8252, z programowaniem problemu nie ma (naturalnie tylko w tegdy gdy kompilacja przebiegnie pomyslnie).

    Co robic?
  • #11 3020133
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    clipie napisał:
    ...Podczas kompilowania Bląd: UNDEFINED SYMBOL dla np. T2CON albo RCAP2H
    ...
    Co robic?

    "Zapoznać" kompilator z tymże mikrokontrolerem , poprzez #include <at898252.h>

    Piotrek
  • #12 3020142
    clipie
    Poziom 16  
    Posty: 188
    Pomógł: 11
    Ocena: 1
    ok, a jesli pisze w asemblerze?
  • Pomocny post
    #13 3020241
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    clipie napisał:
    ok, a jesli pisze w asemblerze?

    A cóż to za różnica :?:
    Składnia będzie inna niż w C , ale cel ten sam.
    No i żeby uniknąć kolejnego postu w postaci "wywala błędy" , podam przykład:
    
    $NOMOD51                           ;"wyłączamy" domyślny plik
    $INCLUDE (AT898252.INC)     ;dołączamy nas interesujący
    	sjmp	reset
    reset:
    	nop
    	sjmp reset
    	end
    


    Piotrek
  • #14 3020465
    clipie
    Poziom 16  
    Posty: 188
    Pomógł: 11
    Ocena: 1
    Juz dziala, za przyklad dziekuje.
    Szybka fachowa pomoc, supper :)

Podsumowanie tematu

✨ Problem dotyczył nieoczekiwanego skoku do nieistniejącego adresu po instrukcji RETI w przerwaniu timera w mikrokontrolerze AT89S8252 podczas debugowania w Keil uVision2. Przyczyną było nadpisywanie stosu przez zmianę banku rejestrów w obsłudze przerwania bez odpowiedniego ustawienia wskaźnika stosu (SP). Domyślny stos zaczynał się na adresie 07H, który kolidował z bankiem rejestrów 1 (adresy 08H-0FH), co powodowało nadpisanie adresu powrotu z przerwania i błędne skoki programu. Rozwiązaniem było przesunięcie wskaźnika stosu na wyższy adres pamięci, np. MOV SP,#4FH, aby uniknąć kolizji z bankiem rejestrów. Dodatkowo poruszono problem braku definicji rejestrów specyficznych dla AT89S8252 (np. T2CON, RCAP2H) w Keil uVision2, który rozwiązuje dołączenie odpowiedniego pliku nagłówkowego (at898252.h lub at898252.inc dla asemblera).
Wygenerowane przez model językowy.
REKLAMA