Перейти к содержимому

MOAB

- - - - -

Программирование микроконтроллеров


  • Войдите, чтобы ответить
Сообщений в теме: 5

#1 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 162 сообщений
1 770

Отправлено 21 Август 2017 - 21:19

Есть у нас спецы в области программирования микроконтроллеров? Я в этом деле ВАЩПЕ не в зуб ногой.
Это программа управления шаговым двигателем. Мне нужно поднять обороты двигателя раз этак в 10. В этой программе есть какой-то код, который отвечает за обороты?

;********************************************************
;
;			   Stepper Motor controller
;
;								 Author : Seiichi Inoue
;********************************************************
	    list		    p=pic16f84a
	    include		 p16f84a.inc
	    __config _hs_osc & _wdt_off & _pwrte_on & _cp_off
;****************  Label Definition  ********************
	    cblock  h'0c'
mode						    ;Operation mode
							    ;0=stop 1=right 2=left
count1						  ;Wait counter
count2						  ;Wait counter(for 1msec)
	    endc
rb0	 equ	 0			   ;RB0 of PORTB
rb1	 equ	 1			   ;RB1 of PORTB
rb2	 equ	 2			   ;RB2 of PORTB
rb5	 equ	 5			   ;RB5 of PORTB
rb7	 equ	 7			   ;RB7 of PORTB
;****************  Program Start  ***********************
	    org	 0			   ;Reset Vector
	    goto    init
	    org	 4			   ;Interrupt Vector
	    clrf    intcon		  ;Clear Interruption reg
;****************  Initial Process  *********************
init
	    bsf	 status,rp0	  ;Change to Bank1
	    clrf    trisa		   ;Set PORTA all OUT
	    movlw   b'00100111'	 ;RB0,1,2.5=IN RB7=OUT
	    movwf   trisb		   ;Set PORTB
	    movlw   b'10000000'	 ;RBPU=1 Pull up not use
	    movwf   option_reg	  ;Set OPTION_REG
	    bcf	 status,rp0	  ;Change to Bank0
	    clrf    mode		    ;Set mode = stop
	    clrf    count1		  ;Clear counter
	    clrf    count2		  ;Clear counter
	    movlw   b'00000101'	 ;Set PORTA initial value
	    movwf   porta		   ;Write PORTA
	    bsf	 portb,rb7	   ;Set RB7 = 1
	    btfsc   portb,rb5	   ;RB5 = 0 ?
	    goto    $-1			 ;No. Wait
start
;*************  Check switch condition  *****************
	    btfsc   portb,rb1	   ;RB1(stop key) = ON ?
	    goto    check1		  ;No. Next
	    clrf    mode		    ;Yes. Set stop mode
	    goto    drive		   ;No. Jump to motor drive
check1
	    btfsc   portb,rb2	   ;RB2(right key) = ON ?
	    goto    check2		  ;No. Next
	    movlw   d'1'		    ;Yes. Set right mode
	    movwf   mode		    ;Save mode
	    goto    drive		   ;No. Jump to motor drive
check2
	    btfsc   portb,rb0	   ;RB0(left key) = ON ?
	    goto    drive		   ;No. Jump to motor drive
	    movlw   d'2'		    ;Yes. Set left mode
	    movwf   mode		    ;Save mode
;********************  Motor drive  *********************
drive
	    movf    mode,w		  ;Read mode
	    bz	  start		   ;mode = stop
	    bsf	 portb,rb7	   ;Set RB7 = 1
	    btfsc   portb,rb5	   ;RB5 = 0 ?
	    goto    $-1			 ;No. Wait
	    movlw   d'5'		    ;Set loop count(5msec)
	    movwf   count1		  ;Save loop count
loop    call    timer		   ;Wait 1msec
	    decfsz  count1,f	    ;count - 1 = 0 ?
	    goto    loop		    ;No. Continue
	    bcf	 portb,rb7	   ;Set RB7 = 0
	    btfss   portb,rb5	   ;RB5 = 1 ?
	    goto    $-1			 ;No. Wait
	    movf    porta,w		 ;Read PORTA
	    sublw   b'000000101'    ;Check motor position
	    bnz	 drive2		  ;Unmatch
	    movf    mode,w		  ;Read mode
	    sublw   d'1'		    ;Right ?
	    bz	  drive1		  ;Yes. Right
	    movlw   b'00001001'	 ;No. Set Left data
	    goto    drive_end	   ;Jump to PORTA write
drive1
	    movlw   b'00000110'	 ;Set Right data
	    goto    drive_end	   ;Jump to PORTA write
;-------
drive2
	    movf    porta,w		 ;Read PORTA
	    sublw   b'000000110'    ;Check motor position
	    bnz	 drive4		  ;Unmatch
	    movf    mode,w		  ;Read mode
	    sublw   d'1'		    ;Right ?
	    bz	  drive3		  ;Yes. Right
	    movlw   b'00000101'	 ;No. Set Left data
	    goto    drive_end	   ;Jump to PORTA write
