uControl
Febrero 24, 2017, 06:47:40 *
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 8020 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5693


Cumulonimbus


WWW
« Respuesta #15 : Septiembre 01, 2015, 10:09:07 »

Asegurate de haber polarizado bien al LED.
En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #16 : Septiembre 13, 2015, 07:09:36 »

Ya hemos vuelto de vacaciones y retorno con mi reloj (las vacaciones han sido muy intensas y apenas le he podido dar caña a reloj) Tengo un problema tonto pero que no me salgo. He variado un poco el hardware del reloj para añadirle una luz led pero por alguna extraña razón no se enciende colocando el led en el PORTB, 6 o 7.

                                                             

Y como siempre el código, he hecho uno sencillo para no complicarme la vida

Código:
__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
led
ENDC

#DEFINE Pulsador_0 PORTA,0
#DEFINE Pulsador_2 PORTA,2
#DEFINE Led PORTB,3

; ZONA DE CÓDIGOS ********************************************************************

ORG 0x05
     
Configuracion_inicial
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB
movlw b'00000111'
movwf OPTION_REG
bcf STATUS,RP0 ; Acceso al Banco 0.
movwf CMCON ; Configura las entradas como analógicas.
clrf PORTB
 
movlw   b'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'   
movwf   CCPR1H
movlw   b'00100100'   
movwf   CCPR1L
clrf    TMR1H
clrf    TMR1L         
bsf T1CON,TMR1ON

Inicio
btfsc PORTA, 2
goto ledoff
bsf Led
goto Inicio

ledoff
bcf Led
goto Inicio

END

El problema está que con el PORTB,3 el led se enciende sin problemas, pero si pongo PORTB,6 no se enciende

Código:
#DEFINE Led PORTB,3

Como es posible?? Muchas gracias como siempre

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: 5657



« Respuesta #17 : Septiembre 13, 2015, 05:19:03 »

No he visto el código ya que estoy con el celular y se me dificulta, pero revisa de que no tengas recursos compartidos en esos pines que estés utilizando en el programa y no hayas configurado correctamente.

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 #18 : Septiembre 17, 2015, 04:28:38 »

Efectivamente tenía configurado el pin del LED para un reloj externo, con lo que cambié

Código:
movlw   b'00110000'   ; Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
movwf   T1CON
Y listos.

Pero ahora viene mi gran problema LAS INTERRUPCIONEEEEEESSSSSS. He hecho un programa que no hace lo que debería hacer (vaya novedad). Lo cuelgo y os comento mis dudas

Código:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20
contador
W_Temp
Status_temp
ENDC

; ZONA DE CÓDIGOS ********************************************************************

    goto Inicio

ISR_VECTOR    ORG 0x04
    goto Interrupcion

Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB
movlw 0x07
movwf OPTION_REG
movwf CMCON
bcf STATUS,RP0 ; Acceso al Banco 0.
clrf PORTB

movlw   b'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'   
movwf   CCPR1H
movlw   b'00100100'   
movwf   CCPR1L
CLRF    TMR1H
CLRF    TMR1L         
bsf T1CON,TMR1ON

movlw d'0'
movwf contador

Principal
btfss PORTA,0
bcf PORTB,0
bsf PORTB,0
goto Principal

Interrupcion
movwf   W_Temp
    swapf   STATUS,W
    bcf   STATUS,RP0
    movwf   Status_temp

btfss PIR1,CCP1IF
goto Fin_interrupcion
incf contador

movf contador,W
movwf PORTB
bcf PIR1,CCP1IF
clrf TMR1H 
goto Fin_interrupcion

Fin_interrupcion
swapf   Status_temp,W
    movwf   STATUS
    swapf   W_Temp,F
    swapf   W_Temp,W
retfie

END

Y aquí mis dudas. Primero que el programa solo hace parpadear el led y se olvida por completo de la interrupción. Y segundo el tema de la memoria. Para el conteo uso "contador" para la memoria y creo que no voy bien.  Debería usar W_Temp, Status_temp para la interrupción??

Como siempre, muy agradecido y a ver si puedo aprender de una vez por todas el tema de las interrupciones.

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 #19 : Octubre 14, 2015, 07:49:59 »

Sigo muy espeso con las interrupciones, por mas pruebas que haga no me sale nada bueno. Alguien me puede colgar algún ejemplo sencillo de interrupción?? es que no salgo y por más que mire no hay manera de ver la luz con las interrupciones.

Gracias a todos
En línea

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

