Autor Tema: Multiplezado de displays y Timer0  (Leído 2655 veces)

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

Desconectado lmtreser

  • PIC16
  • ***
  • Mensajes: 133
    • Automatismos Mar del Plata
Multiplezado de displays y Timer0
« en: 29 de Septiembre de 2008, 19:23:48 »
Hola, tengo un pequeño problema.

Estoy haciendo un contador al cual le ingreso datos con unos pulsadores y luego muestro en 4 displays de 7 segmentos en forma multiplexada.

Estoy tratando de realizar la visualización con la interrupcion del timer0. Los digitos los veo bien, pero no se entera cuando presiono los pulsadores de incremento de cuenta.

Cualquier consejo es bienvenido. Muchas gracias!

Código: FreeBasic
  1. Define CONF_WORD = 0x3f30
  2.  
  3. '-- CONFIGURO PUERTOS
  4. AllDigital                                              'Desactivo comparadores
  5. TRISA = %11100000                               'Configuro entradas y salidas PORTA
  6. TRISB = %00000000                               'Configuro entradas y salidas PORTB
  7.  
  8. '-- DECLARO VARIABLES
  9. Dim unidad_fin As Byte                  'Variables de limite
  10. Dim decena_fin As Byte
  11. Dim centena_fin As Byte
  12. Dim miles_fin As Byte
  13. Dim mascara As Byte
  14.  
  15. PORTA = %00000000                               'Limpio PORTA
  16. PORTB = %00000000                               'Limpio PORTB
  17. mascara = 0
  18. unidad_fin = 0
  19. decena_fin = 0
  20. centena_fin = 0
  21. miles_fin = 0
  22.  
  23. '-- INTERRUPCIONES POR TIMER0
  24. INTCON.T0IE = 1                                 'habilita la interrupción por Timer0
  25. INTCON.GIE = True                               'habilita todas las interrupciones
  26. OPTION_REG = %00000100
  27. TMR0 = 0
  28.  
  29. '--INCREMENTO UNIDADES
  30. prog_uno:
  31. If RA.6 = 1 Then
  32.         WaitMs 2
  33.         If RA.6 = 1 Then
  34.                         If unidad_fin = 9 Then
  35.                                 unidad_fin = 0         
  36.                                 Goto prog_uno
  37.                         Endif
  38.         unidad_fin = unidad_fin + 1
  39.         Goto prog_uno
  40.         Endif
  41. Endif
  42. If RA.7 = 1 Then
  43.         WaitMs 2
  44.         If RA.7 = 1 Then Goto prog_dos
  45. Endif
  46. Goto prog_uno
  47.  
  48. prog_dos:
  49.         WaitMs 2
  50.         If RA.6 = 1 Then
  51.                         If decena_fin = 9 Then
  52.                                 decena_fin = 0         
  53.                                 Goto prog_dos
  54.                         Endif
  55.         decena_fin = decena_fin + 1
  56.         Goto prog_dos
  57.         Endif
  58. WaitMs 2
  59. If RA.7 = 1 Then Goto prog_tres
  60. Goto prog_dos
  61.  
  62. prog_tres:
  63. End
  64.  
  65. '-- RUTINA DE VISUALIZACIÓN POR INTERRUPCIÓN
  66. On Interrupt
  67.  
  68. 'Muestro unidades
  69.         mascara = LookUp(0x7e, 0xc, 0xb6, 0x9e, 0xcc, 0xda, 0xfa, 0xe, 0xfe, 0xde), unidad_fin
  70.         PORTB = mascara
  71.         RA.0 = 1
  72.         WaitMs 5                                        'Experimentar con este valor.
  73.         RA.0 = 0
  74.  
  75. 'Muestro decenas
  76.         mascara = LookUp(0x7e, 0xc, 0xb6, 0x9e, 0xcc, 0xda, 0xfa, 0xe, 0xfe, 0xde), decena_fin
  77.         PORTB = mascara
  78.         RA.1 = 1
  79.         WaitMs 5                                        'Experimentar con este valor.
  80.         RA.1 = 0
  81.  
  82. 'Muestro centenas
  83.         mascara = LookUp(0x7e, 0xc, 0xb6, 0x9e, 0xcc, 0xda, 0xfa, 0xe, 0xfe, 0xde), centena_fin
  84.         PORTB = mascara
  85.         RA.2 = 1
  86.         WaitMs 5                                        'Experimentar con este valor.
  87.         RA.2 = 0
  88.  
  89. 'Muestro miles
  90.         mascara = LookUp(0x7e, 0xc, 0xb6, 0x9e, 0xcc, 0xda, 0xfa, 0xe, 0xfe, 0xde), miles_fin
  91.         PORTB = mascara
  92.         RA.3 = 1
  93.         WaitMs 5                                        'Experimentar con este valor.
  94.         RA.3 = 0
  95.  
  96. INTCON.T0IF = 0                                 'habilita nuevamente la interrupción
  97. Resume

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Multiplezado de displays y Timer0
« Respuesta #1 en: 04 de Octubre de 2008, 22:28:17 »
Te dejo un programa  básico para que trabajes sobre él, si lo ves conveniente.

