Stoper pod mikrokontroler 8051.

0

Witam i przepraszam z gory za kod w asm

Potrzebuje waszej pomocy, musze napisac stoper w asm. Już sie męcze z tym troche i nie chce działac tak jak powinno, więc prosze was o naproawdzenie/poprawienie błedów w kodzie ponizej.

I chcialbym rowniez wiedziec, czy moja interpretacja polecen w tym kodzie jest poprawna.

Sam Timer działa poprawnie.

Chcialbym aby sterowanie stoperem odbywalo sie za pomoca portu P1. w sensie poprzez ilosc klikniec nastapi start/stop/zerowanie.

z gory thx.

org 0h 
;Następny rozkaz zostanie umieszczony pod adresem 0x0000
 
 
sek1	equ 	55h 
sek2	equ 	56h
ms1	equ	57h
ms2	equ	58h
min1	equ	59h
min2	equ 	5Ah
godz1	equ	5Bh
godz2	equ	5Ch	
;umieszczenie nowych zmiennych w rejestrach
 
MOV R5,#0
MOV R4,#0
MOV R3,#0
MOV R2,#0
;wyzerowanie rejestrów
 
 
JMP stoper
;skok krótki do etykiety stoper
 
start:
org 100bh 	
;ustawienie licznika lokalizacji asemblera
 
INTT0:  
 
Inc R5
;dodanie 1 do R5
CJNE R5, #99, ems	
;porównanie zawartości rejestru z daną natychmiastową (99), jeśli są różne następuje skok pod etykietę ems, jeśli są równe skok nie jest wykonywany
 
Inc R4
MOV R5,#0
;wyzerowanie R5
CJNE R4, #60, s 
 
Inc R3
MOV R4,#0
CJNE R3, #60, min
 
Inc R2
MOV R3,#0
CJNE R2, #24, godz
 
 
ems:
SJMP BCDMS	
;skok krótki do etykiety BCDMS, tylko pod adresy z zakresu 0-255
 
s:
SJMP BCDS
 
min:
LJMP BCDMIN	 
;skok długi do etykiety BCDMIN, dostępny pełny obszar adresowy 64k
 
godz:
LJMP BCDGODZ
 
 
start:
MOV sek1,#0 
MOV sek2,#0
MOV ms1,#0
MOV ms2,#0
MOV min1,#0
MOV min2,#0
MOV godz1,#0
MOV godz2,#0
;wyzerowanie zmiennych
 
MOV R7, #0 
;wyzerowanie R7
MOV TL0, #LOW(65535-10000) 
;Załadowanie młodszych bitów zmiennej z liczbą cykli 10000
MOV TH0, #HIGH(65535-10000) 
;Załadowanie s tarszych bitów zmiennej z liczbą cykli 10000
MOV TMOD, #00010001b 
;tryb pierwszy dla T0 i T1 
SETB EA  
;zezwolenie na przerwania ogolnie  
SETB ET0 
;zezwolenie na przerwanie licznika T0
SETB TR0 
;startujemy T0
 
;obsluga portu
SETB ET1 
;zezwolenie na przerwanie od licznika t1
MOV TH1,#-13 
;ustawienie szybkosci przepelnienia, czym mniejsza wartosc tym szybciej nastapi sygnał przerwania
MOV TL1,TH1
;zapamiętanie wartości TH1 w mniej znaczącym bicie 
SETB TR1 
;startujemy T1
MOV SCON,#01010000b  
;aktywacja odbiornika oraz wybor  1-go trybu dla portu szeregowego = Transmisja szeregowa asynchroniczna full duplex, Znaki 8-bitowe. Prędkość transmisji określana programowo 
 
 
JMP $ 
;wieczna pętla
 
BCDS:
MOV A,04
MOV B,#10 
;ustawienie ile razy licznik ma się przepełnić, ile razy ma zliczac 
DIV AB 
MOV sek1,A
;wynik z dzielenia zapisany do sek1
MOV sek2,B
;dzielnik dielenia zapisany do sek2
RETI 
;Wyjście z bloku kodu obsługi przerwania
 
BCDMS:
CLR C
;wyczyszczenie C
MOV A,05
MOV B,#10 
DIV AB
MOV ms1,A
MOV ms2,B
MOV SBUF,#13
 
