Projekt - riadenie krokového motora cez RS232 (AT89S51)

Ahojte. Dostal som úlohu od jedného známeho aby som mu spravil riadenie krokového motora cez RS232.
Takže. Začínam s programovaním, a v škole sme programovali 8051ku , vlastne iba simulovali v tomto fajnovom softe mcu8051ide.sourceforge.net/

Zadanie bolo nasledovné.
Na krokovom motore bude pripevnený kruh s 12 otvormi v rozostupoch 30° od seba. Z programu LabWiev pošlem cez sériový port číslo otvoru od 1 do 12. uCU spracuje tento povel preráta na počet krokov. Najprv sa vráti na nulovú pozíciu kde bude uSpínač, a odtial odráta počet krokov ku zadanému otvoru. Na konci natáčania pošle späť cez RS232 signál že proces natáčania skončil a simulácia v LabWiev-e može ďalej pokračovať.

Keďže ako tak ovládam kodenie 8051, vybral som si na túto aplikáciu uCU AT89S51 ktorý si ymslím že úplne postačuje.

Zatiaľ som nakódil všetko okrem tej komunikácie cez RS232. Bol by som rád keby mi niekto pozrel kód a povedal či by to tak zatiaľ mohlo byť. A vlastne čo mi na začiatku programu chýba, lebo v simulátore netreba písať tie úvodné príkazy, a tie nejak zatial neovládam. A potom keby mi niekto poradil s tou komunikáciou cez RS232. Nejakú teoriu mám naštudovanú, ale neviem ako by som to mal implementovať.

Kód programu:

        org	00h
	ljmp	start

	org	003h		;Po vyvolani prersenia program skoci sem
	ljmp	PREVOD		;Navestie kde sa zacina vykonavat obsluha prerusenia

start:	org	30h		        ;Nastavi pointer na adresu 30h
	MOV	P2,#10000000b	;Na P2 bude pripojená 7 segmentovka
	MOV	P1,#10000000b	;Na nultý bit bude pripojený spínač polohy, a na vyššie bity bude pripojená druhá 7 segmentovka
	MOV	P0,#00000000b	;Nultý port bude ovládať budič krokového motora
	MOV	IE,#10000001b	;Nastavenie prerušení
	MOV 	R7,#00h		;Obsahuje počet krokov
	MOV	R6,#02h		;Obsahuje polohu
	jmp	$		        ;Nekonecny cyklus, opakuje sa pokial nepride prerusenie


;*************************************************************
;*******Prevedenie polohy 1, 2, 3, ... na počet krokov krokového motora s krokom 1,8°
PREVOD:	cjne	R6,#01h,dva
	mov	R7,#00h
	ljmp	SKOK1
dva:	cjne	R6,#02h,tri
	mov	R7,#011h		;17 krokov
	ljmp	SKOK1
tri:	cjne	R6,#03h,styri
	mov	R7,#021h		;33 krokov
	ljmp	SKOK1
styri:	cjne	R6,#04h,pet
	mov	R7,#032h		;50 krokov
	ljmp	SKOK1
pet:	cjne	R6,#05h,sest
	mov	R7,#043h		;67 krokov
	ljmp	SKOK1
sest:	cjne	R6,#06h,sedem
	mov	R7,#053h		;83 krokov
	ljmp	SKOK1
sedem:	cjne	R6,#07h,osem
	mov	R7,#064h		;100 krokov
	ljmp	SKOK1
osem:	cjne	R6,#08h,devet
	mov	R7,#075h		;117 krokov
	ljmp	SKOK1
devet:	cjne	R6,#09h,desat
	mov	R7,#085h		;133 krokov
	ljmp	SKOK1
desat:	cjne	R6,#0Ah,jedenast
	mov	R7,#096h		;150 krokov
	ljmp	SKOK1
jedenast: cjne	R6,#0bh,dvanast
	 mov	R7,#0A7h		;167 krokov
	 ljmp	SKOK1
dvanast:	cjne	R6,#0Ch,NEPLATI
	mov	R7,#0B7h		;183 krokov
SKOK1:	ljmp	VZAD
NEPLATI:	reti			;Keď príjme iné číslo ako je v rozshu vráti sa speť z prerušenia.


;************************************************************
;*******Vykreslovanie zadanej pozície na dysplej.
DISPLEJ: cjne	R6,#01h,TWO
	mov	P2,#11110010b
	mov	P1,#10000000b
	reti
TWO:	cjne	R6,#02h,THREE
	mov	P2,#01001000b
	mov	P1,#10000000b
	reti
