Autor Tema: Contador con PIC Simulator IDE  (Leído 6517 veces)

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

Desconectado lmtreser

  • PIC16
  • ***
  • Mensajes: 131
    • Automatismos Mar del Plata
Contador con PIC Simulator IDE
« en: 02 de Julio de 2008, 20:19:41 »
Hola gente les comento mi nombre es Lucas y soy nuevo en el foro, este es mi primer mensaje.

Estoy empezando con los PICs despues de 10000 idas y vueltas. El entorno que uso para programar es el PIC Simulator IDE. Con el mismo estoy haciendo un contador de 3 digitos, lo que hice fue multiplezar los displays con 3 transistores y con un delay de 2 ms enciendo los displays. Esa parte la tengo funcionando a medias.

Tengo problemas con la entrada de pulsos, ya que si le doy un tiempo pequeño el pulsador no me cambia la cuenta, y si agrego una demora me parpadean los displays. No se si entendieron mi pregunta. Pero seria mas o menos asi.

Agradezco la atención, mañana subo más detalles y el diagrama. Un abrazo!

Código: FreeBasic
  1. Define CONF_WORD = 0x3f50
  2.  
  3. '-----CONFIGURO PUERTOS----------
  4. AllDigital                                                      'Deshabilito comparadores.
  5. TRISA = %00000010
  6. TRISB = %00000000
  7.  
  8. '-----DECLARO VARIABLES----------
  9. Dim contador As Word
  10. Dim conversion As Word
  11. Dim digito1 As Byte
  12. Dim digito2 As Byte
  13. Dim digito3 As Byte
  14. Dim mascara As Byte
  15.  
  16. '-----INICIALIZO----------
  17. PORTA = %00000000
  18. PORTB = %00000000
  19. contador = %00000000
  20. conversion = %00000000
  21. digito1 = %00000000
  22. digito2 = %00000000
  23. digito3 = %00000000
  24.  
  25. '-----COMIENZO----------
  26. loop:
  27.         If RA1 = 0 Then
  28.         contador = contador + 1
  29.         WaitMs 2                            
  30.         Endif
  31.  
  32. '-----CENTENAS, DECENAS, UNIDADES----------
  33. digito1 = contador  'conversion / 100
  34. digito2 = 0  'digito3 / 10
  35. digito3 = 0  'digito2 / 1
  36.  
  37. '-----MUESTRO UNIDADES----------
  38.         mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito3
  39.         PORTB = mascara
  40.         RA.0 = 1
  41.         WaitMs 2                                        'Experimentar con este valor.
  42.         RA.0 = 0
  43.  
  44. '-----MUESTRO DECENAS----------
  45.         mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito2
  46.         PORTB = mascara
  47.         RA.7 = 1
  48.         WaitMs 2                                        'Experimentar con este valor.
  49.         RA.7 = 0
  50.  
  51. '-----MUESTRO CENTENAS----------
  52.         mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito1
  53.         PORTB = mascara
  54.         RA.6 = 1
  55.         WaitMs 2                                        'Experimentar con este valor.
  56.         RA.6 = 0
  57.  
  58. Goto loop

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Contador con PIC Simulator IDE
« Respuesta #1 en: 02 de Julio de 2008, 22:26:41 »
si pruebas con un if anidado:

If RA1 = 0 Then
  WaitMs 2
   If RA1 = 0 Then
    contador = contador + 1
   Endif
Endif
     
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado takagi

  • PIC10
  • *
  • Mensajes: 1
Re: Contador con PIC Simulator IDE
« Respuesta #2 en: 02 de Julio de 2008, 23:30:47 »
Hola Lucas

Despues de ver tu mensaje, en el cual ponias el codigo, comprendi que no usas interrupcion,sino "polling"; usas unademora de 2 ms, comparable al retardo de los displays. fijate si es eso; yo en tu lugar usaria interrupciones con antirrebote y todo. te digo esto porque ya lo he utilizado con otros trabajos. En todo caso, si te interesa, contactame al mail y te comento mas detalladamente.
Saludos

Desconectado lmtreser

  • PIC16
  • ***
  • Mensajes: 131
    • Automatismos Mar del Plata
