comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[ASM] Programando un PIC (Control motor paso a paso)

  • 0 Respuestas
  • 6361 Vistas

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

Desconectado kal23

  • *
  • Underc0der
  • Mensajes: 11
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« en: Enero 23, 2014, 05:52:00 pm »
Viendo el post que hizo "mr.blood" sobre programación ASM para PIC, quise colaborar aportando algunos programas sencillos.

Este proyecto consiste en controlar 2 motores paso a paso desde un pic 16f690, El sistema de control consiste en pulsadores para mover los motores en diferentes sentidos y sensores para no sobrepasar el limite del eje. Lo hice de esta manera porque use este programa para controlar el brazo de una CNC. También tiene una modalidad de prueba automática, que se activa presionando los 4 pulsadores al mismo tiempo.

Espero que sea de su utilidad.

Código: ASM
  1.  
  2. list            p=16f690                ;Especifica microcontrolador
  3. #include        <P16F690.inc>
  4.  
  5. ;Opciones de configuración
  6.      __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
  7.  
  8. ; '__CONFIG' se utiliza para acceder a opciones de configuración desde un archivo .asm
  9. ; Las etiquetas a que se hace referencia están definidas en el archivo .inc correspondiente
  10. ; Refiérase a la hoja de datos para conocer la función de casa etiqueta
  11.  
  12. ;ZONA DE DECLARACIÓN DE VARIABLES
  13. ;********************************
  14.     cblock 0x20
  15. Delay1                   ;Define 2 variables para retardo
  16. Delay2                   ;en las posiciones 0x20 y 0x21
  17.      endc
  18.  
  19. ;INICIALIZACION
  20. ;********************************
  21.      ORG        0x00            ;vector de reset
  22.  
  23.      CLRF    STATUS     ;Selecciona página #1
  24.  
  25.      bsf       STATUS,RP0     ; Abre página de registro 1
  26.      movlw     b'11011111'
  27.      movwf     TRISA          ; A5 salida, el resto entradas
  28.  
  29.      movlw     0xF0
  30.      movwf     TRISB          ; PORTB será sólo entradas
  31.  
  32.      clrf      TRISC          ; PORTC será sólo salidas
  33.  
  34.      bcf       STATUS,RP0     ; Abre página de registro 2
  35.      bsf       STATUS,RP1
  36.      movlw     0x00           ; Todos los pines de PortA serán entradas digitales
  37.      movwf     ANSEL
  38.      movlw     0x00           ; Todos los pines de PortB serán entradas digitales
  39.      movwf     ANSELH
  40.      bcf       STATUS,RP0     ; Regresa a página de registro 0
  41.      bcf       STATUS,RP1
  42.  
  43.  
  44. ;INSTRUCCIONES
  45. ;------------------------------------------------
  46. main:                         ;inicio
  47.     clrf PORTA                ;Iniciar en 0 Puerto A
  48.     clrf PORTB                ;Iniciar en 0 Puerto B
  49.     clrf PORTC                ;Iniciar en 0 Puerto C
  50. test:                   ;En esta subrutina se verificara si los 4 entradas están activas
  51.     BTFSS       PORTA,0 ;Si Port A0 = 0 salta a la etiqueta up, si es 1 verificara el estado de A1
  52.     goto        up
  53.     BTFSS       PORTA,1 ;Si Port A1 = 0 salta a la etiqueta up, si es 1 verificara el estado de A2
  54.     goto        up
  55.     BTFSS       PORTA,2 ;Si Port A2 = 0 salta a la etiqueta up, si es 1 verificara el estado de A4
  56.     goto        up
  57.     BTFSS       PORTA,4 ;Si Port A4 = 0 salta a la etiqueta up, si es 1 verificara salta a la  subrutina Test_Motor
  58.     goto        up
  59.     goto        Test_Motor
  60. up:
  61.     BTFSS       PORTA,0       ;Si PORT A0 es 1 salta una linea, si es 0 lee la siguiente
  62.     goto        down          ;Ir a etiqueta Down
  63.     BTFSS       PORTB,4       ;Si Port B4 esta en 0 leerá linea siguiente
  64.                               ;Sistema de seguridad asociado a Sensor 1
  65.     goto        Motor_Up      ;Ir a subrutina Motor_Up
  66.     goto        main          ;Volver a etiqueta main
  67. down:
  68.     BTFSS       PORTA,1       ;Si PORT A1 es 1 salta una linea
  69.     goto        left
  70.     BTFSS       PORTB,5
  71.     goto        Motor_Down
  72.     goto        main
  73. left:
  74.     BTFSS       PORTA,2       ;Si PORT A2 es 1 salta una linea
  75.     goto        right
  76.     BTFSS       PORTB,6
  77.     goto        Motor_Left
  78.     goto        main
  79. right:
  80.     BTFSS       PORTA,4       ;Si PORT A4 es 1 salta una linea
  81.     goto        main
  82.     BTFSS       PORTB,7
  83.     goto        Motor_Right
  84.     goto        main
  85.  
  86. ;Subrutinas
  87. ;--------------------------------------------------
  88.  
  89. Motor_Up:  ;Con esa subrutina el motor 1 gira hacia la izquierda
  90.     movlw    b'00000011'
  91.     movwf      PORTC
  92.     bsf        PORTA,5        ;Enciende led indicador
  93.     call    Retardo_100ms
  94.     movlw    b'00000110'
  95.     movwf      PORTC
  96.     call    Retardo_100ms
  97.     movlw    b'00001100'
  98.     movwf      PORTC
  99.     call    Retardo_100ms
  100.     movlw    b'00001001'
  101.     movwf      PORTC
  102.     bcf        PORTA,5        ;Apaga led indicador
  103.     call    Retardo_100ms
  104.     goto    main
  105.  
  106. Motor_Down: ;Con esa subrutina el motor 1 gira hacia la derecha
  107.     movlw    b'00001100'
  108.     movwf      PORTC
  109.     bsf        PORTA,5        ;Enciende led indicador
  110.     call    Retardo_100ms
  111.     movlw    b'00000110'
  112.     movwf      PORTC
  113.     call    Retardo_100ms
  114.     movlw    b'00000011'
  115.     movwf      PORTC
  116.     call    Retardo_100ms
  117.     movlw    b'00001001'
  118.     movwf      PORTC
  119.     bcf        PORTA,5        ;Apaga led indicador
  120.     call    Retardo_100ms
  121.     goto    main
  122.  
  123. Motor_Left: ;Con esa subrutina el motor 2 gira hacia la izquierda
  124.     movlw    b'00110000'
  125.     movwf      PORTC
  126.     bsf        PORTA,5        ;Enciende led indicador
  127.     call    Retardo_100ms
  128.     movlw    b'01100000'
  129.     movwf      PORTC
  130.     bcf        PORTA,5        ;Apaga led indicador
  131.     call    Retardo_100ms
  132.     movlw    b'11000000'
  133.     movwf      PORTC
  134.     bsf        PORTA,5        ;Enciende led indicador
  135.     call    Retardo_100ms
  136.     movlw    b'10010000'
  137.     movwf      PORTC
  138.     bcf        PORTA,5        ;Apaga led indicador
  139.     call    Retardo_100ms
  140.     goto    main
  141.  
  142. Motor_Right: ;Con esa subrutina el motor 1 gira hacia la derecha
  143.     movlw    b'11000000'
  144.     movwf      PORTC
  145.     bsf        PORTA,5        ;Enciende led indicador
  146.     call    Retardo_100ms
  147.     movlw    b'01100000'
  148.     movwf      PORTC
  149.     bcf        PORTA,5        ;Apaga led indicador
  150.     call    Retardo_100ms
  151.     movlw    b'00110000'
  152.     movwf      PORTC
  153.     bsf        PORTA,5        ;Enciende led indicador
  154.     call    Retardo_100ms
  155.     movlw    b'10010000'
  156.     movwf      PORTC
  157.     bcf        PORTA,5        ;Apaga led indicador
  158.     call    Retardo_100ms
  159.     goto    main
  160.  
  161. Test_Motor:
  162.  
  163.     bsf        PORTA,5        ;Enciende led indicador
  164.     Motor1_Up:                ;Motor 1 girara hacia la izquierda
  165.     movlw    b'00000011'
  166.     movwf      PORTC
  167.     call    Retardo_100ms
  168.     movlw    b'00000110'
  169.     movwf      PORTC
  170.     call    Retardo_100ms
  171.     movlw    b'00001100'
  172.     movwf      PORTC
  173.     call    Retardo_100ms
  174.     movlw    b'00001001'
  175.     movwf      PORTC
  176.     call    Retardo_100ms
  177.     BTFSS       PORTB,4     ;Si Port B4 = 0, lee la linea siguiente, si es 1 Salta una linea
  178.     goto                Motor1_Up   ;Si Port B4 (Sensor1) es 0, vuelve a leer la subrutina Motor1_Up
  179.     goto        Motor1_Down ;Si Port B4 es 1 saltara a la subrutina Motor1_Down
  180.     Motor1_Down:            ;Motor 1 girara hacia la derecha
  181.     movlw    b'00001100'
  182.     movwf      PORTC
  183.     call    Retardo_100ms
  184.     movlw    b'00000110'
  185.     movwf      PORTC
  186.     call    Retardo_100ms
  187.     movlw    b'00000011'
  188.     movwf      PORTC
  189.     call    Retardo_100ms
  190.     movlw    b'00001001'
  191.     movwf      PORTC
  192.     call    Retardo_100ms
  193.     BTFSS       PORTB,5     ;Si Port B5 = 0, lee la linea siguiente, si es 1 Salta una linea
  194.     goto                Motor1_Down ;Si Port B5 (Sensor2) es 0, vuelve a leer la subrutina Motor1_Down
  195.     goto        Motor2_Left ;Si Port B5 es 1 saltara a la subrutina Motor1_Left
  196.     Motor2_Left:            ;Motor 2 girara hacia la izquierda
  197.     movlw    b'00110000'
  198.     movwf      PORTC
  199.     call    Retardo_100ms
  200.     movlw    b'01100000'
  201.     movwf      PORTC
  202.     call    Retardo_100ms
  203.     movlw    b'11000000'
  204.     movwf      PORTC
  205.     call    Retardo_100ms
  206.     movlw    b'10010000'
  207.     movwf      PORTC
  208.     call    Retardo_100ms
  209.     BTFSS       PORTB,6      ;Si Port B6 = 0, lee la linea siguiente, si es 1 Salta una linea
  210.     goto                Motor2_Left  ;Si Port B6 (Sensor3) es 0, vuelve a leer la subrutina Motor1_Left
  211.     goto        Motor2_Right ;Si Port B6 es 1 saltara a la subrutina Motor1_Right
  212.     Motor2_Right:            ;Motor 2 girara hacia la Derecha
  213.     movlw    b'11000000'
  214.     movwf      PORTC
  215.     call    Retardo_100ms
  216.     movlw    b'01100000'
  217.     movwf      PORTC
  218.     call    Retardo_100ms
  219.     movlw    b'00110000'
  220.     movwf      PORTC
  221.     call    Retardo_100ms
  222.     movlw    b'10010000'
  223.     movwf      PORTC
  224.     call    Retardo_100ms
  225.     BTFSS       PORTB,7       ;Si Port B7 = 0, lee la linea siguiente, si es 1 Salta una linea
  226.     goto                Motor2_Right  ;Si Port B7 (Sensor4) es 0, vuelve a leer la subrutina Motor1_Right
  227.     clrf        PORTC         ;Si Port B7 es 1 limpia Port C
  228.     bcf         PORTA,5       ;Si Port B7 es 1 Apaga Led indicador
  229.     goto        main          ;Si Port B7 es 1 Vuelve a la etiqueta main
  230.  
  231.  
  232.     Include <RETARDOS.INC>  ;Incluimos la libreria llamada RETARDOS.INC
  233.     END                 ;fin del programa
  234.  