http://hobbiesygadgets.blogspot.com.es/
DML
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 30


« Respuesta #20 : Octubre 18, 2015, 10:02:22 »

Efectivamente tenía configurado el pin del LED para un reloj externo, con lo que cambié

Código:
movlw   b'00110000'   ; Se selecciona TMR1, preescaler de 1/8, modo temporizador.-
movwf   T1CON
Y listos.

Pero ahora viene mi gran problema LAS INTERRUPCIONEEEEEESSSSSS. He hecho un programa que no hace lo que debería hacer (vaya novedad). Lo cuelgo y os comento mis dudas

Código:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20
contador
W_Temp
Status_temp
ENDC

; ZONA DE CÓDIGOS ********************************************************************

    goto Inicio

ISR_VECTOR    ORG 0x04
    goto Interrupcion

Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB
movlw 0x07
movwf OPTION_REG
movwf CMCON
bcf STATUS,RP0 ; Acceso al Banco 0.
clrf PORTB

movlw   b'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'   
movwf   CCPR1H
movlw   b'00100100'   
movwf   CCPR1L
CLRF    TMR1H
CLRF    TMR1L         
bsf T1CON,TMR1ON

movlw d'0'
movwf contador

Principal
btfss PORTA,0
bcf PORTB,0
bsf PORTB,0
goto Principal

Interrupcion
movwf   W_Temp
    swapf   STATUS,W
    bcf   STATUS,RP0
    movwf   Status_temp

btfss PIR1,CCP1IF
goto Fin_interrupcion
incf contador

movf contador,W
movwf PORTB
bcf PIR1,CCP1IF
clrf TMR1H 
goto Fin_interrupcion

Fin_interrupcion
swapf   Status_temp,W
    movwf   STATUS
    swapf   W_Temp,F
    swapf   W_Temp,W
retfie

END

Y aquí mis dudas. Primero que el programa solo hace parpadear el led y se olvida por completo de la interrupción. Y segundo el tema de la memoria. Para el conteo uso "contador" para la memoria y creo que no voy bien.  Debería usar W_Temp, Status_temp para la interrupción??

Como siempre, muy agradecido y a ver si puedo aprender de una vez por todas el tema de las interrupciones.



Estuve mirando tu codigo y si no configuras que tipo de interrupción queres el Control de Interrupciones (INTCON), en el pic no se va a disparar ningun tipo de interrupción.
Espero que te sirva
Saludos
Diego
En línea
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #21 : Octubre 19, 2015, 06:30:48 »

Muchas gracias por tu respuesta, finalmente (me ha costado un montón) pero he conseguido realizar mi primera interrupción. Actualmente mi reloj al presionar un botón muestra la hora y los minutos. Aun me queda mucho, pero debería empezar a contar los tiempos para poder hacer el programa más preciso. Creo que con el MPALB se puede hacer pero esta opción me sale desactivada. Alguien sale porque??

Como siempre, os cuelgo el código.

Código:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF
LIST    P=16F628A
INCLUDE  <P16F628A.INC>
 
;*****************************************************
;                   Datos
;*****************************************************
;udata_shr
CBLOCK  0x20
W_temp         
Status_temp     
segundos
minutos
horas
contador
memoria_boton_0
estado
est_pulsador_0
est_pulsador_2
ENDC

Max_horas EQU d'12'
Max_minutos EQU d'60'
Max_segundos EQU d'60'

 ;*****************************************************
 ;                  Vectores
 ;*****************************************************

ORG    0x0000      ; Vector de reset
    GOTO    Start
    ORG    0x0004      ; Vector de interrupcion
    GOTO    Interrupcion
;*****************************************************
;               Programa Principal
;*****************************************************

                    ; Programa principal

Start:
 
bsf STATUS,RP0
clrf TRISA
movlw b'11111111'
movwf TRISB
bcf STATUS,RP0

        CLRF    PORTA           ; Digital y a 0
        MOVLW   0x07
        MOVWF   CMCON
movlw   b'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'   
movwf   CCPR1H
movlw   b'00100100'   
movwf   CCPR1L
clrf    TMR1H
clrf    TMR1L         
bsf T1CON,TMR1ON
        ; Activamos interrupciones

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


movlw d'2'
movwf contador
movlw d'0'
movwf memoria_boton_0
movlw d'0'
movwf estado
movlw d'0'
movwf est_pulsador_0
movlw d'0'
movwf est_pulsador_2
movlw d'1'
movwf segundos
movlw d'1'
movwf minutos
movlw d'1'
movwf horas

