Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859695 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #540 en: 16 de Marzo de 2009, 11:19:07 »
Tienes que prestar mucha atención a la resolución del CCP, numero de BIT, ya que si té pasas de esa resolución pasa directamente la salida del CCP a nivel 1.

Enlace calculo CCP:

http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html

por ejemplo si te sale una resolución máxima de 64 puntos, ósea de 0 a 63, a partir de 63 la salida ya queda a estado 1.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #541 en: 17 de Marzo de 2009, 07:19:34 »
He estado revisando los parametros de OSCCON y supongo que si no ponia este registro es como ponerlo a 0 y por tanto seguramente trabajaba a 31 khz (quizas por eso algunas funciones me ivan muy lentas).

Ya he enlazado con la pagina web para el cálculo de frecuencias y configuracion, he configurado el CCP1 y el resultado no puede ser mejor, he utilizado un frecuencia de 16 Mhz, el silbido del motor ya no se oye y con todo arreglado los cambios de curva (lectura de la memoria y modificacion de los valores) no observo pausas en el comportamiento del mando.  Ahora ya solo falta mejorar el dedo para el gatillo (cosa que no tiene arreglo).

Bueno bromas a parte gracias por tu ayuda. Si crees que vale la pena cuelgo de nuevo el programa y borro los anteriores para que el hilo no quede tan largo

Sal U2

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #542 en: 17 de Marzo de 2009, 09:37:39 »
Me alegro que funcione bien el proyecto. Lo de publicarlo eso queda a tu elección, ya que hay información suficiente marcada en el índice para trabajar con el ADC, CCP1 y las bases de tiempos. Y con respecto a modificar otro hilo antiguo pues no soy muy partidario porque se pierde la coherencia de los posteos.

De todas formas hay varias mejoras posibles en el programa actual, utilizas las interrupciones para generar bases de tiempos pero también puedes aprovecharlas para hacer la lectura del ADC, con lo que ganas otra vez tiempo y puede que algún cambio más.

Pero lo importante es que siguas haciendo cosas y te mantengas por aquí para compartir tus nuevos conocimientos y experiencias.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #543 en: 18 de Marzo de 2009, 06:18:39 »
Citar
De todas formas hay varias mejoras posibles en el programa actual, utilizas las interrupciones para generar bases de tiempos pero también puedes aprovecharlas para hacer la lectura del ADC, con lo que ganas otra vez tiempo y puede que algún cambio más.

Esto, si no entiendo mal, es lo que hice en una de las versiones del programa, (salvo que tambien incluia GOSUB dentro del control de las interrupciones) y lince me aconsejo minimizar el código dentro de las interrupciones.

Ahora tambien me estoy planteando una nueva meta y que creo que no has tocado en este hilo, el otro dia desmonte una impresora HP y extraje los motores pensando que serian PAP como EPSON, pero sorpresa me encontre que eran motores normales y que utilizaban encoders para saber la posicion. Trasladando en lo posible esto a la EBasic, estoy pensando en adaptar un zocalo donde va el PIC y utilizar las entradas de los pulsadores para recibir las señales de los  encoders de un raton y asi poder probar la funcion count ,  el control del sentido de giro y mostrar el resultado en el LCD. (Je, je, seguro que necesito ayuda)

Sal U2

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #544 en: 18 de Marzo de 2009, 20:44:57 »
No me refiero a los gosub, dejo el ejemplo a ver que te parece, con esto te quitas los bucles de espera While-Wend

