Anda di halaman 1dari 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

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

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 timer, 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

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.

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

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 to do 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 velo cidad 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.

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.

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 retlw retlw retlw retlw retlw 0Ch 04h 06h 02h 0Ah

;1000 ;1100 ;0100 ;0110 ;0010 ;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.

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

bsf STATUS,RP0 bcf OPTION_REG,3 bcf OPTION_REG,5 ; Ahora lo tengo a 1:16 bsf OPTION_REG,0 bsf OPTION_REG,1 bcf OPTION_REG,2 clrf TRISB bcf STATUS,RP0

; banco 1 ; activo preescaler TMR0 ; activo cuenta interna

; Rango del prescaler TMR0 Rate 1:4 ; Rango del prescaler TMR0 Rate 1:4 ; Rango del prescaler TMR0 Rate 1:4

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 interrupcin

1000000 4080

=245 veces

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

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 Prin2 movfw tiempo sublw 0F5h BTFSS STATUS,Z goto Principal goto Mos_Vuel ; goto Mostrar_Vueltas ; si tiempo=n mostrar vueltas ; Vamos al siguiente paso

10

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 movwf PORTB clrf velocidad ; Buscamos en la tabla el paso siguiente ; Hacemos el siguiente paso ; Reseteamos la velocidad

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

11

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 e l 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 SWAPF STATUS, W ; Copia W en W_TEMP ; Swap status y deja resultado en W

MOVWF STATUS_TEMP ; Salva STATUS EN STATUS_TEMP register

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

POP SWAPF STATUS_TEMP, W; Recupera STATUS en W 12

MOVWF STATUS SWAPF W_TEMP, F SWAPF W_TEMP, W bcf INTCON,2 retfie

; Mueve W a STATUS ; Recupera W ; ; desabilito causa-interrupcion ; Retornamos

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

LED

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

;Fin de rutinas de interrupciones end

13

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 14

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

15

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 terminado el trabajo vemos que el uso de los microcontroladores pic16f84 para la realizacin 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 interesante 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.

16

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

BOOT

CODE

0x00

;Vector de Reset

goto Inicio

INTERRUPCION

CODE

0x04

goto Interrupciones

17

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 retlw retlw retlw retlw retlw 0Ch 04h 06h 02h 0Ah

;1000 ;1100 ;0100 ;0110 ;0010 ;1010

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

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

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 19

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

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 BTFSS STATUS,Z goto Principal goto Mos_Vuel ; goto Mostrar_Vueltas ; si tiempo=n mostrar vueltas

Siguiente_Paso

call Tabla movwf PORTB clrf velocidad

; Buscamos en la tabla el paso siguiente ; Hacemos el siguiente paso ; Reseteamos la velocidad

incf CUENTA_TABLA,1 ; Incrementamos para siguiente paso 20

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

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 clrf tiempo movfw velocidadTer

; mostramos parpadeo/seg ; Reseteamos el tiempo ; Hacemos que la velocidad sea constante 21

sublw 04h BTFSS STATUS, Z goto Decre goto Principal Decre decf velocidadTer,F goto Principal;

; en su momento de mxima velocidad

; Sino es velocidad mxima, decrementamos

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 STATUS_TEMP velocidad tiempo vueltas_seg

RES RES RES RES RES

1 ; Registro temporal para interrupciones 1; Salvamos STATUS(Interrupcion) 1; contador para cambiar secuncia del motor 1; contador del timer 1; contador de vueltas

GLOBAL velocidad, tiempo, vueltas_seg CODE

22

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

MOVWF STATUS_TEMP ; Salva STATUS EN STATUS_TEMP register

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

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

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

LED

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

;Fin de rutinas de interrupciones End 23

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

24

Anda mungkin juga menyukai