Está en la página 1de 24

Diseo de Sistemas Basados

en Microprocesadores



Experiencia con
Motores paso a paso




Rubn Tauroni Gil


ITIS 2008-2009

Universidad de Las Palmas de Gran Canaria
2

ndice

Objetivos .............................................................................................................................3
Parte Terica........................................................................................................................4
Desarrollo de la prctica .......................................................................................................7
Flujo del programa............................................................................................................7
Apartado 1) ......................................................................................................................8
Apartado 2) ......................................................................................................................9
Apartado 3) ....................................................................................................................10
Apartado 4) ....................................................................................................................11
Apartado 5) ....................................................................................................................12
Apartado 6) ....................................................................................................................14
Problemas y mejoras ..........................................................................................................16
Conclusin .........................................................................................................................16
Cdigo del programa ..........................................................................................................17
Bibliografa.........................................................................................................................24


3

Objetivos

El objetivo de esta prctica es que el alumno se desenvuelva an ms con la
programacin en ensamblador en un PIC16F84 en una prctica ideada por el propio
alumno, o ideada por el profesor si el alumno no se le ocurre nada. Vamos a trabajar
con un motor paso a paso de un reproductor de CDs.

La prctica se puede dividir en aparatos:

1 Sobre el motor paso a paso, debemos investigar y averiguar la secuencia que
mueve a dicho motor, as como intentar llegar a la velocidad mxima del
mismo.

2 Se programar el timer interno, para aprovecharlo y poder calcular 1
segundo.

3 Aprovechando el ti mer, lo usaremos para que cada segundo, mostraremos
ms adelante algo por la pantalla.

4 Cada x segundo hacemos el siguiente paso de la secuencia del motor.
Aumentando la velocidad de manera progresiva.

5 Adaptando un fotodiodo al motor paso a paso en su circuito adaptado para
ello, captaremos cada vuelta del motor, enviando una seal por el puerto RB0
produciendo una interrupcin y contabilizar dicha vuelta.

6 Por ltimo, mostraremos por la pantalla de la Placa PicSchool, el mensaje
Vuelta/Seg XX donde XX ir las vueltas por segundos que actualmente se est
dando.


Para la realizacin de la prctica necesitaremos una serie de materiales para el
desarrollo de la actividad.

Placa PicSchool
Ordenador y software de grabacin
Microcontrolador PIC16F84
Fuente de alimentacin
Cables para las conexiones
Resistencias
Fotodiodo
Motor paso a paso


4

Parte Terica

Placa PicSchool

Es un laboratorio de carcter didctico y una evolucin lgica de los populares conocidos
entrenadores MicroPIC Trainer y PICLaboratory. Permite trabajar con los dispositivos PIC ms
representativos de las familias 12F, 16F y 18F, pudindose desarrollar aplicaciones tanto a
nivel de software como de hardware. Dispone de un amplio y representativo nmero de
perifricos muy utilizados en las aplicaciones reales y un mdulo board para el montaje sin
soldadura que permite implementar el hardware necesario en un determinado proyecto.


PIC16F84
El microcontrolador PIC16F84 es un microcontrolador de 8 bits. Dispone de 18 pines y un
repertorio de instrucciones RISC. Su estructura interna consta de:
Memoria Flash de programa (1K x 14).
Memoria EEPROM de datos (64 x 8).
Memoria RAM (68 registros x 8).
Banco de registros de propsito general (STATUS, OPTION, INTCON, PC)
Un temporizador/contador (timer de 8 bits).
Un divisor de frecuencia.
Varios puertos de entrada-salida (13 pines en dos puertos, 5 pines el puerto A y 8
pines el puerto B).
Manejo de interrupciones (de 4 fuentes).
Perro guardin (watchdog).
Bajo consumo.
Frecuencia de reloj externa mxima 10MHz. (Hasta 20MHz en nuevas versiones). La
frecuencia de reloj interna es un cuarto de la externa, lo que significa que con un reloj
de 20Mhz, el reloj interno sera de 5Mhz y as__ pues se ejecutan 5 Millones de
Instrucciones por Segundo (5 MIPS).
Pipe-line de 2 etapas, 1 para bsqueda de instruccin y otra para la ejecucin de la
instruccin (los saltos ocupan un ciclo ms).
Repertorio de instrucciones reducido (RISC), con tan solo 30 instrucciones distintas.
4 tipos distintos de instrucciones, orientadas a byte, orientadas a bit, operacin entre
registros, de salto.