Principal

inc_segundos
btfss PIR1,CCP1IF
goto inc_segundos
bcf PIR1,CCP1IF
clrf TMR1H
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 se va a inc_segundos.
goto Principal

;=========================== INCREMENTAMOS LOS MINUTOS =====================================================
; " 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
movlw d'1' ; Ponemos a cero los segundos para que empiece el conteo.
movwf 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.
goto Principal ; si no, se va ainc_segundos que empiezan a cero puesto que ya se ha reseteado en movwf segundos.

; ============================== INCREMENTAMOS LAS HORAS =====================================================
; " 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
movlw d'1' ; Primer número por donde quieres que empiece el conteo.
movwf minutos
incf horas

movf horas,W
sublw Max_horas ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
call doce_horas
goto Principal

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

;*****************************************************
;               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
         ; Interrupciones!!
Int_Rb0:
  movf minutos,W ; mostramos las horas por el display de leds.
movwf PORTA
call Retardo_500ms
clrf PORTA
call Retardo_500ms
clrf PORTA
movf horas,W ; mostramos las horas por el display de leds.
movwf PORTA
call Retardo_500ms
clrf PORTA


Fin_int_Rb0:
        BCF     INTCON,INTF     
        RETURN

INCLUDE<RETARDOS.INC>
   
    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: 5657



« Respuesta #22 : Octubre 19, 2015, 08:17:45 »

Creo que con el MPALB se puede hacer pero esta opción me sale desactivada. Alguien sale porque??
¿A que opción te refieres específicamente?
¿que MPLAB estas utilizando? MPLAB X o MPLAB IDE 8.XX

Si te refieres a la ventana del Stopwatch, en MPLAB IDE 8.XX debes tener habilitado algún debug, puede ser el "MPLAB SIM" por ejemplo.
Lo utilizo mucho a la hora de ajustar tiempos.

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 #23 : Noviembre 21, 2015, 06:50:21 »

Os dejo mis últimas novedades, que no son pocas, otro día colgaré el nuevo hardware porque he hecho muchos cambios. De momento ya uso las interrupciones y ahora me meteré de lleno a controlar los tiempos con el CCP. Si alguien se anima a yudar, bienvenido sea.


Código:
; =====================================================================
; El reloj funciona con dos botones, al pulsar un boton se visualiza
; por los leds la hora y los minutos. Al volver a pulsarlo se enciende
; el led que hace de linterna. Con el otro botón, se apaga la linterna
; o se apagan los leds que dan la hora.
;
; Version: 1.5

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

CBLOCK  0x20 
segundos
minutos
horas
contador
boton_0
led
W_temp
Status_temp
ENDC
boton_1 EQU d'0'
Max_horas EQU d'12'
Max_minutos EQU d'60'
Max_segundos EQU d'60'

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

Start
 
bsf STATUS,RP0
clrf TRISA
movlw b'11111111'
movwf TRISB
bcf STATUS,RP0

    CLRF    PORTA           ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'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'   
movwf   CCPR1H
movlw   b'00100100'   
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.

movlw d'0'
movwf boton_0
movlw d'1'
movwf segundos
movwf minutos
movwf horas
movwf contador
movlw d'64'
movwf led
; ================================================================
; Comienza el programa principal.
; ================================================================

Principal
call Pulsador
call Contar_hora
goto Principal

Pulsador
btfss PORTB,1
goto clear_boton_0
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'0'
btfsc STATUS,Z
return
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'2'
btfsc STATUS,Z
goto Encender_led
movf boton_0,W
sublw d'1'
btfsc STATUS,Z
goto Mostrar_hora
goto Principal

; ===================================================================
; Enciende el LED de iluminación
; ===================================================================

Encender_led
movf led,W
movwf PORTA
goto Contar_hora

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

clear_boton_0
clrf PORTA
movlw d'0'
movwf boton_0
return
; =======================================================================
; 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
call Contar_hora ; tiempo en que los leds permanecen encendidos mostrando la hora
clrf PORTA
call Contar_hora ; tiempo en que los leds permanecen apagados
movf minutos,W ; mostramos lOS minutos por el display de leds.
movwf PORTA
call Contar_hora
clrf PORTA
return