Código: QBasic/QuickBASIC
  1. '***************************************************************************************
  2. 'NOMBRE: 16F88_MandoJEVO_01
  3. 'MICRO: PIC16f88
  4. 'Version: 2.0
  5. 'Utilización de interrupciones
  6. ''**************************************************************************************
  7. Define CONF_WORD = 0x2f50
  8. Define CONF_WORD_2 = 0x3ffc
  9. Define CLOCK_FREQUENCY = 8
  10. 'Define ADC_SAMPLEUS = 10
  11. 'Define ADC_CLOCK = 5
  12.  
  13. DIM duty(15) AS Byte  'Duty Cicle
  14. DIM curva(15) AS Byte  'Curva grabada
  15. DIM vg AS Byte  'Valor gatillo
  16. DIM ca AS Byte  'Curva actual
  17. DIM cn AS Byte  'Curva nueva
  18. DIM mca AS Byte  'Modificacion curva actual P5
  19. DIM mcn AS Byte  'Modificacion curva nueva  P5
  20. DIM asa AS Byte  'Antispin Actual P4
  21. DIM asn AS Byte  'Antispin nuevo P4
  22. DIM ai AS Byte  'Contador inicio
  23. DIM af AS Byte  'Contador fin
  24. DIM a AS Byte  'contador
  25. DIM b AS Byte
  26. DIM va(4) AS Byte
  27. DIM mc(3) AS Byte
  28. DIM i AS Byte
  29. DIM e_adc AS Byte  'Selecciona la entrada del ADC
  30. '---------------Variables el timer-------------------
  31. DIM t1_ms AS Byte  'Base de tiempos del timer 1
  32. DIM t1_ms_t AS Byte  'Contiene el valor de t1_ms
  33. DIM t2_ms AS Byte  'Base de tiempos del timer 2
  34. DIM t2_ms_t AS Byte  'Contiene el valor de t2_ms
  35. DIM t3_ms AS Byte  'Base de tiempos del timer 3
  36. DIM t3_ms_t AS Byte  'Contiene el valor de t3_ms
  37. '--------------Definición de puertos
  38. ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
  39. TRISB = %11110111  'Configuración input/output
  40. TRISA = %01100011  'Configuración input/output'MODIFICADOS PARA QUE QUEDEN POLARIZADOS
  41. CMCON = 0x07  'Comparador a off
  42. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  43. ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
  44. ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  45. ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  46. '--------------Configuracion Interrupciones -----------------
  47. T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
  48. T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
  49. T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
  50. TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
  51. TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
  52. '-------------Carga los valores iniciales del timer ------------------------
  53. t1_ms = 0
  54. t2_ms = 0
  55. t3_ms = 0
  56. t1_ms_t = 3  'Valor para el  timer del P4  Arranque
  57. t2_ms_t = 5  'Valor para el timer del P5 Curva
  58. t3_ms_t = 200  'Valor para el timer del selector de curva
  59. vg = 0
  60. asn = 0
  61. mcn = 0
  62. e_adc = 0
  63. '---------------------Habilita las interrupciones --------------------------------------
  64. T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
  65. 'PIE1.TMR1IE = 1  'Activa la interrupcion del timer
  66. INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
  67. Enable  'INTCON.GIE habilita todas las interrupciones globales
  68. '****************************************************************************
  69. 'Ver curva actual
  70. 'Gosub write_memoria
  71. GOSUB vercurva
  72. GOSUB leermemoria
  73. GOSUB modificarcurva
  74. GOSUB modificararranque
  75. '__Activo lectura gatillo
  76. ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
  77. ADCON0.CHS1 = 0
  78. ADCON0.CHS2 = 0
  79. ADCON0.GO = 1  'Activo una lectura
  80. '__
  81. PIE1.TMR1IE = 1  'Activa la interrupcion del timer
  82. 'Activo el PWM
  83. PWMon 1, 9
  84. PWMduty 1, 0
  85. 'Rutina principal
  86. LOOP:
  87.         'For i = 1 To 240  'Bucle solo para pruebas de tiempos
  88.  
  89.  
  90.         SELECT CASE vg
  91.                 CASE < 16
  92.                         PWMduty 1, 0  'Freno
  93.                 CASE < 32
  94.                         PWMduty 1, duty(0)
  95.                 CASE < 48
  96.                         PWMduty 1, duty(1)
  97.                 CASE < 64
  98.                         PWMduty 1, duty(2)
  99.                 CASE < 80
  100.                         PWMduty 1, duty(3)
  101.                 CASE < 96
  102.                         PWMduty 1, duty(4)
  103.                 CASE < 112
  104.                         PWMduty 1, duty(5)
  105.                 CASE < 128
  106.                         PWMduty 1, duty(6)
  107.                 CASE < 144
  108.                         PWMduty 1, duty(7)
  109.                 CASE < 160
  110.                         PWMduty 1, duty(8)
  111.                 CASE < 176
  112.                         PWMduty 1, duty(9)
  113.                 CASE < 192
  114.                         PWMduty 1, duty(10)
  115.                 CASE < 208
  116.                         PWMduty 1, duty(11)
  117.                 CASE < 224
  118.                         PWMduty 1, duty(12)
  119.                 CASE < 240
  120.                         PWMduty 1, duty(13)
  121.                 CASE <= 255
  122.                         PWMduty 1, duty(14)
  123.         EndSelect
  124.  
  125.         IF t1_ms >= t1_ms_t THEN
  126.  
  127.                 IF asn <> asa THEN GOSUB modificararranque
  128.                 t1_ms = 0
  129.         Endif
  130.  
  131.                 IF t2_ms >= t2_ms_t THEN
  132.  
  133.  
  134.                 IF mcn <> mca THEN GOSUB modificarcurva
  135.                 t2_ms = 0
  136.                 t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
  137.                 'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
  138.         Endif
  139.  
  140.         IF t3_ms >= t3_ms_t THEN
  141.                 Toggle RA7
  142.                 GOSUB vercurva  'Comprueba que no se haya cambiado la curva
  143.                 IF cn <> ca THEN GOSUB leermemoria
  144.                 t3_ms = 0
  145.         Endif
  146.  
  147. 'next i  'Bucle para pruebas
  148. GOTO LOOP
  149. END                                              
  150.  
  151.  
  152. '********************************************************
  153. 'Deteccion de la curva a leer
  154. vercurva:
  155.         'Ver curva nueva
  156.         cn = 0
  157. 'If PORTA.4 = 1 Then cn = cn + 1
  158. 'If PORTA.3 = 1 Then cn = cn + 2
  159. 'If PORTA.2 = 1 Then cn = cn + 4
  160.         IF PORTA.5 = 1 THEN cn = cn + 8  'SOLO UTILIZO LA OPCION A.5 = 1
  161. RETURN                                            
  162. leermemoria:
  163.         'Leer valores Guardados segun la curva a leer
  164.         ai = LookUp(0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240), cn  'Posicion inicial de memoria donde leer
  165.         af = LookUp(14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254), cn  'Posicion final de memoria donde leer
  166.         FOR a = ai TO af
  167.                 b = a - ai
  168.                 READ a, duty(b)
  169.                 curva(b) = duty(b)
  170.         NEXT a
  171.         'Genera los valores para las modificaciones de curvas
  172.         va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
  173.         va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
  174.         va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
  175.         va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
  176.         ca = cn
  177. RETURN                                            
  178. write_memoria:  'ESCRIBO VALORES EN LA EEPROM INTERNA DEL MICRO
  179.         FOR a = 0 TO 255
  180.                 WRITE a, a
  181.         NEXT a
  182. RETURN                                            
  183.  
  184. '*************************************************************
  185. 'Ajuste fino de la curva grabada
  186. 'Rutina para modificar el centro de la curva
  187. modificarcurva:
  188.         SELECT CASE mcn
  189.                 CASE < 22  'P -5
  190.                         mc(0) = ((va(3) * 5) / 10)
  191.                         mc(1) = ((va(1) * 5) / 10)
  192.                         duty(5) = curva(5) - mc(0)
  193.                         duty(6) = curva(6) - mc(1)
  194.                         duty(7) = curva(7) - mc(1)
  195.                         duty(8) = curva(8) - mc(1)
  196.                         duty(9) = curva(9) - mc(0)
  197.                         mca = mcn
  198.                         RETURN
  199.  
  200.                 CASE < 44  'P -4
  201.                         mc(0) = ((va(3) * 4) / 10)
  202.                         mc(1) = ((va(1) * 4) / 10)
  203.                         duty(5) = curva(5) - mc(0)
  204.                         duty(6) = curva(6) - mc(1)
  205.                         duty(7) = curva(7) - mc(1)
  206.                         duty(8) = curva(8) - mc(1)
  207.                         duty(9) = curva(9) - mc(0)
  208.                         mca = mcn
  209.                         RETURN
  210.  
  211.                 CASE < 66  'P -3
  212.                         mc(0) = ((va(3) * 3) / 10)
  213.                         mc(1) = ((va(1) * 3) / 10)
  214.                         duty(5) = curva(5) - mc(0)
  215.                         duty(6) = curva(6) - mc(1)
  216.                         duty(7) = curva(7) - mc(1)
  217.                         duty(8) = curva(8) - mc(1)
  218.                         duty(9) = curva(9) - mc(0)
  219.                         mca = mcn
  220.                         RETURN
  221.  
  222.                 CASE < 88  'P -2
  223.                         mc(0) = ((va(3) * 2) / 10)
  224.                         mc(1) = ((va(1) * 2) / 10)
  225.                         duty(5) = curva(5) - mc(0)
  226.                         duty(6) = curva(6) - mc(1)
  227.                         duty(7) = curva(7) - mc(1)
  228.                         duty(8) = curva(8) - mc(1)
  229.                         duty(9) = curva(9) - mc(0)
  230.                         mca = mcn
  231.                         RETURN
  232.  
  233.                 CASE < 110  'P -1
  234.                         mc(0) = va(3) / 10
  235.                         mc(1) = va(1) / 10
  236.                         duty(5) = curva(5) - mc(0)
  237.                         duty(6) = curva(6) - mc(1)
  238.                         duty(7) = curva(7) - mc(1)
  239.                         duty(8) = curva(8) - mc(1)
  240.                         duty(9) = curva(9) - mc(0)
  241.                         mca = mcn
  242.                         RETURN
  243.  
  244.                 CASE < 145  'P 0
  245.                         duty(5) = curva(5)
  246.                         duty(6) = curva(6)
  247.                         duty(7) = curva(7)
  248.                         duty(8) = curva(8)
  249.                         duty(9) = curva(9)
  250.                         mca = mcn
  251.                         RETURN
  252.  
  253.                 CASE < 165  'P +1
  254.                         mc(0) = va(3) / 10
  255.                         mc(1) = va(2) / 10
  256.                         mc(2) = va(1) / 10
  257.                         duty(5) = curva(5) + mc(0)
  258.                         duty(6) = curva(6) + mc(1)
  259.                         duty(7) = curva(7) + mc(2)
  260.                         duty(8) = curva(8) + mc(1)
  261.                         duty(9) = curva(9) + mc(0)
  262.                         mca = mcn
  263.                         RETURN
  264.  
  265.                 CASE < 185  'P +2
  266.                         mc(0) = ((va(3) * 2) / 10)
  267.                         mc(1) = ((va(2) * 2) / 10)
  268.                         mc(2) = ((va(1) * 2) / 10)
  269.                         duty(5) = curva(5) + mc(0)
  270.                         duty(6) = curva(6) + mc(1)
  271.                         duty(7) = curva(7) + mc(2)
  272.                         duty(8) = curva(8) + mc(1)
  273.                         duty(9) = curva(9) + mc(0)
  274.                         mca = mcn
  275.                         RETURN
  276.  
  277.                 CASE < 205  'P +3
  278.                         mc(0) = ((va(3) * 3) / 10)
  279.                         mc(1) = ((va(2) * 3) / 10)
  280.                         mc(2) = ((va(1) * 3) / 10)
  281.                         duty(5) = curva(5) + mc(0)
  282.                         duty(6) = curva(6) + mc(1)
  283.                         duty(7) = curva(7) + mc(2)
  284.                         duty(8) = curva(8) + mc(1)
  285.                         duty(9) = curva(9) + mc(0)
  286.                         mca = mcn
  287.                         RETURN
  288.  
  289.                 CASE < 230  'P +4
  290.                         mc(0) = ((va(3) * 4) / 10)
  291.                         mc(1) = ((va(2) * 4) / 10)
  292.                         mc(2) = ((va(1) * 4) / 10)
  293.                         duty(5) = curva(5) + mc(0)
  294.                         duty(6) = curva(6) + mc(1)
  295.                         duty(7) = curva(7) + mc(2)
  296.                         duty(8) = curva(8) + mc(1)
  297.                         duty(9) = curva(9) + mc(0)
  298.                         mca = mcn
  299.                         RETURN
  300.        
  301.                 CASE <= 255  'P +5
  302.                         mc(0) = ((va(3) * 5) / 10)
  303.                         mc(1) = ((va(2) * 5) / 10)
  304.                         mc(2) = ((va(1) * 5) / 10)
  305.                         duty(5) = curva(5) + mc(0)
  306.                         duty(6) = curva(6) + mc(1)
  307.                         duty(7) = curva(7) + mc(2)
  308.                         duty(8) = curva(8) + mc(1)
  309.                         duty(9) = curva(9) + mc(0)
  310.                         mca = mcn
  311.                         RETURN
  312.         EndSelect
  313. RETURN                                            
  314. '*****************************************************************
  315. 'Ajuste del control de arrancada
  316. modificararranque:
  317.         SELECT CASE asn
  318.                 CASE < 25  'P 1
  319.                         duty(0) = curva(0)
  320.                         duty(1) = curva(1)
  321.                         duty(2) = curva(2)
  322.                         duty(3) = curva(3)
  323.                         duty(4) = curva(4)
  324.                         asa = asn
  325.                         RETURN
  326.  
  327.                 CASE < 50  'P 2
  328.                         duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
  329.                         duty(1) = curva(1)
  330.                         duty(2) = curva(2)
  331.                         duty(3) = curva(3)
  332.                         duty(4) = curva(4)
  333.                         asa = asn
  334.                         RETURN
  335.  
  336.                 CASE < 75  'P 3
  337.                         duty(0) = curva(1)
  338.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  339.                         duty(2) = curva(2)
  340.                         duty(3) = curva(3)
  341.                         duty(4) = curva(4)
  342.                         asa = asn
  343.                         RETURN
  344.  
  345.                 CASE < 100  'P 4
  346.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  347.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  348.                         duty(2) = curva(2)
  349.                         duty(3) = curva(3)
  350.                         duty(4) = curva(4)
  351.                         asa = asn
  352.                         RETURN
  353.  
  354.                 CASE < 125  'P 5
  355.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  356.                         duty(1) = curva(2)
  357.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  358.                         duty(3) = curva(3)
  359.                         duty(4) = curva(4)
  360.                         asa = asn
  361.                         RETURN
  362.  
  363.                 CASE < 150  'P 6
  364.                         duty(0) = curva(2)
  365.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  366.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  367.                         duty(3) = curva(3)
  368.                         duty(4) = curva(4)
  369.                         asa = asn
  370.                         RETURN
  371.        
  372.                 CASE < 175  'P 7
  373.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  374.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  375.                         duty(2) = curva(3)
  376.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  377.                         duty(4) = curva(4)
  378.                         asa = asn
  379.                         RETURN
  380.  
  381.                 CASE < 200  'p 8
  382.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  383.                         duty(1) = curva(3)
  384.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  385.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  386.                         duty(4) = curva(4)
  387.                         asa = asn
  388.                         RETURN
  389.  
  390.                 CASE < 225  'P 9
  391.                         duty(0) = curva(3)
  392.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  393.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  394.                         duty(3) = curva(4)
  395.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  396.                         asa = asn
  397.                         RETURN
  398.  
  399.                 CASE <= 255  'P 10
  400.                         duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  401.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  402.                         duty(2) = curva(4)
  403.                         duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  404.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
  405.                         asa = asn
  406.                 RETURN
  407.  
  408.         EndSelect
  409. RETURN                                            
  410.  
  411. '----------------------- Interrupciones ------------------------------------------
  412. ON Interrupt
  413.         IF e_adc = 0 AND ADCON0.GO = 0 THEN
  414.                 vg = ADRESH  'Paso valor gatillo
  415.                 'Activo lectura valor de p4 ADC 5
  416.                 ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
  417.                 ADCON0.CHS1 = 0
  418.                 ADCON0.CHS2 = 1
  419.                 ADCON0.GO = 1  'Activo una lectura
  420.                 e_adc = 1
  421.         Endif
  422.         IF e_adc = 1 AND ADCON0.GO = 0 THEN
  423.                 asn = ADRESH  'paso valor p4
  424.                 'Activo lectura valor de p5 ADC 0
  425.                 ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
  426.                 ADCON0.CHS1 = 0
  427.                 ADCON0.CHS2 = 0
  428.                 ADCON0.GO = 1  'Activo una lectura
  429.                 e_adc = 2
  430.         Endif
  431.         IF e_adc = 2 AND ADCON0.GO = 0 THEN
  432.                 mcn = ADRESH  'Paso valor p5
  433.                 'Activo lectura gatillo
  434.                 ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
  435.                 ADCON0.CHS1 = 0
  436.                 ADCON0.CHS2 = 0
  437.                 ADCON0.GO = 1  'Activo una lectura
  438.                 e_adc = 0
  439.         Endif
  440.  
  441.         IF PIR1.TMR1IF = 1 THEN
  442.                 IF t1_ms < t1_ms_t THEN t1_ms = t1_ms + 1
  443.                 IF t2_ms < t2_ms_t THEN t2_ms = t2_ms + 1
  444.                 IF t3_ms < t3_ms_t THEN t3_ms = t3_ms + 1
  445.         Endif
  446.         TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
  447.         TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
  448.         PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
  449. RESUME