Código: vb.net
  1. '---------- Solo simulacion, rectificado By COS
  2. Define CONF_WORD = 0x3ff2
  3. Define CLOCK_FREQUENCY = 8
  4. 'Define SIMULATION_WAITMS_VALUE = 1
  5. '**************** Pic16F84 ********************
  6. '**********************************************
  7. '-- DECLARO VARIABLES
  8. Dim mascara As Byte
  9. Dim digito As Byte
  10. Dim numero As Word
  11. Dim timer0 As Byte
  12. Dim timer1 As Byte
  13. Dim timer2 As Byte
  14. Dim timer0_tiempo As Byte
  15. Dim timer1_tiempo As Byte
  16. Dim timer2_tiempo As Byte
  17. Dim tecla1 As Byte
  18. Dim digito0 As Word
  19. Dim digito1 As Word
  20. Dim digito2 As Word
  21. Dim digito3 As Word
  22. Dim aux_digito As Word
  23. Dim indice As Byte
  24. '--Asiganacion de valores a variables
  25. mascara = 0
  26. digito = 0
  27. numero = 0
  28. tecla1 = 0
  29. timer0_tiempo = 1  '150 'Retarado entre pulsacion en mSeg. (valor real 150)
  30. timer1_tiempo = 1  'Libre
  31. timer2_tiempo = 10  'Libre
  32. numero = 4321
  33. '-- CONFIGURO PUERTOS
  34. AllDigital  'Desactivo comparadores
  35. TRISA = %10000  'Configuro entradas y salidas PORTA
  36. TRISB = %00000000  'Configuro entradas y salidas PORTB
  37. PORTA = %00000000  'Limpio PORTA
  38. PORTB = %00000000  'Limpio PORTB
  39. '-----Inicializacion de Interrupciones por TIMER0-----------------------------
  40. OPTION_REG.T0CS = 0  'selecciona reloj interno
  41. OPTION_REG.PSA = 0  'asigna el prescales al timer0
  42. OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
  43. OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
  44. OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
  45. INTCON.T0IF = 0  'borra el flag de desbordamiento del timer0
  46. TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS
  47. 'TMR0 = 250  'habilitar para simulacion
  48. Enable  'INTCON.GIE habilita las interrupciones globales
  49. INTCON.T0IE = 1  'INTCON.tmr0ie = 1  'habilita las interrupciones del timer0
  50. '----------------------------------------------------------------------------
  51. '------------------ Rutina del programa principal ---------------------------
  52. main:  'Rutina principal
  53.  
  54.         If tecla1 = 1 Then Gosub sub_tecla1  'Activa evento tecla
  55.  
  56. Goto main  'Impide que la rutina principal termine
  57. '----------------------------------------------------------------------------
  58. End                                              
  59.  
  60. '--Subrutinas generales
  61. sub_tecla1:  'Si se pulso la tecla
  62.         numero = numero + 1  'Incrementa el numero a mostrar
  63.         tecla1 = 0  'Deja la tecla libre
  64. Return                                            
  65.  
  66. '-- RUTINA DE VISUALIZACIÓN POR INTERRUPCIÓN y bases de tiempos
  67. On Interrupt  'Rutina interrupciones
  68.         TMR0 = 130  'cargo el registro del TMR0 para que desborde cada 1ms
  69.  
  70.         'Descompone el numero a mostrar en digitos
  71.         digito3 = numero / 1000  'calculo unidades de millar
  72.         aux_digito = numero - (digito3 * 1000)  '___calculo centenas
  73.         digito2 = aux_digito / 100  '_________________
  74.         digito1 = (aux_digito - (digito2 * 100)) / 10  'calculo decenas
  75.         digito0 = aux_digito - ((aux_digito / 10) * 10)  'calculo unidades
  76.  
  77.         'Selecciona el numero a mostrar
  78.         If digito = 0 Then indice = digito0
  79.         If digito = 1 Then indice = digito1
  80.         If digito = 2 Then indice = digito2
  81.         If digito = 3 Then indice = digito3
  82.         mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), indice
  83.  
  84.         'Apaga display y carga puerto (mascara)
  85.                 RA.1 = 0
  86.                 RA.2 = 0
  87.                 RA.3 = 0
  88.                 RA.0 = 0
  89.                 PORTB = mascara
  90.  
  91.         'Enciende digito
  92.         If digito = 0 Then  'Unidades
  93.                 RA.0 = 1
  94.         Endif
  95.         If digito = 1 Then  'Decenas
  96.                 RA.1 = 1
  97.         Endif
  98.         If digito = 2 Then  'Centenas
  99.                 RA.2 = 1
  100.         Endif
  101.         If digito = 3 Then  'Unidades de millar
  102.                 RA.3 = 1
  103.                 Endif
  104.  
  105.         digito = digito + 1  'selecciona el proximo digito
  106.         If digito > 3 Then digito = 0  'Reinicia digito
  107.  
  108.         'Bases de tiempos
  109.         If timer0 < timer0_tiempo Then timer0 = timer0 + 1
  110.         If timer1 < timer1_tiempo Then timer1 = timer1 + 1
  111.         If timer2 < timer2_tiempo Then timer2 = timer2 + 1
  112.  
  113.         'Detecta teclas
  114.         If timer0 >= timer0_tiempo And RA4 = 1 Then  'Detecta tecla pulsada + retardo
  115.                 tecla1 = 1  'Activa la secuencia de la tecla
  116.                 timer0 = 0  'Reinicia el timer
  117.         Endif
  118.  
  119. 'TMR0 = 250  'habilitar para simulacion
  120.         INTCON.T0IF = 0  'habilita nuevamente la interrupción
  121. Resume
« Última modificación: 04 de Octubre de 2008, 22:32:13 por dogflu66 »
Saludos desde Granada, España.