Tiempo_refresco
btfss PIR1,CCP1IF
goto Tiempo_refresco
bcf PIR1,CCP1IF
clrf TMR1H
decfsz contador,F
goto Tiempo_refresco
movlw d'2'
movwf contador
return
; ==========================================================================
; 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
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 se va a inc_segundos.
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
movlw d'1' ; Ponemos a cero los segundos para que empiece el conteo.
movwf 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 ; si no, se va ainc_segundos que empiezan a cero puesto que ya se ha reseteado en movwf segundos.


; " 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
movlw d'1' ; Primer número por donde quieres que empiece el conteo.
movwf minutos
incf horas

movf horas,W
sublw Max_horas ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
call doce_horas
return

doce_horas
movlw d'1'
movwf segundos
movwf minutos
movwf horas
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:
btfsc PORTB,0
incf boton_0,1
goto Fin_int_Rb0

Fin_int_Rb0:
BCF     INTCON,INTF     
RETURN

END
 
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 #24 : Enero 09, 2016, 09:49:36 »

AYUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, pues lo tengo todo listo, a falta de mejorar los tiempos, pero ahora me pasa lo mismo que hace un tiempo, los leds del PORTA 4 y 5 o se encienden. Hice lo que me dijisteis hace un tiempo, pero ahora vuelva a hacerme lo mismo. Que puede ser?? Os dejo el código para que lo veais.

Muchiiiiiiiiiiiiiiiiiiiiiiiiiiiisimas gracias.

Código:
; =====================================================================
; El reloj funciona con dos botones, al pulsar un boton se visualiza
; por los leds la hora y los minutos. Al volver a pulsarlo se enciende
; el led que hace de linterna, al volver a pulsarlo se encienden todos
; los leds de modo intermitente.
; Con el otro botón, se apagan todos los leds.
;
;
; Version: 1.6

__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
boton_0
led
W_temp
Status_temp
runing_light
ENDC

Max_horas EQU d'12'
Max_minutos EQU d'60'
Max_segundos EQU d'60'

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

Start
 
bsf STATUS,RP0
clrf TRISA
movlw b'00000011'
movwf TRISB
bcf STATUS,RP0

    CLRF    PORTA           ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'00110000'   ; 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'  
movwf   CCPR1H
movlw   b'00100100'  
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.

movlw d'0'
movwf boton_0
movlw d'0'
movwf segundos
movlw d'26'
movwf minutos
movlw d'10'
movwf horas
movlw d'64'
movwf led
movlw d'63'
movwf runing_light
; ================================================================
; Comienza el programa principal.
; ================================================================

Principal
call Pulsador
call Contar_hora
goto Principal

Pulsador
btfss PORTB,1
goto clear_boton_0
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'0'
btfsc STATUS,Z
return
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'2'
btfsc STATUS,Z
goto Encender_led
movf boton_0,W
sublw d'1'
btfsc STATUS,Z
goto Mostrar_hora
movf boton_0,W ;revisa si ha llegado a 60 segundos.
sublw d'3'
btfsc STATUS,Z
goto runing_mode
goto Principal

; ===================================================================
; Enciende el LED de iluminación
; ===================================================================

Encender_led
movf led,W
movwf PORTA
goto Contar_hora
; ====================================================================
; ===================================================================

runing_mode
movf runing_light,W
movwf PORTA
call Contar_hora
clrf PORTA
call Contar_hora
goto Pulsador

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

clear_boton_0
clrf PORTA
movlw d'0'
movwf boton_0
return
; =======================================================================
; 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
call Contar_hora ; tiempo en que los leds permanecen encendidos mostrando la hora
clrf PORTA
call Contar_hora ; tiempo en que los leds permanecen apagados
movf minutos,W ; mostramos lOS minutos por el display de leds.
movwf PORTA
call Contar_hora
clrf PORTA
return

; ==========================================================================
; 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
nop
nop
nop
nop
nop
nop
nop
nop
nop
bcf PIR1,CCP1IF
clrf TMR1H
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 se va a inc_segundos.
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
movlw d'0' ; Ponemos a cero los segundos para que empiece el conteo.
movwf 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 ; si no, se va ainc_segundos que empiezan a cero puesto que ya se ha reseteado en movwf segundos.


; " 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
movlw d'0' ; Primer número por donde quieres que empiece el conteo.
movwf minutos
incf horas

movf horas,W
sublw Max_horas ; revisa si ha llegado a 60 minutos.
btfsc STATUS,Z
call doce_horas
return

doce_horas
movlw d'0'
movwf segundos
movwf minutos
movwf horas
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:
btfsc PORTB,0
incf boton_0,1
goto Fin_int_Rb0