Save Systen se utiliza cuando se producen valores intermedios en operaciones matematicas tipo word y long o se utilizan funciones complejas.
Pero este no es el caso, pienso que el programa funcionara igual de bien si lo suprimes e incluso aceleras la rutina porque Save Systen es muy larga
ya que tiene que guardar una serie de registros comuenes a operaciones con variables, funciones, retorno y de mas registros de bajo nivel.

Y cuanto al otro tema, ¡¡¡ADELANTE!!!...
« Última modificación: 29 de Junio de 2012, 07:53:36 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #545 en: 07 de Julio de 2009, 07:24:35 »
Bueno, finalmente me he puesto a analizar la utilizacion de un encoder para presentar en un display  menus o valores de los parametros ( a modo de las radios de los coches, etc), hace poco encontre una pagina donde hay un codigo para la utilizacion de un encoder, Aplicacion con PICs para posicionamiento con encoder analizando la direccion de giro, pero esta en un pic basic diferente al de PSI y lgunas lineas se me escapan o no las entiendo.

He intentado hacer la adaptacion al PSI pero siguiendo el programa hay datos que ya veo que me daria error.
La adaptacion que yo he hecho es la siguiente:
Código: [Seleccionar]
'VERSION: 1.0
'MICRO: PIC16f88A
'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR

'***************************************************************************************************
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'***********************************DEFINICION DE VARIABLES**************************************
'--------------------------------------Variables Programa----------------------------------------
Dim pos As Long  'guarda el estado de la tecla hasta terminar la maniobra
Dim a As Bit  'guarda el estado del canal A
Dim b As Bit  'guarda el estado del canal B
Dim av As Bit  'guarda el estado anterior del canal A
Dim bv As Bit  'guarda el estado anterior del canal B
Dim dpos As Long  'Dato de presentacion de Pos

'------------------------------------------ASIGNACIONES------------------------------------------
pos = 0
a = 0
b = 0
av = 0
bv = 0

'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00000000  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "16f88_LCD_I/O"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas Encoder"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'--------------------------------------Main Programa-----------------------------------------------
main:
av = a
bv = b

a = PORTA.5
b = PORTA.6
WaitMs 1

If a = av Then Goto chequearb
If a = 1 And av = 0 Then Goto chequearb1

decremento:
If pos = 0 Then Goto lcd
pos = pos - 1
Goto lcd

chequearb1:
b = PORTA.6
If b = 1 Then Goto incremento
Goto decremento

chequearb:
b = PORTA.6
If b = bv Then Goto lcd
If b = 1 And bv = 0 Then Goto chequeara
If a = 1 Then Goto incremento
Goto decremento

