Pasar de ASM a C este programa controla motor

Hola:

El proteus 8.0 es el que descargué pensado que es el 8.1, a lo mejor no me deja cargar tu proyecto por eso.

Por cierto, hasz nombrado mucho osciladores menos el renosador EC, que es el que uso en este momento porque la demoboard está diseñado así, con configuración de RC si lo deseo.

Lo que no me hace gracias que es caro y grande. Precisametne este el que me vino.
78osc4mp.jpg


Saludo.
 
ha ok.
Todos estos son cristales... uno se parece al que muestras.
quartz_Crystal_Resonators.jpg


Para el PIC F88 son los modos LP, XT o HS (según la frecuencia). El resto son otras configuraciones.

Que dice su rubrica que no alcanzo a ver?... pero es seguro que es un cristal como los de la imagen.
 
Hola Meta, me imagino que ya solucionaste el problema de del proyecto que no compilaba en Mplabx, asi que solo de comentario, por algún motivo al momento de compilar Mplabx buscaba el archivo *.asm en la ruta de la PC donde yo compile el archivo "buscaba en la PC de mi trabajo".

make[2]: *** No rule to make target `C:/Documents and Settings/henry/Escritorio/ej/ej_motor.X/ej_motor.asm', needed by `build/default/production/_ext/1042234281/ej_motor.o'.
Stop. make[1]: *** [.build-conf] Error 2
 
Hola:

Lo del resonador no es XT, en un libro que compré junto a la placa te deja claro que se usaré el EC, son 4 pines. Se que es de cristal de cuarzo, lo que no se si este es el fallo realmente.

https://docs.google.com/file/d/0B6U...C00OWQwLWJhY2ItY2M2ZGNjYjJmMjM2/edit?hl=en_US

Página 1-5.

Ver punto: 1.3.2 Oscilador.

Es como dices pero de 4 pines. Jejee. Lo que tienes que poner EC en vez de XT, si pongo XT se comporta igual.



En cuanto a Sant_, me funciona de maravilla el proteus. Muchas gracias. Habrá que verlo en real, porque con el 16F88 no funciona nada.

Saludos.
 
Ya veo porqué insistias con EC jeje... bueno , los únicos modos que soportan una línea de entrada de reloj son el EXTRC (hay dos) y creo que el ECIO, ésto en la configuración del MPLABX.

Abres la ventana de configuración, ajustas los fuses, generas el código y copias/pegas los fuses como en la imagen.

También sugeriria que actives/pruebes el oscilador interno... los fuses son INTRC (hay dos tipos), éste necesita ajustar el registro OSCCON a 4Mhz (todo el cálculo está en base a esa frecuencia).

Código:
OSCCON = 0b01100100;
o
OSCCON = 0b01100110;
 

Adjuntos

  • fusesF88.jpg
    fusesF88.jpg
    93.9 KB · Visitas: 7
Que extraño, no recuerdo haber tenido problemas con el PIC 16f88 salvo por algunos pic que no estaban en buen estao, aguna vez me causo problemas el MIKROC en una de sus verciones antiguas, tambien tube algun problema con CCS PICC, en ambos casos fue por que el propio compilador tenia problema, me di cuenta de ello cuando revise a fondo el asm que generaban, pero esos errores son raros y en general confio bastante en los compiladores en C.
Meta ,que tal si pruebas con esto, tiene configurado el oscilador interno a 4MHz.
Código:
    list    P=16F88        ; Procesador.
    include <p16F88.inc>   ; Definición de las etiquetas del PIC.
    __CONFIG _CONFIG1, _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB3 & _CP_OFF
    __CONFIG _CONFIG2, _FCMEN_ON & _IESO_ON
;***************************************
;Declaracion de variables y constantes
;***************************************
#define p1          PORTA,4     ; Pulsador 1.
#define p2          PORTA,3     ; Pulsador 2.
#define p3          PORTA,2     ; Pulsador 3.
#define p4          PORTA,1     ; Pulsador 4.
#define motor       PORTB,7     ; Motor DC.
#define led1        PORTB,6     ; Diodo Led 1.
#define led2        PORTB,5
#define led3        PORTB,4
#DEFINE Altavoz     PORTB,3     ; Altavoz.
#DEFINE Zumbador    PORTB,2     ; Zumbador piezoeléctrico.

