Após criar um firmware com Arduíno desejei fazer o mesmo procedimento com 89c2051, assim após testes apresentava um erro ao motor mudar de rotação e tive que acrescentar diodos retificadores nas portas de entrada do ULN 2003 para funcionar corretamente, pois motor trava sem os diodos já com Arduíno não teve a necessidade de adicionar tais diodos.
Rotina em assembler para controle do motor de passo. Note de há mais de um tipo de rotina de delay, neste caso utilizei somente duas delas
$mod51
org 00h ;Posição de reset
sjmp inicio ;Salto para o início do código
org 30h ; Endereço do inicio do programa
inicio: clr p3.0 ; Limpa estado da porta p1.7
clr p3.1
; Limpa esta da porta p1.3
testes:
teste1: jb p3.0,passo1
; Verificado estado da porta
lcall DELAY1ms ; Caso esteja acionada vá ao passo1
teste2: jb p3.1,passo2 ;
lcall testes
passo1: clr a
mov p1,a
mov p1,#8
lcall DELAY
mov p1,#4
lcall DELAY
mov p1,#2
lcall DELAY
mov p1,#1
lcall delay
jb p3.0, passo1 ; alterado
lcall testes
passo2: clr a
mov p1,a
mov p1,#1
lcall DELAY
mov p1,#2
lcall DELAY
mov p1,#4
lcall DELAY
mov p1,#8
lcall delay
jb p3.1, passo2
lcall testes
; Obs.: No MSC1211 um ciclo de Máquina = 4 pulsos de clock...
; Obs.: No 8051 um ciclo de Máquina = 12 pulsos de clock...
;
; *** DELAY 1ms ************************************************************
; ** **
; ******************************** [ MSC1211 @ 11.0592MHz = 2757 CICLOS] ***
;
DELAY1ms: PUSH 07H
MOV R7,#83 ; <-- 250="" ciclo="" msc1211="" p="" para="" pulsos="" um="">-->
_LOOP1ms: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,_LOOP1ms
POP 07H
RET
; *** DELAY 500ms **********************************************************
; ** Baseada na rotina de 1ms! **
; ********************************************* [ MSC1211 @ 11.0592MHz ] ***
;
DELAY500ms: PUSH 07H
MOV R7,#100
_LOOP500ms: LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
DJNZ R7,_LOOP500ms ; Repete 100x
POP 07H
RET
; *** DELAYx1000ms(A) ******************************************************
; ** Baseada na rotina de 1ms! **
; ********************************************* [ MSC1211 @ 11.0592MHz ] ***
;
DELAYx1000ms: PUSH 07H
PUSH 06H
MOV R7,A
_LOOPxx1000ms: MOV R6,#200
_LOOPx1000ms: LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
LCALL DELAY1ms ; Aguarda 1ms!!!
DJNZ R6,_LOOPX1000ms ; Repete 200x = 1segundo
DJNZ R7,_LOOPxx1000ms ; Repete A vezes
POP 06H
POP 07H
RET
DELAY: mov r4,#01 ; 01 fica bem mais rapido
MOV TMOD,#01
MOV TCON,#00
REPETE: MOV TH0,#08
MOV TL0,#0DBh
SETB TR0
AQUI: JNB TF0,AQUI
CLR TF0
DJNZ R4,REPETE
CLR TR0
RET
end
Fonte: E-INFTRONIC
0 comments:
Postar um comentário