TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: melk en 31 de Diciembre de 2007, 11:13:17
-
Hola, ante todo primero agradecer a todo el mundo que pertenece al foro que exista, luego quería plantear una duda que me ha surgido. He escrito en ASM el programa siguiente, la versión anterior del mismo habia estado funcionando perfectamente en un 16F88, pero por simplificar el diseño se ha optado por emplear uno de los pequeños 12F675. El caso es que no termina de funcionar la simulación en el Proteus empleando este micro, simplemente no se activan las interrupciones. Sin embargo, si intento probar el programa con el 16F629, tanto el compilado para el 12F675 como el compilado para el 12F629, funcionan perfectamente. Lo unico que se me ocurre es que me haya olvidado de activar o desactivar algun bit asociado al comparador A/D pero lo he mirado y remirado y si algo se me está pasando por alto realmente no lo veo y agradeceria que alguien me lo indicase, la otra opcion, que me parece mas improbable, es que el Proteus este fallando con este micro, aunque algo he leido por el foro al respecto, se referia a versiones anteriores a la 7. Todavia no lo he probado con el PIC real, debido en parte, a que el 16F88 me ha dado problemas al quemarlo con el MCLR interno activado para despues borrarlo, y me interesaría tener un programa que se supone que ya funciona para reducir al maximo el debugeado sobre la cucaracha real para el 12F675 (donde tambien voy a activar el MCLR interno). A continuacion adjunto mi codigo, cualquier ayuda sera bienvenida.
PD: Si este mensaje corresponde a otra seccion del foro (como el relacionado con Simulacion), disculpen los moderadores haberlo colocado aqui y les agradeceria que lo moviesen a la seccion correspondiente
;-----------------------------------------------------------------------;
; STEPH12F.ASM Secuencia paso motor ( GP0,GP1,GP4,GP5 ) ;
; Input de giro y direccion ( GP2,GP3 ) ;
; ;
; El programa siguiente permite actuar al micro ;
; seleccionado como driver para motor paso a paso ;
; que enviara una secuencia de medios pasos: ;
; - Cuando se produce una interrupcion en el ;
; pin GP2 debe realizarse un paso ;
; - Si el pin GP3 esta alto el sentido de ;
; giro sera positivo, en otro caso, sera ;
; negativo ;
; ;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; ;
;-----------------------------------------------------------------------;
#DEFINE MICRO D'675' ; Define el tipo de microcontrolador
; 12F629: D'629'
; 12F675: D'675'
#DEFINE INTERRUP D'0' ; Define el tipo de interrupcion activado
; INTE activado: D'0'
; GPIE activado: D'1'
IF (MICRO == D'629')
LIST P=12F629, ; Usar PIC 16F629
#INCLUDE <P12F629.inc>
ENDIF
IF (MICRO == D'675')
LIST P=12F675, ; Usar PIC 16F675
#INCLUDE <P12F675.inc>
ENDIF
IF (MICRO == D'629' || MICRO == D'675')
; Palabra de configuracion: 0x3F84
__CONFIG _CP_OFF&_PWRTE_ON&_MCLRE_OFF&_WDT_OFF&_BODEN_OFF&_CPD_OFF&_INTRC_OSC_NOCLKOUT
; Code Protect o Proteccion de codigo:OFF
; Power-Up Timer o Temporizacion de encendido:ON
; Master Clear Enable o MCLR externo activo:OFF
; Watchdog o Reset por bucle infinito:OFF
; Brown-out Reset Enable o Reset por fallo de alimentacion:OFF
; Proteccion de lectura memoria EEPROM:OFF
; Oscilador:Interno con modo I/O activado en las dos patillas
ENDIF
ERRORLEVEL -302 ; Elimina Warning de cambio de Banco
CBLOCK 0x20 ; Bloque de declaracion de variables
; Es equivalente a declararlas especificando
; su posicion de memoria
FLAGS ; FLAGS EQU 0x20
ANG45 ; ANG45 EQU 0x21
ANG90 ; ANG90 EQU 0x22
ANG135 ; ANG135 EQU 0x23
ANG180 ; ANG180 EQU 0x24
ANG225 ; ANG225 EQU 0x25
ANG270 ; ANG270 EQU 0x26
ANG315 ; ANG315 EQU 0x27
ANG360 ; ANG360 EQU 0x28
_W ; _W EQU 0x29 Variable auxiliar para el almacenamiento de W antes de la interrupcion
_STATUS ; _STATUS EQU 0x30 Variable auxiliar para el almacenamiento de STATUS antes de la interrupcion
_PCLATH ; _PCLATH EQU 0x31 Variable auxiliar para el almacenamiento de PCLATH antes de la interrupcion ENDC
ENDC
ORG 0x00
GOTO INICIO
ORG 0x04
GOTO INTEPROC
INTEPROC
MOVWF _W ; Almacenamiento del estado del programa, esto
MOVF STATUS,W ; es, de las variables W,STATUS y PCLATH antes
BCF STATUS,RP0 ; de entrar en la interrupcion
BCF STATUS,RP1
MOVWF _STATUS
MOVF PCLATH,W
MOVWF _PCLATH
CLRF PCLATH
CLRF FLAGS ; Limpia los bits de la variable FLAGS que se
; emplea para establecer si el motor debe
; activarse y en que direccion
IF (INTERRUP == D'1')
BTFSS GPIO,2 ; Activa el primer bit de la variable FLAGS
GOTO INTEXIT ; cuando el pin GP2 pasa a estado alto
BSF FLAGS,0 ; indicando que el motor debe moverse
ENDIF
BTFSS GPIO,3 ; Se activa el segundo bit de la variable
GOTO $+3 ; FLAGS cuando el sentido del motor debe ser
BSF FLAGS,1 ; positivo y se desactiva cuando el sentido
GOTO $+3 ; deba ser negativo. La operacion NOP se
BCF FLAGS,1 ; incluye para mantener constante el retraso
NOP
IF (INTERRUP == D'0')
BSF FLAGS,0 ; Activa el primer bit de la variable FLAGS
; que indica que el motor debe avanzar medio
; paso. Esto puede hacerse despues de
; comprobar el sentido porque la interrupcion
; siempre es por flanco de subida
ENDIF
INTEXIT
IF (INTERRUP == D'0')
BCF INTCON,1 ; Resetea el bit que indica que se ha producido
; una interrupcion externa debida a un flanco de
; subida en el pin GP2/INT
ENDIF
IF (INTERRUP == D'1')
BCF INTCON,0 ; Resetea el bit que indica que se ha producido
; una interrupcion debida a un cambio en uno de
; los pines definidos por la variable IOC
ENDIF
MOVF _PCLATH,W ; Recupera el estado del programa, esto es,
MOVWF PCLATH ; restaura los valores originales de las
MOVF _STATUS,W ; variables W,STATUS y PCLATH a aquellos que
MOVWF STATUS ; tenian antes de que se produjese la
SWAPF _W,F ; interrupcion
SWAPF _W,W
RETFIE
INICIO ; Es la funcion que inicializa las variables
MOVLW 0x07 ; Seleccion de modo I/O para las patillas que
MOVWF CMCON ; pueden funcionar como comparador
IF (MICRO == D'675')
CLRF ADCON0 ; Activa todos los pines para funcionar como
CLRF ANSEL ; I/O digitales y desactiva el modulo A/D
ENDIF
BSF STATUS,RP0 ; Seleccion de Banco 1
MOVLW 0x0C ; Se establecen las patillas GP0,GP1,GP4,GP5
MOVWF TRISIO ; como outputs
IF (INTERRUP == D'1')
MOVLW 0x04 ; Se establecen como pin de interrupcion por
MOVWF IOC ; cambio de estado el GP2
ENDIF
BCF STATUS,RP0 ; Seleccion de Banco 0
CLRF GPIO ; Se ponen a 0 los outputs GP
MOVLW B'010000' ; Se inicializan los angulos que gira
MOVWF ANG45 ; el motor paso a paso
MOVLW B'110000' ; Las secuencias seran las siguientes:
MOVWF ANG90 ; 45º = Rojo (4)
MOVLW B'100000' ; 90º = Rojo + Azul (4 y 5)
MOVWF ANG135 ; 135º = Azul (5)
MOVLW B'100001' ; 180º = Azul + Amarillo (5 y 0)
MOVWF ANG180 ; 225º = Amarillo (0)
MOVLW B'000001' ; 270º = Amarillo + Naranja (0 y 1)
MOVWF ANG225 ; 315º = Naranja (1)
MOVLW B'000011' ; 360º = Rojo + Naranja (1 y 4)
MOVWF ANG270 ; El orden corresponde con el sentido positivo
MOVLW B'000010' ; Invertir la secuencia invierte el giro
MOVWF ANG315 ; El valor de pausa pone a cero todos los pines
MOVLW B'010010' ; asociados al control del giro
MOVWF ANG360
BCF STATUS,IRP ; Se almacena como posicion de memoria a la que
MOVLW ANG360 ; apunta el indice INDF a la asociada con el giro
MOVWF FSR ; hasta 360º
IF (INTERRUP == D'0')
BSF OPTION_REG,INTEDG ; Se establece que la interrupcion
; por cambio en el pin GP2/INT se
; produzca por flanco de subida
MOVLW 0x90 ; Se activa la interrupcion externa debido al
MOVWF INTCON ; cambio en el pin GP2/INT (INTE),asi como
; la interrupcion global (GIE)
ENDIF
IF (INTERRUP == D'1')
MOVLW 0x88 ; Se activa la interrupcion debida al cambio
MOVWF INTCON ; de estado en los pines seleccionados con la
; variable IOC asi como la interrupcion global
; (GIE)
ENDIF
GOTO STEPCONTROL
STEPCONTROL ; Es la funcion que controla el giro del motor
BTFSS FLAGS,0 ; Mientras no se haya activado una interrupcion
GOTO $-1 ; en el pin GP2 no se enviara nada al motor.
BTFSS FLAGS,1 ; Cuando se produce, se emplea una variable
GOTO $+3 ; auxiliar FLAGS para realizar un medio paso
CALL GIROPOS ; cambiando el bit 0 a estado alto, lo que
GOTO $+2 ; permite continuar el proceso. Si el bit 1
CALL GIRONEG ; de la variable auxiliar FLAGS esta alto
; se realizara un medio paso en sentido
; positivo, y en caso contrario, logicamente,
; en sentido negativo. Durante el tiempo entre
; interrupciones el PIC seguira enviando la
; secuencia del ultimo medio paso
CLRF FLAGS
GOTO STEPCONTROL
GIROPOS ; Es la funcion que hace girar el motor en sentido positivo
MOVF INDF,W ; Se cambia la referencia a la posicion
XORWF ANG360,W ; de memoria que permite continuar el
BTFSC STATUS,Z ; giro positivo, recorriendo la serie de
GOTO $+3 ; variables en sentido creciente hasta que
INCF FSR,F ; que se llega a la correspondiente a 360º
GOTO $+3 ; y en ese momento se vuelve a apuntar a
MOVLW ANG45 ; la posicion 45º. El proceso consume 7
MOVWF FSR ; ciclos
MOVF INDF,W ; Se ponen altos los pines que envian el
MOVWF GPIO ; ciclo de paso. El proceso consume 2 ciclos
RETLW 0 ; La instruccion consume 2 ciclos
GIRONEG ; Es la funcion que hace girar el motor en sentido negativo
NOP ; Instruccion necesaria para mantener
; el retraso equivalente al del que se
; produce durante el giro positivo con
; la logica actual
MOVF INDF,W ; Se cambia la referencia a la posicion
XORWF ANG45,W ; de memoria que permite continuar el
BTFSC STATUS,Z ; giro negativo, recorriendo la serie de
GOTO $+3 ; variables en sentido decreciente hasta
DECF FSR,F ; que se llega a la correspondiente a 45º
GOTO $+3 ; y en ese momento se vuelve a apuntar h
MOVLW ANG360 ; la posicion 360º. El proceso consume 7
MOVWF FSR ; ciclos
MOVF INDF,W ; Se ponen altos los pines que envian el
MOVWF GPIO ; ciclo de paso. El proceso consume 2 ciclos
RETLW 0 ; La instruccion consume 2 ciclos
END ; Fin de programa
-
Hola melk
Saludos!
Lo que detecte, a simple(se me pudo ir algo más pero ando medio visco :mrgreen:) es un problema en cambio de bancos.
IF (MICRO == D'675')
CLRF ADCON0 ; Activa todos los pines para funcionar como
CLRF ANSEL ; I/O digitales y desactiva el modulo A/D
ENDIF
El registro ADCON0 si se encunetra en el banco 0, asi que su configuración es correcta, esta deshabilitado el ADC.
Pero ahi mismo haces el CLRF ANSEL y el registro ANSEL (0x9F) esta úbicado en el BANCO 1 por lo que no puedes acceder a el , asi que su escritura queda volando.
Ahi el motivo que el F629 si te trabaje.
Bueno, espero haberte ayudado y que no me falle la vista :D
Saludos
FEliz Año
Atentamente
Akenafab
-
Otro punto bien importante.
Utilizas el Oscilador Interno, pero no cargas el valor al inicio de programa.
Con estos microcontroladores uno debe cargar el valor del oscilador.Este valor se encuentra en la ultima posición de memoria. 0x3FF.
En proteus te simula porque el programa no modela el registro OSCCAL asi que no te marca ese error, ya que trabaja con la frecuencia que especificamos en la ventanita al cargarle el HEX.
-
Muchas gracias AKENAFAB, tienes toda la razon... todo es evidente cuando a uno se lo señalan... uff... estaba convencido de que el ANSEL estaba en el banco 0 pero al revisar el Datasheet... mil perdones por hacer perder el tiempo... Ya esta funcionando, y como de bien nacido es ser agradecido pego el codigo corregido por si a alguien le sirve de algo. Yo voy a emplearlo como driver de un motor paso a paso controlado mediante el soft EMC2 (http://www.linuxcnc.org/) que quizas en el hilo de la fresadora conozcan. Otra cosa, lo de no inicializar el valor del OSCCAL fue algo mas o menos deliberado, puesto que la velocidad a la que van a moverse los motores no hace necesario tanto una frecuencia elevada y exacta como repetibilidad, es decir, en mi caso no seria problematico que el PIC corriera a 3.7 MHz porque seguiria siendo una velocidad mucho mayor que la minima necesaria, siempre y cuando esta fuese igual a lo largo de todo el proceso, de todas maneras lo he añadido al codigo, recordando que TAMBIEN esta en el banco 1... Mil gracias de nuevo... Un saludo y feliz año nuevo
;-----------------------------------------------------------------------;
; STEPH12F.ASM Secuencia paso motor ( GP0,GP1,GP4,GP5 ) ;
; Input de giro y direccion ( GP2,GP3 ) ;
; ;
; El programa siguiente permite actuar al micro ;
; seleccionado como driver para motor paso a paso ;
; que enviara una secuencia de medios pasos: ;
; - Cuando se produce una interrupcion en el ;
; pin GP2 debe realizarse un paso ;
; - Si el pin GP3 esta alto el sentido de ;
; giro sera positivo, en otro caso, sera ;
; negativo ;
; ;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; ;
;-----------------------------------------------------------------------;
#DEFINE MICRO D'675' ; Define el tipo de microcontrolador
; 12F629: D'629'
; 12F675: D'675'
#DEFINE INTERRUP D'0' ; Define el tipo de interrupcion activado
; INTE activado: D'0'
; GPIE activado: D'1'
IF (MICRO == D'629')
LIST P=12F629, ; Usar PIC 16F629
#INCLUDE <P12F629.inc>
ENDIF
IF (MICRO == D'675')
LIST P=12F675, ; Usar PIC 16F675
#INCLUDE <P12F675.inc>
ENDIF
IF (MICRO == D'629' || MICRO == D'675')
; Palabra de configuracion: 0x3F84
__CONFIG _CP_OFF&_PWRTE_ON&_MCLRE_OFF&_WDT_OFF&_BODEN_OFF&_CPD_OFF&_INTRC_OSC_NOCLKOUT
; Code Protect o Proteccion de codigo:OFF
; Power-Up Timer o Temporizacion de encendido:ON
; Master Clear Enable o MCLR externo activo:OFF
; Watchdog o Reset por bucle infinito:OFF
; Brown-out Reset Enable o Reset por fallo de alimentacion:OFF
; Proteccion de lectura memoria EEPROM:OFF
; Oscilador:Interno con modo I/O activado en las dos patillas
ENDIF
ERRORLEVEL -302 ; Elimina Warning de cambio de Banco
CBLOCK 0x20 ; Bloque de declaracion de variables
; Es equivalente a declararlas especificando
; su posicion de memoria
FLAGS ; FLAGS EQU 0x20
ANG45 ; ANG45 EQU 0x21
ANG90 ; ANG90 EQU 0x22
ANG135 ; ANG135 EQU 0x23
ANG180 ; ANG180 EQU 0x24
ANG225 ; ANG225 EQU 0x25
ANG270 ; ANG270 EQU 0x26
ANG315 ; ANG315 EQU 0x27
ANG360 ; ANG360 EQU 0x28
_W ; _W EQU 0x29 Variable auxiliar para el almacenamiento de W antes de la interrupcion
_STATUS ; _STATUS EQU 0x30 Variable auxiliar para el almacenamiento de STATUS antes de la interrupcion
_PCLATH ; _PCLATH EQU 0x31 Variable auxiliar para el almacenamiento de PCLATH antes de la interrupcion ENDC
ENDC
ORG 0x00
GOTO INICIO
ORG 0x04
GOTO INTEPROC
INTEPROC
MOVWF _W ; Almacenamiento del estado del programa, esto
MOVF STATUS,W ; es, de las variables W,STATUS y PCLATH antes
BCF STATUS,RP0 ; de entrar en la interrupcion
BCF STATUS,RP1
MOVWF _STATUS
MOVF PCLATH,W
MOVWF _PCLATH
CLRF PCLATH
CLRF FLAGS ; Limpia los bits de la variable FLAGS que se
; emplea para establecer si el motor debe
; activarse y en que direccion
IF (INTERRUP == D'1')
BTFSS GPIO,2 ; Activa el primer bit de la variable FLAGS
GOTO INTEXIT ; cuando el pin GP2 pasa a estado alto
BSF FLAGS,0 ; indicando que el motor debe moverse
ENDIF
BTFSS GPIO,3 ; Se activa el segundo bit de la variable
GOTO $+3 ; FLAGS cuando el sentido del motor debe ser
BSF FLAGS,1 ; positivo y se desactiva cuando el sentido
GOTO $+3 ; deba ser negativo. La operacion NOP se
BCF FLAGS,1 ; incluye para mantener constante el retraso
NOP
IF (INTERRUP == D'0')
BSF FLAGS,0 ; Activa el primer bit de la variable FLAGS
; que indica que el motor debe avanzar medio
; paso. Esto puede hacerse despues de
; comprobar el sentido porque la interrupcion
; siempre es por flanco de subida
ENDIF
INTEXIT
IF (INTERRUP == D'0')
BCF INTCON,1 ; Resetea el bit que indica que se ha producido
; una interrupcion externa debida a un flanco de
; subida en el pin GP2/INT
ENDIF
IF (INTERRUP == D'1')
BCF INTCON,0 ; Resetea el bit que indica que se ha producido
; una interrupcion debida a un cambio en uno de
; los pines definidos por la variable IOC
ENDIF
MOVF _PCLATH,W ; Recupera el estado del programa, esto es,
MOVWF PCLATH ; restaura los valores originales de las
MOVF _STATUS,W ; variables W,STATUS y PCLATH a aquellos que
MOVWF STATUS ; tenian antes de que se produjese la
SWAPF _W,F ; interrupcion
SWAPF _W,W
RETFIE
INICIO ; Es la funcion que inicializa las variables
MOVLW 0x07 ; Seleccion de modo I/O para las patillas que
MOVWF CMCON ; pueden funcionar como comparador
IF (MICRO == D'675')
CLRF ADCON0 ; Desactiva el modulo A/D
ENDIF
BSF STATUS,RP0 ; Seleccion de Banco 1
MOVLW 0x80 ; Permitira ajustar el valor de frecuencia
MOVWF OSCCAL ; si se desea que sea 4Mhz
IF (MICRO == D'675')
CLRF ANSEL ; Activa todos los pines para funcionar como
; I/O digitales
ENDIF
MOVLW 0x0C ; Se establecen las patillas GP0,GP1,GP4,GP5
MOVWF TRISIO ; como outputs
IF (INTERRUP == D'1')
MOVLW 0x04 ; Se establecen como pin de interrupcion por
MOVWF IOC ; cambio de estado el GP2
ENDIF
BCF STATUS,RP0 ; Seleccion de Banco 0
CLRF GPIO ; Se ponen a 0 los outputs GP
MOVLW B'010000' ; Se inicializan los angulos que gira
MOVWF ANG45 ; el motor paso a paso
MOVLW B'110000' ; Las secuencias seran las siguientes:
MOVWF ANG90 ; 45º = Rojo (4)
MOVLW B'100000' ; 90º = Rojo + Azul (4 y 5)
MOVWF ANG135 ; 135º = Azul (5)
MOVLW B'100001' ; 180º = Azul + Amarillo (5 y 0)
MOVWF ANG180 ; 225º = Amarillo (0)
MOVLW B'000001' ; 270º = Amarillo + Naranja (0 y 1)
MOVWF ANG225 ; 315º = Naranja (1)
MOVLW B'000011' ; 360º = Rojo + Naranja (1 y 4)
MOVWF ANG270 ; El orden corresponde con el sentido positivo
MOVLW B'000010' ; Invertir la secuencia invierte el giro
MOVWF ANG315 ; El valor de pausa pone a cero todos los pines
MOVLW B'010010' ; asociados al control del giro
MOVWF ANG360
BCF STATUS,IRP ; Se almacena como posicion de memoria a la que
MOVLW ANG360 ; apunta el indice INDF a la asociada con el giro
MOVWF FSR ; hasta 360º
IF (INTERRUP == D'0')
BSF OPTION_REG,INTEDG ; Se establece que la interrupcion
; por cambio en el pin GP2/INT se
; produzca por flanco de subida
MOVLW 0x90 ; Se activa la interrupcion externa debido al
MOVWF INTCON ; cambio en el pin GP2/INT (INTE),asi como
; la interrupcion global (GIE)
ENDIF
IF (INTERRUP == D'1')
MOVLW 0x88 ; Se activa la interrupcion debida al cambio
MOVWF INTCON ; de estado en los pines seleccionados con la
; variable IOC asi como la interrupcion global
; (GIE)
ENDIF
GOTO STEPCONTROL
STEPCONTROL ; Es la funcion que controla el giro del motor
BTFSS FLAGS,0 ; Mientras no se haya activado una interrupcion
GOTO $-1 ; en el pin GP2 no se enviara nada al motor.
BTFSS FLAGS,1 ; Cuando se produce, se emplea una variable
GOTO $+3 ; auxiliar FLAGS para realizar un medio paso
CALL GIROPOS ; cambiando el bit 0 a estado alto, lo que
GOTO $+2 ; permite continuar el proceso. Si el bit 1
CALL GIRONEG ; de la variable auxiliar FLAGS esta alto
; se realizara un medio paso en sentido
; positivo, y en caso contrario, logicamente,
; en sentido negativo. Durante el tiempo entre
; interrupciones el PIC seguira enviando la
; secuencia del ultimo medio paso
CLRF FLAGS
GOTO STEPCONTROL
GIROPOS ; Es la funcion que hace girar el motor en sentido positivo
MOVF INDF,W ; Se cambia la referencia a la posicion
XORWF ANG360,W ; de memoria que permite continuar el
BTFSC STATUS,Z ; giro positivo, recorriendo la serie de
GOTO $+3 ; variables en sentido creciente hasta que
INCF FSR,F ; que se llega a la correspondiente a 360º
GOTO $+3 ; y en ese momento se vuelve a apuntar a
MOVLW ANG45 ; la posicion 45º. El proceso consume 7
MOVWF FSR ; ciclos
MOVF INDF,W ; Se ponen altos los pines que envian el
MOVWF GPIO ; ciclo de paso. El proceso consume 2 ciclos
RETLW 0 ; La instruccion consume 2 ciclos
GIRONEG ; Es la funcion que hace girar el motor en sentido negativo
NOP ; Instruccion necesaria para mantener
; el retraso equivalente al del que se
; produce durante el giro positivo con
; la logica actual
MOVF INDF,W ; Se cambia la referencia a la posicion
XORWF ANG45,W ; de memoria que permite continuar el
BTFSC STATUS,Z ; giro negativo, recorriendo la serie de
GOTO $+3 ; variables en sentido decreciente hasta
DECF FSR,F ; que se llega a la correspondiente a 45º
GOTO $+3 ; y en ese momento se vuelve a apuntar h
MOVLW ANG360 ; la posicion 360º. El proceso consume 7
MOVWF FSR ; ciclos
MOVF INDF,W ; Se ponen altos los pines que envian el
MOVWF GPIO ; ciclo de paso. El proceso consume 2 ciclos
RETLW 0 ; La instruccion consume 2 ciclos
END ; Fin de programa
-
Que bueno que lo pudiste solucionar.
Saludos!
Hasta luego!!
Feliz año!
Atentamente
Akenafab