forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

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

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> 8051 / 8052
 
kajo873
Nováček
Nováček


Založen: 5.6.2012
Příspěvky: 6

PříspěvekZaslal: 09 červen 2012, 22:39    Předmět: Projekt - riadenie krokového motora cez RS232 (AT89S51) Citovat

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 http://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:
kód:

        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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Panda38
Profesionál
Profesionál


Založen: 18.9.2012
Příspěvky: 398
Bydliště: Praha, Most

PříspěvekZaslal: 20 listopad 2012, 19:47    Předmět: Citovat

Do 4 KB kód vejde v pohodě, tohle v ASM zabere jen max. pár stovek bajtů. Smile I v C by vešlo s rezervou. (obsah bohužel neumím posoudit)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> 8051 / 8052 Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)