Re: Contador con PIC Simulator IDE
« Respuesta #3 en: 03 de Julio de 2008, 12:58:34 »
Hola, bueno muchas gracias por las rtas. La verdad todavia no manejo las interrupciones asi que cambie el codigo y lo tengo funcionando. Por ahora nada mas que palabras de agradecimiento:

Código: FreeBasic
  1. Define CONF_WORD = 0x3f50
  2.  
  3. AllDigital                                                      'Configuracion de puertos
  4. TRISA = %00000001
  5. TRISB = %00000000
  6.  
  7. Dim unidad As Byte                                      'Declaracion de variables
  8. Dim decena As Byte
  9. Dim centena As Byte
  10. Dim mascara As Byte
  11.  
  12. inicio:
  13.         PORTA = %00000000                                       'Inicializacion
  14.         PORTB = %00000000
  15.         unidad = 0
  16.         decena = 0
  17.         centena = 0
  18.                
  19.         main:                                                           'Comienzo del programa
  20.  
  21.                 mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), unidad
  22.                 PORTB = mascara
  23.                 RA.1 = 1
  24.                 WaitMs 2                                        'Experimentar con este valor.
  25.                 RA.1 = 0
  26.        
  27.                 mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), decena
  28.                 PORTB = mascara
  29.                 RA.2 = 1
  30.                 WaitMs 2                                        'Experimentar con este valor.
  31.                 RA.2 = 0
  32.  
  33.                 mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), centena
  34.                 PORTB = mascara
  35.                 RA.3 = 1
  36.                 WaitMs 2                                        'Experimentar con este valor.
  37.                 RA.3 = 0       
  38.  
  39.                 If RA0 = 1 Then
  40.                         If unidad > 9 Then
  41.                                 unidad = 0
  42.                                 Goto decena            
  43.                         Endif
  44.                 unidad = unidad + 1
  45.                 Goto main
  46.  
  47. decena:
  48.                         If decena > 9 Then
  49.                                 decena = 0
  50.                                 Goto centena
  51.                         Endif
  52.                         decena = decena + 1
  53.                         Goto main
  54.  
  55. centena:
  56.                         If centena > 9 Then Goto inicio
  57.                                 centena = centena + 1
  58.                                 Goto main
  59.                         Endif
  60.         Endif          
  61.         Goto main

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contador con PIC Simulator IDE
« Respuesta #4 en: 03 de Julio de 2008, 16:27:40 »
Puede que este programa haga lo que quieres y digo "puede" porque solo lo he probado en el simulador.

