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

MOV SBUF, @R0- czyli dlaczego stos zaczyna orać? :)

bolek 14 Gru 2006 13:31 1140 4
REKLAMA
  • #1 3330170
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    wklejam wycinek kodu. problem polega na tym że wywołania procedury SEN_RAM powoduje wyłczenie przerwania z T0, przerwanie z UARTA działa
    Sama procedura wykonuje swoje zadanie.

    Wina jest na pewno tej procedury, w przerwaniu od T0 robie CPL ledowi. Przestaje on migać w momencie powrotu z SEN_RAM (mam za CALL SEN_RAM postawione jmp $)


    		ORG 0000H
    	JMP MAIN
    
    	ORG 000BH
    	JMP TMR0
    	
    	ORG 0023H
    	JMP UART_INT
    	
    MAIN:
    	MOV R0, #20H
    MAI1:	MOV @R0, #0
    	INC R0
    	MOV A, R0
    	CJNE A, #128,MAI1	
    	
    	MOV SP, #05h
    	
    	SETB P3.0
    	SETB P3.1
    	
    	
    	MOV IE,   #10010010B	;ZEWOLENIE NA PRZERWANIA OD: UART, T0
    	MOV SCON, #01000000B	;UART W TRYBIE PIERWSZYM
    	MOV TMOD, #00100001B	;T1 JAKO LICZNIK 8 BITOWY Z AUTOPRZELADOWANIEM, T0 JAKO LICZNIK 16 BITOWY
    	MOV PCON, #10000000B	;SMOD=1, PODWOJENIE PREDKOSCI DLA UARTA (ABY BYLO 19200)
    	MOV TH1, #0FDh		;UART BEDZIE PRACOWAL Z PREDKOSCIA 19200
    	SETB PS			;PRZERWANIE Z UARTA BEDZIE MIEC NAJWYZSZY PRIORYTET
    	SETB TR1		;START LICZNIKÓW 
    	SETB TR0
    	SETB REN		;SPRZETOWE ODBLOKOWANIE UARTA
    	CLR P3.2
    	CLR RI		
    	
    	call sen_ram
    	jmp $
    
    SER:	INC R0			;ZWIEKSZ WSKAZNIK ADRESU
    	JNB TI, $
    	CLR TI
    SEN_RAM:			;WYSLANIE ZAWARTOSCI RAMU OD ADRESU PODANEGO W R0 DO ADRESU R1
    	
    	MOV SBUF, @R0
    	MOV A, R0
    	CJNE A, AR1, SER
    	RET
    
    UART_INT:
    	clr ri
    	clr ti
    	reti
    TMR0:
    	reti
    END


    wklejony kod to to co testowałem na symulatorze. w pewnym momencie stos zrywa sie z łańcucha i jeźdzo po całym ramie ;/
    Nie wiem czy to wina symulatora, ale program w procku nie leci w maliny- wyłącza sie tylko przerwanie
  • REKLAMA
  • #2 3330266
    bis
    Poziom 21  
    Posty: 274
    Pomógł: 54
    Ocena: 3
    Cytat:
    MOV SP, #05h

    Co chcesz przez to uzyskać? Ile miejsca masz po takim ustawieniu zarezerwowane na stosie? Rozważ co się stanie po Call i wystapieniu przerwań, Co będzie z rejestrami R1 i R0.

    Cytat:
    SER: INC R0 ;ZWIEKSZ WSKAZNIK ADRESU
    JNB TI, $
    CLR TI

    Jak często w "normalnym programie" wyłapiesz to "TI" skoro w przerwaniach je kasujesz?

    bis
  • REKLAMA
  • #3 3330348
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    rejestry mam poodkładane, Ti Ri zeruje tylko w celu symulacji
    To zachowuje się dokładnie tak jak bym miał gdzieś w tej procedurze rozkaz wyłączenia przerwania z od T0. Jeśli był by to problem z odkładaniem na stos, to domyślam się ze tak identyczny objaw by nie wsytępował. Cały program jest o wiele bardziej rozbudowany i wszytsko działało do memndy gdy nie dodałem tej nieszczęsnej procedury wysyłki ramu do SBUFa

    Dodano po 1 [godziny] 30 [minuty]:

    Jest coś nowego w sprawie
    Problem znikoł w momencie gdy usunowłem polecenie SETB PS. Czyli przerwanie z uarta ma najwyższy priorytet. W tedy by się mogło zdarzyć że nie T0 nie zostanie obsłużone, bo procesor siedzi cały czas w UARCie. Ale w takim razie dlaczego normalnie wykonywał pętle główną?

    Dalej nie wiem "co ma piernik do wiatraka"
  • REKLAMA
  • #4 3331066
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Wchodzisz do rozkazu JNB TI, $ i program sie w tym badaniu kręci. W tym czasie wystąpi przerwanie od UART-u i w jego obsłudze zostaje wyzerowana flaga TI. Po powrocie z obsługi przerwania UART-u flaga TI jest = 0 i JNB TI, $ kręci się w koło, nigdy z tego nie wychodząc. W dość chytry sposób zapętliłeś sobie program, gratulacje.
  • #5 3331113
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    he he, to jest bardziej skomplikowane niż sie wydaje. Orginalnie procedura przerwania od UARTa kasuje mi tylko RI, a odebrane dane przepisuje do ramu. TI było kasowane tylko w procedurze nadawania znaków.
    Cholernie to dziwne czemu przestał obsługiwac przerwanie od T0 a wykonywał pętle główną?!?

    Na szybko rozwiązałem to w inny sposób. Wstawiłęm z powrotem SETB PS, ale TI kasuje w przerwaniu UARTa ustawiajac zarazem bit świadczący o nadaniu znaku ( no i jeśli on się ustawi to nadaje kolejny znak)

    ot niezbadane sa ścierzki PC w prockach.
    jutro to przerobie całkiem, ewentualnie tu jeszcze dopisze coś ciekawego i zamykam temat
REKLAMA