chequeara:
a = PORTA.5
If a = 1 Then Goto incremento
Goto decremento

incremento:
If pos = 255 Then Goto lcd
pos = pos + 1
Goto lcd

lcd:
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
print_lcd:  '____________________muestra los datos por el display

Lcdcmdout LcdLine1Clear  'borra la primera linea y cursor al principio
If pos >= 128 Then
dpos = pos - 128
Lcdout "  Valor= ", #dpos  'imprime  los valores positivos en el lcd
End If                                           
If pos < 128 Then
dpos = 128 - pos
Lcdout "  Valor= -", #dpos  'imprime  los valores negativos en el lcd
End If                                           
Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
Lcdout "----------------"  'muestra los datos en el lcd
Return 

Alguien me podria decir si la adaptacion del programa es correcta.

Saludos


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #546 en: 07 de Julio de 2009, 19:41:37 »
Código: FreeBasic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4.  
  5. 'VERSION: 1.0
  6. 'MICRO: PIC16f88A
  7. 'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR
  8.  
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. 'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
  19. 'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '***********************************DEFINICION DE VARIABLES**************************************
  24. '--------------------------------------Variables Programa----------------------------------------
  25. Dim pos As Long  'guarda el estado de la tecla hasta terminar la maniobra
  26. Dim a As Bit  'guarda el estado del canal A
  27. Dim b As Bit  'guarda el estado del canal B
  28. Dim av As Bit  'guarda el estado anterior del canal A
  29. Dim bv As Bit  'guarda el estado anterior del canal B
  30. Dim dpos As Long  'Dato de presentacion de Pos
  31. '------------------------------------------ASIGNACIONES------------------------------------------
  32. pos = 0
  33. a = 0
  34. b = 0
  35. av = 0
  36. bv = 0
  37. '**************************************DEFINICION DE PUERTOS*************************************
  38. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  39. ANSEL = %00000000  'los pin I/O digitales
  40. CMCON = 0x07  'comparador a off
  41. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  42. TRISA = 0x00  'Puerto A como salidas
  43. TRISB = 0x00  'puerto B como salidas
  44. TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
  45. TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
  46. PORTB.3 = 1  'luz lcd a on (RB3)
  47. PORTA.7 = 1  'led amarillo a off
  48. PORTB.0 = 1  'led verde a off
  49. '**************************************Inicio Programa*********************************************
  50. Lcdinit  'inicializa el lcd sin cursor
  51. WaitMs 1000  'espera 1Seg
  52. Lcdout "16f88_LCD_I/O"  'escribe en el lcd
  53. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  54. Lcdout "Pruebas Encoder"  'escribe en el lcd
  55. WaitMs 3000  'espera 3Seg
  56. '--------------------------------------Main Programa-----------------------------------------------
  57.  
  58. main:
  59.                 a = av
  60.                 b = bv
  61.         a = PORTA.5
  62.         b = PORTA.6
  63.         WaitMs 1
  64.         If a = av Then Goto chequearb
  65.         If a = 1 And av = 0 Then Goto chequearb1
  66.  
  67.         decremento:
  68.         If pos = 0 Then Goto lcd
  69.                 pos = pos - 1
  70.                 Goto lcd
  71.  
  72.         chequearb1:
  73.                 b = PORTA.6
  74.                 If b = 1 Then Goto incremento
  75.                 Goto decremento
  76.  
  77.         chequearb:
  78.                 b = PORTA.6
  79.                 If b = bv Then Goto lcd
  80.                 If b = 1 And bv = 0 Then Goto chequeara
  81.                 If a = 1 Then Goto incremento
  82.                 Goto decremento
  83.  
  84.         chequeara:
  85.                 a = PORTA.5
  86.                 If a = 1 Then Goto incremento
  87.                 Goto decremento
  88.  
  89.         incremento:
  90.                 If pos = 255 Then Goto lcd
  91.                 pos = pos + 1
  92.                 Goto lcd
  93.  
  94.         lcd:
  95.                 Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
  96.                 WaitMs 100
  97. Goto main
  98. End                                              
  99. '--------------------------------------FIN DEL MAIN---------------------------------------------
  100. '**************************************Subrrutinas**********************************************
  101. print_lcd:  '____________________muestra los datos por el display
  102.         Lcdcmdout LcdLine1Clear  'borra la primera linea y cursor al principio
  103.         If pos >= 128 Then
  104.                 dpos = pos - 128
  105.                 Lcdout "  Valor= ", #dpos.HB, #dpos.LB  'imprime  los valores positivos en el lcd
  106.         Endif
  107.         If pos < 128 Then
  108.                 dpos = 128 - pos
  109.                 Lcdout "  Valor= -", #dpos.HB, #dpos.LB  'imprime  los valores negativos en el lcd
  110.         Endif
  111.         Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
  112.         Lcdout "----------------"  'muestra los datos en el lcd
  113. Return                                            
  114. End
