Sei sulla pagina 1di 6

Objetivo

Implementar un circuito que permita generar las seales de control para un motor de
pasos unipolar.
Preparatorio
Disear un circuito que permita controlar un motor de pasos unipolar. Se podr
seleccionar entre control de paso simple o paso doble. Adems se podr controlar el
sentido de giro del motor.

.include "m164pdef.inc"
;definicion de variables:
.def temp=r16
.def cont=r17
.def cont_ma=r18
.def cont_dobsim=r19
.def cont_anthor=r20
.def p=r21
.def ant=r22
.dseg
pram: .byte 1
;inicio
.cseg
.org 0X00
rjmp inicio
.org 0X02
rjmp ma
.org 0X04
rjmp sim_dob
.org 0X06
rjmp anthor
.org 0X08
rjmp pulsador
inicio:
;definicion de entradas y salidas
ldi
temp,0b00001111
out
ddra,temp
out
ddrc,temp
ldi
temp,0
out
porta,temp
out
portc,temp
ldi
temp,0
out
ddrb,temp
out
ddrd,temp
ldi
temp,255
out
portb,temp
out
portd,temp
;stack:
ldi
temp,high(ramend)
out
sph,temp
ldi
temp,low(ramend)
out
spl,temp
;interrupciones para el cambio de estado
ldi
temp,0b00000010
sts
PCICR,temp ; actvacion de interrupcion en puerto b
ldi
temp,0b00000011

sts
PCMSK1,temp ; activacion de 2 pines de b
sei
in
ant,pinb ; guardo estado anterior
;interrupciones externas
ldi
temp,0b00000111
out
EIMSK,r16
ldi
r16,0b00101010
sts
EICRA,r16
sei
lazo:; lazo principal
sbrc
cont_ma,0
rjmp manual
rjmp automatico
manual:
;pull up
ldi
temp,0b00001111
out
ddra,temp
out
ddrc,temp
;interrupcion para cambio de estado 2
ldi
temp,0b00000010
sts
PCICR,temp ; interrupcion en puerto b
ldi
temp,0b00000011
sts
PCMSK1,temp ; 2 pines de b
sei
simple_m:
ldi
temp,0b00000100
out
portc,temp
lds
p,pram ; se carga el valor de p
cpi
p,0 ; salto
breq move_s1
cpi
p,1
breq move_s2
cpi
p,2
breq move_s3
cpi
p,3
breq move_s4
move_s1:
ldi
temp,0b00000001;
out
porta,temp
rjmp salir_m1
move_s2:
ldi
temp,0b00000010;
out
porta,temp
rjmp salir_m1
move_s3:
ldi
temp,0b00000100;
out
porta,temp
rjmp salir_m1
move_s4:
ldi
temp,0b00001000;
out
porta,temp
rjmp salir_m1

doble_m:
ldi
out
lds
cpi

paso

paso

paso

paso

temp,0b0000000
portc,temp
p,pram ; cargo el valor a p y comparo
p,0

breq
cpi
breq
cpi
breq
cpi
breq

move_d1 ; salto
p,1
move_d2 ; salto
p,2
move_d3 ; salto
p,3
move_d4 ; salto
move_d1:
ldi
temp,0b00000011
out
porta,temp
rjmp salir_m1
move_d2:
ldi
temp,0b00000110
out
porta,temp
rjmp salir_m1
move_d3:
ldi
temp,0b00001100
out
porta,temp
rjmp salir_m1
move_d4:
ldi
temp,0b00001001
out
porta,temp
rjmp salir_m1

; paso

; paso

; paso

; paso

salir_m1:
rjmp lazo

automatico:
;configuracion entradas y salidas
ldi
temp,0b00001111 ; salidas
out
ddra,temp
out
ddrc,temp
;desactivacion y configuracion de interr por cambio de estado
ldi
temp,0b00000000
sts
PCMSK1,temp
sbrc
rjmp
rjmp