5

Cabe destacar la organizacin de la memoria
dividida en tres bloques, RAM, con registros de
propsito general y propsito especial, EEPROM,
grabable dinmicamente desde el programa y
FLASH, memoria de programa.

Tenemos un vector de reset indicando la direccin
de comienzo del programa (Reset Vector: 0000h) y
un vector de interrupciones con una nica entrada
de interrupcin (Interrupt vector 0004h), tras la cual
hemos de identificar cual de las lneas la ha
generado.

La memoria de datos (RAM), est organizada en
bancos, en nuestro PIC, se organiza en 2 bancos
(vease figura a la izquierda) admitiendo cada uno de
ellos hasta 128 bytes. Para movernos entre los
bancos el bit RP0 del registro general STATUS, el cual, cuando est a 0, estamos en el banco 0 y
cuando est a 1, estamos en el banco 1. Vease en el dibujo como algunos registros son
comunes a ambos bancos, ocurriendo lo mismo a partir de la direccin 0Ch de la memoria.

MOTOR PASO A PASO
Bsicamente estos motores estn constituidos normalmente por un rotor sobre el que van
aplicados distintos imanes permanentes y por un cierto nmero de bobinas excitadoras
bobinadas en su estator.
Las bobinas son parte del estator y el rotor es un imn permanente. Toda la conmutacin (o
excitacin de las bobinas) deber ser externamente manejada por un controlador.
Existen dos tipos de motores paso a paso de imn permanente:

Cuestiones bsicas
Los motores paso a paso se pueden ver como motores elctricos sin escobillas. Es
tpico que todos los bobinados del motor sean parte del estator, y el rotor puede ser
un imn permanente o, en el caso de los motores de reluctancia variable (que
luego describiremos mejor), un cilindro slido con un mecanizado en forma de
6

dientes (similar a un engranaje), construido con un material magnticamente
"blando" (como el hierro dulce).
La conmutacin se debe manejar de manera externa con un controlador electrnico
y, tpicamente, los motores y sus controladores se disean de manera que el motor
se pueda mantener en una posicin fija y tambin para que se lo pueda hacer girar
en un sentido y en el otro.
La mayora de los motores paso a paso conocidos se pueden hacer avanzar a
frecuencias de audio, lo que les permite girar muy velozmente. Con un controlador
apropiado, se los puede hacer arrancar y detenerse en un instante en posiciones
controladas.
Comportamiento propio de los motores paso a paso:
Los motores paso a paso tienen un comportamiento del todo diferente al de los
motores de corriente continua. En primer lugar, no giran libremente por s mismos.
Los motores paso a paso, como lo indica su nombre, avanzan girando por pequeos
pasos. Tambin difieren de los motores de CC en la relacin entre velocidad y
torque (un parmetro que tambin es llamado "par motor" y "par de giro"). Los
motores de CC no son buenos para of recer un buen torque a baja velocidad sin la
ayuda de un mecanismo de reduccin. Los motores paso a paso, en cambio,
trabajan de manera opuesta: su mayor capacidad de torque se produce a baja
velocidad.
Los motores paso a paso tienen una caracterstica adicional: el torque de detencin
(que se puede ver mencionado tambin como "par de detencin", e incluso
par/torque "de mantenimiento"), que no existe en los motores de CC. El torque de
detencin hace que un motor paso a paso se mantenga firmemente en su posicin
cuando no est girando. Esta caracterstica es muy til cuando el motor deja de
moverse y, mientras est detenido, la fuerza de c arga permanece aplicada a su eje.
Se elimina as la necesidad de un mecanismo de freno.
Si bien es cierto que los motores paso a paso funcionan controlados por un pulso de
avance, el control de un motor paso a paso no se realiza aplicando en directo este
pulso elctrico que lo hace avanzar. Estos motores tienen varios bobinados que,
para producir el avance de ese paso, deben ser alimentados en una adecuada
secuencia. Si se invierte el orden de esta secuencia, se logra que el motor gire en
sentido opuesto. Si los pulsos de alimentacin no se proveen en el orden correcto,
el motor no se mover apropiadamente. Puede ser que zumbe y no se mueva, o
puede ser que gire, pero de una manera tosca e irregular.
Esto signif ica que hacer girar un motor paso a paso no es tan simple como hacerlo
con un motor de corriente continua, al que se le entrega una corriente y listo. Se
requiere un circuito de control, que ser el responsable de convertir las seales de
avance de un paso y sentido de giro en la necesaria secuencia de energizacin de
los bobinados.