ctte_5_min      equ    .5         ; constante para 5 minutos
ctte_10_min     equ    .10        ; constante para 10 minutos
ctte_20_min     equ    .20        ; constante para 20 minutos
ctte_min        equ    .60        ; para 1 minuto
ctte_timer      equ    .16        ; para 1 segundo
carga_timer     equ    .12        ;

variables       udata    0x20
cont_timer      RES 1
cont_seg        RES 1        ; contador de segundos
cont_min        RES 1            ; contador de minutos
tiempo_fijado   RES 1
PDel0           RES 1
PDel1           RES 1
W_TEMP          RES 1
STATUS_TEMP     RES 1
PCLATH_TEMP     RES 1
RAM             RES 1
RAM_1           RES 1
RAM_2           RES 1
RAM_3           RES 1
RAM_4           RES 1
RAM_5           RES 1
RAM_6           RES 1
;**************************************
    org     0x00
    goto    configuracion
    org     0x04
;**********************************************************************
;    Rutinas de interrupciones
;**********************************************************************
rutina_de_interrupcion
PUSH
    MOVWF W_TEMP        ;Copy W to TEMP register
    SWAPF STATUS, W     ;Swap status to be saved into W
    CLRF STATUS         ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
    MOVWF STATUS_TEMP   ;Save status to bank zero STATUS_TEMP register
    MOVF PCLATH, W      ;Only required if using page 1
    MOVWF PCLATH_TEMP   ;Save PCLATH into W
    CLRF PCLATH         ;Page zero, regardless of current page

    btfss   INTCON,TMR0IF        ;verifica si es interrupción temporizada
    goto    salida_timer0        ;sale de la rutina de interrupción
    movlw   carga_timer          ;
    movwf   TMR0                 ;carga al timer0 para reiniciar cuenta
    movfw   cont_timer           ;
    xorlw   ctte_timer           ;compara si llego al segundo
    btfss   STATUS,Z
    goto    salida_timer0        ;sale de la rutina de interrupción si no es 1 segundo
    clrf    cont_timer           ;
    incf    cont_seg             ;se incrementa cada segundo
    movfw   cont_seg
    xorlw   ctte_min             ;compara si es un minuto
    btfss   STATUS,Z
    goto    salida_timer0        ;sale de la rutina de interrupción
    clrf    cont_seg
    incf    cont_min             ;se incrementa cada minuto
salida_timer0
    incf    cont_timer
    bcf     INTCON,TMR0IF
POP
    MOVF PCLATH_TEMP, W     ;Restore PCLATH
    MOVWF PCLATH            ;Move W into PCLATH
    SWAPF STATUS_TEMP, W    ;Swap STATUS_TEMP register into W (sets bank to original state)
    MOVWF STATUS            ;Move W into STATUS register
    SWAPF W_TEMP, F         ;Swap W_TEMP
    SWAPF W_TEMP, W         ;Swap W_TEMP into W
    retfie
;***********************************************
;Subrutinas
;***********************************************
reiniciar_tiempo
    movlw   carga_timer
    movwf   TMR0
    clrf    cont_timer
    clrf    cont_seg
    clrf    cont_min
    banksel OPTION_REG
    bcf     OPTION_REG,T0CS    ; timer0 inicia la cuenta
    banksel PORTA
    bsf     INTCON,GIE         ; interrupciones habilitadas
    bsf     motor
    return
;*************************************************************
pulsador1
    call    retardo_10ms
    btfsc   p1
    return
    ;***********************************************************
    btfss   p1      ; espera hasta que se suelte el pulsador
    goto    $-1     ;
    ;***********************************************************
    movlw   ctte_5_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led1
    return
;*************************************************************
pulsador2
    call    retardo_10ms
    btfsc   p2
    return
    movlw   ctte_10_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    bsf     led2
    return
;*************************************************************
pulsador3
    call    retardo_10ms
    btfsc   p3
    return
    movlw   ctte_20_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    bsf     led3
    return
;*************************************************************
pulsador4
    call    retardo_10ms
    btfsc   p4
    return
    call    detener_tiempo
    return
;*************************************************************
detener_tiempo
    clrf    PORTB
    banksel OPTION_REG
    bsf     OPTION_REG,T0CS    ; timer0 detenido
    banksel PORTA
    bcf     INTCON,GIE        ; interrupciones desactivadas
;*************************************************************
retardo_10ms
    movlw   .8
    movwf   PDel0
PLoop1
    movlw   .249
    movwf   PDel1
PLoop2
    clrwdt
    clrwdt
    decfsz  PDel1,1
    goto    PLoop2
    decfsz  PDel0,1
    goto    PLoop1
PDelL1
    goto    PDelL2
PDelL2
    clrwdt
    return
;******************************************************
; Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto"
;*******************************************************
PitidoLargo
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_500ms
;******************************************************
Pitido
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_200ms
;******************************************************
PitidoCorto
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_20ms
    bcf     Altavoz
    bcf     Zumbador
    return
;**************************************************
Retardo_500ms
    movlw   0x03
    movwf   RAM
    movlw   0x18
    movwf   RAM_1
    movlw   0x02
    movwf   RAM_2
Retardo_500ms_0
    decfsz  RAM, f
    goto    $+2
    decfsz  RAM_1, f
    goto    $+2
    decfsz  RAM_2, f
    goto    Retardo_500ms_0
    goto    $+1
    return
;******************************************************
Retardo_200ms
    movlw   0x3E
    movwf   RAM_3
    movlw   0x9D
    movwf   RAM_4
Retardo_200ms_0
    decfsz  RAM_3, f
    goto    $+2
    decfsz  RAM_4, f
    goto    Retardo_200ms_0
    goto    $+1
    nop
    return
;******************************************************
Retardo_20ms
    movlw   0x9E
    movwf   RAM_5
    movlw   0x10
    movwf   RAM_6
Retardo_20ms_0
    decfsz  RAM_5, f
    goto    $+2
    decfsz  RAM_6, f
    goto    Retardo_20ms_0
    goto    $+1
    nop
    return
;**********************************************
configuracion
;**********************************************
;   configuracion del oscilador interno
;**********************************************
    banksel OSCCON  ;bank 1
    movfw   OSCCON
    iorlw   0x60    ;oscilador interno a 4Mhz
    movwf   OSCCON
    banksel PORTA   ;bank 0
;**********************************************
; Configuración de puertos de entrada y salida
;**********************************************
    clrf    PORTA       ;porta=0
    clrf    PORTB       ;portb=0
    banksel ANSEL       ;bank 1
    clrf    ANSEL       ;puertos i/o digitales
    movlw   0xff        ;w=255
    movwf   TRISA       ;porta como entradas
    clrf    TRISB       ;portb como salidas
;***********************************************
;Configuraciond de las interrupcion temporizada
;***********************************************
    movlw   b'11110111' ;prescaler asignado a timer0, prescaler=256
    movwf   OPTION_REG
    banksel INTCON
    movlw   b'00100000' ;
    movwf   INTCON      ;interrupciones globales desactivados e interrupción timer0 activado
    clrf    TMR0
;**********************************************
bucle
    btfss   p1
    call    pulsador1
    btfss   p2
    call    pulsador2
    btfss   p3
    call    pulsador3
    btfss   p4
    call    pulsador4
    movfw   cont_min
    xorwf   tiempo_fijado,W
    btfss   STATUS,Z
    goto    bucle
    incf    cont_min
    call    detener_tiempo
    goto    bucle
;***********************************************************
    end
 

Adjuntos

  • ej_pic16f88.rar
    45 KB · Visitas: 8
hola.... meta.....aca te subo una utilidad que esta pensada para los motores pap..es un.EXE que te genera un archivo en c...... con los movimientos y velocidad del motor...... tal vez te sirva de algo
 

Adjuntos

  • stepper.zip
    325.3 KB · Visitas: 10
Hola:

Me funciona el asm del PIC16F88. Lo que no entiendo que el pulsador 1 suena un pitido bien, y los demás suena como si fuera un grillo. ;)

Otro motivo, que al apagarse el motor porque se acabó el tiempo. No pita nada. el que me interesa es el pitido largo.

Aquí dejo la prueba.

Código:
 list    P=16F88        ; Procesador.
 include <p16F88.inc>   ; Definición de las etiquetas del PIC.
 __CONFIG _CONFIG1, _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB3 & _CP_OFF
 __CONFIG _CONFIG2, _FCMEN_ON & _IESO_ON
;***************************************
;Declaracion de variables y constantes
;***************************************
#define p1          PORTA,4     ; Pulsador 1.
#define p2          PORTA,3     ; Pulsador 2.
#define p3          PORTA,2     ; Pulsador 3.
#define p4          PORTA,1     ; Pulsador 4.
#define motor       PORTB,7     ; Motor DC.
#define led1        PORTB,6     ; Diodo Led 1.
#define led2        PORTB,5
#define led3        PORTB,4
#DEFINE Altavoz     PORTB,3     ; Altavoz.
#DEFINE Zumbador    PORTB,2     ; Zumbador piezoeléctrico.

ctte_5_min      equ    .5         ; constante para 5 minutos
ctte_10_min     equ    .10        ; constante para 10 minutos
ctte_20_min     equ    .20        ; constante para 20 minutos
ctte_min        equ    .60        ; para 1 minuto
ctte_timer      equ    .16        ; para 1 segundo
carga_timer     equ    .12        ;

variables       udata    0x20
cont_timer      RES 1
cont_seg        RES 1        ; contador de segundos
cont_min        RES 1            ; contador de minutos
tiempo_fijado   RES 1
PDel0           RES 1
PDel1           RES 1
W_TEMP          RES 1
STATUS_TEMP     RES 1
PCLATH_TEMP     RES 1
RAM             RES 1
RAM_1           RES 1
RAM_2           RES 1
RAM_3           RES 1
RAM_4           RES 1
RAM_5           RES 1
RAM_6           RES 1
;**************************************
    org     0x00
    goto    configuracion
    org     0x04
;**********************************************************************
;    Rutinas de interrupciones
;**********************************************************************
rutina_de_interrupcion
PUSH
    MOVWF W_TEMP        ;Copy W to TEMP register
    SWAPF STATUS, W     ;Swap status to be saved into W
    CLRF STATUS         ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
    MOVWF STATUS_TEMP   ;Save status to bank zero STATUS_TEMP register
    MOVF PCLATH, W      ;Only required if using page 1
    MOVWF PCLATH_TEMP   ;Save PCLATH into W
    CLRF PCLATH         ;Page zero, regardless of current page

    btfss   INTCON,TMR0IF        ;verifica si es interrupción temporizada
    goto    salida_timer0        ;sale de la rutina de interrupción
    movlw   carga_timer          ;
    movwf   TMR0                 ;carga al timer0 para reiniciar cuenta
    movfw   cont_timer           ;
    xorlw   ctte_timer           ;compara si llego al segundo
    btfss   STATUS,Z
    goto    salida_timer0        ;sale de la rutina de interrupción si no es 1 segundo
    clrf    cont_timer           ;
    incf    cont_seg             ;se incrementa cada segundo
    movfw   cont_seg
    xorlw   ctte_min             ;compara si es un minuto
    btfss   STATUS,Z
    goto    salida_timer0        ;sale de la rutina de interrupción
    clrf    cont_seg
    incf    cont_min             ;se incrementa cada minuto
salida_timer0
    incf    cont_timer
    bcf     INTCON,TMR0IF
POP
    MOVF PCLATH_TEMP, W     ;Restore PCLATH
    MOVWF PCLATH            ;Move W into PCLATH
    SWAPF STATUS_TEMP, W    ;Swap STATUS_TEMP register into W (sets bank to original state)
    MOVWF STATUS            ;Move W into STATUS register
    SWAPF W_TEMP, F         ;Swap W_TEMP
    SWAPF W_TEMP, W         ;Swap W_TEMP into W
    retfie
;***********************************************
;Subrutinas
;***********************************************
reiniciar_tiempo
    movlw   carga_timer
    movwf   TMR0
    clrf    cont_timer
    clrf    cont_seg
    clrf    cont_min
    banksel OPTION_REG
    bcf     OPTION_REG,T0CS    ; timer0 inicia la cuenta
    banksel PORTA
    bsf     INTCON,GIE         ; interrupciones habilitadas
    bsf     motor
    return
;*************************************************************
pulsador1
    call    retardo_10ms
    btfsc   p1
    return
    ;***********************************************************
    btfss   p1      ; espera hasta que se suelte el pulsador
    goto    $-1     ;
    ;***********************************************************
    movlw   ctte_5_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led1
    return
;*************************************************************
pulsador2
    call    retardo_10ms
    btfsc   p2
    return
    movlw   ctte_10_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led2
    return
;*************************************************************
pulsador3
    call    retardo_10ms
    btfsc   p3
    return
    movlw   ctte_20_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led3
    return
;*************************************************************
pulsador4
    call    retardo_10ms
    btfsc   p4
    return
    call    detener_tiempo
    call    Pitido
    return
