quinta-feira, 23 de julho de 2026

Controle de motor de passo com 89c2051



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

Translate | Tradutor

Ajude este projeto

Ajude este projeto
Produtos Digitais


Deseja anunciar aqui. Fale comigo !!!

Nome

E-mail *

Mensagem *

Tecnologia do Blogger.

Popular Posts

Arquivo