Приклад програми для лабораторної роботи №8

Скласти програму керування кроковим двигуном. Режим роботи двигуна визначається натисканням кнопок першого рядка клавіатури (наприклад, перша кнопка – пуск/стоп, друга – реверс, третя – збільшення швидкості обертання, четверта – зменшення).

Алгоритм роботи драйвера:

 

 

Рисунок 7.2 – Алгоритм основного циклу програми керування кроковим двигуном (обробка переривання таймера 0)

 


 

 

sbit F1  = 0xD1        //Declare flag F1

DAT     equ R0 //Data transfer register

ADDR    equ R1 //Address transfer register

ST_CNT equ R2      //Steps counter

PS_CNT equ R3      //step to step pause

V_cnt equ R4

Flags_a equ 0x004

 

C_TL0 EQU 0FFh

C_TH0 EQU 00Ah    //07FFh - max stab. vel. of rotation

SM_addr EQU 009h //Step motor address

Step_11 EQU 000000001b

Step_12 EQU 000000100b

Step_13 EQU 000000010b

Step_14 EQU 000001000b

Step_21 EQU 000000101b

Step_22 EQU 000000110b

Step_23 EQU 000001010b

Step_24 EQU 000001001b

 

Pause EQU 003h

 

ORG      0x0000

JMP      RESET

ORG      0x000B

JMP      Tim0_ovf

 

ORG      0x0030

RESET:

  MOV ST_CNT, #001h //Step 1

  MOV PS_CNT, #Pause //pause...

  MOV V_cnt, #Pause //program flags

  MOV DAT, #0FFh

  MOV ADDR,#007h

  CALL write

  MOV DAT, #000h

  MOV ADDR,#SM_addr

  CALL write

  CALL Timer0_init

  wait:

        JMP wait

 

Timer0_init:

MOV      TH0, #C_TH0           //1,0XX ms

MOV      TL0, #C_TL0

MOV      TMOD,#001h           

MOV      TCON, #010h //Run timer

MOV      IE, #010000010b

//Enable global interrupt and Timer0 interrupt

MOV      IP, #000000000b

//interrupt priority


RET

;**********************************

; Step subroutine

Tim0_ovf:

MOV      TH0, #C_TH0           //1,0XX ms

MOV      TL0, #C_TL0           //Reload timer 0

      

  CALL Read_row1

  MOV A, DAT

  JB ACC.4, RUN

  JB ACC.5, Revers

  JB ACC.6, V_inc

  JB ACC.7, V_dec

      

  JMP M_CNTRL

  RUN: //starting and feet by turns

        CPL F0

        JMP M_CNTRL

  Revers:     

            

        JMP M_CNTRL

  V_inc:

        INC V_cnt

        CJNE V_cnt, #000h, M_CNTRL

        DEC V_cnt

        JMP M_CNTRL

  V_dec:

        DEC V_cnt

        MOV A, V_cnt

        SUBB A, #003h

        JNC M_CNTRL

        MOV V_cnt, #003h

        JMP M_CNTRL

  M_CNTRL:

  DEC PS_CNT         //decrement step to step pause counter

  CJNE PS_CNT, #000h, E_T0_ovf

               // exit from interrupt

               // if pause is full

  MOV A, V_cnt

  MOV PS_CNT, A             //reload step to step pause counter

  JNB F0, E_T0_ovf

step1:

  CJNE ST_CNT, #001h, step2

        MOV DAT, #Step_11

        MOV ADDR,#SM_addr

        CALL Write

  MOV ST_CNT, #002h

  RETI

step2:

  CJNE ST_CNT, #002h, step3

        MOV DAT, #Step_12

        MOV ADDR,#SM_addr

        CALL Write

  MOV ST_CNT, #003h

  RETI

step3:

  CJNE ST_CNT, #003h, step4

        MOV DAT, #Step_13

        MOV ADDR,#SM_addr

        CALL Write

  MOV ST_CNT, #004h

  RETI

step4:

  CJNE ST_CNT, #004h, step1

        MOV DAT, #Step_14

        MOV ADDR,#SM_addr

        CALL Write

  MOV ST_CNT, #001h

  RETI

E_T0_ovf:

  // mov zero to step motor latch

  MOV DAT, #000h

  MOV ADDR, #SM_addr

  CALL write

RETI

;*********************************

Read_row1:

  MOV P1, #000h

  MOV P2, #000010000b

  NOP

  NOP

  MOV A, P1

  ANL A, #0F0h

  MOV Dat, A

//Check old-push button

  JB F1, RR1

  CJNE DAT, #000h, RR2

  JMP RRend

  RR1:

        CJNE DAT, #000h, RR3

        CLR F1

        JMP RRend

  RR2:

        SETB F1

        JMP RRend

  RR3:

        MOV DAT, #000h

        JMP RRend

  RRend:

RET

write: setb P3.6

  mov P0, DAT //moving data to bus buffer

  mov P2, ADDR //set periferals address

  nop

  nop

  mov P2,#000h   //clock

Ret

END


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: