uControl
Enero 20, 2017, 06:46:34 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: 1 2 3 [4]   Ir Abajo
  Imprimir  
Autor Tema: Reloj binario PIC 16F628A ASm (en proceso)  (Leído 7741 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #45 : Abril 13, 2016, 11:54:50 »

Bueno, visto mis problemas he decidido dar un paso atrás y empezar las cosas poco a poco. Mi primera victoria, he realizado un programa muy sencillo en el que da la hora y los minutos (la base de todo este proyecto) y después de dos semanas de funcionamiento ininterrumpido el reloj binario seguía en hora (quizás hayan algunos segundos pero lo hice comparándolo con el móvil y de momento me conformo)

Código:
; =====================================================================
; Versión simple del reloj binario,
;
;
; Version: easy_mode_1.1

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20 
segundos
minutos
horas
contador
Ajuste
Ajuste_1
Ajuste_2
ENDC

; ====================================================================
; Zona donde se guardan los valores invariables.
; ====================================================================

Max_horas EQU d'13' ; Hora máxima para poner a 1 horas después de las 12 horas.
Max_minutos EQU d'60'
Max_segundos EQU d'60'
Max_boton_0 EQU d'2'

; =========================================================
; Configuración de la interrupción, entradas, salidas, timer.
; ==============================================================

ORG    0x0000      ; Vector de reset
goto Inicio

Inicio
 
bsf STATUS,RP0
clrf TRISA
movlw b'00000011' ; Configurado como entrada.
movwf TRISB
movlw B'11110000' ; Configurado como salida los cuatro últimos.
movwf TRISA ; configurado como salida.
bcf STATUS,RP0

    CLRF    PORTA            ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'00111100'    ; ('00111100')Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
  movwf   T1CON
    movlw   b'00001011'  ; Se configura CCP modo captura cada flanco de subida.-
    movwf   CCP1CON

movlw   b'11110100' ; 0xF4
movwf   CCPR1H
movlw   b'00100100'    ; 0x24
movwf   CCPR1L
CLRF    TMR1H
CLRF    TMR1L         
bsf T1CON,TMR1ON

;===================================================================
; Zona del banco de memorias de los diferentes registros.
; ====================================================================


clrf segundos
movlw d'2'
movwf contador
movlw d'249'
movwf Ajuste
movlw d'136'
movwf Ajuste_1
movlw d'5'
movwf Ajuste_2

movlw d'4' ; Se pone la hora
movwf horas
movlw d'5' ; Se ponen los minutos (en este caso se ajusta el reloj a las 04:05)


; =======================================================================
; Una vez el boton_0 está a 1 mostramos la hora y los minutos
; =======================================================================

Mostrar_hora

movf horas,W ; mostramos las horas por el display de leds.
movwf PORTA
movwf PORTB
call Contar_hora ; tiempo en que los leds permanecen encendidos mostrando la hora
clrf PORTA
clrf PORTB
call Contar_hora ; tiempo en que los leds permanecen apagados
movf minutos,W ; mostramos lOS minutos por el display de leds.
movwf PORTA
movwf PORTB
call Contar_hora
clrf PORTA
clrf PORTB
call Contar_hora
goto Mostrar_hora

; ==========================================================================
; Conteo de las horas del reloj y su puesta a cero cuando llega a las 12 horas
; =============================================================================

Contar_hora
inc_segundos

btfss PIR1,CCP1IF
goto inc_segundos
bcf PIR1,CCP1IF
clrf TMR1H
Ajuste_fino
decfsz Ajuste,F ; Se crea esta línea para ajustar aún más el tiempo, se predefine en los valores invariables a principio del código
goto Ajuste_fino
movlw d'249'
movwf Ajuste

decfsz Ajuste_1,F
goto Ajuste_fino
movlw d'136'
movwf Ajuste_1
decfsz Ajuste_2,F
goto Ajuste_fino
movlw d'5'
movwf Ajuste_2

decfsz contador,F
goto inc_segundos

comp
movlw d'2'
movwf contador

incf segundos,F
movf segundos,W ;revisa si ha llegado a 60 segundos.
sublw Max_segundos
btfss STATUS,Z ; si ha llegado a 60 segundos, se va a inc_minutos, sino return
return
; ================================================================================
; En el momento que los segundos llegan a 60, se incrementa 1 a minutos,
; se revisa si se ha llegado a 60 minutos y se pone a 0 los segundos
; ================================================================================

inc_minutos ; Ponemos a cero los segundos para que empiece el conteo.
clrf segundos
incf minutos ; incrementamos en 1 los minutos.

movf minutos,W
sublw Max_minutos ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
goto inc_horas ; si ha llegado a 60 minutos se va a inc_horas.
return

; =================================================================================
; En el momento que los minutos llegan a 60,
; se incrementa 1 en horas y se ponen a 0 los minutos y los segundos.
; ==============================================================================

inc_horas
clrf minutos
incf horas

movf horas,W
sublw Max_horas ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
call doce_horas
return
; ========================================================================
; Se ponen a inicio las horas, minutos y segundos
; =======================================================================

doce_horas
movlw d'1'
movwf horas
clrf segundos
clrf minutos
return
 
END




Como siempre, os cuelgo el código para compartirlo. Ahora poco a poco iré poniéndole todos los otros modos, los botones, la linterna, el modo runner y así hasta que ya no sepa que más hacer.
En cuanto tenga nuevos progresos iré informando, de momento ya puedo ir pensando en como hacerlo de pulsera y que quede algo bien hecho.

        Gracias a todos.
En línea

Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #46 : Junio 07, 2016, 02:08:24 »

Hola, seguimos progresando pero ahora tengo un problema gordo, (uno más). El reloj funciona correctamente, pero he hecho un protoboard y puesto una pila y esta pila solo dura unas horas. El código lo he modificado para que solo se enc¡endan los leds cuando se pulsa un botón, por lo que siempre están apagados y lo único que consume es el pic. Os dejo el código por si veis algo raro.

Supongo que el problema debe estar por aquí, pero la verdad no veo el que puede estar mal.

Código:
Inicio
 
bsf STATUS,RP0
clrf TRISA
movlw b'00000011' ; Configurado como entrada.
movwf TRISB
movlw B'11110000' ; Configurado como salida los cuatro últimos.
movwf TRISA ; configurado como salida.
bcf STATUS,RP0

    CLRF    PORTA            ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'00111100'    ; ('00111100')Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
  movwf   T1CON
    movlw   b'00001011'  ; Se configura CCP modo captura cada flanco de subida.-
    movwf   CCP1CON

movlw   b'11110100' ; 0xF4
movwf   CCPR1H
movlw   b'00100100'    ; 0x24
movwf   CCPR1L
CLRF    TMR1H
CLRF    TMR1L         
bsf T1CON,TMR1ON

; Activamos la interrupción

BCF     INTCON,INTF     ; Activo interrupcion de RB0/Flanco descendente
BSF     INTCON,INTE
BSF     INTCON,GIE      ; Habilitamos interrupciones globales


Os dejo el código completo, por  si queréis echarle un vistazo.

Código:
; =====================================================================
; Esta versión simple del reloj funciona con un botón,
; Se pulsa el botón y aparece la hora durante un segundo y
; luego aparacen los minutos, después se apagan todos los LEDS
;
; Version: easy_mode_1.2
; ======================================================================

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20
Status_temp
W_temp
boton_0 
segundos
minutos
horas
contador
Ajuste
Ajuste_1
Ajuste_2
ENDC

; ====================================================================
; Zona donde se guardan los valores invariables.
; ====================================================================

Max_horas EQU d'13' ; Hora máxima para poner a 1 horas después de las 12 horas.
Max_minutos EQU d'60'
Max_segundos EQU d'60'
Max_boton_0 EQU d'2'

; =========================================================
; Configuración de la interrupción, entradas, salidas, timer.
; ==============================================================

ORG    0x0000      ; Vector de reset
goto Inicio
ORG 0X0004 ; Vector de interrupcion
goto Interrupcion

Inicio
 
bsf STATUS,RP0
clrf TRISA
movlw b'00000011' ; Configurado como entrada.
movwf TRISB
movlw B'11110000' ; Configurado como salida los cuatro últimos.
movwf TRISA ; configurado como salida.
bcf STATUS,RP0

    CLRF    PORTA            ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'00111100'    ; ('00111100')Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
  movwf   T1CON
    movlw   b'00001011'  ; Se configura CCP modo captura cada flanco de subida.-
    movwf   CCP1CON

movlw   b'11110100' ; 0xF4
movwf   CCPR1H
movlw   b'00100100'    ; 0x24
movwf   CCPR1L
CLRF    TMR1H
CLRF    TMR1L         
bsf T1CON,TMR1ON

; Activamos la interrupción

BCF     INTCON,INTF     ; Activo interrupcion de RB0/Flanco descendente
BSF     INTCON,INTE
BSF     INTCON,GIE      ; Habilitamos interrupciones globales


;===================================================================
; Zona del banco de memorias de los diferentes registros.
; ====================================================================


clrf segundos
movlw d'2'
movwf contador
movlw d'250'
movwf Ajuste
movlw d'137'
movwf Ajuste_1
movlw d'5'
movwf Ajuste_2
movlw d'0'
movwf boton_0


; =============================================================
; Ponemos en hora el reloj.
; ==============================================================

movlw d'8'
movwf horas
movlw d'5' ; Aquí se pone los minutos
movwf minutos

; ================================================================
; Comienza el programa principal.
; Tabla: Según el estado del boton_0 el reloj pasara a un modo u otro.
; Si el boton_0 esta a "0" llamará a pulsador, si esta a "1" a Mostrar_hora
; ================================================================


; ================================================================
; Comienza el programa principal.
; ================================================================
Tabla
movf boton_0,W
addwf PCL,F
call Pulsador
call Mostrar_hora
goto Tabla



; ===================================================================
; Dejamos a cero la memoria del botón_0 y limpiamos PORTA
; ====================================================================

Pulsador
btfss PORTB,1
goto clear_boton_0
call Contar_hora
goto Tabla

; ===================================================================
; Dejamos a cero la memoria del botón_0 y limpiamos PORTA
; ====================================================================

clear_boton_0
clrf PORTA
clrf PORTB
movlw d'0'
movwf boton_0
goto Contar_hora
goto Tabla

; =======================================================================
; Una vez el boton_0 está a 1 mostramos la hora y los minutos
; =======================================================================

Mostrar_hora

movf horas,W ; mostramos las horas por el display de leds.
movwf PORTA
movwf PORTB
call Contar_hora ; tiempo en que los leds permanecen encendidos mostrando la hora
clrf PORTA
clrf PORTB
call Contar_hora ; tiempo en que los leds permanecen apagados
movf minutos,W ; mostramos lOS minutos por el display de leds.
movwf PORTA
movwf PORTB
call Contar_hora
clrf PORTA
clrf PORTB
call Contar_hora
clrf boton_0
goto Tabla

; ==========================================================================
; Conteo de las horas del reloj y su puesta a cero cuando llega a las 12 horas
; =============================================================================

Contar_hora
inc_segundos

btfss PIR1,CCP1IF
goto inc_segundos
bcf PIR1,CCP1IF
clrf TMR1H
Ajuste_fino
decfsz Ajuste,F ; Se crea esta línea para ajustar aún más el tiempo, se predefine en los valores invariables a principio del código
goto Ajuste_fino
movlw d'250'
movwf Ajuste

decfsz Ajuste_1,F
goto Ajuste_fino
movlw d'137'
movwf Ajuste_1
decfsz Ajuste_2,F
goto Ajuste_fino
movlw d'5'
movwf Ajuste_2

decfsz contador,F
goto inc_segundos

comp
movlw d'2'
movwf contador

incf segundos,F
movf segundos,W ;revisa si ha llegado a 60 segundos.
sublw Max_segundos
btfss STATUS,Z ; si ha llegado a 60 segundos, se va a inc_minutos, sino return
return
; ================================================================================
; En el momento que los segundos llegan a 60, se incrementa 1 a minutos,
; se revisa si se ha llegado a 60 minutos y se pone a 0 los segundos
; ================================================================================

inc_minutos ; Ponemos a cero los segundos para que empiece el conteo.
clrf segundos
incf minutos ; incrementamos en 1 los minutos.

movf minutos,W
sublw Max_minutos ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
goto inc_horas ; si ha llegado a 60 minutos se va a inc_horas.
return

; =================================================================================
; En el momento que los minutos llegan a 60,
; se incrementa 1 en horas y se ponen a 0 los minutos y los segundos.
; ==============================================================================

inc_horas
clrf minutos
incf horas

movf horas,W
sublw Max_horas ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
call doce_horas
return
; ========================================================================
; Se ponen a inicio las horas, minutos y segundos
; =======================================================================

doce_horas
movlw d'1'
movwf horas
clrf segundos
clrf minutos
return


; ===========================================================
; Comienzo de la interrupcion
; =============================================================

Interrupcion
; Guardo Contexto
    MOVWF   W_temp
    SWAPF   STATUS,W
    MOVWF   Status_temp
; Comienza el codigo de mi interrupcion

      BANKSEL PIR1
      BTFSC   INTCON,INTF
      CALL    Int_Rb0

; Fin de codigo de interrupcion       
; Devuelvo el contexto

;Fin_interrupcion:

        SWAPF   Status_temp,W
        MOVWF   STATUS

        SWAPF   W_temp,F
        SWAPF   W_temp,W
        RETFIE

Int_Rb0
incf boton_0,1
BCF     INTCON,INTF     
RETURN
 
END



En línea

Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/
HJ
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5653



« Respuesta #47 : Junio 07, 2016, 09:07:38 »

Hola Fulguitron,  deberías subir el circuito que tienes montado para ver si no vemos por donde se te puede estar escapando el consumo.
¿de que tipo es la pila que utilizas? tensión, mA/h, etc...
En cuanto pueda le hecho un vistazo al código.

saludos
HJ
En línea

"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #48 : Junio 26, 2016, 02:44:46 »

Perdón por la tardanza, os paso la foto y usa una pila de botón la 2322, debo  hacer algo con los pines del PIC que se quedan sueltos?Huh?

En línea

Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #49 : Julio 07, 2016, 05:14:35 »

Una pregunta, como se configura el pis a 1mhz???
En línea

Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #50 : Julio 14, 2016, 06:39:05 »

Por más que mire por internet no lo encuentro, como puedo configurar el oscilador del PIC en asm, sin usar cristales externos???
En línea

Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/
HJ
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5653



« Respuesta #51 : Julio 14, 2016, 07:45:46 »

Hola Fulgitron, el PIC16F628A tiene una sola frecuencia en su oscilador interno y es de 4MHz.
Para utilizarlo debes modificar la palabra de configuración (fuses) debes poner a "1" el bit 4 y a "0" los bits 0 y 1.
En el "p16f628a.inc" aparece como "_INTRC_OSC_NOCLKOUT" o "_INTOSC_OSC_NOCLKOUT " o "_FOSC_INTOSCIO"
Por ejemplo yo suelo configurarlo como sigue:

Código:
__CONFIG _INTRC_OSC_NOCLKOUT  & _WDT_OFF & _PWRTE_ON & _CP_ON & _BOREN_ON & _MCLRE_OFF & _LVP_OFF & _DATA_CP_OFF

Saludos
HJ
En línea

"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]
Páginas: 1 2 3 [4]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.067 segundos con 24 consultas. (Pretty URLs adds 0.008s, 2q)