uControl
Marzo 27, 2017, 05:32:50 *
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 8305 veces)
0 Usuarios y 2 Visitantes están viendo este tema.
HJ
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5662



« Respuesta #30 : Enero 16, 2016, 03:28:20 »

Duro como una piedra... o terco como una mula.... diría mi abuelo

El primero es visualizar la interrupción del pulsador que funciona correctamente salvo que PORTA4 y 5 no funcionan.
Pero la respuesta está en el imagen de la hoja de datos de mi respuesta anterior...
RA4 es drenador abierto (OD) y RA5 es solo entrada, pero sino crees y no querés leer lo que uno te va mencionando nunca vas ha aprender.
« Última modificación: Enero 16, 2016, 03:29:55 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]
pastbytes
PIC12F
**
Desconectado Desconectado

Mensajes: 170


« Respuesta #31 : Enero 16, 2016, 04:27:23 »

Si no me equivoco, todos los PICs tienen un pin que solamente funciona como entrada, lo normal cuando uno empieza un proyecto es asignar ese pin a una entrada y luego asignarle funciones al resto, para no encontrarse despues con la sorpresa de que se necesite una salida y solo quede ese pin libre.
En línea
Fulguitron
PIC12F
**
Desconectado Desconectado

Mensajes: 103


« Respuesta #32 : Enero 20, 2016, 05:05:48 »

A ver, no saquemos las cosas de sitio, en una de mis pruebas (que llevo muchas) funcionó, por eso mi duda, pero luego me dí cuenta que cuando lo hice usé el otro puerto como salida. Mi problema es que el PIC tiene en un port la interrupción y en el otro no puedo usar todos los pines como salida.
Resumiendo, estoy jodido, algunas solución?? Cambio de PIC ? si cambios los puertos me quedo sin la interrupción.

Estoy en un pozo sin fondo 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: 5662



« Respuesta #33 : Enero 20, 2016, 07:37:36 »

A ver, no saquemos las cosas de sitio,
Nadie saca las cosas de sitio. tratamos de explicarte porque no anda lo que nos mostraste.

usé el otro puerto como salida.
Ahí estás, porque en el 16F628A en el Puerto A, RA4 es colector abierto y RA5 es solo entrada. que es lo que estamos tratando de decir.

Cambio de PIC ?
El 16F883 o el 16F886 son de 28 pines, tendrías un puerto mas, y no tienen esos problemas del 16F628.... por ejemplo tenés esos, o será cuestión de que busques uno que se ajuste a tu proyecto. Microchip en su página tiene un selector de micros.

algunas solución?? Cambio de PIC ? si cambios los puertos me quedo sin la interrupción.
No hace falta cambiar de PIC, podes cambiar los puertos y hacer una pseudo-interrupción por consulta, con cualquier pin, todo va ha depender de que tan rápido se mueva la señal que generaría la interrupción, o lo que quieras capturar, y de que tan eficiente es tu programa....


Saludos
HJ
« Última modificación: Enero 20, 2016, 07:40:18 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 #34 : Enero 22, 2016, 08:44:15 »

Me gustaría no hacer un cambio de pic para que el reloj (que espero acabarlo algún día) será de pulsera, por lo que tengo que reducir el tamaño en lo que pueda.
Respecto a una seudo interrupción, puedes darme más detalles??
Como siempre, muuuuchas gracias
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: 5662



« Respuesta #35 : Enero 22, 2016, 09:21:22 »

Me gustaría no hacer un cambio de pic para que el reloj (que espero acabarlo algún día) será de pulsera, por lo que tengo que reducir el tamaño en lo que pueda.
Puedes cambiar por un PIC que se ajuste a tus necesidades, por eso te puse el enlace al selector de microchip.

Respecto a una seudo interrupción, puedes darme más detalles??
Puedes leer acerca de ello en: microchip AN514

Saludos
HJ
« Última modificación: Enero 22, 2016, 09:27:44 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 #36 : Enero 26, 2016, 05:25:58 »

Bueno seguimos avanzando poco a poco, de momento estoy haciendo pruebas con el 16F876 y uso el PORTC para las salidas y funcionan todas. Así mientras veo que hago si cambio por PIC o hago una seudointerrupción (aunque lo he leido y no me enterado de casi nada).
Pero mientras ... sigo con mis problemas, como siempre. El código en Proteus funciona correctamente pero en la vida real no. Supongo que es por la línea de config que hay algo que no está OK.

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