« Última modificación: 08 de Julio de 2009, 20:34:31 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #547 en: 08 de Julio de 2009, 18:41:01 »
Creo que las lineas 58 y 59 de tu codigo

a = av
b = bv
main:

deberia ir a continuacion de main: pues si no es asi la funcion de av y bv se pierde ( es el estado anterior de A y B) y las comparaciones serian siempre sobre los mismos valores

Sal U2

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #548 en: 08 de Julio de 2009, 20:35:16 »
OK, ya lo he cambiado.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #549 en: 13 de Julio de 2009, 07:08:48 »
Bueno, he cambiado el codigo porque no me funcionaba en la ebasic, y despues de hacer funcionar este codigo me encuentro con los siguientes problemas:

si muevo el encoder lentamente, si que me funciona bien, pero si lo muevo a una velocidad normal de uso ,es como si me saltase del estado 00 (canales a y b) al estado 00 y ni se inmuta.

Para probar a reducir los tiempos quito los tiempos de espera  y entonces es la presentacion en el LCD que se ve mal (normal)

Despues tambien me encuentro con el problema que el encoder (es con mesetas) y siempre se queda en 00 con lo cual me salta los 4 pasos

Alguna idea  de por donde debo encaminarme???

Sal U2

Código: Visual Basic
  1. 'VERSION: 1.0
  2. 'MICRO: PIC16f88A
  3. 'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR
  4.  
  5.  
  6. Define CONF_WORD = 0x2f10
  7. Define CONF_WORD_2 = 0x3ffc
  8. Define CLOCK_FREQUENCY = 8
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. 'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
  19. 'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '***********************************DEFINICION DE VARIABLES**************************************
  24. '--------------------------------------Variables Programa----------------------------------------
  25. Dim pos As Long  'guarda la posicion
  26. Dim a As Bit  'guarda el estado del canal A
  27. Dim b As Bit  'guarda el estado del canal B
  28. Dim av As Bit  'guarda el estado anterior del canal A
  29. Dim bv As Bit  'guarda el estado anterior del canal B
  30. Dim dpos As Long  'Dato de presentacion de Pos
  31.  
  32. '------------------------------------------ASIGNACIONES------------------------------------------
  33. pos = 0
  34. a = 0
  35. b = 0
  36. av = 0
  37. bv = 0
  38.  
  39. '**************************************DEFINICION DE PUERTOS*************************************
  40. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  41. ANSEL = %00000000  'los pin I/O digitales
  42. CMCON = 0x07  'comparador a off
  43. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  44. TRISA = 0x00  'Puerto A como salidas
  45. TRISB = 0x00  'puerto B como salidas
  46. TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
  47. TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
  48. PORTB.3 = 1  'luz lcd a on (RB3)
  49. PORTA.7 = 1  'led amarillo a off
  50. PORTB.0 = 1  'led verde a off
  51. '**************************************Inicio Programa*********************************************
  52. Lcdinit  'inicializa el lcd sin cursor
  53. WaitMs 1000  'espera 1Seg
  54. Lcdout "16f88_LCD_I/O"  'escribe en el lcd
  55. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  56. Lcdout "Pruebas Encoder"  'escribe en el lcd
  57. WaitMs 3000  'espera 3Seg
  58. '--------------------------------------Main Programa-----------------------------------------------
  59. main:
  60. av = a
  61. bv = b
  62.  
  63. a = PORTA.5
  64. b = PORTA.6
  65. 'WaitMs 1
  66. 'Break
  67. If a = av And b = bv Then Goto lcd
  68.  
  69. If a = 0 And av = 0 Then
  70.         If b = 0 And bv = 1 Then Goto incr
  71.         If b = 1 And bv = 0 Then Goto decr
  72. Endif
  73.  
  74. If a = 1 And av = 0 Then
  75.         If b = 0 And bv = 0 Then Goto incr
  76.         If b = 1 And bv = 0 Then Goto decr
  77.         If b = 1 And bv = 1 Then Goto decr
  78.         If b = 0 And bv = 1 Then Goto decr
  79. Endif
  80.  
  81. If a = 0 And av = 1 Then
  82.         If b = 0 And bv = 0 Then Goto decr
  83.         If b = 1 And bv = 1 Then Goto incr
  84. Endif
  85.  
  86. If a = 1 And av = 1 Then
  87.         If b = 0 And bv = 0 Then Goto decr
  88.         If b = 1 And bv = 0 Then Goto incr
  89.         If b = 0 And bv = 1 Then Goto decr
  90. Endif
  91.  
  92. Goto lcd
  93.  
  94. incr:
  95. If pos = 255 Then Goto lcd
  96. pos = pos + 1
  97. Goto lcd
  98.  
  99. decr:
  100. If pos = 0 Then Goto lcd
  101. pos = pos - 1
  102.  
  103. lcd:
  104. Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
  105. 'WaitMs 100
  106. Goto main
  107. End                                              
  108. '--------------------------------------FIN DEL MAIN---------------------------------------------
  109. '**************************************Subrrutinas**********************************************
  110. print_lcd:  '____________________muestra los datos por el display
  111.  
  112. Lcdcmdout LcdLine1Clear  'borra la primera linea y cursor al principio
  113. If pos >= 128 Then
  114.         dpos = pos - 128
  115.         Lcdout "  Valor= ", #dpos.HB, #dpos.LB  'imprime  los valores positivos en el lcd
  116. Endif
  117. If pos < 128 Then
  118.         dpos = 128 - pos
  119.         Lcdout "  Valor= -", #dpos.HB, #dpos.LB  'imprime  los valores negativos en el lcd
  120. Endif
  121. Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
  122. Lcdout "----------------"  'muestra los datos en el lcd
  123. Return

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #550 en: 13 de Julio de 2009, 09:36:36 »
Es normal lo que te  pasa, para poder leer con exactitud tienes que dar una resolución de lectura superior al pulso de menor duración que puede generar el encoder. Una vez que se detecta el inicio del pulso hay que esperar un tiempo de estabilización porque se suelen generar rebotes. En este caso lo ideal es utilizar interrupciones. Creo recordar que tengo por ahí un software en PSI que realice hace tiempo que utiliza encoder, lo buscare a ver donde para.

