Autor Tema: ¿Fallo de mi ASM o fallo del Proteus?  (Leído 4122 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado melk

  • PIC10
  • *
  • Mensajes: 20
¿Fallo de mi ASM o fallo del Proteus?
« 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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: ¿Fallo de mi ASM o fallo del Proteus?
« Respuesta #1 en: 31 de Diciembre de 2007, 17:51:34 »
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.

Citar
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
   

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: ¿Fallo de mi ASM o fallo del Proteus?
« Respuesta #2 en: 31 de Diciembre de 2007, 18:22:00 »
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.

Desconectado melk

  • PIC10
  • *
  • Mensajes: 20
Re: ¿Fallo de mi ASM o fallo del Proteus?
« Respuesta #3 en: 31 de Diciembre de 2007, 19:29:19 »
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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: ¿Fallo de mi ASM o fallo del Proteus?
« Respuesta #4 en: 31 de Diciembre de 2007, 19:37:03 »

Que bueno que lo pudiste solucionar.

Saludos!

Hasta luego!!

Feliz año!

Atentamente
 Akenafab