• Sábado 13 de Junio de 2026, 17:04

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Joscar

Páginas: [1]
1
Microcontroladores / Instrucciones De La Programacion Del Pic 16f84
« en: Sábado 21 de Agosto de 2004, 22:18 »
Hola a todos, mi duda es la siguiente: tengo el siguiente programa, pero existe unas intrucciones que no entiendo (GOTO    $-1), por favor me lo pueden explicar. Gracias por sus respuestas
el programa controla la velocidad, el sentido de giro (horario, antihorario) de un motor paso a paso.

    ;********************************************************
    ;
    ;               Stepper Motor controller
    ;
    ;                                
    ;********************************************************
     
            LIST            P=PIC16F84A
            INCLUDE         P16F84A.INC
            LIST
    ; P16F84A.INC  Standard Header File, Version 2.00'(modify)
            LIST
           __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

    ;****************  Label Definition  ********************
            CBLOCK  H'0c'
     MODE                            ;Operation mode
                                    ;0=stop 1=right 2=left
     COUNT1                          ;Wait counter
     COUNT2                          ;Wait counter(for 1msec)
     ENDC
     
    RB0     EQU     0               ;RB0 of PORTB
    RB1     EQU     1               ;RB1 of PORTB
    RB2     EQU     2               ;RB2 of PORTB
    RB5     EQU     5               ;RB5 of PORTB
    RB7     EQU     7               ;RB7 of PORTB
     
    ;****************  Program Start  ***********************
     ORG     0               ;Reset Vector
            GOTO    INIT
            ORG     4               ;Interrupt Vector
            CLRF    INTCON          ;Clear Interruption reg
     
    ;****************  Initial Process  *********************
    INIT
     BSF     STATUS,RP0      ;Change to Bank1
     CLRF    TRISA           ;Set PORTA all OUT
     MOVLW   B'00100111'     ;RB0,1,2.5=IN RB7=OUT
     MOVWF   TRISB           ;Set PORTB
     MOVLW   B'10000000'     ;RBPU=1 Pull up not use
     MOVWF   OPTION_REG      ;Set OPTION_REG
     BCF     STATUS,RP0      ;Change to Bank0
     CLRF    MODE            ;Set mode = stop
     CLRF    COUNT1          ;Clear counter
     CLRF    COUNT2          ;Clear counter
     MOVLW   B'00000101'     ;Set PORTA initial value
     MOVWF   PORTA           ;Write PORTA
     BSF     PORTB,RB7       ;Set RB7 = 1
     BTFSC   PORTB,RB5       ;RB5 = 0 ?
     GOTO    $-1             ;No. Wait
     
    START
    VALUE
    ;*************  Check switch condition  *****************
     BTFSC   PORTB,RB1       ;RB1(stop key) = ON ?
     GOTO    CHECK1          ;No. Next
     CLRF    MODE            ;Yes. Set stop mode
     GOTO    DRIVE           ;No. Jump to motor drive
    CHECK1
     BTFSC   PORTB,RB2       ;RB2(right key) = ON ?
     GOTO    CHECK2          ;No. Next
     MOVLW   D'1'            ;Yes. Set right mode
     MOVWF   MODE            ;Save mode
     GOTO    DRIVE           ;No. Jump to motor drive
    CHECK2
     BTFSC   PORTB,RB0       ;RB0(left key) = ON ?
     GOTO    DRIVE           ;No. Jump to motor drive
     MOVLW   D'2'            ;Yes. Set left mode
     MOVWF   MODE            ;Save mode
     
    ;********************  Motor drive  *********************
    DRIVE
      MOVF    MODE,W          ;Read mode
      BZ      START           ;mode = stop
      BSF     PORTB,RB7       ;Set RB7 = 1
      BTFSC   PORTB,RB5       ;RB5 = 0 ?
      GOTO    $-1             ;No. Wait
      MOVLW   D'5'            ;Set loop count(5msec)
      MOVWF   COUNT1          ;Save loop count
    LOOP    CALL    TIMER           ;Wait 1msec
      DECFSZ COUNT1,F        ;count - 1 = 0 ?
      GOTO    LOOP            ;No. Continue
      BCF     PORTB,RB7       ;Set RB7 = 0
      BTFSS   PORTB,RB5       ;RB5 = 1 ?
      GOTO    $-1             ;No. Wait
      MOVF    PORTA,W         ;Read PORTA
      SUBLW   B'000000101'    ;Check motor position
      BNZ     DRIVE2          ;Unmatch
      MOVF    MODE,W          ;Read mode
      SUBLW   D'1'            ;Right ?
      BZ      DRIVE1          ;Yes. Right
      MOVLW   B'00001001'     ;No. Set Left data
      GOTO    DRIVE_END       ;Jump to PORTA write
    DRIVE1
      MOVLW   B'00000110'     ;Set Right data
      GOTO    DRIVE_END       ;Jump to PORTA write
     ;-------
    DRIVE2
      MOVF    PORTA,W         ;Read PORTA
      SUBLW   B'000000110'    ;Check motor position
      BNZ     DRIVE4          ;Unmatch
      MOVF    MODE,W          ;Read mode
      SUBLW   D'1'            ;Right ?
      BZ      DRIVE3          ;Yes. Right
      MOVLW   B'00000101'     ;No. Set Left data
      GOTO    DRIVE_END       ;Jump to PORTA write
    ;VALUE

    DRIVE3
     MOVLW   B'00001010'     ;Set Right data
     GOTO    DRIVE_END       ;Jump to PORTA write
    ;-------
    DRIVE4
     MOVF    PORTA,W         ;Read PORTA
     SUBLW   B'000001010'    ;Check motor position
     BNZ     DRIVE6          ;Unmatch
     MOVF    MODE,W          ;Read mode
     SUBLW   D'1'            ;Right ?
     BZ      DRIVE5          ;Yes. Right
     MOVLW   B'00000110'     ;No. Set Left data
     GOTO    DRIVE_END       ;Jump to PORTA write
    DRIVE5
     MOVLW   B'00001001'     ;Set Right data
     GOTO    DRIVE_END       ;Jump to PORTA write
    ;-------
    DRIVE6
     MOVF    PORTA,W         ;Read PORTA
     SUBLW   B'000001001'    ;Check motor position
     BNZ     DRIVE8          ;Unmatch
     MOVF    MODE,W          ;Read mode
     SUBLW   D'1'            ;Right ?
     BZ      DRIVE7          ;Yes. Right
     MOVLW   B'00001010'     ;No. Set Left data
     GOTO    DRIVE_END       ;Jump to PORTA write
    DRIVE7
     MOVLW   B'00000101'     ;Set Right data
     GOTO    DRIVE_END       ;Jump to PORTA write
    ;-------
    DRIVE8
     MOVLW   B'00000101'     ;Compulsion setting
     
    DRIVE_END
     MOVWF   PORTA           ;Write PORTA
     GOTO    START           ;Jump to start

    ;*************  1msec Timer Subroutine  *****************
    TIMER
     MOVLW   D'200'          ;Set loop count
     MOVWF   COUNT2          ;Save loop count
    TMLP    NOP                     ;Time adjust
     NOP                     ;Time adjust
     DECFSZ  COUNT2,F        ;count - 1 = 0 ?
     GOTO    TMLP            ;No. Continue
     RETURN                  ;Yes. Count end
     
    ;********************************************************
    ;             END of Stepper Motor controller
    ;********************************************************
     
     END

Páginas: [1]