;*************************************************************
detener_tiempo
    clrf    PORTB
    banksel OPTION_REG
    bsf     OPTION_REG,T0CS    ; timer0 detenido
    banksel PORTA
    bcf     INTCON,GIE        ; interrupciones desactivadas
;*************************************************************
retardo_10ms
    movlw   .8
    movwf   PDel0
PLoop1
    movlw   .249
    movwf   PDel1
PLoop2
    clrwdt
    clrwdt
    decfsz  PDel1,1
    goto    PLoop2
    decfsz  PDel0,1
    goto    PLoop1
PDelL1
    goto    PDelL2
PDelL2
    clrwdt
    return
;******************************************************
; Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto"
;*******************************************************
PitidoLargo
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_500ms
;******************************************************
Pitido
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_200ms
;******************************************************
PitidoCorto
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_20ms
    bcf     Altavoz
    bcf     Zumbador
    return
;**************************************************
Retardo_500ms
    movlw   0x03
    movwf   RAM
    movlw   0x18
    movwf   RAM_1
    movlw   0x02
    movwf   RAM_2
Retardo_500ms_0
    decfsz  RAM, f
    goto    $+2
    decfsz  RAM_1, f
    goto    $+2
    decfsz  RAM_2, f
    goto    Retardo_500ms_0
    goto    $+1
    return
;******************************************************
Retardo_200ms
    movlw   0x3E
    movwf   RAM_3
    movlw   0x9D
    movwf   RAM_4
Retardo_200ms_0
    decfsz  RAM_3, f
    goto    $+2
    decfsz  RAM_4, f
    goto    Retardo_200ms_0
    goto    $+1
    nop
    return
;******************************************************
Retardo_20ms
    movlw   0x9E
    movwf   RAM_5
    movlw   0x10
    movwf   RAM_6
Retardo_20ms_0
    decfsz  RAM_5, f
    goto    $+2
    decfsz  RAM_6, f
    goto    Retardo_20ms_0
    goto    $+1
    nop
    return
;**********************************************
configuracion
;**********************************************
;   configuracion del oscilador interno
;**********************************************
    banksel OSCCON  ;bank 1
    movfw   OSCCON
    iorlw   0x60    ;oscilador interno a 4Mhz
    movwf   OSCCON
    banksel PORTA   ;bank 0
;**********************************************
; Configuración de puertos de entrada y salida
;**********************************************
    clrf    PORTA       ;porta=0
    clrf    PORTB       ;portb=0
    banksel ANSEL       ;bank 1
    clrf    ANSEL       ;puertos i/o digitales
    movlw   0xff        ;w=255
    movwf   TRISA       ;porta como entradas
    clrf    TRISB       ;portb como salidas
;***********************************************
;Configuraciond de las interrupcion temporizada
;***********************************************
    movlw   b'11110111' ;prescaler asignado a timer0, prescaler=256
    movwf   OPTION_REG
    banksel INTCON
    movlw   b'00100000' ;
    movwf   INTCON      ;interrupciones globales desactivados e interrupción timer0 activado
    clrf    TMR0
;**********************************************
bucle
    btfss   p1
    call    pulsador1
    btfss   p2
    call    pulsador2
    btfss   p3
    call    pulsador3
    btfss   p4
    call    pulsador4
    movfw   cont_min
    xorwf   tiempo_fijado,W
    btfss   STATUS,Z
    goto    bucle
    incf    cont_min
    call    detener_tiempo
    goto    bucle
;***********************************************************
    end

Lo demás está muy bien estructurado. Cuando lo tenga bien subo un vídeo y fotos.

Un saludo.



Hola de nuevo:

Al pulsar los botones 2 o 3, parece que se repite una y otra vez excepto el 1. Lo puedes dejar pulsado y es como si pulsaras varias veces y no es el comportamiento adecuado. El P1 funciona bien.

El montaje por ahora funciona, exceptuando que falta el PitidoLargo al final cuando el motor se detiene solo. Si lo detengo yo, si suena le Pitido.

router-zyxel-857849.png


Saludo.
 
Última edición:
Meta, esto debería solucionar el problema.
Código:
 list    P=16F88        ; Procesador.
 include <p16F88.inc>   ; Definición de las etiquetas del PIC.
 __CONFIG _CONFIG1, _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB3 & _CP_OFF
 __CONFIG _CONFIG2, _FCMEN_ON & _IESO_ON