Adjunto el circuito esquemático para la simulación en proteus, de igual forma dejare al final del post el .DSN, las librerías que utilice y el .ASM



Link de descarga del proyecto completo: You are not allowed to view links. Register or Login
« Última modificación: Noviembre 11, 2014, 08:48:47 pm por ANTRAX »

 

¿Te gustó el post? COMPARTILO!



[ASM] Programando un PIC (Conversión Análogo/Digital 8 bits)

Iniciado por kal23

Respuestas: 0
Vistas: 3048
Último mensaje Enero 24, 2014, 06:17:56 pm
por kal23
[ASM] Programando un PIC (Contador 999 con display 7 segmentos)

Iniciado por kal23

Respuestas: 3
Vistas: 10248
Último mensaje Diciembre 11, 2014, 05:54:52 pm
por mauroe83
[ASM] Programando un PIC (Uso de Timer0)

Iniciado por kal23

Respuestas: 0
Vistas: 1586
Último mensaje Enero 24, 2014, 08:20:44 pm
por kal23
[CCS] Programando un PIC (I/O)

Iniciado por kal23

Respuestas: 0
Vistas: 2347
Último mensaje Enero 27, 2014, 07:29:58 pm
por kal23
[ASM] Programando un PIC

Iniciado por mr.blood

Respuestas: 2
Vistas: 2355
Último mensaje Mayo 13, 2013, 10:30:41 pm
por Stuxnet