Autor Tema: Probar archivo de radio-despertador con PIC 16F84  (Leído 3361 veces)

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

Desconectado Thevenin

  • PIC10
  • *
  • Mensajes: 29
Probar archivo de radio-despertador con PIC 16F84
« 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.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Probar archivo de radio-despertador con PIC 16F84
« Respuesta #1 en: 19 de Julio de 2008, 02:53:48 »
creo que tu problema está en la línea donde colocas:
 
Código: [Seleccionar]
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

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

Desconectado Thevenin

  • PIC10
  • *
  • Mensajes: 29
Re: Probar archivo de radio-despertador con PIC 16F84
« Respuesta #2 en: 20 de Julio de 2008, 10:24:26 »
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

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