Autor Tema: Contador 0 al 99 con 2 Displays 7 Segmentos  (Leído 19485 veces)

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

Desconectado Enner

  • PIC10
  • *
  • Mensajes: 47
Contador 0 al 99 con 2 Displays 7 Segmentos
« en: 03 de Noviembre de 2011, 13:36:48 »
Hola,


Haber si me puedean ayudar, me gustaria saber el fallo que hay en la multiplexión en el código ya que no consigo visualizar en el display de las unidades.

'2 Displays 7 Segmentos  Anodo Comun/ Unidades (Transistor PuertoA.2) y las Decenas  (Transistor PuertoA.3)

Gracias

____Código ___________________________________________________________________________ ____________

Device = 16F628A
Dim Contador As Byte
Dim Digito As Byte
Dim OutDisplay As Byte
Dim I As Byte
Symbol Unidades = PORTA.2   'Salida
Symbol Decenas = PORTA.3    'Salida
Symbol BMode = PORTA.0       'Entrada
Symbol BUp = PORTA.1           'Entrada

'Los 7 segmentos estan en Puerto B = A-RB0/B-RB1..G-RB6 (Anodo Comun)

CMCON= 7                                        'E/S Digitales
TRISA = %00000011                         '0=Salidas/1=Entradas
TRISB=0                                          'Puerto B como salidas                             

Contador=0                                      'Variable contado a "0"

 Ini:
   'Button BUp,0,255,0,I,0, Loop
   Contador=Contador+1
   DelayMS 3000
   GoSub Visualizar
GoTo Ini

Visualizar:
     Digito =Contador Dig 1
     OutDisplay = LookUp Digito ,[64,121,36,48,25,18,3,120,0,24] 'Anodo Comun
     PORTB=OutDisplay
     Decenas=0
     Unidades=1
     DelayMS 5

    Digito  =Contador Dig 0
    OutDisplay = LookUp Digito ,[64,121,36,48,25,18,3,120,0,24] 'Anodo Comun
    Unidades=0
    PORTB=OutDisplay
    Decenas=1
    DelayMS 5
 Return
 End

___________________________________________________________________________

Desconectado Noelillo

  • PIC12
  • **
  • Mensajes: 94
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #1 en: 04 de Noviembre de 2011, 05:42:29 »
Hola creo que el problema que la subrutina Visualiza solo pasa una vez, retorna a ini y espera 3 segundos. Como en la subrutina visualiza  lo hace muy rapido y cuando sale/returna a ini deja encendido decenas (1) y apagado unidades (0).
para darte cuenta aumenta el valos de los delayMS 5 pasalos a 500 ó a 1000 y creo que veras las unidades y pasado el tiempo (500 ó 1000) veras las decenas.

Una solucion puede ser esta, necesitar pasar o repetir varias veces la subrutina visualiza, prueba esto:

  Visualizar:
 for n=0 to 100 ' veces que repite
     Digito =Contador Dig 1
     OutDisplay = LookUp Digito ,[64,121,36,48,25,18,3,120,0,24] 'Anodo Comun
     PORTB=OutDisplay
     Decenas=0
     Unidades=1
     DelayMS 5

    Digito  =Contador Dig 0
    OutDisplay = LookUp Digito ,[64,121,36,48,25,18,3,120,0,24] 'Anodo Comun
    Unidades=0
    PORTB=OutDisplay
    Decenas=1
    DelayMS 5
next n
 Return
 End

no pongas el retardo de 3 segundos...en ini:

