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

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

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #525 en: 11 de Marzo de 2009, 20:35:47 »
Gracias Lince, estos errores demuestran lo poco que se todavia,  tomo nota y me pongo a modificarlo

Sal U2

Edito para no alargar el tema.

Ya he cambiado las rutinas que tenia en las interrupciones al main, ahora lo que detecto es como si el pwm me diese una resolucion mucho mas baja, me explico:

Lo tengo establecido a PWM 1,9 que es a resolucion de 8 bits (hasta 256) pero en cambio cuando introduzco un valor en el PWM superior a 21 o 22 ya me entrega toda la potencia como si estuviese a 255 segun la resolucion establecida.

Sabeis alguno porque se produce este problema ( si cambio el Pic que tengo grabado con el anterior programa funciona bien)

Sal U2
« Última modificación: 12 de Marzo de 2009, 07:51:33 por 21CURIOSOS »

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #526 en: 13 de Marzo de 2009, 21:27:33 »
Bien ya he encontrado el problema, aunque sigo sin entenderlo.

El programilla solo funciona bien si quito la linea
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz

Agradeceria que alguien me pueda explicar porque.

Tambien tengo otra duda y es que el en el timer_3 cuento 200 ms para ejecutar una accion, pero esta me tarda varios segundos en realizarla. Y tampoco se cual es el motivo

Sal U2

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #527 en: 13 de Marzo de 2009, 21:48:58 »
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz

La linea la utilizo en todos mis programas y nunca tuve problema, de echo ya se comento este registro y no se le saco ningun fallo.... :shock:
y si no recuerdo mal si no se coloca el micro anda por defecto a 4Mhz. De todas formas a ver si mañana puedo echar un vistazo mas detallado el programa.

Tambien te lo he compilado con mi version del psi que es la ultima a ver que te hace.

Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #528 en: 14 de Marzo de 2009, 09:17:23 »
No si lo mas curioso es que , me hice la Ebasic, y los programas que tienes colgados en este hilo me funcionan bien y siempre con el registro osccon , por eso no lo entiendo.

Y en el PSI no me da ningun fallo a mi, solo al hacerlo servir en el mando.

Descargo tu version y lo probaré.

Por cierto una pregunta ¿es posible generar un programa con el PSI (aunque no se pueda simular) para un micro que no este en la lista?. Quiero utilizar un PIC18f14k50 y no lo he encontrado en la lista de pic que admite el PSI.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #529 en: 14 de Marzo de 2009, 10:45:04 »
.
.
.
Por cierto una pregunta ¿es posible generar un programa con el PSI (aunque no se pueda simular) para un micro que no este en la lista?. Quiero utilizar un PIC18f14k50 y no lo he encontrado en la lista de pic que admite el PSI.

En realidad no se me ha plateado, en teoría se podría trabajar con otro micro que comparta las mismas direcciones de registro, pero de seguro la estructura interna no será exactamente igual a la del otro modelo ya que no tiene sentido tener dos modelos diferentes si son iguales. No lo veo nada claro.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #530 en: 14 de Marzo de 2009, 15:51:44 »
Pues lo he estado probando y me da lo mismo en el PSI que en la Pic EBasic.
Obtengo solo dos valores uno muy bajo y otro alto.

Para RA5=1, AN1 entre 0 y 5V, AN0=0, AN5=0

He tenido que hacer unas ligueras modificaciones, como cargar la EEProm con valores y anular la lectura de los RA2, RA3 y RA4 para no tener que polarizarlos. La EEProm la he cargado con valores ascendente no se como afectara esto.

Una vez cargados los valores de la EEProm el soft del programador del PSI los reconoce y los carga de forma automática, por lo que la operación solo hay que hacerla una sola vez y no se pierden aunque se compile.

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

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #531 en: 14 de Marzo de 2009, 19:03:29 »
Prueba a eliminar la linea osccon y pruebalo, entonces obtienes los valores de salida del PWM segun modifiques el an1