drive3
	    movlw   b'00001010'	 ;Set Right data
	    goto    drive_end	   ;Jump to PORTA write
;-------
drive4
	    movf    porta,w		 ;Read PORTA
	    sublw   b'000001010'    ;Check motor position
	    bnz	 drive6		  ;Unmatch
	    movf    mode,w		  ;Read mode
	    sublw   d'1'		    ;Right ?
	    bz	  drive5		  ;Yes. Right
	    movlw   b'00000110'	 ;No. Set Left data
	    goto    drive_end	   ;Jump to PORTA write
drive5
	    movlw   b'00001001'	 ;Set Right data
	    goto    drive_end	   ;Jump to PORTA write
;-------
drive6
	    movf    porta,w		 ;Read PORTA
	    sublw   b'000001001'    ;Check motor position
	    bnz	 drive8		  ;Unmatch
	    movf    mode,w		  ;Read mode
	    sublw   d'1'		    ;Right ?
	    bz	  drive7		  ;Yes. Right
	    movlw   b'00001010'	 ;No. Set Left data
	    goto    drive_end	   ;Jump to PORTA write
drive7
	    movlw   b'00000101'	 ;Set Right data
	    goto    drive_end	   ;Jump to PORTA write
;-------
drive8
	    movlw   b'00000101'	 ;Compulsion setting
drive_end
	    movwf   porta		   ;Write PORTA
	    goto    start		   ;Jump to start
;*************  1msec Timer Subroutine  *****************
timer
	    movlw   d'200'		  ;Set loop count
	    movwf   count2		  ;Save loop count
tmlp    nop					 ;Time adjust
	    nop					 ;Time adjust
	    decfsz  count2,f	    ;count - 1 = 0 ?
	    goto    tmlp		    ;No. Continue
	    return				  ;Yes. Count end
;********************************************************
;			 END of Stepper Motor controller
;********************************************************
	    end

СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#2 Spinne

Spinne

    Зануда™

  • Основатель
  • PipPipPipPipPip
  • 1 915 сообщений
3 296
  • Излесу, вестимо

Отправлено 21 Август 2017 - 23:32

С PIC'ами дела не имел, но с асмом для 8051 навеселился :)

Насколько можно интуитивно разобраться в этом диалекте, должен быть интересен вот этот участок:
timer
			movlw   d'200'				;Set loop count
Вот эти 200 уменьшите до 20 – похоже, получите что хотелось. Это как раз "заряжается" таймер, задающий задержку отсчетом пустых циклов с декрементом.
Ник не менял, подпись поменяю позже. Ваш Зануда. Он же AHP-net, но это уже там

#3 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 162 сообщений
1 770

TC Отправлено 22 Август 2017 - 08:51

Spinne, Спасибо. Вчера только начал познавать ассемблер и тоже начал подозревать, что менять нужно цифру 200, ровно по той причине, что это просто единственная цифра в коде :lol: и еще что-то там про таймер написано.
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#4 Spinne

Spinne

    Зануда™

  • Основатель
  • PipPipPipPipPip
  • 1 915 сообщений
3 296
  • Излесу, вестимо

Отправлено 22 Август 2017 - 15:35

Нет, не совсем. :) Там еще есть переменная count1, которая "заряжается" на 5 интервалов этого таймера. Но вам-то нужно было укоротить "пульс" в 10 раз...
Ник не менял, подпись поменяю позже. Ваш Зануда. Он же AHP-net, но это уже там

#5 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 162 сообщений
1 770

TC Отправлено 22 Август 2017 - 17:06

Spinne, Ну так чего крутить, куда нажимать? :blush:

ЗЫ Хотя учитывая древность и несовершенство схемы склоняюсь уже заказать драйвер из Китая на TB6600 + импульсный генератор.
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#6 Spinne

Spinne

    Зануда™

  • Основатель
  • PipPipPipPipPip
  • 1 915 сообщений
3 296
  • Излесу, вестимо

Отправлено 23 Август 2017 - 06:13

А какого там ждать совершенства? Все схемы с контроллерами примерно одинаковы, шаговый двигатель никакой особой схемотехники не требует – лишь бы он механически успевал за пульсом (не "проскальзывал"). Так что спокойно уменьшайте задержку с 200 циклов до 20 – если будет успевать, получите 10-кратный прирост скорости, а если не будет, никакой волшебный контроллер его не раскрутит...
Ник не менял, подпись поменяю позже. Ваш Зануда. Он же AHP-net, но это уже там




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных



© 2017 SMO&SEO форум «WEBIMHO» — продвижение и создание сайтов, интернет-маркетинг

По вопросам рекламы на форуме и цены на рекламу
Все материалы SEO форума разрешены к копированию только с установкой гиперактивной ссылки на webimho.ru,
тем, кто этого не сделает, мы оторвем руки и ноги и поменяем местами,
а когда выйдем из тюрьмы, опять оторвем и опять поменяем.


Россия, г. Москва

Мы в соцсетях: twitter | вконтакте | facebook | livejournal