;***************************************
;Declaracion de variables y constantes
;***************************************
#define p1          PORTA,4     ; Pulsador 1.
#define p2          PORTA,3     ; Pulsador 2.
#define p3          PORTA,2     ; Pulsador 3.
#define p4          PORTA,1     ; Pulsador 4.
#define motor       PORTB,7     ; Motor DC.
#define led1        PORTB,6     ; Diodo Led 1.
#define led2        PORTB,5
#define led3        PORTB,4
#DEFINE Altavoz     PORTB,3     ; Altavoz.
#DEFINE Zumbador    PORTB,2     ; Zumbador piezoeléctrico.

ctte_5_min      equ    .5         ; constante para 5 minutos
ctte_10_min     equ    .10        ; constante para 10 minutos
ctte_20_min     equ    .20        ; constante para 20 minutos
ctte_min        equ    .60        ; para 1 minuto
ctte_timer      equ    .16        ; para 1 segundo
carga_timer     equ    .12        ;

variables       udata    0x20
cont_timer      RES 1
cont_seg        RES 1        ; contador de segundos
cont_min        RES 1            ; contador de minutos
tiempo_fijado   RES 1
PDel0           RES 1
PDel1           RES 1
W_TEMP          RES 1
STATUS_TEMP     RES 1
PCLATH_TEMP     RES 1
RAM             RES 1
RAM_1           RES 1
RAM_2           RES 1
RAM_3           RES 1
RAM_4           RES 1
RAM_5           RES 1
RAM_6           RES 1
;**************************************
    org     0x00
    goto    configuracion
    org     0x04
;**********************************************************************
;    Rutinas de interrupciones
;**********************************************************************
rutina_de_interrupcion
PUSH
    MOVWF   W_TEMP
    SWAPF   STATUS,W
    CLRF    STATUS
    MOVWF   STATUS_TEMP
    MOVF    PCLATH,W
    MOVWF   PCLATH_TEMP
    CLRF    PCLATH

    btfss   INTCON,TMR0IF        ;verifica si es interrupción temporizada
    goto    salida_timer0        ;sale de la rutina de interrupción
    movlw   carga_timer          ;
    movwf   TMR0                 ;carga al timer0 para reiniciar cuenta
    movfw   cont_timer           ;
    xorlw   ctte_timer           ;compara si llego al segundo
    btfss   STATUS,Z
    goto    salida_timer0        ;sale de la rutina de interrupción si no es 1 segundo
    clrf    cont_timer           ;
    incf    cont_seg             ;se incrementa cada segundo
    movfw   cont_seg
    xorlw   ctte_min             ;compara si es un minuto
    btfss   STATUS,Z
    goto    salida_timer0        ;sale de la rutina de interrupción
    clrf    cont_seg
    incf    cont_min             ;se incrementa cada minuto
salida_timer0
    incf    cont_timer
    bcf     INTCON,TMR0IF
POP
    MOVF    PCLATH_TEMP,W
    MOVWF   PCLATH
    SWAPF   STATUS_TEMP,W
    MOVWF   STATUS
    SWAPF   W_TEMP,F
    SWAPF   W_TEMP,W
    retfie
;***********************************************
;Subrutinas
;***********************************************
reiniciar_tiempo
    movlw   carga_timer
    movwf   TMR0
    clrf    cont_timer
    clrf    cont_seg
    clrf    cont_min
    banksel OPTION_REG
    bcf     OPTION_REG,T0CS    ; timer0 inicia la cuenta
    banksel PORTA
    bsf     INTCON,GIE         ; interrupciones habilitadas
    bsf     motor
    return
;*************************************************************
pulsador1
    call    retardo_10ms
    btfsc   p1
    return
    ;***********************************************************
    btfss   p1      ; espera hasta que se suelte el pulsador
    goto    $-1     ;
    ;***********************************************************
    movlw   ctte_5_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led1
    return
;*************************************************************
pulsador2
    call    retardo_10ms
    btfsc   p2
    return
    ;***********************************************************
    btfss   p2      ; espera hasta que se suelte el pulsador
    goto    $-1     ;
    ;***********************************************************
    movlw   ctte_10_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led2
    return
;*************************************************************
pulsador3
    call    retardo_10ms
    btfsc   p3
    return
    ;***********************************************************
    btfss   p3      ; espera hasta que se suelte el pulsador
    goto    $-1     ;
    ;***********************************************************
    movlw   ctte_20_min
    movwf   tiempo_fijado
    clrf    PORTB
    call    reiniciar_tiempo
    call    PitidoCorto
    bsf     led3
    return