Alguna sugerencia??? He mirado el datasheet pero no he sabido encontrar la info.
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: 5662



« Respuesta #37 : Enero 26, 2016, 08:19:39 »

Vas ha tener que acostumbrarte a estudiar la hoja de datos.
__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF & _MCLRE_OFF
Con la instrucción resaltada en rojo, le estas diciendo que utilizas un oscilador del tipo XT, es decir un cristal de mas de 4 MHz entre los pines OSC1 y OSC2.
Como seguramente no lo has conectado, nunca va ha trabajar.
El 16F876 NO tiene oscilador interno, por eso te recomendaba el 16F886 que si tiene.
Y lo que está en verde te tendría que haber tirado un error de compilación ya que este micro, el 166F876 no posee MCLR compartido, ese pin en esta micro es exclusivo para el MCLR y la Vpp de programación. Por lo que requieres una resistencia de 1K conectado entre el pin MCLR/VPP y Vcc.
El 16F886 que te recomendé si posee este compartido con un puerto de entrada salida.
En estos "detalles" el 16F876 es igual al 16F876A.

o hago una seudointerrupción (aunque lo he leido y no me enterado de casi nada).
En la nota de aplicación que te pasé el enlace está bastante bien explicado como hacerlo, aunque en ingles...

Saludos
HJ
« Última modificación: Enero 26, 2016, 08:23:05 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 #38 : Enero 27, 2016, 12:33:33 »

Pido mil disculpas pero entre que está en inglés (que bueno más o menos me entero) y que hay algunas instrucciones que no entiendo ... vamos que no me entero de nada. Buscaré el google a ver que encuentro ....

Casi lo tengo y va ahora y me sale esto ... poco a poco ...
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: 5662



« Respuesta #39 : Enero 27, 2016, 12:59:46 »

Es simple, debes tener un lazo infinito, con una duración fija, dentro del lazo o bucle, consultas regularmente el estado de las entradas que generarían la sesudo-interrupción, por eso se llama "interrupción por consulta" o poling.
Debes hacer que todo el programa trabaje dentro de ese tiempo que has fijado, normalmente mediante un sistema multitareas, las cuales no deberían ocupar mas tiempo que el preestablecido.

Te dejo el enlace a un programa ejemplo que supe publicar en otro foro, en una época en la cual tenía algode tiempo libre... (Aquí)
En ese ejemplo hay uso de dedo un poco, por ejemplo, máquinas de estado, máscaras, sistemas multi-tareas, poling, etc. Incluso está el diagrama de flujo de la máquina de estados.
Como expreso allí mismo, eso mismo se podría haber hecho de muchas otras maneras, pero fue escrito como programa ejemplo.

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]
HJ
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5662



« Respuesta #40 : Enero 27, 2016, 01:04:32 »

Transcribo aquí el programa ejemplo que menciono en el mensaje anterior y el diagrama de flujo, así los tienes a mano.

Código:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;      Inventable.eu
;      llave628.asm
;
; Por HJ
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;Revisión histórica
;----------------------------
;05/04/2014 ID´s: 00000001
; * Primera versión operativa.
;----------------------------
;04/04/2014 ID´s: 00000000
; * Inicio de Programación.
;----------------------------
;************************************************************************
        TITLE " Llave con 16F628A "