7

Desarrollo de la prctica

Explicaremos cada uno de los apartados en que subdividimos la prctica y explicaremos tanto
su uso como su desarrollo, pero antes mostraremos un pequeo flujo del programa tal y como
est estructurado el cdigo.

Flujo del programa

Hay que recordar que cuando se produce la interrupcin, vamos a tratarla y al retornar
volvemos justo por donde iba el flujo del programa.



8

Apartado 1)

1 Sobre el motor paso a paso, debemos investigar y averiguar la secuencia que mueve
a dicho motor, as como intentar llegar a la velocidad mxima del mismo.
En primer lugar hemos tenido que calcular cuales son los valores hexadecimales para el
movimiento del motor paso a paso. Al investigar cmo se realiza este movimiento
averiguamos que existen distintas manera, secuencia normal, secuencia del tipo wave drive y
secuencia de medio paso. Al probarlas descubrimos que la que mejor funciona es la secuencia
de medio paso, pero vemos que no funciona con la exactitud con l a que realmente
querramos.
Para ello creamos una tabla, en la cual ir dicha secuencia. Para probar con otro motor, tan
solo deben cambiar dicha secuencia.
Tabla ; Tabla para el movimiento del motor
movlw HIGH Tabla
movwf PCLATH

movfw CUENTA_TABLA
addwf PCL,W
BTFSC STATUS, C
incf PCLATH,F
movfw CUENTA_TABLA
addwf PCL,F

retlw 08h ;1000
retlw 0Ch ;1100
retlw 04h ;0100
retlw 06h ;0110
retlw 02h ;0010
retlw 0Ah ;1010

Por ensayo y error fuimos buscando hasta encontrar cual era la velocidad mxima, siendo
entre 70 y 80 RPM. Empezamos desde una velocidad lenta, hasta ir aumentando poco a poco
hasta llegar a la velocidad mxima y mantenindola constante.

9

Apartado 2)

2 Se programar el timer interno, para aprovecharlo y poder calcular 1 segundo.

bsf STATUS,RP0 ; banco 1
bcf OPTION_REG,3 ; activo preescaler TMR0
bcf OPTION_REG,5 ; activo cuenta interna
; Ahora lo tengo a 1:16
bsf OPTION_REG,0 ; Rango del prescaler TMR0 Rate 1:4
bsf OPTION_REG,1 ; Rango del prescaler TMR0 Rate 1:4
bcf OPTION_REG,2 ; Rango del prescaler TMR0 Rate 1:4
clrf TRISB
bcf STATUS,RP0

Con esto el timer se incrementar de uno en uno cada 16 instrucciones, hasta llegar a 256, tras
la cual este se resetear y producir una excepcin. Un segundo equivale a 1 milln de
instrucciones, por lo que tenemos:

255 x 16 = 4080 instrucciones por cada interrupci n


1000000
4080
=245 veces

Pasando 245 a hexadecimal tenemos que cada segundo se producir tras F5 interrupciones del
timer.
10

Apartado 3)

3 Tendremos un programa Principal el cual comprobar indefinidamente si hemos de
hacer un cambio al siguiente paso del motor, o bien mostrar por pantalla.
Aprovechando el timer, lo usaremos para que cada segundo, mostremos ms adelante
algo por la pantalla.