MOV A,godz1
ADD A,#30h
MOV SBUF,A
MOV A,godz2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
 
MOV A,min1
ADD A,#30h
MOV SBUF,A
MOV A,min2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
 
 
MOV A,sek1
ADD A,#30h
MOV SBUF,A
MOV A,sek2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
 
 
MOV A,ms1
ADD A,#30h
MOV SBUF,A
MOV A,ms2
ADD A,#30h
MOV SBUF,A
RETI 
 
 
BCDMIN:
CLR C
MOV A,03
MOV B,#10
DIV AB
MOV min1,A
MOV min2,B
RETI 
 
 
BCDGODZ:
CLR C
MOV A,02
MOV B,#10
DIV AB
MOV godz1,A
MOV godz2,B
RETI 
 
 
Zerowanie: 
MOV TR1,#0
MOV TR0,#0
jnb P1.0,stoper
 
stoper:
jnb P1.0, start
jb P1.0, Zerowanie
END
0

To może napisz jak "nie chce działać poprawnie", jakie wyniki dostajesz. Jaki hardware i konfiguracja? Pobierz sobie może jakiś symulator/emulator '51. Ewentualnie zapytaj na forum elektrody.

0

Na porcie P1 nie masz obsługi klawy. P3 odpowiada za klawę sekwencyjną. Polecam sięgnąć po książkę Podstawy programowania mikrokontrolera 8051 panów P.Gałka i P.Gałka.

0

na elektrodzie ogolnie mi napisali, ze w tym calym programie jest sporo bledow. Tyle ze wedlug wykladowcy dziala on poprawnie (w sensie sam timer),a stoper to juz inna bajka:p

wiec w sumie to nie wiem do konca o co w tym wszystkim juz chodzi, skoro to co sie uczylem bylo niepoprawne.

Zamienijac port1 na port3 to wtedy bd to dzialalo w taki sposob: ze klikajac raz stoper startuje / kilkjac drugi raz stoper zarzymuje sie/ klikajac 3raz stoper zeruja sie

org 0h 
;Następny rozkaz zostanie umieszczony pod adresem 0x0000
 
 
sek1        equ         55h 
sek2        equ         56h
ms1        equ        57h
ms2        equ        58h
min1        equ        59h
min2        equ         5Ah
godz1        equ        5Bh
godz2        equ        5Ch        
;umieszczenie nowych zmiennych w rejestrach
 
MOV R5,#0
MOV R4,#0
MOV R3,#0
MOV R2,#0
;wyzerowanie rejestrów
 
 
JMP stoper
;skok krótki do etykiety stoper
 
start:
org 100bh         
;ustawienie licznika lokalizacji asemblera
 
INTT0:  
 
Inc R5
;dodanie 1 do R5
CJNE R5, #99, ems        
;porównanie zawartości rejestru z daną natychmiastową (99), jeśli są różne następuje skok pod etykietę ems, jeśli są równe skok nie jest wykonywany
 
Inc R4
MOV R5,#0
;wyzerowanie R5
CJNE R4, #60, s 
 
Inc R3
MOV R4,#0
CJNE R3, #60, min
 
Inc R2
MOV R3,#0
CJNE R2, #24, godz
 
 
ems:
SJMP BCDMS        
;skok krótki do etykiety BCDMS, tylko pod adresy z zakresu 0-255
 
s:
SJMP BCDS
 
min:
LJMP BCDMIN         
;skok długi do etykiety BCDMIN, dostępny pełny obszar adresowy 64k
 
godz:
LJMP BCDGODZ
 
 
start:
MOV sek1,#0 
MOV sek2,#0
MOV ms1,#0
MOV ms2,#0
MOV min1,#0
MOV min2,#0
MOV godz1,#0
MOV godz2,#0
;wyzerowanie zmiennych
 
MOV R7, #0 
;wyzerowanie R7
MOV TL0, #LOW(65535-10000) 
;Załadowanie młodszych bitów zmiennej z liczbą cykli 10000
MOV TH0, #HIGH(65535-10000) 
;Załadowanie s tarszych bitów zmiennej z liczbą cykli 10000
MOV TMOD, #00010001b 
;tryb pierwszy dla T0 i T1 
SETB EA  
;zezwolenie na przerwania ogolnie  
SETB ET0 
;zezwolenie na przerwanie licznika T0
SETB TR0 
;startujemy T0
 