;       CLOCK INTERNO DE 4Mhz    Ciclo = 1 uS
;---
#include P16F628A.INC ;Archivo de definiciones de micro
__IDLOCS 0001 ;Versión del programa
__CONFIG _INTOSC_OSC_NOCLKOUT  & _WDT_ON & _PWRTE_ON & _CP_OFF & _BOREN_ON & _MCLRE_OFF & _LVP_OFF & _CPD_OFF
errorlevel -302
;************************************************************************
;--- Constantes
W EQU 0x00
F EQU 0x01
;************************************************************************
;--- Variables mapeadas en el banco 0
E_PUL_0 EQU 0x20 ;Estado del pulsador 0
E_PUL_1 EQU 0x21 ;Estado del pulsador 1
E_PUL_2 EQU 0x22 ;Estado del pulsador 2
E_PUL_3 EQU 0x23 ;Estado del pulsador 3
E_PUL_4 EQU 0x24 ;Estado del pulsador 4
E_PUL_5 EQU 0x25 ;Estado del pulsador 5
E_PUL_6 EQU 0x26 ;Estado del pulsador 6
E_PUL_7 EQU 0x27 ;Estado del pulsador 7
PULSA EQU 0x28 ;Tarea o Pulsador que está siendo atendido.
INTER EQU 0x29 ;Variable intermedia de salida.
WX EQU 0x2A ;Variable auxiliar
MASCARA EQU 0x2B ;Variable auxiliar
;########################################################################
; Programa principal
;************************************************************************
ORG 0 ;Vector de reset
bcf STATUS,RP0
movlw 0x07
movwf CMCON ;Apago el módulo comparador.
goto start ;Voy al comienzo del programa.
ORG 4 ;Vector de interrupciones.
;---
start
clrwdt
movlw 0xFF
movwf PORTA
clrf PORTB
;---
;--- Inicializacion Registros PIC
;--- Configuro los puertos y Deshabilito interrupciones periféricas.
bsf STATUS,RP0 ;Banco 1.
clrf PIE1 ;Deshabilito interrupciones periféricas
movlw 0xFF
movwf TRISA ;Todas entradas
clrf TRISB ;Todas salidas
bcf STATUS,RP0 ;Banco 0.
clrf INTCON ;Deshabilito las interrupciones
;---
;--- Inicializar TMR0
;Obtiene una base de tiempos para hacer evolucionar la maquina de
;estados a partir del desbordamiento de TMR0 cada: 2.5 ms
;Programo TMR0 para que funcione como temporizador.
;Entran al TMR0-> 4MHz/4 = 1 MHz
;Programo preescalador para que funcione con TMR0 y que divida por 64.
bsf STATUS,RP0
movlw 0x85 ;"1000 0101"
movwf OPTION_REG
bcf STATUS,RP0 ;Pagina 0
;La salida del preescalador es de 15625 Hz o 64 useg
;En 2.5 ms TMR0 llega a: (2.5 mseg / 64 useg) =  39.0625 (aprox = 39)
;Con 39 se tiene: (64 useg x 39) = 2.496 mseg (aprox = 2.5 mseg)
;Cargar TMR0 con (256 - 39) = 217
movlw .217
movwf TMR0 ;Cargo el TMR0 para que desborde cada 64uSeg.
bcf INTCON,T0IF ;Blanqueo la bandera del desborde de TMR0
;---
;--- Inicializo registros
clrf PULSA
clrf E_PUL_0
clrf E_PUL_1
clrf E_PUL_2
clrf E_PUL_3
clrf E_PUL_4
clrf E_PUL_5
clrf E_PUL_6
clrf E_PUL_7
clrf INTER
;---
;--- Lazo principal del programa, tiene un ciclo de 2.5 milisegundos
loop_principal
btfss INTCON,T0IF
goto loop_principal ;Espero a que desborde el TMR0
bcf INTCON,T0IF ;Blanqueo la bandera del desborde de TMR0
movlw .217
movwf TMR0 ;Recargo el TMR0 para que desborde cada 64uSeg.
clrwdt
;---
movlw E_PUL_0 ;Cargo W con la posición en RAM del primer registro de
;estado
addwf PULSA,W
movwf FSR ;Apunto con FSR al registro que contiene el estado del
;pulsador que está siendo atendido en este momento.
;---
;--- Obtengo una máscara para determinar el estado del pulsador que se atenderá en esta
;    tarea.
movf PULSA,W
movwf WX ;Cargo WX con el valor del pulsador (o tarea) que está
;siendo atendido
incf WX,F ;Incremento para poder hacer las rotaciones necesarias
;de la máscara.
clrf MASCARA ;Blanqueo el registro utilizado como Máscara.
bsf STATUS,C ;Seteo el carry a fin de generar la máscara rotando
;el registro correspondiente, luego al rotar el registro
;tantas veces como sea el el pulsador atendido logro una
;máscara para actuar sobre el puerto A o el puerto B
loop_mascara
rlf MASCARA,F
bcf STATUS,C
decfsz WX,F
goto loop_mascara ;continuar rotando
;--- Ya se terminó de rotar, el registro MASCARA contendrá un único "1" que se
;    ubicará en el lugar del bit correspondiente al pulsador que se está leyendo
;    en este instante.
;---
movf MASCARA,W
andwf PORTA,W
movwf WX ;Guardo en WX el estado del pulsador que está siendo
;atendido si el pulsador esta presionado WX = 0x00 y
;si está liberado WX será distinto de 0X00.
;---
;--- A paertir de acá la máquina de estados propiamente dicha.
movf INDF,W
addwf PCL,F
;---
goto estado_0 ;estado de reposo inicial
goto estado_1 ;filtro antirebote por software
goto estado_2 ;filtro antirebote por software
goto estado_3 ;Presionó el pulsador => activo la salida
goto estado_4 ;espero que libere el pulsador
goto estado_0 ;estado_5 = estado_0 estado de reposo intermedio,
goto estado_1 ;estado_6 = estado_1
goto estado_2 ;estado_7 = estado_2
goto estado_8 ;espero que libere el pulsador para desactivar la
;salida
;----------------------------
estado_0 ;Estado de reposo inicial
movf WX,F
btfss STATUS,Z
goto finalizar_estados
;---
inc_estado
incf INDF,F
goto finalizar_estados
;----------------------------
estado_1 ;Estado utilizado como filtro antirebote por software
movf WX,F
btfsc STATUS,Z
goto inc_estado
;---
decf INDF,F
goto finalizar_estados
;----------------------------
estado_2 ;Estado utilizado como filtro antirebote por software
movf WX,F
btfsc STATUS,Z
goto inc_estado
;---
decf INDF,F
decf INDF,F
goto finalizar_estados
;----------------------------
estado_3 ;Estado de activación de la salida.
;--- Utilizo la máscara para poner a "1" la salida correspondiente sin afectar las
;    otras.
;    Al tener la máscara solamente un "1" sobre el bit correspondiente a la salida que
;    queremos activar y "0" en los otros bits, si hacemos una OR solamente activaremos
;    dicha salida, sin que las otras se vean afectadas.
movf MASCARA,W
iorwf INTER,F
goto inc_estado
;----------------------------
estado_4 ;Estado en el que espero que se libere el pulsador.
movf WX,F
btfsc STATUS,Z
goto finalizar_estados
;--- Ya fué liberado, voy al siguiente estado.
goto inc_estado
;----------------------------
estado_8 ;Estado en que espero que libere el pulsador para desactivar
;la salida
movf WX,F
btfsc STATUS,Z
goto finalizar_estados ;continúo esperando a que sea liberado.
;---
;--- El pulsador ya fué liberado.
;---
;--- Utilizo la máscara (negada) para poner a "0" la salida correspondiente sin afectar
;    las otras.
;    Al tener la máscara solamente un "1" sobre el bit correspondiente a la salida que
;    queremos activar y "0" en los otros bits, necesito invertir dichos valores de
;    forma que contenga solamente un "0" sobre la salida que queremos apagar, de tal
;    forma que si hacemos una AND
;    solamente desactivaremos dicha salida, sin que las otras se vean afectadas.
comf MASCARA,W
andwf INTER,F
;---
clrf INDF ;Retorno a estado_0
;---
finalizar_estados
incf PULSA,F
movlw 0x08
xorwf PULSA,W
btfsc STATUS,Z
clrf PULSA ;Permito solamente 8 tareas, de la 0 a la 7
;---
;--- Escribo el puerto B.
;    Debido a que estuvimos trabajando sobre un registro intermedio, es necesario en
;    cada vuelta reflejar los cambios sobre el Puerto "B"
movf INTER,W
movwf PORTB
clrwdt
goto loop_principal
;************************************************************************
END