Una vez calculado cuando se producir un segundo podemos pasar a organizar nuestro
programa. Estaremos continuamente comprobando si hemos llegado a la velocidad terminal, si
es as tendremos que cambiar al Siguiente_Paso, en caso contrari o, tambin debemos
comprobar si ha transcurrido ya un segungo, si es as debemos mostrar_vueltas por la pantalla
y sino pues volvemos a Principal y seguir comprobando. Durante todo esto surgirn
interrupciones, que se acudirn a ellas recordando por donde va el flujo del programa.

Principal
movfw velocidadTer
movwf velocidadAux
movfw velocidad
subwf velocidadAux,W ; si velocidad = velocidadTer paso siguiente
BTFSS STATUS, Z
goto Prin2
goto Siguiente_Paso ; Vamos al siguiente paso

Prin2 movfw tiempo
sublw 0F5h ; si tiempo=n mostrar vueltas
BTFSS STATUS,Z
goto Principal
goto Mos_Vuel ; goto Mostrar_Vueltas


11

Apartado 4)

4 Cada x segundo hacemos el siguiente paso de la secuencia del motor.

Para cambiar la secuencia del motor, buscamos en la tabla el cdigo del paso siguiente, una
vez buscado dicho paso, lo mandamos por el puerto B realizndose. Debemos resetear
velocidad, para empezar con el siguiente paso, todo esto controlando que no nos salgamos de
la tabla
Siguiente_Paso

call Tabla ; Buscamos en la tabla el paso siguiente
movwf PORTB ; Hacemos el siguiente paso
clrf velocidad ; Reseteamos la velocidad
incf CUENTA_TABLA,1 ; Incrementamos para siguiente paso
movfw CUENTA_TABLA
sublw 06h ; Si es 6 volvemos al inicio de la tabla
BTFSS STATUS, Z
goto Principal
clrf CUENTA_TABLA
clrf velocidad ; Reseteamos la velocidad
goto Principal


12

Apartado 5)

5 Adaptando un fotodiodo al motor paso a paso en su circuito adaptado para ello,
captaremos cada vuelta del motor, enviando una seal por el puerto RB0 produciendo
una interrupcin y contabilizar dicha vuelta.

Aprovecharemos este apartado para mostrar y explicar el cdigo de las interrupciones, que
nuestro caso tenemos dos tipos, interrupcin por RB0 e interrupcin por timer.
Al producirse una interrupcin primero hemos de salvar los registros de STATUS y el valor de
W para no perder ningn valor cuando se produce la interrupcin, eso se hace en PUSH.
Hemos de comprobar de donde proviene la interrupcin comprobando el bit 0 del puerto B, si
este est a 0, la interrupcin la produjo el timer, en caso contrario la produjo RB0, esto se hace
en ISR.
En TIMER tan solo incrementamos en 1, velocidad y tiempo, que son variables auxiliares que
una vez llegado a un valor, se resetean y obligan a cambiar algo. Tiempo hace que cada vez
que llegue al valor F5 se vaya a la subrutina que muestra por pantalla y Velocidad que cada vez
que llegue a una velocidad terminal, el tiempo de cambio al siguiente paso sea mas rpida y as
aumente la velocidad del motor.
Cada vez que llegamos a LED es que se produjo una vuelta en el motor, la contabilizamos y
deshabilitamos la interrupcin.
Por ltimo en POP, recuperamos los valores de STATUS y W deshabilitamos la interrupcin
por Timer y continuamos por donde iba la ejecucin del programa.
Interrupciones
GLOBAL Interrupciones
PUSH
MOVWF W_TEMP ; Copia W en W_TEMP
SWAPF STATUS, W ; Swap status y deja resultado en W
MOVWF STATUS_TEMP ; Salva STATUS EN STATUS_TEMP register

ISR
BTFSS INTCON,1 ; Testeamos el bit 0 de PORTB
goto TIMER ; Si es 0 interrupcin por TMR0
goto LED ; si es 1 interrupcin por RB0

