Skocz do zawartości

[Asm] Pomoc w kodzie


damo

Pomocna odpowiedź

Witam mam kod do mikrokontrolera PIC16F lecz nie potrafie rozszyfrowac.

Jak działa wykonywanie tego kodu i jaka jest rola petli?

;///////// DIODY ///////////////////////////////////////////////////////////////// 
; 
; Toggle the green LED every half second. 
;Use 4 MHz crystal for 1 us internal clock period 
; 
;///////// Program hierarchy //////////////////////////////////////////////////// 
; 
;ProgramGlowny 
;	Inicjalizacja 
;	Przelacz 
;	DziesiecMs 
; 
;//////////////////////////////////////////////////////////////////////////////// 

list C=160, N=80, ST=ON, MM=ON 
include "P16F74.INC" 
__config ( _CP_OFF & _PWRTE_ON & _HS_OSC & _WDT_OFF & _BODEN_OFF ) 
errorlevel -302 

;///////// Equates ////////////////////////////////////////////////////////////// 

Bank0RAM	equ	H'20' 
MaksLicz	equ	50 
Dioda3	equ	B'00000001' 
DziesMsH	equ	13 
DziesMsL	equ	250 

;///////// Variables //////////////////////////////////////////////////////////// 

cblock Bank0RAM 
LICZPETLE 
LICZNIKH 
LICZNIKL 
endc 

;///////// Wektory ////////////////////////////////////////////////////////////// 

org	H'000' 
goto ProgramGlowny 
org	H'004' 
Stop 
goto	Stop 

;///////// Tablice ///////////////////////////////////////////////////// 

;brak tablic 

;///////// Program g?ówny ///////////////////////////////////////////////////// 

ProgramGlowny 
call	Inicjalizacja 
nop 
nop 
PetlaGlowna 

call	DziesiecMs 
call	Przelacz 
goto	PetlaGlowna 

;///////// Inicjalizacja ////////////////////////////////////////////////// 

Inicjalizacja 
movlw	MaksLicz 
movwf	LICZPETLE 
bsf	STATUS,RP0 
clrf	TRISD 
bcf	STATUS,RP0 
movlw	Dioda3 
movwf	PORTD 
return 

;///////// Przelacz ///////////////////////////////////////////////////// 

Przelacz 
decfsz	LICZPETLE,F 
goto PrzelaczKoniec 
call Op47c 
movlw	MaksLicz 
movwf	LICZPETLE 
movlw	Dioda3 
xorwf	PORTD,F 
PrzelaczKoniec 
return 

;///////// DziesiecMs ///////////////////////////////////////////////////// 

DziesiecMs 
;nop 
movlw	DziesMsH 
movwf	LICZNIKH 
movlw	DziesMsL -3 
movwf	LICZNIKL 
DziesiecMs_1 
decfsz	LICZNIKL,F 
goto	DziesiecMs_1 
decfsz	LICZNIKH,F 
goto	DziesiecMs_1 
return 
Op47c 
movlw 14 
movwf LICZNIKL 
Op47c_1 
decfsz LICZNIKL,F 
goto Op47c_1 
return 
end

 

Link do komentarza
Share on other sites

Nie przesadzaj, lista instrukcji tego muzealnego zabytku to pewnie ze 30 instrukcji na krzyż. Jeżeli w ogóle rozumiesz działanie jakiegokolwiek procesora, to z PICem takim jak ten pójdzie Ci jak z płatka. Bierzesz ją (listę instrukcji - zajmuje niecałą stronę A4) do ręki, odczytujesz kolejne instrukcje z programu, sprawdzasz co robią i sam tłumaczysz nam działanie kodu dopisując komentarze po prawej stronie. Ja mogę zacząć od pętli głównej programu:

ProgramGlowny ; Etykieta czyli nazwa pewnego miejsca w kodzie
call	Inicjalizacja ; Wywołanie procedury Inicjalizacja
nop 
nop 
PetlaGlowna ; Znowu etykieta - tym razem miejsce nazwano "PetlaGlowna", ciekawe dlaczego?

call	DziesiecMs ; Wywołanie procedury DziesiecMs (może chodzi o opóźnienie 10ms?)
call	Przelacz ; Wywołanie procedury Przelacz (pewnie coś przełączy - zobaczymy)
goto	PetlaGlowna ; Skok do miejsca PetlaGlowna - wyjaśniła się nazwa, to rzeczywiście główna pętla tego programu

Teraz Twoja kolej, weź się za to:

Inicjalizacja 
movlw	MaksLicz 
movwf	LICZPETLE 
bsf	STATUS,RP0 
clrf	TRISD 
bcf	STATUS,RP0 
movlw	Dioda3 
movwf	PORTD 
return 

Jeżeli czegoś nie wiesz, zatrzymujesz się i piszesz "<-- Tego nie rozumiem". Odpowiedź "Nie rozumiem niczego" jest nieakceptowalna.

No to czekamy 🙂

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.