Donde dice =0 o =1 es el estado lógico de la entrada del pulsador en cuestión.
=0 es cuando el pulsador está presionado y =1 cuando el pulsador está sin ser presionado.

Saludos
HJ

* Diagrama de flujo.JPG (21.62 KB - descargado 166 veces.)
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 #41 : Febrero 01, 2016, 02:24:39 »

Muchas gracias HJ en cuanto tenga el ordenador me lo miro, vamos progresando.
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 #42 : Febrero 06, 2016, 04:57:03 »

Bueno, finalmente he optado por un solución muy simple y que va genial, uso parte del PORTB como salida, de esta manera cuatro leds los controlo por el PORTA y los otros tres por el PORTB. En la protoboard funciona perfectamente. Ahora de momento estoy haciendo pruebas a ver como va, en cuanto pueda cuelgo el código actualizado y un pantallazo del Proteus con la nueva configuración.

Como siempre muy agradecido por vuestra ayuda, seguimos avanzando.
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 #43 : Marzo 12, 2016, 01:20:54 »

Hola otra vez, hacía días que no me ponía con el reloj, actualmente sigo avanzando. El tema de los puertos lo he arreglado usando cuatro bits en un puerto y los otros cuatro en otro (aunque solo necesito tres). Hasta aquí va bien, se enciende el led linterna y los de intermitencia.
Pero todo no son buenas noticias, ahora estoy intentando que vaya más o menos a la hora y por más que toque no consigo que se avance menos de 1 minuto a la hora (lo cual es una barbaridad) El problema casi seguro está en el CCP, que por más que hago no consigo entenderlo del todo.
Por eso, he hecho otro código más simple con solo la hora y los minutos para simplificar el código y hacerme la vida más fácil. Iré poniendo el código poco a poco y diciendo donde creo que no lo hago bien

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

