TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: Thevenin en 18 de Julio de 2008, 20:07:52
-
Buenas noches:
Este es mi primer mensaje en el foro, un saludo desde Tenerife :o
Y como no podía ser de otra manera, comienzo pidiendo un favor especial:
Necesitaría que alguien probase el archivo .DSN en el adjunto a ver si os ocurre un fallo que me trae de cabeza.
Es un radio despertador con pantalla LCD 16 caracteres de dos líneas (incompleto), que para poner la hora, hay que tocar primero el botón SET.
Al pulsarlo, los segundos se quedan bailando, y tras ajustar la hora (esto sí funciona) y volver a pulsar SET para
continuar aparecen caracteres indebidos en el display en la línea 1.
No tengo pantallas, y quiero acumular cosas para comprarlas por internet, y no sé si es fallo de mi versión de ISIS,
o de mi código.
Adjunto código fuente necesario, aunque con que me digáis si os pasa o no me basta.
Versión Proteus 6.9 sp5
Un saludo.
-
creo que tu problema está en la línea donde colocas:
btfss Flag_Set,1;de la subrutina Mostrar_segundos, porque cuando no estás seteando las horas, esperas un segundo y si estás en modo de seteo no lo esperas, por lo tanto accedes al lcd más rapidamente y por eso aparecen los caracteres raros y los segundos se mueven erráticos. No creo que sea un problema de proteus
Espero haberte ayudado
Mostrar_Segundos
call Pitido
Posicionar_Digito Posicion_Decenas_Segundos
call BIN_a_BCD
call LCD_Byte
Salto_Retardo_1s
Posicionar_Digito Posicion_Decenas_Segundos
movfw Segundos
call BIN_a_BCD
call LCD_Byte
btfss Flag_Set,1; ¡Ojo con esta instrucción. Si se pone, aparecen caracteres extraños al pulsar BSet en la simulación
call Retardo_1s
call Incrementar_Segundos
-
Muchísimas gracias Pablo,
estás en lo correcto, tras una revisión
le puse un salto si el flag estaba activado en la función Mostrar Segundos para que se saltase la visualización y evitar el parpadeo:
Mostrar_Segundos
Posicionar_Digito Posicion_Decenas_Segundos
call BIN_a_BCD
btfss Flag_Set,1 <-------- Se salta y evita mostrar el parpadeo en los segundos
call LCD_Byte
Este es el nuevo código con algunos fallos corregidos
por si alguien le interesa, actualmente es un reloj básico con
botones de SET, HOUR, MIN y presentación mediante LCD.
Ahora a seguir con el resto de la programación.
Un saludo.
:o
; *************************************************
; Radio despertador con microcontrolador
;
; *************************************************
LIST P=16F84A ; Le decimos el tipo de procesador a utilizar
INCLUDE <P16F84A.INC> ; Include del pic16f84A
; Configuramos proteccion de codigo a off, perro guardian a off, power reset a on, y cristal on.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;-------------------------------------------------------------------------------------------
; Registros donde guardar datos.
; Comienzan a guardarse en la posición 0x0C, la primera de la RAM disponible para el usuario
;-------------------------------------------------------------------------------------------
CBLOCK 0x0C
Unidades_Seg, Decenas_Seg
Unidades_Min, Decenas_Min
Unidades_Hora, Decenas_Hora
Digito, cmh, Flag_Boton
Contador
Segundos
R1L
R1M
Minutos
R1H
Horas
Flag_Set
Flag_Alarm
Flag_Horas
Guarda_W
Guarda_STATUS
ENDC
; Definimos las posiciones de las segundos, minutos y horas en el Display empezando por la izquierda
; Así se visualiza la hora en el display en la segunda línea (línea inferior) " 00:00:00 "
Posicion_Unidades_Segundos equ d'11'
Posicion_Decenas_Segundos equ d'10'
Posicion_Separador_Segundos equ d'9'
Posicion_Unidades_Minutos equ d'8'
Posicion_Decenas_Minutos equ d'7'
Posicion_Separador_Minutos equ d'6'
Posicion_Unidades_Hora equ d'5'
Posicion_Decenas_Hora equ d'4'
#Define BSet PORTB,0
#Define BHour PORTB,1
#Define BMin PORTB,2
#Define BAlarm PORTB,3
;-----------------------------------------------------------
; Zona de codigos
;-----------------------------------------------------------
;***********************************************************
; MACROS
;***********************************************************
;-------------------------------------
; Posiciona un dígito en la posición
; indicada en Posicion en la línea 2
; (Línea inferior)
;-------------------------------------
Posicionar_Digito MACRO Posicion
movlw Posicion ; La posición del dígito
call LCD_PosicionLinea2 ; Nos desplazamos a esa posicion en la linea2
ENDM
;-----------------------------------------
; Cambia los dígitos de segundos y minutos
; Si Digito llega a 60 llama a la función
; pasada como segundo parámetro.
;------------------------------------------
Cambiar_Digito_Minutos MACRO Digito, Funcion
incf Digito,F
; Minutos llegan a 60
movlw d'60'
subwf Digito,W ; Si la resta es cero, el flag Z se pone a 1
btfsc STATUS, Z ; Si la resta fue cero, se salta la siguiente instrucción
call Funcion
ENDM
;-----------------------------------------
; Cambia las Horas
; Si Digito llega a 24 llama a la función
; pasada como segundo parámetro.
;-----------------------------------------
Cambiar_Digito_Horas MACRO Digito, Funcion
incf Digito, F
; Horas llegan a 24
movlw d'24'
subwf Digito,W ; Si la resta es cero, el flag Z se pone a 1
btfsc STATUS, Z ; Si la resta fue cero, se salta la siguiente instrucción
call Funcion
ENDM
org 0
goto Inicio
org 4
goto BotonSet
;***********************************************************
; INICIO DEL PROGRAMA
;************************************************************
Inicio
;-----------------------------------------
; Inicializamos las variables
;-----------------------------------------
;Inicializar variables
clrf Segundos
clrf Minutos
clrf Horas
clrf Flag_Set
;-------------------------------------------
; Configuramos display, puertos, etc
;-------------------------------------------
call LCD_Inicializa
bsf STATUS,RP0 ; Acceso al banco 1 (Para configurar los puertos)
clrf PORTA ; Configuramos el PORTA como salida
movlw b'00001111' ; El nibble bajo se configuran como entradas para los pulsadores
movwf PORTB ; el alto como salidas para el LCD
bsf BMin
bcf OPTION_REG, NOT_RBPU ; Activamos las resistencias PULL-UP del puerto B
bcf OPTION_REG, INTEDG ; Activamos cuando sube el pulsador (Flanco de bajada)
bcf STATUS,RP0 ; Volvemos al banco 0
movlw b'10010000'
movwf INTCON
;---------------------------------------
Principal
;---------------------------------------
call LCD_Linea1
movlw Mensaje_Radio ; Visualiza "Radio" en la linea1
call LCD_Mensaje
call Retardo_1s
call LCD_Linea2
movlw Mensaje_Despertador ; Visualiza "Despertador" en la linea2
call LCD_Mensaje
call Retardo_1s
call LCD_Borra
call LCD_Linea1
movlw Mensaje_V01 ; Visualiza la version
call LCD_Mensaje
call Retardo_1s
call LCD_Linea2
movlw Mensaje_Autor ; Visualiza el autor
call LCD_Mensaje
;------------------------------------------------
; Despues de 1 segundo borramos la pantalla
;------------------------------------------------
call Retardo_1s
call LCD_Borra
;------------------------------------------------
; Frase final del mensaje de inicio
;------------------------------------------------
; call LCD_Linea1
; movlw Mensaje_Foros
; call LCD_MensajeMovimiento
; call Retardo_200ms
;-------------------------------------
; Mostramos la hora
;-------------------------------------
call LCD_Borra
call LCD_Linea2
call Mostrar_Hora
Inicio_Cuenta
;-------------------------
; Aumenta los segundos
;-------------------------
Mostrar_Segundos
Posicionar_Digito Posicion_Decenas_Segundos
call BIN_a_BCD
btfss Flag_Set,1
call LCD_Byte
Salto_Retardo_1s
Posicionar_Digito Posicion_Decenas_Segundos
movfw Segundos
call BIN_a_BCD
call LCD_Byte
btfss Flag_Set,1;
call Retardo_1s
call Incrementar_Segundos
Mostrar_Minutos
Posicionar_Digito Posicion_Decenas_Minutos
movfw Minutos ; 00100000b 32d
call BIN_a_BCD ; 00110010bcd 32d
call LCD_Byte
Boton_Minutos
btfsc BMin
goto Mostrar_Horas
call Retardo_200ms
call Incrementar_Minutos_Boton
goto Salto_Retardo_1s
Mostrar_Horas
Posicionar_Digito Posicion_Decenas_Hora
movfw Horas
call BIN_a_BCD
call LCD_Byte
Boton_Horas
btfsc BHour
goto Inicio_Cuenta
call Retardo_200ms
call Incrementar_Horas_Boton
goto Salto_Retardo_1s
;----------------------------------------------
; Gestión del botón Set
;
; Si Flag_Set está puesto a 1 lo ponemos a cero
; Si Flag_Set está puesto a 0 lo ponemos a 1
;----------------------------------------------
BotonSet
movwf Guarda_W
swapf STATUS,W
movwf Guarda_STATUS
bcf STATUS, RP0
btfss Flag_Set,1 ; Comprobamos si está encendido, si lo está salta a Apagar
goto Encender
Apagar
bcf Flag_Set, 1
movlw d'0'
call LCD_PosicionLinea1
movlw ClearLine1
call LCD_Mensaje
call Resetear_Segundos
goto PulsadorLibre
Encender
call Resetear_Segundos
bsf Flag_Set, 1
movlw d'0'
call LCD_Linea1
movlw Set_Time ; Visualiza "Radio" en la linea1
call LCD_Mensaje
PulsadorLibre
call Pitido
btfss BSet
goto PulsadorLibre
swapf Guarda_STATUS, W
movwf STATUS
swapf Guarda_W,F
swapf Guarda_W,W
bcf INTCON, INTF
retfie
;--------------------------------
; Esta rutina emite un pitido
; corto.
;--------------------------------
Pitido
movlw 0x5
movwf Contador
Lazo
decfsz Contador, F
goto Lazo
call Retardo_1ms
bsf PORTA,3
call Retardo_1ms
bcf PORTA,3
return
;----------------------------------------
; Visualizacion de la hora 00:00:00
;----------------------------------------
Mostrar_Hora
movlw Hora
call LCD_Mensaje
return
Incrementar_Segundos
btfss Flag_Set,1
Cambiar_Digito_Minutos Segundos, Incrementar_Minutos
return
Resetear_Segundos
clrf Segundos ; Segundos a cero
return
Incrementar_Minutos
call Resetear_Segundos
Cambiar_Digito_Minutos Minutos, Incrementar_Horas
return
Incrementar_Minutos_Boton
btfss Flag_Set,1
return
Cambiar_Digito_Minutos Minutos, Resetear_Minutos
return
Resetear_Minutos
clrf Minutos
return
Incrementar_Horas
call Resetear_Minutos
Cambiar_Digito_Horas Horas, Resetear_Horas
return
Incrementar_Horas_Boton
btfss Flag_Set,1
return
Cambiar_Digito_Horas Horas, Resetear_Horas_Boton
return
Resetear_Horas
btfsc BHour
call Resetear_Minutos
clrf Horas
return
Resetear_Horas_Boton
clrf Horas
return
;----------------------------------------
; Mensajes
;----------------------------------------
Mensajes
addwf PCL,F
Mensaje_Radio
DT "Radio",0x00
Mensaje_Despertador
DT "Despertador",0x00
Mensaje_V01
DT "V-0.0.1",0x00
Mensaje_Autor
DT "por David Yanes",0x00
Hora
DT " 00:00:00 ", 0x00
Alarma
DT "AL",0x00
Set_Time
DT "SET THE TIME:", 0x00
ClearLine1
DT " ",0x00
INCLUDE "LCD_4BIT.INC"
INCLUDE "LCD_MENS.INC"
INCLUDE "RETARDOS.INC"
INCLUDE "BIN_BCD.INC"
INCLUDE "TESTCASE.INC"
END