;obsluga portu
SETB ET1 
;zezwolenie na przerwanie od licznika t1
MOV TH1,#-13 
;ustawienie szybkosci przepelnienia, czym mniejsza wartosc tym szybciej nastapi sygnał przerwania
MOV TL1,TH1
;zapamiętanie wartości TH1 w mniej znaczącym bicie 
SETB TR1 
;startujemy T1
MOV SCON,#01010000b  
;aktywacja odbiornika oraz wybor  1-go trybu dla portu szeregowego = Transmisja szeregowa asynchroniczna full duplex, Znaki 8-bitowe. Prędkość transmisji określana programowo 
 
 
JMP $ 
;wieczna pętla
 
BCDS:
MOV A,04
MOV B,#10 
;ustawienie ile razy licznik ma się przepełnić, ile razy ma zliczac 
DIV AB 
MOV sek1,A
;wynik z dzielenia zapisany do sek1
MOV sek2,B
;dzielnik dielenia zapisany do sek2
RETI 
;Wyjście z bloku kodu obsługi przerwania
 
BCDMS:
CLR C
;wyczyszczenie C
MOV A,05
MOV B,#10 
DIV AB
MOV ms1,A
MOV ms2,B
MOV SBUF,#13
 
MOV A,godz1
ADD A,#30h
MOV SBUF,A
MOV A,godz2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
 
MOV A,min1
ADD A,#30h
MOV SBUF,A
MOV A,min2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
 
 
MOV A,sek1
ADD A,#30h
MOV SBUF,A
MOV A,sek2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
 
 
MOV A,ms1
ADD A,#30h
MOV SBUF,A
MOV A,ms2
ADD A,#30h
MOV SBUF,A
RETI 
 
 
BCDMIN:
CLR C
MOV A,03
MOV B,#10
DIV AB
MOV min1,A
MOV min2,B
RETI 
 
 
BCDGODZ:
CLR C
MOV A,02
MOV B,#10
DIV AB
MOV godz1,A
MOV godz2,B
RETI 
 
 
Zerowanie: 
MOV TR1,#0
MOV TR0,#0
jnb P3.0,stoper
 
stoper:
jnb P3.0, start
jb P3.0, Zerowanie
END
0

Nie masz zamieć portu P1.0 na P3.0! Sięgnij lepiej po książkę, którą wpomniałem wcześniej.

0

obecnie posiadam taki kod / po edycji poprzedniego

ale dalej nie wysyla na port szeregowy;/

program mam zakodowany tak aby przy:

P1.0=1 - pracuje lub kontynuuje prace stopera
P1.0=0 - stop stopera
P1.1=1 - kontynuuje prace
P1.1=0 - stopuje i zeruje

fl_wyslane equ 20h.0
 
sek1 equ 55h
sek2 equ 56h
ms1 equ 57h
ms2 equ 58h
min1 equ 59h
min2 equ 5Ah
godz1 equ 5Bh
godz2 equ 5Ch
;................................................................
	org 0h
	LJMP Reset
 
	ORG 0BH
	LJMP  INTT0
;................................................................
	org 30h
;...........................................................
; restart
;........................................................... 
Reset:
	MOV sek1,#0
	MOV sek2,#0
	MOV ms1,#0
	MOV ms2,#0
	MOV min1,#0
	MOV min2,#0
	MOV godz1,#0
	MOV godz2,#0	
	MOV R7, #0
 
	MOV R5,#0
	MOV R4,#0
	MOV R3,#0
	MOV R2,#0
 
	clr fl_wyslane
 
;konfiguraca port szeregowy
;tryb 1 
	MOV SCON,#01000000b
	setb TI 
 
;konfiguracja timerow
;timer0 Mode 1 – 16-bit Timer/Counter
;timer1 Mode 2 – 8-bit Auto-Reload Timer/Counter	;generator predkosci UART
	MOV TMOD, #00100001b
 
	setb ET0
 
	MOV  TL0, #LOW(55535)	;1mS policzyc dla uzytego kwarca
	MOV  TH0, #HIGH(55535)

 