THREE:	cjne	R6,#03h,FOUR
	mov	P2,#01100000b
	mov	P1,#10000000b
	reti
FOUR:	cjne	R6,#04h,FIVE
	mov	P2,#00110010b
	mov	P1,#10000000b
	reti
FIVE:	cjne	R6,#05h,SIX
	mov	P2,#00100100b
	mov	P1,#10000000b
	reti
SIX:	cjne	R6,#06h,SEVEN
	mov	P2,#00000110b
	mov	P1,#10000000b
	reti
SEVEN:	cjne	R6,#07h,EIGHT
	mov	P2,#11110000b
	mov	P1,#10000000b
	reti
EIGHT:	cjne	R6,#08h,NINE
	mov	P2,#00000000b
	mov	P1,#10000000b
	reti
NINE:	cjne	R6,#09h,TEN
	mov	P2,#00110000b
	mov	P1,#10000000b
	reti
TEN:	cjne	R6,#0Ah,ELEVEN
	mov	P2,#10000000b
	mov	P1,#11110010b
	reti
ELEVEN:	cjne	R6,#0Bh,TWELVE
	mov	P2,#11110010b
	mov	P1,#11110010b
	reti
TWELVE:	cjne	R6,#0Bh,KONIEC
	mov	P2,#01001000b
	mov	P1,#11110010b
KONIEC:	reti

;**********************************************************
;******** Spetný chod motora, pokial nepríde na nulovú polohu, kedy dostane log.1 na port 
;******** P1.0. Program potom skočí na vykonávanie dopredného chodu.
;***********************************************************
VZAD:	JB	P1.0,koniecREV	;ak bude na nulovej pozicii, prejde hneď na točenie vpred
	MOV	P0,#00000001b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00000011b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00001000b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00001001b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00000100b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00001100b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00000010b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	MOV	P0,#00000110b
	ACALL	ONESKOR
	JB	P1.0,koniecREV
	ljmp	VZAD
koniecREV:ljmp	VPRED

;**********************************************************************
;*****Dopredný chod motora. Vykonáva sa pokial nespravý definovaný počet krokov
;*****ktorý je uložený v registry R7. Po vykoananí všetkých krokov sa program vrázi z
;*****prerušenia
;***************************************************************

VPRED:	MOV	P0,#00000001b
	ACALL	ONESKOR
	DJNZ	R7,STEP1
	ljmp	DISPLEJ
STEP1:	MOV	P0,#00000011b
	ACALL	ONESKOR
	DJNZ	R7,STEP2
	ljmp	DISPLEJ
STEP2:	MOV	P0,#00000010b
	ACALL	ONESKOR
	DJNZ	R7,STEP3
	ljmp	DISPLEJ
STEP3:	MOV	P0,#00000110b
	ACALL	ONESKOR
	DJNZ	R7,STEP4
	ljmp	DISPLEJ
STEP4:	MOV	P0,#00000100b
	ACALL	ONESKOR
	DJNZ	R7,STEP5
	ljmp	DISPLEJ
STEP5:	MOV	P0,#00001100b
	ACALL	ONESKOR
	DJNZ	R7,STEP6
	ljmp	DISPLEJ
STEP6:	MOV	P0,#00001000b
	ACALL	ONESKOR
	DJNZ	R7,STEP7
	ljmp	DISPLEJ
STEP7:	MOV	P0,#00001001b
	ACALL	ONESKOR
	DJNZ	R7,VPRED
	ljmp	DISPLEJ

;************************************
;********Podprogram oneskorenia
;***********************************
ONESKOR: MOV	R4,#02h		;Podprogram oneskorenia (pozn. 1E a FF)
ONES:	MOV	R3,#02h
	djnz	R3,$
	djnz	R4,ONES
	RET			;Vrátenie späť kde došlo k zavolaniu podprogramu oneskorenia
	
	END

Oneskorenie je zatiaľ kvôli simulácii nastavené len na niekolko u-sekúnd ale potom ho nastavím na m-sekundy, aby kru nenabral zotrvačnosť, aby zastavil na tej pozícii kde má zastaviť.
Na konci celého podprogramu prerušenia je ešte výpis aktuálnej pozície na sedemsegmentovku.

A ešte jedna otázka, či mi vlastne do tej AT89S51 ky vojde takýto dlhý kód keď má len 4kb programovej pamäti.

Ďakujem za rady.

Do 4 KB kód vejde v pohodě, tohle v ASM zabere jen max. pár stovek bajtů. :slight_smile: I v C by vešlo s rezervou. (obsah bohužel neumím posoudit)