Código: Visual Basic
  1. '*****PIC16F88, 3x7 Segmentos Led Display******
  2. Define CONF_WORD = 0x2f10
  3. Define CONF_WORD_2 = 0x3ffc
  4. Define CLOCK_FREQUENCY = 8
  5. '-----Ignora los valores de Waitms-----
  6. Define SIMULATION_WAITMS_VALUE = 1
  7. '-----DECLARO VARIABLES----------
  8. Dim contador As Word
  9. Dim aux_contador As Word
  10. Dim conversion As Word
  11. Dim digito1 As Byte
  12. Dim digito2 As Byte
  13. Dim digito3 As Byte
  14. Dim mascara As Byte
  15. Dim tmr1ms As Byte
  16. Dim tmr2ms As Byte
  17. Dim tmr3ms As Byte
  18. Dim tmr1ms_tp As Byte
  19. Dim tmr2ms_tp As Byte
  20. Dim tmr3ms_tp As Byte
  21. Dim tecla As Bit
  22. Dim lcd_digito As Byte
  23. Dim flag As Byte
  24. '-----ASIGNACION DE VALORES A VARIABLES-----
  25. contador = 0
  26. conversion = 0
  27. digito1 = 0
  28. digito2 = 0
  29. digito3 = 0
  30. tmr1ms_tp = 2
  31. tmr2ms_tp = 1  '2 valor real
  32. tmr3ms_tp = 3  '200 valor real
  33. lcd_digito = 1
  34. '-----CONFIGURO REGISTROS-----
  35. AllDigital  'Pin I/O Digitales
  36. CMCON = 0x07  'comparador a off
  37. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  38. TRISA = %00000010
  39. TRISB = %00000000
  40. '-----INICIALIZO PIN----------
  41. PORTA = %00000000
  42. PORTB = %00000000
  43. '-----INICIALIZA INTERRUPCIONES CADA 1mSeg. CON EL TIMER1-----
  44. T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
  45. T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
  46. T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
  47. TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
  48. TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
  49. T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
  50. PIE1.TMR1IE = 1  'activa las interrupciones del timer1
  51. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  52. Enable  'INTCON.GIE habilita todas las interrupciones globales
  53. '-----COMIENZO----------
  54. loop:
  55. '-----CENTENAS, DECENAS, UNIDADES----------
  56.         digito1 = contador / 100  'calculo centenas
  57.         aux_contador = contador - (digito1 * 100)  '___calculo decenas
  58.         digito2 = aux_contador / 10  '_________________
  59.         digito3 = aux_contador - (digito2 * 10)  'calculo unidades
  60. '-----MUESTRO UNIDADES----------
  61.         If lcd_digito = 1 Then
  62.                 mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito3
  63.                 PORTB = mascara
  64.                 RA0 = 1
  65.                 flag = 1  'control rutina demora digito
  66.                 tmr2ms = 0  'activa base de tiempos
  67.         Endif
  68. '-----MUESTRO DECENAS----------
  69.         If lcd_digito = 2 Then
  70.                 mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito2
  71.                 PORTB = mascara
  72.                 RA.7 = 1
  73.                 flag = 2  'control rutina demora digito
  74.                 tmr2ms = 0  'activa base de tiempos
  75.         Endif
  76. '-----MUESTRO CENTENAS----------
  77.         If lcd_digito = 3 Then
  78.                 mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito1
  79.                 PORTB = mascara
  80.                 RA6 = 1
  81.                 flag = 3  'control rutina demora digito
  82.                 tmr2ms = 0  'activa base de tiempos
  83.         Endif
  84. '-----INCREMENTA SI DETECTA TECLA-----
  85.         If tecla = 1 And tmr3ms >= tmr3ms_tp Then
  86.                 contador = contador + 1
  87.                 tecla = 0  'desbloquea tecla
  88.                 tmr3ms = 0  'activa base de tiempos
  89.         Endif
  90. Goto loop
  91. End                                              
  92. '-----INTERRUPCIONES-----
  93. On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
  94.         TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
  95.         TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
  96.         Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
  97.         If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion del timer1 es activa
  98.                 If tmr1ms < tmr1ms_tp Then tmr1ms = tmr1ms + 1  'tmr1
  99.                 If tmr2ms < tmr2ms_tp Then tmr2ms = tmr2ms + 1  'tmr2
  100.                 If tmr3ms < tmr3ms_tp Then tmr3ms = tmr3ms + 1  'tmr3
  101.         Endif
  102.         If RA1 = 0 And tecla = 0 Then tecla = 1
  103. '_____Control digitos-----
  104.         If flag = 1 Then  'control digito a ON
  105.                 If tmr2ms >= tmr2ms_tp Then  'digito a OFF a los 2mSeg.
  106.                         RA.0 = 0  'apaga digito
  107.                         lcd_digito = 2  'selecciona el siguiente digito
  108.                 Endif
  109.         Endif
  110.         If flag = 2 Then  'control digito a ON
  111.                 If tmr2ms >= tmr2ms_tp Then  'digito a OFF a los 2mSeg.
  112.                         RA.7 = 0  'apaga digito
  113.                         lcd_digito = 3  'selecciona el siguiente digito
  114.                 Endif
  115.         Endif
  116.         If flag = 3 Then  'control digito a ON
  117.                 If tmr2ms >= tmr2ms_tp Then  'digito a OFF a los 2mSeg.
  118.                         RA.6 = 0  'apaga digito
  119.                         lcd_digito = 1  'selecciona el siguiente digito
  120.                 Endif
  121.         Endif
  122. '_____
  123.         PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
  124. Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
  125. End
« Última modificación: 03 de Julio de 2008, 20:56:30 por dogflu66 »
Saludos desde Granada, España.