TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Azteka en 29 de Febrero de 2024, 04:05:01
-
Hola a todos. Solicito su ayuda, por favor, con el siguiente problema. Estoy desplegando el contenido de las variables "Hour" y "Minute" en displays INDIVIDUALES de 7 segmentos . Divido ambas variables en dos variables cada una, de manera que tengo dos dígitos para la hora, a los que llamo "HRS_DER" y "HRS_IZQ"; también la variable de los minutos la separo en dos dígitos a los que he llamado "MIN_DER" y "MIN_IZQ". Cada una de estas últimas variables las envío a un display individual de 7 segmentos. Hasta ahí todo funciona bien, pero ahora deseo reducir los cuatro display individuales de 7 segmentos a DOS DISPLAYS DOBLES DE 7 SEGMENTOS, un display doble para la hora y el otro para los minutos. El problema es que las instrucciones que me sirven para desplegar cada dígito por separado en un display individual no funcionan para DISPLAYS DOBLES. Ya he probado las ideas que se me han ocurrido, pero no logro hacerlo. Por favor, ¿alguien puede decirme cuales son las instrucciones correctas? Anexo el código en PBP que funciona para cuatro displays individuales. De antemano, mil gracias.
CÓDIGO
; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F628A, DISPLAYS DE 7 SEGMENTOS Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS
CMCON=7
define OSC 4
Symbol Hrs_button = PORTA.0 ; BOTON DE AJUSTE PARA HORAS
Symbol Mins_button = PORTA.1 ; BOTO0N DE AJUSTE PARA MINUTOS
Ticks VAR byte ; 61 ticks = 1 sec
Hour VAR byte
Minute VAR byte
Second VAR byte
Disp VAR byte ; Disp = 1 to ACTULIZA DISPLAYS
Delay VAR byte
TRISB = 0 ; PORTB is SALIDA
TRISA = 3 ; RA0,RA1 SON ENTRADAS
;VARIABLES A DESPLEGAR
MIN_DER VAR BYTE ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO DERECHO
MIN_IZQ VAR BYTE ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO IZQUIERDO
HRS_DER VAR BYTE ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO DERECHO
HRS_IZQ VAR BYTE ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO IZQUIERDO
; INICIALIZAR VARIABLES
Hour = 0
Minute = 0
Second = 0
Ticks = 0
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0
HRS_IZQ = 0
OPTION_REG = $05 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR
INTCON = $A0
;INICIO DEL PROGRAMA
PROG:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
IF Hrs_button = 0 THEN
Hour = Hour + 1
IF Hour = 24 THEN Hour = 0
Gosub Antirrebote
ENDIF
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
IF Mins_button = 0 THEN
Minute = Minute + 1
IF Minute = 60 THEN Minute = 0
Gosub Antirrebote
ENDIF
;RUTINA PARA MOSTRAR VALORES DE H:M:S
IF Disp = 1 THEN
MIN_DER = Minute DIG 0
MIN_IZQ = Minute DIG 1
HRS_DER = Hour DIG 0
HRS_IZQ = Hour DIG 1
PORTB=224+MIN_DER
PAUSE 50
PORTB=208+MIN_izq
PAUSE 50
PORTB=176+HRS_DER
PAUSE 50
PORTB=112+HRS_IZQ
PAUSE 50
Disp = 0
ENDIF
GOTO PROG
;RUTINA ANTIRREBOTE
Antirrebote:
FOR Delay = 1 To 200
Pause 1
NEXT Delay
Disp = 1
RETURN
;RUTINA PARA EJECUCION DE UN SEGUNDO
DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
Minute = Minute + 1
IF Minute = 60 THEN
Minute = 0
Hour = Hour + 1
IF Hour = 24 THEN
Hour = 0
ENDIF
ENDIF
ENDIF
Disp = 1
; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0
Resume
ENABLE
END
END
-
Que tal Azteka,
Podrías mostrar un esquemático de tu circuito con los displays individuales y luego uno con los displays dobles que quieres usar.
También podrías decirnos que tipos de displays estas usando, tanto los individuales como los dobles (ánodo común o cátodo común).
elreypic.
-
Que tal Azteka,
Podrías mostrar un esquemático de tu circuito con los displays individuales y luego uno con los displays dobles que quieres usar.
También podrías decirnos que tipos de displays estas usando, tanto los individuales como los dobles (ánodo común o cátodo común).
elreypic.
Hola, elreypic2, gracias por contestar. En ambos casos estoy empleando displays de 7 segmentos de Ánodo común. Probé al principio con el mismo programa que sí funciona con displays individuales, luego intenté algunos cambios que se ocurrieron, pero nada. Te anexo los esquemáticos de ambos. Gracias por tu ayuda. Saludos.
-
demo proteus con proton
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings
Device = 16F628A
Config FOSC_HS, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF
;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
Declare Xtal = 4
Declare Optimiser_Level = 3
Declare Bootloader off
Declare Float_Display_Type = Fast
Declare Dead_Code_Remove = 1 ' Remove dead code
Declare Watchdog = Off
Declare Create_Coff On
'Declare Reminders Off
'Declare Hints Off
'Declare Warnings Off
'Declare Auto_Variable_Bank_Cross = On
; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F628A, DISPLAYS DE 7 SEGMENTOS Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS
CMCON=7
Symbol Hrs_button = PORTA.0 ; BOTON DE AJUSTE PARA HORAS
Symbol Mins_button = PORTA.1 ; BOTO0N DE AJUSTE PARA MINUTOS
Dim Ticks As Byte ; 61 ticks = 1 sec
Dim Hour As Byte
Dim Minute As Byte
Dim Second As Byte
Dim Disp As Byte ; Disp = 1 to ACTULIZA DISPLAYS
PORTB= 0
TRISB = 0 ; PORTB is SALIDA
TRISA = 3 ; RA0,RA1 SON ENTRADAS
;VARIABLES A DESPLEGAR
Dim hab As Bit
Dim MIN_DER As Byte ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO DERECHO
Dim MIN_IZQ As Byte ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO IZQUIERDO
Dim HRS_DER As Byte ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO DERECHO
Dim HRS_IZQ As Byte ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO IZQUIERDO
Dim timer As Word
; INICIALIZAR VARIABLES
Hour = 0
Minute = 0
Second = 0
Ticks = 0
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0
HRS_IZQ = 0
OPTION_REG = 1 ; prescaler = 2
On_Hardware_Interrupt GoTo Isr ; IR A RUTINA ISR
INTCON = $A0
;INICIO DEL PROGRAMA
Do
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
If Hrs_button = 0 And timer = 0 Then
timer = 500
Inc Hour
If Hour = 24 Then Hour = 0
EndIf
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
If Mins_button = 0 And timer = 0 Then
timer = 500
Inc Minute
If Minute = 60 Then Minute = 0
EndIf
If hab = 1 Then
PORTB=$0f
Select Case Disp
Case 0
MIN_DER = Dig Minute,0
PORTB=MIN_DER
PORTB=PORTB|$80
Case 1
MIN_IZQ = Dig Minute,1
PORTB=MIN_IZQ
PORTB=PORTB|$40
Case 2
HRS_DER = Dig Hour,0
PORTB=HRS_DER
PORTB=PORTB|$20
Case 3
HRS_IZQ = Dig Hour,1
PORTB=HRS_IZQ
PORTB=PORTB|$10
End Select
Inc Disp
Disp = Disp & 3
hab = 0
EndIf
Loop
;RUTINA PARA EJECUCION DE UN SEGUNDO
Isr:
Context Save
If hab = 0 Then hab = 1
If timer>0 Then Dec timer
Inc Ticks
If Ticks < 61 Then NoUpdate
;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Inc Second
If Second = 60 Then
Second = 0
Inc Minute
If Minute = 60 Then
Minute = 0
Inc Hour
If Hour = 24 Then
Hour = 0
EndIf
EndIf
EndIf
; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0
Context Restore
End
-
Jiha, no entiendo tu mensaje.
-
El programa está funcionando modificado para proton basic y en reloj.zip está la simulación en proteus
-
Jiha, disculpa por tantas molestias pero, ¿podrías, por favor, enviarme la simulación en Proteus versión 8.7, o anterior? esa es la que tengo. Mil gracias. :oops: :oops: :oops:
-
No tengo esa version, adjunto la version en isis 7.8 que se puede cargar en las versiones 8 de proteus
-
Hola, Jiha. ¿O se podría una imagen del esquemático, por favor? Gracias.
-
esquematico