cont_dobsim,0 ; sentido doble o simple


simple_a ; simple automatico
doble_a ; doble automatico
simple_a:
sbrc
cont_anthor,0 ; horario o antohorario
rjmp simple_aa
rjmp simple_ah
simple_aa:
;enciendo de led para automatico simple
ldi
temp,0b00000101
out
portc,temp
ldi
temp,0b00001000
ldi
cont,4
salto_sa:
out
porta, temp
call
retardo ; para ver el ciclo
lsr
temp ; recorro con 1
dec
cont
brne salto_sa
rjmp salir
simple_ah:
ldi

temp,0b00000111 ; encendido de leds de control

out
ldi
ldi

rjmp

portc,temp
temp,0b00000001
cont,4
salto_sh:
out
porta, temp
call
retardo
lsr
temp ; recorro con 1
dec
cont
brne salto_sh
salir

doble_a:
sbrc
cont_anthor,0 ; horario o antihorario
rjmp doble_aa
rjmp doble_ah
doble_aa:
ldi
temp,0b00000001 ; leds de control
out
portc,temp
ldi
temp,0b00001001
out
porta,temp
call
retardo
ldi
ldi

rjmp

salir:
rjmp

temp,0b00001100
cont,3
salto_da:
out
porta,temp
call
retardo
lsr
temp
dec
cont
brne salto_da
salir

doble_ah:
ldi
out
ldi
ldi
salto_dh:
out
call
lsl
dec
brne
ldi
out
call
rjmp salir
lazo

;interrupciones externas
;cambio manual - automtico
ma:
sbrc
cont_ma,0
rjmp cambio_auto
rjmp cambio_manual
cambio_auto:
ldi
cont_ma,0
rjmp salir_ma
cambio_manual:

temp,0b00000011 ; leds de control


portc,temp
temp,0b00000011
cont,3
retardo

porta,temp

temp
cont
salto_dh
temp, 0b00001001
porta,temp
retardo

ldi
rjmp

cont_ma,1
salir_ma

salir_ma:
reti
;cambio de modo simple a doble
sim_dob:
sbrc
cont_dobsim,0
rjmp cambio_simple
rjmp cambio_doble
cambio_simple:
ldi
cont_dobsim,0
rjmp salir_dobsim
cambio_doble:
ldi
cont_dobsim,1
rjmp salir_dobsim
salir_dobsim:
reti
;cambio de sentido
anthor:
sbrc
cont_anthor,0
rjmp cambio_hor
rjmp cambio_antihor
cambio_hor:
ldi
cont_anthor,0
rjmp salir_anthor
cambio_antihor:
ldi
cont_anthor,1
rjmp salir_anthor
salir_anthor:
reti
;interrupciones por cambio de estado
pulsador:
push r16
in
r16,sreg
push r16
in
eor
in

r16,pinb
r16,ant ; sumo al anterior y si es uno cambio
ant,pinb ;valor inicial 0

sbrc
rjmp

r16,0
pre_h

sbrc
rjmp
rjmp

r16,1
pre_a
salirp
pre_h:
sbrc
ant,0
rjmp hor_mp
rjmp salirp
pre_a:

sbrc
rjmp
rjmp

ant,1
antihor_mp
salirp
hor_mp:
inc
p
cpi
p,3
breq borrar
rjmp salirp
antihor_mp:
inc
p
cpi
p,0
breq borrar1
rjmp salirp
borrar:
clr
borrar1:
ldi

salirp:
sts
pop
out
pop

p
p,3

pram,p
r16
sreg,r16
r16

reti
;subrutina de retardo
retardo:
ldi
r21,36
saltor:
ldi
r22,20
saltor1:
ldi
r23,198
saltor2:
dec
r23
brne saltor2
dec
r22
brne saltor1
dec
r21
brne saltor
ldi
r21,1
saltor3:
dec
r21
brne saltor3
nop
ret

Potrebbero piacerti anche