Aquí configuro las entradas y las salidas y el CCP, creo que esto está todo correcto

Código:
clrf    TMR1H
clrf    TMR1L
BANKSEL PIE1
    BSF     PIE1,CCP1IE     ;Activamos interrupcion
    BANKSEL PIR1
    BCF     PIR1,CCP1IF     ;Limpiamos flag
    BSF     INTCON,PEIE
    BSF     INTCON,GIE         
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

Aquí seguro que no hago algo bien, he intentado copiar el código de KillerJC pero no funciona del todo, pero no sé porque.

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

Contar_hora
inc_segundos
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

btfss PIR1,CCP1IF
goto inc_segundos
bcf PIR1,CCP1IF
clrf TMR1H
clrf TMR1L

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

Aquí cuento 1 segundo, he puesto un ajuste fino por si me ayudaba a mejorar los tiempos pero no hace absolutamente, por lo que seguro que aquí hay otra cagada.

Y finalmente pongo el código completo del simplificado a ver si alguien ve algo.

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

__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
boton_1
W_temp
Status_temp
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'
Ajuste EQU d'200' ; Ajuste de ciclos para llegar a 1 seg. exacto.


; =========================================================
; 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
BANKSEL PIE1
    BSF     PIE1,CCP1IE     ;Activamos interrupcion
    BANKSEL PIR1
    BCF     PIR1,CCP1IF     ;Limpiamos flag
    BSF     INTCON,PEIE
    BSF     INTCON,GIE         
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 boton_0
clrf segundos
movlw d'2'
movwf contador
movlw d'38' ; Aquí se pone los minutos
movwf minutos
movlw d'10'
movwf horas

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

Tabla
movf boton_0,W
addwf PCL,F
call Contar_hora
call Mostrar_hora
goto Tabla
return

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

Mostrar_hora
btfss PORTB,1
goto Pulsador
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
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

btfss PIR1,CCP1IF
goto inc_segundos
bcf PIR1,CCP1IF
clrf TMR1H
clrf TMR1L

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

    MOVWF   W_temp ; Guardo Contexto
    SWAPF   STATUS,W
    MOVWF   Status_temp

    BANKSEL PIR1 ; Comienza el codigo de la interrupcion
    BTFSC   INTCON,INTF
    CALL    Int_Rb0


SWAPF   Status_temp,W
MOVWF   STATUS
SWAPF   W_temp,F
        SWAPF   W_temp,W
        RETFIE

Int_Rb0 ; Código de la interrupción
btfsc PORTB,0
incf boton_0,1
movf boton_0
sublw Max_boton_0
goto Fin_int_Rb0
clrf boton_0
Fin_int_Rb0
BCF     INTCON,INTF     
RETURN

END



Cada vez me queda menos, pero se me resiste el condenado (puedo decir condenado en el foro) espero que si, comprended mi frustación 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: 5662



« Respuesta #44 : Marzo 12, 2016, 07:12:34 »

Hola Fulguitron, vas ha tener que estudiar el llamado a sub-rutinas y su regreso, así como los diferentes tipos de saltos condicionados y no condicionados.

Por ejemplo, tienes definida algo llamado Tabla, pero que en realidad no funciona como subrutina, ademas dentro de ella llamas a otra subrutina "Mostrar_hora" a la que accedes con un "call" y de la que vuelves con un "goto  Tabla" en lugar de volver con un return...

Ojo que no he revisado todo el código ya que estoy con el celular y se me dificulta leerlo.

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.094 segundos con 24 consultas. (Pretty URLs adds 0.012s, 2q)