Se supone que la frecuencia del reloj ya la defines en la linea: Define CLOCK_FREQUENCY = 8

Pero sigo sin entender porque no funciona con la linea OSCCON

Yo la version del PSI es la 6.51 me estoy planteando comprar la actual, aunque me frena un poco el tema de que no tengo incluido el pic que comentaba, el 18f14k50 que tiene USB y es "pequeño", 20 patas

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #532 en: 14 de Marzo de 2009, 22:54:42 »
Bien, cambie los datos en la eeprom y ya funciona, me hace lo mismo en el PSI que en la realidad... :mrgreen:
Dejo los datos que he utilizado para la opcion RA5:



Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #533 en: 14 de Marzo de 2009, 23:02:07 »
No se que problema puedes tener pero a mi me funciona.

Clock_Frequency indica al compilador a que frecuencia trabajaremos pero no afecta al micro, esto quiere decir que el compilador puede hacer todos los cálculos para trabajar a 8Mhz pero el micro puede estar funcionado a otra frecuencia, como puede ser 4Mhz, por lo que todos los cálculos se alargan y puede que algunas funciones no funcionen bien.

Dejo el archivo de nuevo con los valores de la eeprom precargados.
« Última modificación: 14 de Marzo de 2009, 23:04:11 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #534 en: 15 de Marzo de 2009, 19:01:53 »
Te explico, en tu hex del 14 de marzo 00.48 me pasa lo mismo que cuando lo compilo yo, la respuesta no es segun los valores del PWM duty, simplemente, me va o parado o casi gas a fondo, no me regula segun los parametros que yo le he dado, y los siguientes ejemplos, supongo que son para la Ebasic, pues provado en el mando no da señal ninguna del PWM

En la ebasic, solo me parpadea el led pero al regular con el potenciometro no varia la frecuencia del parpadeo

Prueba a utilizar los valores de la memoria de 30(decimal) para arriba a ver si funciona que es cuando me falla a mi.,

Realmente no se cual puede ser el problema, pues a mi en el PSI tambien me simula bien

Sal u2

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #535 en: 15 de Marzo de 2009, 20:33:14 »
Claro lo he probado en la EBasic, el led que parpadea no tiene que variar de frecuencia tan solo es un chivato que delata cuando se ejecuta una rutina determinada, en este caso t3_ms, este es un método muy común para comprobar algo visualmente.

La EBasic es una placa entrenadora y en realidad no hay porque utilizarla con el display, si se retira el display queda el zócalo libre para poder interactuar como se quiera con esos pin y lo mismo con casi todos los de mas. Y si funciona bajo esta placa también debería funcionar en tu mando.

En fin o yo no te entiendo lo que ocurre.

De todas formas como la curiosidad me gana, puedes hacer me llegar el programa que te funciona, lo pruebo y una vez verificado que me funciona a mi también lo voy modificando sobre la marcha, añadiendo la nueva forma de leer el ADC y añadiendo las bases de tiempos.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #536 en: 16 de Marzo de 2009, 05:59:41 »
Te envio el programa que me funciona, pero a continuacion tambien te describo las pruebas que hice con lo que descubri lo de la linea osccon.

Este esl el codigo con el que probe, como veras tambien probe a anotar los bits de OSCCON por separado, con este codigo si activo la linea OSCCON, ya me falla. El resultado es que hasta un valor entre 25 o 30 puedo regular el mando y a partir de ahí ya empieza a darme el maximo, se supone que los 255 en el PWM

Será un Poltergeist?



Código: [Seleccionar]
'* * * * * * * * * * * * * adaptado para trabajar con el modulo adc sin interrupciones * * * * * * * * * * * * * *
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 1.0
''**************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5

Dim duty(15) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Word  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte

ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111  'Configuración input/output todo entradas menos el port b 3
TRISA = %11111111  'Configuración input/output todo entradas
CMCON = 0x07  'Comparador a off    "00000111"

'OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz "01111110"

'OSCCON.IRCF2 = 1  '= 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz "01111110"
'OSCCON.IRCF1 = 1
'OSCCON.IRCF0 = 1
ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA1
ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON

PWMon 1, 9
PWMduty 1, 0

'****************************************************************************
'Rutina principal
loop:
'Adcin 1, vg  'lee el valor del gatillo
ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 1  'Activa lectura 10bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
vg.HB = ADRESH  'ADC a 10bit
vg.LB = ADRESL  'ADC a 10bit
'vg = ADRESh  'ADC a 8 bit

Select Case vg
Case < 64
PWMduty 1, 0  'Freno
Case < 128
PWMduty 1, 10
Case < 192
PWMduty 1, 20
Case < 256
PWMduty 1, 30
Case < 320
PWMduty 1, 40
Case < 384
PWMduty 1, 50
Case < 448
PWMduty 1, 70
Case < 512
PWMduty 1, 90
Case < 576
PWMduty 1, 110
Case < 640
PWMduty 1, 130
Case < 704
PWMduty 1, 150
Case < 768
PWMduty 1, 170
Case < 832
PWMduty 1, 190
Case < 896
PWMduty 1, 200
Case < 960
PWMduty 1, 210
Case <= 1024
PWMduty 1, 230
EndSelect


Goto loop
End                                               



Y este es el código que me funciona, pero supongo que por lo que comentas a 4 mhz
Código: [Seleccionar]
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 2.0
'Utilización de interrupciones
''**************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5

Dim duty(15) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Word  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte
Dim i As Byte

'---------------Variables el timer-------------------
Dim t1_ms As Byte  'Base de tiempos del timer 1
Dim t1_ms_t As Byte  'Contiene el valor de t1_ms
Dim t2_ms As Byte  'Base de tiempos del timer 2
Dim t2_ms_t As Byte  'Contiene el valor de t2_ms
Dim t3_ms As Byte  'Base de tiempos del timer 3
Dim t3_ms_t As Byte  'Contiene el valor de t3_ms

'--------------Definición de puertos
ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111  'Configuración input/output
TRISA = %11111111  'Configuración input/output
CMCON = 0x07  'Comparador a off
'OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
'--------------Configuracion Interrupciones -----------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48

'-------------Carga los valores iniciales del timer ------------------------

t1_ms = 0
t2_ms = 0
t3_ms = 0
t1_ms_t = 1  'Valor para el  timer del P4  Arranque
t2_ms_t = 3  'Valor para el timer del P5 Curva
t3_ms_t = 10  'Valor para el timer del selector de curva

'---------------------Habilita las interrupciones --------------------------------------
T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
PIE1.TMR1IE = 1  'Activa la interrupcion del timer
INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales

'****************************************************************************


'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque

'Activo el PWM
PWMon 1, 9
PWMduty 1, 0

'Rutina principal
loop:
'For i = 1 To 240  'Bucle solo para pruebas de tiempos

'Leo el valor del gatillo
ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 1  'Activaria lectura 10bit del ADC
'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
vg.HB = ADRESH  'ADC a 10bit
vg.LB = ADRESL  'ADC a 10bit
'vg = ADRESH  'ADC a 8 bit

Select Case vg
Case < 64
PWMduty 1, 0  'Freno
Case < 128
PWMduty 1, duty(0)
Case < 192
PWMduty 1, duty(1)
Case < 256
PWMduty 1, duty(2)
Case < 320
PWMduty 1, duty(3)
Case < 384
PWMduty 1, duty(4)
Case < 448
PWMduty 1, duty(5)
Case < 512
PWMduty 1, duty(6)
Case < 576
PWMduty 1, duty(7)
Case < 640
PWMduty 1, duty(8)
Case < 704
PWMduty 1, duty(9)
Case < 768
PWMduty 1, duty(10)
Case < 832
PWMduty 1, duty(11)
Case < 896
PWMduty 1, duty(12)
Case < 1024
PWMduty 1, duty(13)
Case <= 255
PWMduty 1, duty(14)
EndSelect

If t1_ms >= t1_ms_t Then

'Leo el valor de p4 ADC 5
ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 1
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend

asn = ADRESH  'ADC a 8bit
If asn <> asa Then Gosub modificararranque
t1_ms = 0
Endif


If t2_ms >= t2_ms_t Then
'Leo el valor de p5 ADC 0
ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
mcn = ADRESH  'ADC a 8bit
If mcn <> mca Then Gosub modificarcurva
t2_ms = 0
t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
Endif

If t3_ms >= t3_ms_t Then

Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
t3_ms = 0

Endif

'next i  'Bucle para pruebas

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.5 = 1 Then cn = cn + 8

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
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
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

For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           



'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn

Return                                           
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return                                           

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)


mca = mcn
Return                                           

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

EndSelect
Return                                           

'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return                                           

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return                                           

EndSelect
Return                                           

'----------------------- Interrupciones ------------------------------------------
On Interrupt
Save System
If PIR1.TMR1IF = 1 Then
If t1_ms < t1_ms_t Then t1_ms = t1_ms + 1
If t2_ms < t2_ms_t Then t2_ms = t2_ms + 1
If t3_ms < t3_ms_t Then t3_ms = t3_ms + 1

Endif

TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
Resume                                           

Sal U2

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #537 en: 16 de Marzo de 2009, 06:08:37 »
Hasta donde se, si no indicas nada al PSI compilara a 4 Mhz y lo mismo el micro, si no le indicas la velocidad creo que queda configurado para trabajar a 4Mhz.

Yo siempre he utilizado el PSI con los programadores recomendados por el autor, no se si el utilizar programadores diferentes puede afectar en algo, de todas formas en las ultimas versiones creo que realizó algunas modificaciones en el código, puede que ahora sea más compatible..... si es que antes no lo era.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #538 en: 16 de Marzo de 2009, 06:27:59 »
Ya pero esto lo entenderia que no fuese compatible si tus ejemplos no me funcionasen en la Ebasic, pero tus ejemplos me funcionan, por eso creo que debe haber algo mas, utilizacion de alguna entrada del pic que no pueda utlizarse, en segun que condiciones, etc... , o algo asi.

Si quito, las dos lineas de configuracion Word y Word2, tampoco funciona.

Sal U2


Edito por si sirve de algo, si codifico OSCCON para 4 mhz, la salida PWM se me dispara al pasar del valor 40 ( en 8 mhz era entre 20 y 25), y a 2 mhz  a partir de 90, lo que casi me hace pensar que la frecuencia que entrega el pwm a 8 mhz es demasiado alta y "por decirlo de alguna forma" se satura, ¿ estoy diciendo alguna tonteria ? o puede ser. Si es asi,  quiza el problema este en el optoacoplador que utilizo, que puede que le llegue una frecuencia demasiado alta.


Reedito, Te confirmo que era la saturacion del optoacoplador, ahora he definido la frecuencia del PWM  a 1,8  (3900 hz segun el manual x 2 ) y el mando funciona a 8Mhz. Ahora tendre que decidir si utilizo una frecuencia mayor, porque me silba el motor,  para aumentarla deberia ser con 9 bits y eso implica modificar gran parte del programa y el uso de la memoria.



Pero sigo sin entender porque me funciona sin poner la linea OSCCON

« Última modificación: 16 de Marzo de 2009, 08:02:34 por 21CURIOSOS »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #539 en: 16 de Marzo de 2009, 09:32:08 »
Nunca se ha plateado problemas con el registro OSCCON así que haré un estudio del registro  a ver como se comporta por defecto en el PSI.

Y con respecto al CCP1 creo que lo mejor va a ser utilizar la configuración del modulo directamente, de todas formas lo mejor es hacer los cálculos a mano para hacerse una idea de las frecuencias y el numero de BIT, creo recordar que eso esta en el índice de este hilo, pero de todas formas tengo un enlace a una pagina que suministrando los datos de entrada ya hace los cálculos y da todos los valores para poder trabajar con el registro, a ver si lo encuentro.
Saludos desde Granada, España.


 

anything