POP
SWAPF STATUS_TEMP, W; Recupera STATUS en W
13

MOVWF STATUS ; Mueve W a STATUS
SWAPF W_TEMP, F ; Recupera W
SWAPF W_TEMP, W ;
bcf INTCON,2 ; desabilito causa-interrupcion
retfie ; Retornamos

TIMER
bcf PORTB,7 ; (Bit que muestra parpadeo/seg)
incf tiempo,1 ; incrementamos tiempo
incf velocidad,1 ; incrementamos velocidad
goto POP

LED ; Cada vez que llegamos aqu contamos 1 vuelta
; Cuando mostramos vueltas_seg hay que resetearla
incf vueltas_seg,1
bcf INTCON,1 ; desabilito interrupcin por RB0
goto POP

;Fin de rutinas de interrupciones
end

14

Apartado 6)

6 Por ltimo, mostraremos por la pantalla de la Placa PicSchool, el mensaje
Vuelta/Seg XX donde XX ir las vueltas por segundos que actualmente se est dando.

Al inicio de la ejecucin del programa mostramos el mensaje por la pantalla. Para ello
debemos incluir la librera de la pantalla LCD y declarar sus funciones:
include "lcd.inc" ;Librera pantalla LCD
EXTERN DISPLAY_CONF, BORRA_Y_HOME, LCD_DATO, LCD_REG, LCD_INI
Codigo que muestra el mensaje Vueltas/Seg XX usando las funciones ya desarrolladas.
call LCD_INI ;Inicializa display
call DISPLAY_CONF
movlw 'V'
call LCD_DATO
movlw 'u'
call LCD_DATO
movlw 'e'
call LCD_DATO
movlw 'l'
call LCD_DATO
movlw 't'
call LCD_DATO
movlw 'a'
call LCD_DATO
movlw 's'
call LCD_DATO
movlw '/'
call LCD_DATO
movlw 's'
call LCD_DATO
movlw 'e'
call LCD_DATO
movlw 'g'
call LCD_DATO
movlw 0C0h
call LCD_REG
movlw 'X'
call LCD_DATO
movlw 'X'
call LCD_DATO
bcf PORTA,2 ;Desactivamos la pantalla
15


Para mostrar el valor de Vueltas_Seg, debemos pasar dicho valor que est en hexadecimal y
pasarlo a cdigo ascci. Mostrarmos dos nmeros por la pantalla por lo que para el digito ms
significativo nos quedamos con los 4 bits del segundo byte de vueltas_seg lo rotamos 4
posciones a la derecha y le sumamos 30h y obtenemos el nmero en ascci, y para el otro
nmero repetimos el proceso pero sin desplazamiento:

Mos_Vuel ; Aqu llegamos una vez por segundo

movlw 0C0h
call LCD_REG
movfw vueltas_seg
andlw 0F0h
movwf ascii
bcf STATUS,C
rrf ascii
rrf ascii
rrf ascii
rrf ascii
movfw ascii
addlw 30h
call LCD_DATO
bcf PORTA,2
movfw vueltas_seg
andlw 0Fh
addlw 30h
call LCD_DATO
bcf PORTA,2
clrf vueltas_seg
16

Problemas y mejoras

El mayor problema ha sido que no conseguimos el perfecto control del motor paso a paso,
como realmente se debera haber conseguido. Tampoco se logr una velocidad asombrosa.
Se hizo la prueba con otro motor paso a paso, pero era un poco ms complejo, al no poderlo
acoplar directamente a la placa, para este caso tuvimos que alimentar el motor paso a paso
desde una fuente de alimentacin, pero la velocidad fue muy parecida que en el otro caso.
Mejoras que se lo podra aadir a la prctica sera aadirle otras funcionalidades al control del
motor paso a paso controladas o bien con el teclado de la placa o bien mediante pulsadores o
conmutadores, como por ejemplo:
Cambiar de sentido al motor.
Aumentar la velocidad.
Disminuir la velocidad.
Detenerlo
Conclusin