Lo que te ocurre con el LCD es normal ya que la forma que se dispone en este ejemplo, no permite estabilizar los datos el suficiente tiempo para que se vean estables. Habría que cambiar a la siguiente forma de utilizar el LCD. Te hago parte de las correcciones para que lo termines de adaptar:
« Última modificación: 05 de Octubre de 2010, 20:10:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #551 en: 13 de Julio de 2009, 09:42:46 »
Código: FreeBasic
  1. '**************************************Sub-rutinas**********************************************
  2. print_lcd:  '____________________muestra los datos por el display
  3.  
  4. Lcdcmdout LcdLine1Home  'Primera linea y cursor al principio
  5. If pos >= 128 Then
  6.         dpos = pos - 128
  7.         Lcdout "Valor= ", #dpos.HB, #dpos.LB, "      "  'Imprime  los valores positivos en el lcd
  8. Endif
  9. If pos < 128 Then
  10.         dpos = 128 - pos
  11.         Lcdout "Valor= -", #dpos.HB, #dpos.LB, "     "  'Imprime  los valores negativos en el lcd
  12. Endif
  13. Lcdcmdout LcdLine2Home  'Linea 2 y cursor al principio
  14. Lcdout "----------------"  'muestra los datos en el lcd
  15. Return
« Última modificación: 13 de Julio de 2009, 09:44:58 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #552 en: 14 de Julio de 2009, 19:16:34 »
Bueno, a falta de probarlo en la ebasic , con tus datos y un post que he encontrado de nocturno he rehecho el codigo. 
En el simulador parece que funciona, y aunque tengo claro que tiene que funcionar mediante interrupciones este ya es un primer paso