;*************************************************************
pulsador4
    call    retardo_10ms
    btfsc   p4
    return
    ;***********************************************************
    btfss   p4      ; espera hasta que se suelte el pulsador
    goto    $-1     ;
    ;***********************************************************
    call    detener_tiempo
    call    Pitido
    return
;*************************************************************
detener_tiempo
    clrf    PORTB
    banksel OPTION_REG
    bsf     OPTION_REG,T0CS    ; timer0 detenido
    banksel PORTA
    bcf     INTCON,GIE        ; interrupciones desactivadas
;*************************************************************
retardo_10ms
    movlw   .8
    movwf   PDel0
PLoop1
    movlw   .249
    movwf   PDel1
PLoop2
    clrwdt
    clrwdt
    decfsz  PDel1,1
    goto    PLoop2
    decfsz  PDel0,1
    goto    PLoop1
PDelL1
    goto    PDelL2
PDelL2
    clrwdt
    return
;******************************************************
; Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto"
;*******************************************************
PitidoLargo
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_500ms
;******************************************************
Pitido
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_200ms
;******************************************************
PitidoCorto
    bsf     Altavoz
    bsf     Zumbador
    call    Retardo_20ms
    bcf     Altavoz
    bcf     Zumbador
    return
;**************************************************
Retardo_500ms
    movlw   0x03
    movwf   RAM
    movlw   0x18
    movwf   RAM_1
    movlw   0x02
    movwf   RAM_2
Retardo_500ms_0
    decfsz  RAM, f
    goto    $+2
    decfsz  RAM_1, f
    goto    $+2
    decfsz  RAM_2, f
    goto    Retardo_500ms_0
    goto    $+1
    return
;******************************************************
Retardo_200ms
    movlw   0x3E
    movwf   RAM_3
    movlw   0x9D
    movwf   RAM_4
Retardo_200ms_0
    decfsz  RAM_3, f
    goto    $+2
    decfsz  RAM_4, f
    goto    Retardo_200ms_0
    goto    $+1
    nop
    return
;******************************************************
Retardo_20ms
    movlw   0x9E
    movwf   RAM_5
    movlw   0x10
    movwf   RAM_6
Retardo_20ms_0
    decfsz  RAM_5, f
    goto    $+2
    decfsz  RAM_6, f
    goto    Retardo_20ms_0
    goto    $+1
    nop
    return
;**********************************************
configuracion
;**********************************************
;   configuracion del oscilador interno
;**********************************************
    banksel OSCCON  ;bank 1
    movfw   OSCCON
    iorlw   0x60    ;oscilador interno a 4Mhz
    movwf   OSCCON
    banksel PORTA   ;bank 0
;**********************************************
; Configuración de puertos de entrada y salida
;**********************************************
    clrf    PORTA       ;porta=0
    clrf    PORTB       ;portb=0
    banksel ANSEL       ;bank 1
    clrf    ANSEL       ;puertos i/o digitales
    movlw   0xff        ;w=255
    movwf   TRISA       ;porta como entradas
    clrf    TRISB       ;portb como salidas
;***********************************************
;Configuraciond de las interrupcion temporizada
;***********************************************
    movlw   b'11110111' ;prescaler asignado a timer0, prescaler=256
    movwf   OPTION_REG
    banksel INTCON
    movlw   b'00100000' ;
    movwf   INTCON      ;interrupciones globales desactivados e interrupción timer0 activado
    clrf    TMR0
;**********************************************
    clrf    cont_min
    movlw   0xff
    movwf   tiempo_fijado
bucle
    btfss   p1
    call    pulsador1
    btfss   p2
    call    pulsador2
    btfss   p3
    call    pulsador3
    btfss   p4
    call    pulsador4
    movfw   cont_min
    xorwf   tiempo_fijado,W
    btfss   STATUS,Z
    goto    bucle
    incf    cont_min
    call    detener_tiempo
    call    PitidoLargo         ;************************************
    goto    bucle
;***********************************************************
    end
 
hola meta..bueno recion me doy cuenta que es un motor DC.....en este caso...... te subo el mismo ejemplo pero para servos...espero que te sirva de algo...
 

Adjuntos

  • servo.zip
    305.1 KB · Visitas: 6
Atrás
Arriba