Una vez termi nado el trabajo vemos que el uso de los microcontroladores
pic16f84 para la reali zacin y control de tareas sencillas con una serie de
entradas y salidas es ideal puesto que su repertorio de instrucciones permite
una programacin sin demasiada dificultad. Lo ms i nteresante que me resulta
es aplicar los conocimientos de programacin en algo tangible hecho por
nosotros, con resultados interesantes.

Adems esta prctica ha servido a aprender a usar an ms los
microcontroladores, as como conocer el funcionamiento de los motores paso a
paso.


17

Cdigo del programa

Fichero pr1:

List p=16F84A ;Tipo de procesador
include "P16F84A.INC" ;Definiciones de registros internos
include "lcd.inc" ;Libreria pantalla LCD

LIST
; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc.

EXTERN velocidad, tiempo, vueltas_seg
EXTERN Interrupciones
EXTERN DISPLAY_CONF, BORRA_Y_HOME, LCD_DATO,LCD_REG, LCD_INI

Cero EQU 00h ; Inicialzar

UDATA
statusR RES 1 ; Registro temporal de estado
PORTB_TEMP RES 1; Salvamos PORTB(Interrupcion)
CUENTA_TABLA RES 1; lleva la cuenta de la tabla
v RES 1; variable fija, si velocidad = v -> Siguiente_Paso
n RES 1; variable fija, si tiempo = n -> Mostrar_Vueltas
velocidadTer RES 1; velocidad terminal cambiante
velocidadAux RES 1;
ascii RES 1;

BOOT CODE 0x00 ;Vector de Reset
goto Inicio

INTERRUPCION CODE 0x04
goto Interrupciones

18

PPAL CODE ;Interrupciones
Tabla ; Tabla para el movimiento del motor
movlw HIGH Tabla
movwf PCLATH

movfw CUENTA_TABLA
addwf PCL,W
BTFSC STATUS,C
incf PCLATH,F
movfw CUENTA_TABLA
addwf PCL,F

retlw 08h ;1000
retlw 0Ch ;1100
retlw 04h ;0100
retlw 06h ;0110
retlw 02h ;0010
retlw 0Ah ;1010

Inicio
bsf STATUS,RP0 ; banco 1
bcf OPTION_REG,3 ; activo preescaler TMR0
bcf OPTION_REG,5 ; activo cuenta interna
; Ahora lo tengo a 1:16
bsf OPTION_REG,0 ; Rango del prescaler TMR0 Rate 1:4
bsf OPTION_REG,1 ; Rango del prescaler TMR0 Rate 1:4
bcf OPTION_REG,2 ; Rango del prescaler TMR0 Rate 1:4
clrf TRISB
bcf STATUS,RP0

call LCD_INI;Inicializa display
call DISPLAY_CONF
movlw 'V'
19

call LCD_DATO
movlw 'u'
call LCD_DATO
movlw 'e'
call LCD_DATO
movlw 'l'
call LCD_DATO
movlw 't'
call LCD_DATO
movlw 'a'
call LCD_DATO
movlw 's'
call LCD_DATO
movlw '/'
call LCD_DATO
movlw 's'
call LCD_DATO
movlw 'e'
call LCD_DATO
movlw 'g'
call LCD_DATO
movlw 0C0h
call LCD_REG
movlw 'X'
call LCD_DATO
movlw 'X'
call LCD_DATO
bcf PORTA,2

movlw Cero
movwf PORTB
clrf TMR0
movlw 0h ; inicialiamos tiempo y velocidad
20

movwf tiempo
movwf velocidad
movlw 060h ; inicialiamos velocidad terminal
movwf velocidadTer
movlw 01h;
movwf CUENTA_TABLA
bcf INTCON,1 ; RB0 did not ocurr
bcf INTCON,2 ; TMR0 did not overflow
bsf INTCON,4 ; Activo interrupcin por RB0
bsf INTCON,5 ; Activo interrupcin por TMR0
bsf INTCON,7 ; Activo interrupcin blobal