;TH1=256-(xtal/(384 x baud)) ;dla SMOD=0
;TH1=256-(xtal/(192 x baud)) ;dla SMOD=1
	MOV TH1,#253
	MOV TL1,TH1
 
	SETB TR1
	SETB EA
 
;...........................................................
;obsluga stopera
;...........................................................
;P1.0 
;...................................................
Stoper:
 
	jb  P1.1,Stoper_ss
 
Stoper_Wyzeruj:	;+stop	;P1.1=0 dopuki 0 stoper wyzerowany i zatrzymany
	CLR TR0
	CLR TF0
	MOV  TL0, #LOW(55535)
	MOV  TH0, #HIGH(55535)

 
	MOV sek1,#0
	MOV sek2,#0
	MOV ms1,#0
	MOV ms2,#0
	MOV min1,#0
	MOV min2,#0
	MOV godz1,#0
	MOV godz2,#0	
	MOV R7, #0
	MOV R5,#0
	MOV R4,#0
	MOV R3,#0
	MOV R2,#0
 
	jb fl_wyslane,stoper
	call Wyslij_UART
	sjmp stoper
 
Stoper_ss:
	jb  P1.0,Stoper_start	;1= start lub kontynuacja
 
Stoper_Stop:			;P1.0=0 dopuki 0 zatrzymany
	CLR TR0
	CLR TF0
	MOV  TL0, #LOW(55535)
	MOV  TH0, #HIGH(55535)

	jb fl_wyslane,stoper
	call Wyslij_UART
 
	sjmp stoper
 
Stoper_start:	;P1.1=1 dopuki 1 stoper pracuje
 
	SETB TR0 
 
	jb fl_wyslane,stoper
	call Wyslij_UART
 
	sjmp stoper
;..............................................................................
;koniec obslugi stopera
;..............................................................................
Wyslij_UART:
 	MOV A,R5
 
	MOV B,#10
	DIV AB
	MOV ms1,A
	MOV ms2,B
	JNB TI,$	;1=bufor pusty 0=bufor pelny  
	CLR TI
	MOV SBUF,#13
 
	MOV A,godz1
	ADD A,#30h	;na ascii
	JNB TI,$	;1=bufor pusty 0=bufor pelny
	CLR TI
	MOV SBUF,A
 
	MOV A,godz2
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A
	JNB TI,$
	MOV SBUF,#58
 
	MOV A,min1
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A

	MOV A,min2
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A
	JNB TI,$
	CLR TI
	MOV SBUF,#58
 
	MOV A,sek1
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A

	MOV A,sek2
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A
	JNB TI,$
	CLR TI
	MOV SBUF,#58
 
	MOV A,ms1
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A

	MOV A,ms2
	ADD A,#30h
	JNB TI,$
	CLR TI
	MOV SBUF,A
 
	setb fl_wyslane
 
	ret
;.................................................................
;obsluga przerwania od T0  ;10mS
;.................................................................
INTT0:
	push	PSW
	push	ACC
	push	B
 
	MOV TL0, #LOW(55535)
	MOV TH0, #HIGH(55535)
 
	clr fl_wyslane
 
	Inc R5
	CJNE R5, #99, BCDMS
 
	Inc R4
	MOV R5,#0
	CJNE R4, #60, BCDS
 
	Inc R3
	MOV R4,#0
	CJNE R3, #60, BCDMIN
 
	Inc R2
	MOV R3,#0
	CJNE R2, #24, BCDGODZ
BCDMS:
	pop B
	pop ACC
	pop PSW
	RETI
;..................................................................
;...................................................................................
BCDS:
	MOV A,R4
	MOV B,#10
	DIV AB
	MOV sek1,A
	MOV sek2,B
	pop B
	pop ACC
	pop PSW
	RETI 
;...................................................................
BCDMIN:
	MOV A,R3
	MOV B,#10
	DIV AB
	MOV min1,A
	MOV min2,B
	pop B
	pop ACC
	pop PSW
	RETI
;..................................................................
BCDGODZ:
	MOV A,R2
	MOV B,#10
	DIV AB
	MOV godz1,A
	MOV godz2,B
	pop B
	pop ACC
	pop PSW
	RETI
;................................................................. 
;koniec obslugi przerwania od T0
;.................................................................... 
END

1 użytkowników online, w tym zalogowanych: 0, gości: 1