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