Fin_int_Rb0:
BCF     INTCON,INTF    
RETURN

END


« Última modificación: Enero 09, 2016, 11:42:11 por HJ » 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: 5657



« Respuesta #25 : Enero 09, 2016, 11:48:19 »

Hola Fulguitron, no he tenido tiempo de ver todo el código en detalle, pero de entrada veo que defines todo el puerto A como salida, pero no has tenido en cuenta que en el micro PIC16F628A el pin RA5 es solo entrada, por lo tanto no puedes utilizarlo como salida.
en cuanto pueda lo veo mas a fondo a ver que si veo algo mas.

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 #26 : Enero 11, 2016, 05:00:46 »

Estas completamente seguro? en otro foro me dijeron que pusiera esto

Código:
movlw   b'00110000'   ; Se selecciona TMR1, preescaler de 1/8, modo temporizador.-

 movwf   T1CON

en otras versiones del programa me ha funcionado pero ahora, supongo que algo he modificado que no sé por donde tirar. A ver si sabéis lo que falla, porque casi lo tengo listo.

Hora
Linterna
Y luces en intermitente para que se nos vea por la noche

Es un reloj para runners jejeje
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: 5657



« Respuesta #27 : Enero 11, 2016, 05:08:57 »

Estas completamente seguro?
Estoy totalmente seguro. En ese micro nunca vas ha poder utilizar el RA5 como salida, es solamente entrada.



saludos
HJ

* RA5.png (38.54 KB - descargado 171 veces.)
« Última modificación: Enero 11, 2016, 05:12:52 por 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 #28 : Enero 16, 2016, 10:58:56 »

Y el PORTA 4?? tampoco funciona. En fin, para simplificar las cosas (intento hacer programas más sencillos para aprender así luego no me cuesta tanto encontrar los fallos) he hecho un par de mini programas. El primero es visualizar la interrupción del pulsador que funciona correctamente salvo que PORTA4 y 5 no funcionan.

Código:
__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
ENDC

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

Start
 
bsf STATUS,RP0
clrf TRISA
movlw b'00000011'
movwf TRISB
bcf STATUS,RP0

    CLRF    PORTA           ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'0011000'   ; ('00110000')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'   
movwf   CCPR1H
movlw   b'00100100'   
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.

movlw d'0'
movwf boton_0

; ================================================================
; Comienza el programa principal.
; ================================================================

Principal
movf boton_0,W ; mostramos las horas por el display de leds.
movwf PORTA
goto Principal

; ===========================================================
; 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

Y luego he intentado crear una tabla para simplificar cófigo pero funciona raro y no tengo ni idea de lo que pasa, una ayudita por favor  Insultos Insultos Insultos

Código:
__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
ENDC

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

Start
 
bsf STATUS,RP0
clrf TRISA
movlw b'00000011'
movwf TRISB
bcf STATUS,RP0

    CLRF    PORTA           ; Digital y a 0
    MOVLW   0x07
    MOVWF   CMCON
movlw   b'0011000'   ; ('00110000')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'   
movwf   CCPR1H
movlw   b'00100100'   
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.

movlw d'1'
movwf boton_0

; ================================================================
; Comienza el programa principal.
; ================================================================

Principal
clrf PORTA
movf boton_0,W
call TablaVerdad
goto Principal

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

addwf PCL,F
goto uno
goto dos
goto tres
uno
movf b'00000001',W ; mostramos las horas por el display de leds.
movwf PORTA
goto Principal
dos
movf b'00000011',W ; mostramos las horas por el display de leds.
movwf PORTA
goto Principal
tres
movf b'00000111',W ; mostramos las horas por el display de leds.
movwf PORTA
goto Principal
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




Y así estamos, un paso para atrás pero a veces es necesario para poder avanzar.

        Un saludo a todos.
En línea

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

http://hobbiesygadgets.blogspot.com.es/
el_vpi
Moderador
PIC18F
******
Desconectado Desconectado

Mensajes: 1346



« Respuesta #29 : Enero 16, 2016, 11:54:12 »

Fijate que RA4 es open drain (OD) con lo cual si lo usas como salida, debes si o si poner algo de pull-up.
Si usas un led por ejm, pones el anodo a Vcc via una R de 470 ohms por ejm. o si lo usas como entrada deberías polarizarla con unos 10K a Vcc.

Saludos, Daniel.
En línea
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.062 segundos con 25 consultas. (Pretty URLs adds 0.015s, 2q)