Autor Tema: Ayuda controlar motor de paso con pic16f84a  (Leído 2377 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado popipown

  • PIC10
  • *
  • Mensajes: 2
Ayuda controlar motor de paso con pic16f84a
« en: 20 de Julio de 2016, 12:17:16 »
estoy tratando de realizar la siguiente practica en assembler  : Se debe hacer girar un motor paso a paso en ambos sentido; el sentido será escogido a través de un suiche y se debe tener la posibilidad de variar la velocidad del giro a través de otros suiches. Se arrancará al presionar P1. Puede usar el L293 para aumentar la corriente al motor .

en mi caso utilizare los puertos rb5 y rb6 como el sw1 que controlara el sentido de giro y los puertos rb2 y rb3 como el sw2 para graduar la velocidad por medio de retardos entre cada paso que de el motor . el punto es que no consigo que trabaje como deberia ser , disculpen si tengo bastantes errores ya que soy un novato con el assembler

list p=16F84A

estado    equ      0x03
porta    equ      0x05
portb    equ      0x06
trisa    equ      0x85
trisb    equ      0x86
R10      equ        0x10
R11      equ        0x11
R        equ        0x01
cont    equ      0x0C
conta1    equ      0x0D
conta2    equ      0x0E
conta3    equ      0x0F
tiempo   equ        .0
ent      equ        .0
vel      equ        .0
      org      0x00
      goto   Inicio
      org      0x05

Inicio  clrf porta
        clrf portb
        bsf     estado,5        ; Pasamos de Banco 0 a Banco 1.-
        movlw   b'11111111'     ; portb todo como entrada.-
        movwf   trisb
        movlw   b'000000'       ; Ra0-Ra3 como salida.-
        movwf   trisa
        bcf     estado,5        ;  del Banco 1 al Banco 0
       
arranque    clrf    porta       ; asegurando que las salidad de porta este limpias para no mover el motor
            btfsc   portb,7     ; esperando p1 para iniciar
            goto arranque
            goto menu     


menu        movf    portb,0
            andlw   B'01100000' 
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0
            movlw   B'00000000'   
            subwf   ent,0     
            btfss   estado,2   ; si es 00  es paso ret sino voy para opc2 esperando un 11
            goto    opc2
            goto    pasoretcom
           


opc2        bcf     estado,2
            bcf     estado,0
            movlw   B'01100000'   
            subwf   ent,0      ; comparando
            btfss   estado,2   ; si es 10 paso completo hacia adelante y sino vuelvo a leer sw
            goto    menu
            goto    pasoadcom     


pasoadcom     call pasoad      ;mando un paso al motor y vuelvo a leer el sw que controla sentido y respectivamente el sw2 que controla la velocidad
              goto menu       ;esto me permite poder cambiar el sentido y la velocidad entre paso

pasoretcom    call pasoret     ;mando un paso al motor y vuelvo a leer el sw1 que controla sentido y respectivamente el sw2 que controla la velocidad
              goto menu       ;esto me permite poder cambiar el sentido y la velocidad entre paso




pasoad      call   velocidad             ; rutina para un paso hacia adelante
            movwf  tiempo                ;registro aux para controlar el retardo
            bcf    estado,0
            rrf    R10,R
            btfsc  estado,0
            bsf    R10,3
            movf   R10,0
            movwf  porta
            call   retardo
            clrf   porta
            retlw  0

pasoret     call   velocidad            ; rutina para un paso hacia adelante
            movwf  tiempo               ;registro aux para controlar el retardo
            bcf    estado,0         
            rlf    R10,R
            btfsc  estado,4
            bsf    R10,0
            movf   R10,0
            movwf  porta
            call   retardo
            clrf   porta
            retlw  0

velocidad   movf    portb,0
            andlw   B'00001100'  ; enmascaro rb2 y rb3 para comparar
            movwf   vel         ; guardando entrada
            movlw   B'00001100'   
            subwf   vel,0     ; comparando
            btfss   estado,2   ; si en el sw2 es 11 retorno a w con .18 para un retardo rapido , sino voy a la otra opc
            goto    vel1
            retlw   .14

vel1        movlw   B'00000000'   
            subwf   ent,10     ; comparando
            btfss   estado,2   ; si en el sw2 es 00 retorno a w con .28 para un retardo mas lento , sino voy a la otra opc
            goto    vel2
            retlw   .18

vel2        nop   ; si es 01 o 11 retorno con el paso mas lento con w.38
            retlw   .20
 
retardo       movlw  tiempo     ;rutina de retardo
            movwf   conta1      
loop1       movlw   .256
           movwf   conta2
loop2       movlw   .256
           movwf   conta3
loop3       decfsz   conta3
       goto   loop3
       decfsz   conta2
       goto   loop2
       decfsz   conta1
       goto   loop1
       return
       end

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda controlar motor de paso con pic16f84a
« Respuesta #1 en: 23 de Julio de 2016, 00:08:36 »
Si nos podes decir cual es el problema que se presenta seria mas facil ayudarte.. mire el codigo y hay un par de incosistencias, de paso te pongo tu mismo codigo con algunos cambios. Asi te acostumbras a usar el nombre de los bits y registros. Asi como tambien algunas otras funciones.

Ejemplo, estas poniendo estado, 2

Cuando al agregar el .inc que ofrece Microchip podes referirte al registro como STATUS que es el nombre que aparece en el datasheet, y en ves del bit 2, usas Z que da mas informacion. Al igual que W y F para los destinos del SUBWF por ejemplo.

Código: ASM
  1. LIST    P=16F84A,
  2.         #include <p16f84A.inc>
  3.  
  4.         CBLOCK 0x10
  5.         R10             ;0x10
  6.         R11             ;0x11
  7.         R               ;0x12
  8.         cont            ;0x13
  9.         conta1          ;0x14
  10.         conta2          ;0x15
  11.         conta3          ;0x16
  12.         ENDC
  13.  
  14. tiempo   equ        .0
  15. ent      equ        .0
  16. vel      equ        .0
  17.  
  18.         org     0x00
  19.         goto    Inicio
  20.         org     0x04
  21.         RETURN
  22.  
  23. Inicio:  
  24.         clrf    PORTA
  25.         clrf    PORTB
  26.         BANKSEL TRISA           ; Banco 1
  27.         movlw   b'11111111'     ; portb todo como entrada.-
  28.         movwf   TRISB
  29.         movlw   b'000000'       ; Ra0-Ra3 como salida.-
  30.         movwf   TRISA
  31.         BANKSEL PORTA           ; Banco 0
  32.        
  33. arranque:    
  34.         clrf    PORTA           ; asegurando que las salidad de porta este limpias para no mover el motor
  35.         btfsc   PORTB,7         ; esperando p1 para iniciar
  36.         goto    arranque
  37.  
  38. menu:        
  39.         movf    portb, W
  40.         andlw   B'01100000'  
  41.         movwf   ent             ;  enmascaro rb6 y rb5 para comparar guardando en entrada, el MOVWF actualiza Z
  42.         btfsc   STATUS, Z       ; si es 00  es paso ret sino voy para opc2 esperando un 11
  43.         goto    pasoretcom
  44.  
  45. opc2:        
  46.         movlw   B'01100000'    
  47.         subwf   ent, W          ; comparando
  48.         btfss   STATUS, Z       ; si es 10 paso completo hacia adelante y sino vuelvo a leer sw
  49.         goto    menu
  50.         goto    pasoadcom    
  51.  
  52.  
  53. pasoadcom:    
  54.         call    pasoad          ;mando un paso al motor y vuelvo a leer el sw que controla sentido y respectivamente el sw2 que controla la velocidad
  55.         goto    menu            ;esto me permite poder cambiar el sentido y la velocidad entre paso
  56.  
  57. pasoretcom:
  58.         call    pasoret         ;mando un paso al motor y vuelvo a leer el sw1 que controla sentido y respectivamente el sw2 que controla la velocidad
  59.         goto    menu            ;esto me permite poder cambiar el sentido y la velocidad entre paso
  60.  
  61.  
  62.  
  63.  
  64. pasoad:    
  65.         call   velocidad        ; rutina para un paso hacia adelante
  66.         movwf  tiempo           ;registro aux para controlar el retardo
  67.         bcf    STATUS, C
  68.         rrf    R10, F
  69.         btfsc  STATUS, C
  70.         bsf    R10,3
  71.         movf   R10, W
  72.         movwf  porta
  73.         call   retardo
  74.         clrf   porta
  75.         retlw  0
  76.  
  77. pasoret:    
  78.         call   velocidad        ; rutina para un paso hacia adelante
  79.         movwf  tiempo           ;registro aux para controlar el retardo
  80.         bcf    STATUS, C
  81.         rlf    R10,R
  82.         btfsc  STATUS, 4        ; bit 4 ??? wtf
  83.         bsf    R10, 0
  84.         movf   R10, W
  85.         movwf  porta
  86.         call   retardo
  87.         clrf   porta
  88.         retlw  0
  89.  
  90. velocidad:  
  91.         movf    portb, W
  92.         andlw   B'00001100'     ; enmascaro rb2 y rb3 para comparar
  93.         movwf   vel             ; guardando entrada
  94.         movlw   B'00001100'    
  95.         subwf   vel, W          ; comparando
  96.         btfsc   STATUS, Z       ; si en el sw2 es 11 retorno a w con .18 para un retardo rapido , sino voy a la otra opc
  97.         retlw   .14
  98.  
  99. vel1:    
  100.         movlw   B'00000000'    
  101.         subwf   ent,10          ; comparando , 10 ???
  102.         btfsc   STATUS, Z       ; si en el sw2 es 00 retorno a w con .28 para un retardo mas lento , sino voy a la otra opc
  103.         retlw   .18
  104.         retlw   .20
  105.  
  106. retardo:      
  107.         movlw  tiempo     ;rutina de retardo
  108.         movwf   conta1      
  109. loop1:      
  110.         movlw   .256
  111.         movwf   conta2
  112. loop2:      
  113.         movlw   .256
  114.         movwf   conta3
  115. loop3:
  116.         decfsz   conta3
  117.         goto   loop3
  118.         decfsz   conta2
  119.         goto   loop2
  120.         decfsz   conta1
  121.         goto   loop1
  122.         return
  123.  
  124.        end

Otra cosa hay 2 lineas que no tienen sentido para mi:

1 esta en pasoret, la cual dice en tu original:

Código: ASM
  1. btfss estado, 4

Que seguro es un error, por que el bit ese no es de ninguna operacion artimetica. Lo cual supongo que quisiste poner:

Código: ASM
  1. btfss R10, 4


---------------------------

La otra es vel1, y aca van 2 cosas:

Código: ASM
  1. vel1:    
  2.         movlw   B'00000000'    
  3.         subwf   ent,10          ; comparando , 10 ???

el segundo lugar es para indicar si va a W o al registro, es decir es lugar para un 0 o un 1, o mejor si usas las letras W y F respectivamente. Asi que ahi hay un error.

Ahora una pequeña leccion para comparar por 0 no es necesario RESTARLE 0, si vas a la tabla de instrucciones vas a notar que algunas instrucciones modifican algunas banderas del registro status, por ejemplo el MOVF modifica unicamente la bandera Z, Entonces lo de arriba se podria haber resumido en:

Código: ASM
  1. vel1:    
  2.         MOVF   ent, W           ; actualizando la bandera Z

Y luego si usas el BTFSS o BTFSC.

---------------------------------------------------

Jugando con las condiciones. Veamos este pedazo de codigo:

Código: ASM
  1. btfss   estado,2   ; si es 00  es paso ret sino voy para opc2 esperando un 11
  2.             goto    opc2
  3.             goto    pasoretcom
  4.  
  5. opc2        
  6.             bcf     estado,2

Lo interesante es que si yo cambio el BTFSS por un BTFSC podria quitar un GOTO quedando:

Código: ASM
  1. btfsc   STATUS, Z       ; si es 00  es paso ret sino voy para opc2 esperando un 11
  2.         goto    pasoretcom
  3.  
  4. opc2:

----------------------------

En fin, si podes decir que es lo que falla como te decia seria mejor, primero trata de hacer un programa que lo mueva para adelante, luego uno que lo mueva para atras, ya con eso podemos ir agregando pulsadores.

Desconectado popipown

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda controlar motor de paso con pic16f84a
« Respuesta #2 en: 27 de Julio de 2016, 08:58:02 »
amigo interesante lo del comando include no lo sabia pero entendi perfectamente lo que dices , es mas facil comprender un codigo si usamos z c que 2 y 0 o 0 y 1 para guardar en f o en w ; al compilar no me daba error pero cuando lo simulaba en el proteus entraba en un bucle infinito . a la final lo que hic fue hacerlo mas facil osea mandando la secuencia de giro del motor a w y luego a el puerto donde lo tenia conectado ; muchas gracias igualemnte por tu ayuda ahorita estoy tratando de hacer un teclado 2x2 con un lcd 16x2 .