Nota, una pregunta, ¿porque si no pongo los espacios en blanco en la linea
         Lcdout "  Valor= ", #dpos.HB, #dpos.LB, "      "  'imprime  los valores positivos en el lcd
me presentalos datos  en el LCD   "Valor= 00/0" ?


Sal U2

Código: FreeBasic
  1. 'VERSION: 1.3
  2. 'MICRO: PIC16f88A
  3. 'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR
  4.  
  5.  
  6. Define CONF_WORD = 0x2f10
  7. Define CONF_WORD_2 = 0x3ffc
  8. Define CLOCK_FREQUENCY = 8
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. 'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
  19. 'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '***********************************DEFINICION DE VARIABLES**************************************
  24. '--------------------------------------Variables Programa----------------------------------------
  25. Dim pos As Long  'guarda la posicion
  26. Dim dpos As Long  'Dato de presentacion de Pos
  27.  
  28. Symbol a = PORTA.5  'estado del canal A
  29. Symbol b = PORTA.6  'estado del canal B
  30. '------------------------------------------ASIGNACIONES------------------------------------------
  31. pos = 128
  32. '**************************************DEFINICION DE PUERTOS*************************************
  33. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  34. ANSEL = %00000000  'los pin I/O digitales
  35. CMCON = 0x07  'comparador a off
  36. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Puerto A como salidas
  38. TRISB = 0x00  'puerto B como salidas
  39. TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
  40. TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
  41. PORTB.3 = 1  'luz lcd a on (RB3)
  42. PORTA.7 = 1  'led amarillo a off
  43. PORTB.0 = 1  'led verde a off
  44. '**************************************Inicio Programa*********************************************
  45. Lcdinit  'inicializa el lcd sin cursor
  46. 'WaitMs 1000  'espera 1Seg
  47. Lcdout "16f88_LCD_I/O"  'escribe en el lcd
  48. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  49. Lcdout "Pruebas Encoder"  'escribe en el lcd
  50. 'WaitMs 3000  'espera 3Seg
  51. '--------------------------------------Main Programa-----------------------------------------------
  52. main:
  53. If a = 1 Then
  54.         If b = 1 Then
  55.                 If pos < 255 Then pos = pos + 1
  56.         Else
  57.                 If pos > 0 Then pos = pos - 1
  58.         Endif
  59.         While a = 1
  60.         Wend
  61. Endif
  62.  
  63.  
  64. Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
  65. 'WaitMs 100
  66. Goto main
  67. End                                              
  68. '--------------------------------------FIN DEL MAIN---------------------------------------------
  69. '**************************************Subrrutinas**********************************************
  70. print_lcd:  '____________________muestra los datos por el display
  71.  
  72. Lcdcmdout LcdLine1Home  'borra la primera linea y cursor al principio
  73. If pos >= 128 Then
  74.         dpos = pos - 128
  75.         Lcdout "  Valor= ", #dpos.HB, #dpos.LB, "      "  'imprime  los valores positivos en el lcd
  76. Endif
  77. If pos < 128 Then
  78.         dpos = 128 - pos
  79.         Lcdout "  Valor= -", #dpos.HB, #dpos.LB, "      "  'imprime  los valores negativos en el lcd
  80. Endif
  81. Lcdcmdout LcdLine2Home  'Linea 2 y cursor al principio
  82. Lcdout "----------------"  'muestra los datos en el lcd
  83. Return
« Última modificación: 15 de Julio de 2009, 03:59:25 por 21CURIOSOS »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #553 en: 15 de Julio de 2009, 18:18:02 »
Claro, porque no borramos la pantalla, lo que hacemos es sobre escribir en ella, y como las variables no tienen longitud fija pues quedan caracteres impresos de la vez anterior. Para que esto no pase rellenamos el final de la línea con caracteres en blanco, que al sobre escribirlos sobre los caracteres anteriores nos hacen el proceso de borrado.

Lcdcmdout lcdlineXhome, no borra las líneas tan solo se limita a llevar el cursor a principio de línea, por eso es uno de los comandos mas rápidos que tiene el LCD. Por ejemplo: el comando Lcdcmdout Lcdclear para borrar las dos líneas tiene que sobre escribir 16 espacios, este comando tarda unos 2mSeg. en realizar el proceso mientras el Lceline1home pueda tardar menos de 500uSg.

Para dar tiempo a que el LCD procese los comandos de finimos un tiempo de espera después de enviar la orden al LCD, con Define LCD_COMMANDUS = 2000 establecemos este tiempo en uSeg.
« Última modificación: 15 de Julio de 2009, 18:29:35 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #554 en: 15 de Julio de 2009, 18:23:44 »
Mira aqui a ver si hay algo que puedas aprovechar sobre la rutina de los encoder.

http://www.freewebs.com/glafebre/miguelito.htm
Saludos desde Granada, España.


 

anything