Principal
movfw velocidadTer
movwf velocidadAux
movfw velocidad
subwf velocidadAux,W ; si velocidad=velocidadTer paso siguiente
BTFSS STATUS,Z
goto Prin2
goto Siguiente_Paso ; Vamos al siguiente paso

Prin2 movfw tiempo
sublw 0F5h ; si tiempo=n mostrar vueltas
BTFSS STATUS,Z
goto Principal
goto Mos_Vuel ; goto Mostrar_Vueltas

Siguiente_Paso

call Tabla ; Buscamos en la tabla el paso siguiente
movwf PORTB ; Hacemos el siguiente paso
clrf velocidad ; Reseteamos la velocidad
incf CUENTA_TABLA,1 ; Incrementamos para siguiente paso
21

movfw CUENTA_TABLA
sublw 06h ; Si es 6 volvemos al inicio de la tabla
BTFSS STATUS, Z
goto Principal
clrf CUENTA_TABLA
clrf velocidad ; Reseteamos la velocidad
goto Principal

Mos_Vuel ;Aqu llegamos una vez por segundo
movlw 0C0h
call LCD_REG
movfw vueltas_seg
andlw 0F0h
movwf ascii
bcf STATUS,C
rrf ascii
rrf ascii
rrf ascii
rrf ascii
movfw ascii
addlw 30h
call LCD_DATO
bcf PORTA,2
movfw vueltas_seg
andlw 0Fh
addlw 30h
call LCD_DATO
bcf PORTA,2
clrf vueltas_seg

bsf PORTB,7 ; mostramos parpadeo/seg
clrf tiempo ; Reseteamos el tiempo
movfw velocidadTer ; Hacemos que la velocidad sea constante
22

sublw 04h ; en su momento de mxima velocidad
BTFSS STATUS, Z
goto Decre
goto Principal
Decre
decf velocidadTer,F ; Sino es velocidad mxima, decrementamos
goto Principal;

Stop
nop
nop

end

Fichero interup_code.asm:

List p=16F84 ;Tipo de procesador
include "P16F84.INC" ;Definiciones de registros internos
LIST

; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc.
UDATA

W_TEMP RES 1 ; Registro temporal para interrupciones
STATUS_TEMP RES 1; Salvamos STATUS(Interrupcion)
velocidad RES 1; contador para cambiar secuncia del motor
tiempo RES 1; contador del timer
vueltas_seg RES 1; contador de vueltas

GLOBAL velocidad, tiempo, vueltas_seg
CODE

23

Interrupciones
GLOBAL Interrupciones
PUSH
MOVWF W_TEMP ; Copia W en W_TEMP
SWAPF STATUS, W ; Swap status y deja resultado en W
MOVWF STATUS_TEMP ; Salva STATUS EN STATUS_TEMP register

ISR
BTFSS INTCON,1 ; Testeamos el bit 0 de PORTB
goto TIMER ; Si es 0 interrupcin por TMR0
goto LED ; si es 1 interrupcin por RB0

POP
SWAPF STATUS_TEMP, W; Recupera STATUS en W
MOVWF STATUS ; Mueve W a STATUS
SWAPF W_TEMP, F ; Recupera W
SWAPF W_TEMP, W ;
bcf INTCON,2 ; desabilito causa-interrupcion
retfie ; Retornamos

TIMER
bcf PORTB,7 ; (Bit que muestra parpadeo/seg)
incf tiempo,1 ; incrementamos tiempo
incf velocidad,1 ; incrementamos velocidad
goto POP

LED ; Cada vez que llegamos aqu contamos 1 vuelta
; Cuando mostramos vueltas_seg hay que resetearla
incf vueltas_seg,1
bcf INTCON,1 ; desabilito interrupcin por RB0
goto POP
;Fin de rutinas de interrupciones
End
24


Bibliografa

http://www.todorobot.com.ar/informacion/tutorial%20stepper/stepper-tutorial.htm

http://www.todorobot.com.ar/informacion/tutorial%20stepper/stepper-tutorial.htm

http://es.wikipedia.org/wiki/Motor_paso_a_paso

También podría gustarte