Autor Tema: Reloj binario PIC 16F628A ASm (en proceso)  (Leído 24195 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #45 en: 19 de Octubre de 2015, 19:29:36 »
Y aca volvemos a unos de los primeros codigos que te pase. Podes hacer:


Interrupciones:
- Usas las interrupciones de CCP para solo incrementar los segundos, minutos, horas. Nada mas, es incrementar y revisar que sean menores que 10 y esas cosas.
- Usas la interrupcion del RB0 para saber cuando se presiono el boton, utilizas algun bit de algun registro. Yo cree un registro Flag en uno de los ejemplos, es lo mismo, supone que el bit 1 sea el indicador de cuando presionas el boton, solo lo activas cuando ocurra esta interrupcion.

Programa Principal:
- Aca vas a depender de las demas cosas. Preguntas por el bit del flag que activo el boton. Y eso te va a indicar si se presiono o no, y vas a mostrarlo de una forma u otra segun ese bit
- Si queres tomar el tiempo, aca tranquilamente podes usar delays pero con delays corres el riesgo que se de un valor que no es exacto. Asi que podrias tomar los segundos, guardarlos en otra variable, y preguntar si es que cuando son distintos con el contador de segundos actual ( paso 1 segundo ), mostrar los segundos actualizar tu variable de segundos que tenes para comparar, esperar que sean distintos, cuando son distintos mostrar los minutos actualizar nuevamente, y finalmente mostrar la hora y volves a la forma comun o seguis haciendo lo mismo eso depende de vos.

Citar
Mi idea era que durante la interrupción sume al tiempo del programa lo que dure la interrupcion, asi no tendré perdidas de tiempo.
No por que lo unico que mide el tiempo es el CCP, cualquier otra cosa como un delay tiene una precision si, pero no es exacta, y usar 2 bases de tiempo es decir delay + CCP vas a tener que tener mucho mas cuidado. Es mas simple directamente hacer la interrupcion corta.
« Última modificación: 19 de Octubre de 2015, 20:05:45 por KILLERJC »

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #46 en: 21 de Noviembre de 2015, 18:44:21 »
No voy a sacar el cava porque aún falta, pero aunque he estado un montón de tiempo sin escribir, yo sigo con lo mio, cuando me dejan. Por donde voy ..., todo funciona correctamente, uso la interrupción para incrementar el valor de un botón que luego uso en el programa principal (eso es poner un flag no). Uso dos botones, uno para ver la hora y cambiar a la linterna (si, ahora tiene linterna) y con el otro lo apago todo y dejo a cero la memoria que uso para la interrupcion.

Código: [Seleccionar]
; =====================================================================
; 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

Que me queda?? pues mucho, ahora con tus apuntes que vas colgando miraré bien bien usar el CCP como contador, porque creo que todavía no lo hago correctamente y luego ... ya veremos por donde seguimos. Seguiremos informando.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #47 en: 23 de Noviembre de 2015, 00:15:59 »
Cualquier duda, y mas que sea puntual y no revisarme todo el codigo mas que seguro voy a intentar contestarla. Asi que suerte con lo que llevas haciendo.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #48 en: 09 de Enero de 2016, 09:48:53 »
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.

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



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

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #49 en: 09 de Enero de 2016, 13:41:51 »
hay tantas cosas mal aplicadas, en el sentido que das muchas vueltas para conseguir un solo objetivo. Cosas que veo en el programa:

Código: ASM
  1. Int_Rb0:
  2.    btfsc   PORTB,0
  3.    incf   boton_0,1
  4.    goto   Fin_int_Rb0
  5.    
  6. Fin_int_Rb0:
  7.    BCF     INTCON,INTF    
  8.    RETURN


¿Por que? Cuando:

Código: C
  1. Int_Rb0:
  2.    incf   boton_0,1          ; Si entro hubo un flanco ascendente, que es lo unico que me importa.
  3.    BCF     INTCON,INTF    
  4.    RETURN

Aca es donde deberias tener un "limite" que lo ponga a 0... si es que se pasa de 3.. sino puede que llegue a 4,5,7 y tu programa falle hasta que lo pongas a 0. con RB1



Otra mas:

Código: ASM
  1. movf   boton_0,W            ;revisa si ha llegado a 60 segundos.
  2.    sublw   d'0'
  3.    btfsc   STATUS,Z

MOVF ya actualiza la bandera Z, podes ver que banderas afecta en la lista de instrucciones

Código: ASM
  1. movf   boton_0,W            ;revisa si ha llegado a 60 segundos. W o F es lo mismo aca
  2.    btfsc   STATUS,Z


Código: ASM
  1. goto   runing_mode  
  2.    goto   Principal

Ese Goto Principal cuando deberia ser un RETURN, recorda que lo llamaste con un CALL



Código: ASM
  1. movlw   d'0'
  2.    movwf   boton_0

clrf



La idea detras de esto:

Código: ASM
  1. Principal
  2.    call   Pulsador
  3.    call   Contar_hora
  4.    goto   Principal

Es que cada "subrutina" , es decir cada CALL, sea totalmente independiente uno de otro, por asi decirlo, pulsador no deberia llamar jamas a Contar_hora, si no que deberia como mucho pasarle un registro con algunos bits para que la subrutina Contar_hora sepa que debe hacer. Tampoco que Pulsador sea una rutina super larga..



Código: ASM
  1. Pulsador
  2.    btfss   PORTB,1
  3.    goto   clear_boton_0
  4.    movf   boton_0,W            ;revisa si ha llegado a 60 segundos.
  5.    sublw   d'0'
  6.    btfsc   STATUS,Z
  7.    return
  8.    movf   boton_0,W            ;revisa si ha llegado a 60 segundos.
  9.    sublw   d'2'
  10.    btfsc   STATUS,Z
  11.    goto   Encender_led
  12.    movf   boton_0,W      
  13.    sublw   d'1'
  14.    btfsc   STATUS,Z
  15.    goto   Mostrar_hora
  16.    movf   boton_0,W            ;revisa si ha llegado a 60 segundos.
  17.    sublw   d'3'
  18.    btfsc   STATUS,Z
  19.    goto   runing_mode  
  20.    goto   Principal

Una tabla y hubiera sido mejor.



Rspecto a RA4, trata de poner el registro OPTION a 0, te va a cambiar el flanco de activacion de RB0 lo unico, pero eso no importa. Es lo unico que puede llegar a ser... Sobre RA5 no puedo decirte nada.. Al estar MCLR deshabilitado deberia poder usarlo.



Y finalmente trata de usar la interrupcion el CCP. Y nada de esperar ahi.
« Última modificación: 09 de Enero de 2016, 15:23:36 por KILLERJC »

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #50 en: 16 de Enero de 2016, 10:51:44 »
casi lo tenía y he dado un paso atrás, en fin, seguimos. Actualmente mi programa no funciona y no tengo ni idea porque así que vuelvo a hacer pequeños programas para conocer mejor el lenguaje y luego pasarlo al Binwatch. Empezamos.

He corregido las líneas de la interrupción y funciona correctamente (todavía no entiendo el 100% del código y hago corta pegas y en ocasiones no acabo de comprenderlo del todo). He creado un pequeño programa que simula la interrupción del pulsador y funciona sin problemas.

Código: [Seleccionar]
__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 AQUÍ EMPIEZAN MIS PROBLEMASSSS (perdón por gritar)
He creado (bueno lo intento) una tabla para simplificar el código pero hace cosas raras y no funciona como debería. Algo falla y no sé el que. Una vez lo tenga claro podré variarla en mi código principal

Código: [Seleccionar]
__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 por último PORTA4 Y 5 siguen sin funcionar, en otro foro me han dicho que PORTA5 no es un puerto de salida, puede ser''

como siempre un saludop y gracias por todo.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #51 en: 16 de Enero de 2016, 13:38:49 »
Citar
(todavía no entiendo el 100% del código y hago corta pegas y en ocasiones no acabo de comprenderlo del todo)

Si decis que es lo que no entendes va a ser mas facil explicartelo.

Citar
He creado (bueno lo intento) una tabla para simplificar el código pero hace cosas raras y no funciona como debería. Algo falla y no sé el que. Una vez lo tenga claro podré variarla en mi código principal

Te pido un tiempo para ver el programa ya que no voy a estar por un tiempo en casa.

Citar
Y por último PORTA4 Y 5 siguen sin funcionar, en otro foro me han dicho que PORTA5 no es un puerto de salida, puede ser''

Sobre lo de RA4 no entiendo el por que no funciona, deberia funcionar. Sobre RA5 es correcto, ese pin solo funciona como entrada en ese PIC ( Pagina 9 datasheet, veras que dice Input solo )

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #52 en: 18 de Enero de 2016, 05:36:32 »
El primer programa es correcto, la implentacion de la tabla es correcta. Hay 2 problemas:

- Error en las instrucciones usadas
- Falta de limite


Tu codigo:

Tabla
Código: ASM
  1. TablaVerdad
  2.  
  3.         addwf   PCL,F
  4.         goto    uno
  5.         goto    dos
  6.         goto    tres
  7. uno
  8.         movf    b'00000001',W                                           ; mostramos las horas por el display de leds.  
  9.         movwf   PORTA
  10.         goto    Principal
  11. dos
  12.         movf    b'00000011',W                                           ; mostramos las horas por el display de leds.  
  13.         movwf   PORTA
  14.         goto    Principal
  15. tres
  16.         movf    b'00000111',W                                           ; mostramos las horas por el display de leds.  
  17.         movwf   PORTA
  18.         goto    Principal

Sin limite:
Código: ASM
  1. Int_Rb0
  2.         incf    boton_0,1
  3.         BCF     INTCON,INTF    
  4.         RETURN

Sobre la tabla, usaste la instruccion MOVF, cuando deberias haber usado MOVLW, si no lo que estas haciendo es leer el registro ubicado en la direccion b'00000001', 0x03 y 0x07 (TMR0, STATUS, 0x07 no esta implementado ) y pasandolo a W, la solucion para que funcione es de esta forma:

Código: ASM
  1. TablaVerdad
  2.  
  3.         addwf   PCL,F
  4.         goto    uno
  5.         goto    dos
  6.         goto    tres
  7. uno
  8.         movlw   b'00000001'                                             ; mostramos las horas por el display de leds.  
  9.         movwf   PORTA
  10.         goto    Principal
  11. dos
  12.         movlw   b'00000011'                                             ; mostramos las horas por el display de leds.  
  13.         movwf   PORTA
  14.         goto    Principal
  15. tres
  16.         movlw   b'00000111'                                             ; mostramos las horas por el display de leds.  
  17.         movwf   PORTA
  18.         goto    Principal

Con respecto al limite, tenes que darte cuenta que el maximo es de 3.

Cuando boton_0 sea 0, entraria a uno
Cuando boton_0 sea 1, entraria a dos
Cuando boton_0 sea 2, entraria a tres

Entonces en la interrupcion hay que limitarlo.. a 3 maximo. Si llego a 3 es por que debes ponerlo a 0, es decir de esta forma:

Código: ASM
  1. Int_Rb0
  2.         incf    boton_0,1
  3.         movlw   0x03
  4.         subwf   boton_0, W
  5.         btfsc   STATUS, Z
  6.         clrf    boton_0
  7.         BCF     INTCON,INTF    
  8.         RETURN

Asi incrementamos y si se supero la cantidad de opciones de la tabla lo ponemos a 0 para que comienze de nuevo. Es importante asegurarnos que el indice ( boton_0) jamas supere la cantidad de opciones de la tabla ( uno,dos,tres ), sino lo que haria es saltar a otra intruccion con posibles problemas en el funcionamiento del programa
« Última modificación: 18 de Enero de 2016, 05:39:38 por KILLERJC »

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #53 en: 26 de Enero de 2016, 05:37:14 »
Bueno como siempre eres una gran ayuda. He modificado el programa de las tablas y funciona a la perfección. Además lo he llevado al programa del reloj y me he ahorrado un montón de líneas, por lo que el código es más limpio. OS dejo el programa de tablas por si alguien le interesa (no he puesto límite, puesto que es solo una prueba ya me vale)

Código: [Seleccionar]
[code]
; Version: Tablas

__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
clrf PORTA
movf boton_0,W
addwf PCL,F

TablaVerdad
goto uno
goto dos
goto tres
return

uno
movlw b'00000001' ; mostramos las horas por el display de leds.
goto Mostrar
dos
movlw b'00000011' ; mostramos las horas por el display de leds.
goto Mostrar
tres
movlw b'00000111' ; mostramos las horas por el display de leds.
goto Mostrar

Mostrar
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
[/code]

Pero me han dicho que el PIC que uso no puedo usar todos los puertos de salida del PORTB, así que de momento mientras pienso que hacer, cambiaré de pic y usaré el 16F876 que casi no tengo que cambiar nada del programa (excepto pasarlo todo al PORTC). Pero en Proteus funciona pero en la realidad no y supongo que es por culpa del config

En el PIC 16F628 esta configuración funciona sin problemas.
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF

Por desgracia en el 16F876 me sale un error y después de probar uso esta para simular, pero en la realidad no funciona
__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF & _MCLRE_OFF

Que le falta al config del 16F876??
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #54 en: 26 de Enero de 2016, 12:13:00 »
Lo primero es que tenes una diferencia que el PIC16F87x NO posee oscilador interno, asi que tenes que agregar un cristal.
si usas XT el fuse es hasta 4Mhz, y si queres usar mas hasta 20Mhz entonces debes seleccionar HS. Respecto a la palabra de configuracion lo autogeneras con el MPLAB o sino mirando en el .inc del pic en cuestion encontraras al final todos los fuses y sus opciones


Por mi parte, si fuera a cambiar de PIC iria por algo mas nuevo, ya que incluso un PIC16F88x tiene oscilador interno y mas cosas (y es viejito tambien). Pero si tenes ese PIC entonces segui con ese. Es tu decision. Micros muchos mas nuevos por ahi poseen cosas que facilitan aun mas la programacion, por tener nuevas instrucciones, distintas formas de acceder a la memoria etc. Creo que Pinolillo habia usado uno de esos sin salir de la flia PIC16.

http://www.todopic.com.ar/foros/index.php?topic=45384.0

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #55 en: 26 de Enero de 2016, 13:00:38 »
Vaya, esto se me esta complicando un poco, he usado el 16F876  porque lo tenia por casa, pero no sabia que no tenía oscilador interno.
Entonces tengo dos opciones: buscarme otro Pic más nuevo, que supongo tendrá nuevas instrucciones  y que debo aprender, lo que creo que a mi nivel será un poco complicado o seguir con 16F628 cambiar los puertos  y hacer una seudointerrupcion que tampoco tengo muy claro lo que es...

Que opción es mejor?? 
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #56 en: 26 de Enero de 2016, 14:30:16 »
Yo creo que tendrias otras opciones:

1- Seguir con el 16F628 y usar otro pin y listo. No se por que estas hablando de pseudointerupciones o lo que eso sea.
2- Ponerle un cristal al 16F876 y tambien ya estarias. Aunque normalmente varian mucho los registros de uno a otro.
3- Buscar un pic nuevo.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #57 en: 26 de Enero de 2016, 19:48:13 »
Hombre, lo suyo seria seguir usando el pic16f628 pero como hago la interrupción con otro pin???
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #58 en: 26 de Enero de 2016, 21:35:44 »
Y la pregunta es por que no usas RB4 a RB7 para eso ?

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re:Reloj binario PIC 16F628A ASm (en proceso)
« Respuesta #59 en: 27 de Enero de 2016, 12:20:20 »
Pues te explico el problema, necesito una entrada por interrupción y siete salidas para los leds. Si uso el PORTB como salida me quedo sin la interrupción del PORTB0 y si uso el PORTA como salida no tengo las siete salidas para los leds porque el PORTA5 es solo para entrada.

Y AHORA QUE HAGO??? creo que he hecho algo malo en otra vida y el karma se esta vengando en forma de reloj jejejeje.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/