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.