pd: yo programa en proton basic. Espero haberte ayudado :( :(

Desconectado Enner

  • PIC10
  • *
  • Mensajes: 47
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #2 en: 04 de Noviembre de 2011, 16:33:22 »
Gracias por tu aporte, por fin he podido visualizar la unidades aumentando el retardo, Pero!!!
Si hago un conteo normal sin el bucle For-Next  funciona más o menos bien (las decenas hacen un parpadeo muy rápido un poco molesto)  las unidades quedan fijas.
A la hora de conectar el pulsador las unidades vuelven a no visualizarse se visualizan momentáneamente y desaparecen no quedan fijas.
Si pongo el bucle For-Next Con el Pulsador no contea bien y aparte hace unas intermitencias tanto las unidades como las decenas y estas más o menos quedan fijas pero molesta n a los ojos.
En todo momento he estado modificando tiempos etc... pero no logro que valla del todo bien.
Quitar los 3 seg del bucle ha sido genial.

En la linea del comando Button hay un error, Sustituir Loop por Ini. (Button BUp,0,255,0,I,0, Ini)

Este contador lo simulo demomento con Isis  no en una Protoboard.

Haber que más puedo hacer.

Saludos y gracias...




« Última modificación: 04 de Noviembre de 2011, 16:39:13 por Enner »

Desconectado Noelillo

  • PIC12
  • **
  • Mensajes: 94
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #3 en: 05 de Noviembre de 2011, 10:44:15 »
Prueba con las interrupciones. Cada vez que pulses generas la interrupcion y aumentas el contador. :( :-/

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #4 en: 05 de Noviembre de 2011, 21:06:09 »
Hola!

A ver si esto te sirve?

Saludos!
Mario

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #5 en: 12 de Noviembre de 2011, 22:48:48 »
Dejo un código a ver si te sirve.

Código: [Seleccionar]
'***********************************
'Control de 3 digitos de 7Segmentos*
'Control7Segmentos_01, by dogflu66**
'11/11, Basic PSI v6.91*************
'Programa para simulación***********
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Ignora los valores de Waitms
'Define SIMULATION_WAITMS_VALUE = 1
'Configura registro
AllDigital  'Pin I/O Digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Reloj interno a 8Mhz
TRISA = %00000010
TRISB = %00000000
'Inicializa Pin
PORTA = %00000000
PORTB = %00000000
'Inicaliza interrupciones cada 1mSeg. mediante TIMER1
T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1
T1CON.T1CKPS0 = 0  'Factor del preescales del timer1
T1CON.T1CKPS1 = 0  'Factor del preescales del timer1
TMR1H = 0xf8  'Carga registro contador para desborde cada 1mSeg
TMR1L = 0x30  'Carga registro contador para desborde cada 1mSeg
T1CON.TMR1ON = 1  'Activa TMR1, comienza a incrementarce
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
INTCON.PEIE = 1  'Bit de activación interrupciones de perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
'Variables
Dim contador As Word
Dim digito As Byte
Dim mascara0 As Byte
Dim mascara1 As Byte
Dim mascara2 As Byte
'Variables de las bases de tiempos
Dim tmr1ms As Byte
Dim tmr2ms As Byte
Dim tmr3ms As Byte
Dim tmr1ms_tp As Byte
Dim tmr2ms_tp As Byte
Dim tmr3ms_tp As Byte
'Variable teclado
Dim tecla As Bit
'Asignación de valores
contador = 321
tmr1ms_tp = 0  '200 valor real
tmr2ms_tp = 0  '10 valor real
tmr3ms_tp = 0  'No se usa
'Rutina principal
main:
digito = nmrbcd(contador, 2)  'Asigna centenas
mascara0 = nmr7seg(digito)  'Asigna mascara centenas
digito = nmrbcd(contador, 1)  'Asigna decenas
mascara1 = nmr7seg(digito)  'Asigna mascara decenas
digito = nmrbcd(contador, 0)  'Asigna unicades
mascara2 = nmr7seg(digito)  'Asigna mascara unidades
'Incrementa si detecta tecla
If tecla = 1 And tmr1ms >= tmr1ms_tp Then  'Control tecla
contador = contador + 1  'Incrementa numero a enviar al 3LCD7Seg.
tecla = 0  'Tecla liberada
tmr1ms = 0  'Reset base de tiempos de la tecla
Endif
Goto main
End                                              
'Codigo BCD, decimal codificado a binario.
'Extrae el digito indicado, hasta 4 digitos
'numero = Cifra a descomponer
'digito = Digito a extraer de 0 a 3
Function nmrbcd(numero As Word, digito As Byte) As Word
Dim n As Byte
For n = 1 To digito
numero = numero / 10
Next n
nmrbcd = numero Mod 10
End Function                                      
'Numero a mascara display 7 segmentos
Function nmr7seg(numero As Byte) As Byte
nmr7seg = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), numero
End Function                                      
'Rutina de control 3 display 7 Segmentos.
Proc lcd7seg(digito2 As Byte, digito1 As Byte, digito0 As Byte)
Dim flag As Byte
If flag = 0 Then  'Control digito unidades
RA.6 = 0  'Apaga digito
PORTB = digito2  'prepara mascara
RA.0 = 1  'Enciende digito
Endif
If flag = 1 Then  'Control digito decenas
RA.0 = 0  'Apaga digito
PORTB = digito1  'prepara mascara
RA.7 = 1  'Enciende digito
Endif
If flag = 2 Then  'Control digito centenas
RA.7 = 0  'Apaga digito
PORTB = digito0  'prepara mascara
RA.6 = 1  'Enciende digito
Endif
flag = flag + 1  'Proximo digito
If flag > 2 Then flag = 0  'Reinicia digito
End Proc                                          
'Interrupciones
On Interrupt  'Interrupciones
Save System  'Guarda valores del sistema
If PIR1.TMR1IF = 1 Then  'Interrupcion del timer1 es activa
TMR1H = 0xf8  'Recarga el contador del timer1, 1mSeg., high byte
TMR1L = 0x30  'Recarga el contador del timer1, 1mSeg., Low byte
If tmr1ms < tmr1ms_tp Then tmr1ms = tmr1ms + 1  'Control base tiempos
If tmr2ms < tmr2ms_tp Then tmr2ms = tmr2ms + 1  'Control base tiempos
If tmr3ms < tmr3ms_tp Then tmr3ms = tmr3ms + 1  'Control base tiempos
If RA1 = 0 And tecla = 0 Then tecla = 1  'Detecta tecla pulsada
'_____Control digitos
If tmr2ms >= tmr2ms_tp Then  'Control digitos, tiempo a On
Call lcd7seg(mascara2, mascara1, mascara0)  'Control display
tmr2ms = 0  'Reincia base de tiempos 2
Endif
'_____
PIR1.TMR1IF = 0  'Borra flag salto TMR1
Endif
Resume  'Retorna al curso normal del programa    

« Última modificación: 12 de Noviembre de 2011, 22:53:02 por dogflu66 »
Saludos desde Granada, España.

Desconectado Enner

  • PIC10
  • *
  • Mensajes: 47
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #6 en: 13 de Noviembre de 2011, 06:49:07 »
Hola a todos,

Siento por haberos abandonado pero tuve un viaje inesperado y tuve que irme.
He visto la ayuda que me habéis ofrecido y os doy las gracias por ello en todos los sentidos.

Gracias dogflu66 por tu trabajo pero tengo que hacer muchas modificaciones en tu código para que se ha compatible.

En un principio quería haber hecho el diseño lo más sencillo posible con la mínima cantidad de componentes posible.
Es decir Micro + Dos display, Resistencias, Transistores para la multiplexión, Pulsadores y la fuente de alimentación y poco más.

Al haber tenido poco éxito con el programa, opte por el diseño de Mario ayer lo monte y no me funciono y no sé porque.
Una vez montado en la protoboard con los  displays a  "0" no contaba ni me hacía nada pulsaba + y -  nada de nada.

Una vez requetepasado el circuito y todos el cableado de nuevo todo estaba correcto y pase hacer los siguiente, cogí el Micro y lo monte en la placa de pruebas.
y vi que la secuencia de los puertos pulsando los pulsadores + y - lo hacía correctamente.
Más tarde cogí el 4511 y lo puse con un 4510 contaba perfectamente, el decoder funcionaba bien.

De nuevo puse el Micro en la protoboard conectando las salidas  con las entradas del 4511 y no funcionaba, hoy estoy en el mismo lugar. Todo funciona por
separado pero junto no, cambie los tiempos por si los latch del 4511 no respondían a la velocidad del micro por ser tecnología hcmos etc... Pero nada de nada.
Las resistencias pull-up en sus sitios nada de nada.

Saludos.


Desconectado Enner

  • PIC10
  • *
  • Mensajes: 47
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #7 en: 15 de Noviembre de 2011, 16:36:44 »
Hola,
Aquí os dejo el código fuente del contador he utilizado los mínimos componentes y pines posibles.
El tiempo del multiplexado se puede cambiar si molestase, pero con cuido, (aquí está la clave...).
El Código es sencillo y claro, explicado paso a paso, para aquellos también que se inician.
No he utilizado el TMR, aunque a lo mejor merecía la pena por el tema del pulsador y los tiempos.

Espero que os sirva!!   Saludos...

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
'***************************************************
'*  Name    : CONTADOR0Al99.BAS                                      *
'*  Author  : Enner                                                              *
'*  Notice   : Copyright (c) 2011                                           *
'*              : All Rights Reserved                                          *
'*  Date     : 15/11/2011                                                      *
'*  Version : 1.0                                                                  *
'*  Notes   : Contador del 0 al 99 Multiplexado                       *
'*          : Componentes:  1 Pic 16F628A o el PIC 16F84A       *
'*          :               1 Display 2/7 Segmentos Anodo-Com.     *
'*          :               4 Resistencias 10K  (Pull-Up PortB)          *
'*          :               7 Resistencias 220 ohms                         *
'*          :               3      "       4K7                                       *
'*          :               1 Pulsador                                             *
'*          :               1 74LS47 Decoder BCD                          *
'*          :               2 PNP Transistores (2N3906)                   *
'***************************************************
Device = 16F628A                'Selecciono El Pic De Trabajo

Dim Numero As Byte            'Declaro la Variable "Numero", Saldrá por los Displays
Dim I As Byte                      'Declaro "     "     "I", Contador de los Numeros del 0 al 100
All_Digital= True                  'Todos las I/O Trabajan como 0 y 1
CMCON= 7                          'Apago los Comparadores
Symbol BUp = PORTA.2        'Asigno el Pulsador a la entrada PuetA.2
TRISA = %00000100            'Asigno las I/O al Pueto A [0=Salidas/1=Entradas]
TRISB=0                             'Todo el Puerto B Como Salida
PORTB=0                            'Apago todo el puertoB

I=0                                    'Pongo la variable "I" a 0

NoPulsado:
If BUp=0 Then                    'Si Pulso
   I=I+1                             'Incremento la Variable I
   If I=100 Then I=0           'Si la Variable I es Mayor, la I pasa a 0
   DelayMS 5000                 'Retardo en la pulsación
   GoSub Ini                       'Salto a la etiqueta "Ini". [No Pulso]
End If                  
GoSub Ini                          'Si no se pulsa va saltando a la etiqueta "Ini"
GoTo NoPulsado                 'Salta a la Etiqueta "NoPulsado"
                        
Ini:                                  'Etiqueta "Ini"
 Numero= I Dig 0             'Calcula las Decenas
 PORTB=Numero              'Saco el Número por el puertoB al Decoder BCD
 PORTA=2                        'Activo el PuertoA.0 y desactivo PuertoA.1
 DelayMS 5000                 'Retardo Multiplexionado
 
 Numero=I Dig 1             'Calcula las Unidades
 PORTB=Numero             'Saco el Número por el puertoB al Decoder BCD
 PORTA=1                       'Desactivo el PuertoA.0 y Activo PuertoA.1
 DelayMS 5000                'Retardo Multiplexionado
Return                            'Retorna a la Etiqueta
End                                'Fin del Programa

/////////////////////////////////////////////////////////////////////////
//////////////////////// FIN ///////////////////////////////////////////
« Última modificación: 15 de Noviembre de 2011, 16:47:31 por Enner »

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #8 en: 15 de Noviembre de 2011, 21:57:46 »
Si lo has hecho funcionar, ¿cuál era el problema?

¿El protoboard?

Saludos!
Mario

Desconectado Enner

  • PIC10
  • *
  • Mensajes: 47
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #9 en: 16 de Noviembre de 2011, 15:22:17 »
Hola

Pues nada Mario, al final tuve que deshacer el circuito y replantearme de nuevo el hardware y la programación del mismo.
No me resignaba a que no fuese una cosa tan sencilla. La única cosa realmente valiosa es la intuición (Albert Einstein).!!

También felicitarte por el buen trabajo que haces en la Web Neoteo.

Saludos.

Desconectado Noelillo

  • PIC12
  • **
  • Mensajes: 94
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #10 en: 16 de Noviembre de 2011, 16:42:54 »
Enner, por que no haces una tabla que pase los valores de Numero a 7seg... :shock:
y te ahorras el 7447.

Paso_a_7Segmento:
   
  select case numero
       case 0
          portb =$3F
         
       case 1
          portb =$06
         
       case 2
          portb =$5B
         
       case 3
          portb =$4F
         
       case 4
          portb =$66
         
       case 5
          portb =$6D
         
       case 6
          portb =$7D
         
       case 7
          portb =$07
         
       case 8
          portb =$7F
         
       case 9
          portb =$67
       
                     
     endselect 

 :-/ :-/ :-/
       

Desconectado Enner

  • PIC10
  • *
  • Mensajes: 47
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #11 en: 16 de Noviembre de 2011, 17:02:33 »
Hola,

En la programación todo vale y hay muchas maneras de llegar al mismo resultado, pero en la  práctica hay que ahorrar código para que el programa
sea lo menos voluminoso posible y se ejecute los más eficiente posible por la máquina con los minimos errores posibles en la depuración (micro...)  sea claro y conciso.
Si hay comandos que hacen dicho trabajo aprovéchalos te ahorraras código y a la hora de repasar el programa lo veras más claro.

Si te fijas en el código de arriba, Puedes ahorrarte código utilizando el Comando [LooKUp]:

Declara OutDisplay / Digito como Byte (Puedes cambiar el nombre de la variable)

OutDisplay=  El Número selecionado por el comando que saldrá por el Display 7 Seg.
Digito        = Contador para el comando "Lookup" 0=64, 1=121.....9=24 y asi sucesibamente hasta el número 9
 
OutDisplay = LookUp Digito ,[64,121,36,48,25,18,3,120,0,24]

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #12 en: 17 de Noviembre de 2011, 08:09:51 »
Aunque no uso el mismo lenguaje Basic, es muy parecida la solución, en mi caso utilizo la siguiente función, que además de quedar muy transportable el código, queda un código mucho más simple y corto.

'Numero a mascara display 7 segmentos
Function nmr7seg(numero As Byte) As Byte
   nmr7seg = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), numero
End Function
Saludos desde Granada, España.

Desconectado Mushito

  • PIC10
  • *
  • Mensajes: 31
Re: Contador 0 al 99 con 2 Displays 7 Segmentos
« Respuesta #13 en: 27 de Marzo de 2013, 17:34:08 »
Enner:
Intente compilar con proton y me salio los siguientes errores,
¿como los soluciono?