Autor Tema: mi servo no se queda quieto (NUEVO RETO)  (Leído 34454 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #60 en: 21 de Julio de 2007, 06:11:37 »
Esa misma pregunta la hice como hace unos 15 años o mas, jeje,
se me quedo grabada la respuesta, los compiladores deben optimizar
el código lo mas posible, que seria lo deseado por todos, pero no
debían de cambiar la sintaxis porque en algunos proceso se requiere
que una rutina determinada tarde un tiempo exacto, ya opere con
unos valores u otros. No se si será la respuesta correcta pero entonces
me pareció suficiente.. jeje.
Saludos desde Granada, España.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #61 en: 21 de Julio de 2007, 16:42:44 »
[...]los compiladores deben optimizar el código lo mas posible, que seria lo deseado por todos, pero no
debían de cambiar la sintaxis porque en algunos proceso se requiere que una rutina determinada tarde un tiempo exacto, ya opere con unos valores u otros.[...]

sabias palabras dogflu... nunca lo habia pensado, pero para mi y para muchos tal vez sea mejor optimizar el codigo al maximo, pero algun que otro listo hace rutinas que duran los ciclos exactos que ellos necesitan, y no puede venir el compilador y joderle el trabajo  :D

alguien sabe alguna pagina donde hablen de los ciclos que tardan las diferentes lineas de codigo? asi como formas de optimizarlo y todo eso... no esta de mas ir profundizando de vez en cuando  :-/
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #62 en: 22 de Julio de 2007, 17:05:44 »
:8} odio cuando algo no funciona y no se por que!!
como no tenia suficientes pines con el 12F683 para hacer las pruebas con 2 pot y 2 servos me pase al 16F88. usando el codigo adaptado que usaba antes no puedo hacer andar el servo con este micro!!! reduje el codigo hasta quedar solo 1 servo y lo basico.... no funciona

Código: C
  1. #include <16F88.h>
  2. #device adc=8
  3.  
  4. #include <math.h>
  5.  
  6. #FUSES NOWDT,INTRC_IO,NOMCLR,PUT,NOBROWNOUT,NOCPD,NOLVP,NOIESO,NODEBUG
  7. #use delay(clock=8000000)
  8. #use standard_io(a)
  9. #use standard_io(b)
  10.  
  11. #define SERVO1 PIN_B4
  12.  
  13. void rLeerADC(void);
  14.  
  15. int1 LeerADC = FALSE;        //indica si el tiempo del timer es menor a 2.5mS
  16. int8 PosicionServo1 = 15;    //posicion del servo1
  17. int16 ContInt = 0;            //cuenta cuantas veces ocurrio la interrupcion
  18.  
  19. #int_TIMER0
  20. TIMER0_isr() {
  21. //Timer 8bits -> 256 ticks = overflow
  22. //1 ciclo cada 0.5uS
  23. //prescaler 1:2 -> 1 tick cada 1uS
  24. //overflow cada 50uS (255 - 205)
  25.  
  26.    set_timer0(205);
  27.    ContInt = ContInt + 1;
  28.  
  29.    if(ContInt = PosicionServo1)
  30.       output_low(SERVO1);
  31.      
  32.    if(ContInt == 51)
  33.       LeerADC = TRUE;
  34.      
  35.    if(ContInt == 400){  //reinicia los 20mS
  36.       ContInt = 0;
  37.       output_high(SERVO1);
  38.    }
  39. }
  40.  
  41. void main() {
  42.  
  43.    setup_adc_ports(sAN1|VSS_VDD);
  44.    setup_adc(ADC_CLOCK_INTERNAL);
  45.    setup_spi(FALSE);
  46.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
  47.    setup_timer_1(T1_DISABLED);
  48.    setup_timer_2(T2_DISABLED,0,1);
  49.    setup_comparator(NC_NC_NC_NC);
  50.    setup_vref(FALSE);
  51.    enable_interrupts(INT_TIMER0);
  52.    enable_interrupts(GLOBAL);
  53.    setup_oscillator(OSC_8MHZ|OSC_INTRC);
  54.    
  55.    set_adc_channel(1);
  56.    set_timer0(205);
  57.    
  58.    do{
  59.       if(LeerADC = TRUE)
  60.          rLeerADC();
  61.    }while(TRUE);
  62. }
  63.  
  64. void rLeerADC(void){
  65.    int16 ValorADC;
  66.    
  67.    ValorADC = read_adc();
  68.    PosicionServo1 = 10 + floor(ValorADC * 0.15625);
  69.    LeerADC = FALSE;
  70. }

supongo que no estara bien configurado el pic... porque el codigo veo que es el mismo que usaba con el 12f683, y funcionaba...
alguien sabe si estoy configurandolo mal?
llevo todo el dia haciendo pruebas y no consigo nada  :(
salu2
« Última modificación: 25 de Julio de 2007, 15:23:44 por Marttyn »
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #63 en: 25 de Julio de 2007, 18:34:31 »
Siento no poder ayudarte en tu lenguaje,
te dejo un ejemplo para el 16F88 a ver
si te sirve la configuracion del micro para
hacerte algo de luz.


Código: FreeBasic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4.  
  5. '***************** Placa Entrenadora (PIC EBadic) ***************************************
  6. 'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_Servo_12
  7. 'Descripcion: Control de un servomotor (Futaba S3003) usando el ADC, Timer1, Interrupciones
  8. 'Micro: pic16f88 / 8mhz reloj interno
  9. 'version 1.2
  10. 'añado base de tiempos, 20 mSeg.
  11. 'suprimo "flag2_pwm"
  12. 'Version 11
  13. 'se fusiona la rutina de division con decimales
  14. 'para mostrar el tiempo del duty cycle en pantalla, minimo 0.43mSeg. y maximo 2.26mSeg.
  15. 'modificacion del formato de salida de la imformacion por el lcd
  16. 'Version: 1.0
  17. 'Fecha/Autor: 4/07, By COS
  18. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  19. 'uso del timer1 para controlar el PWM, de periodo 20mSeg.
  20. 'lectura de entrada analogica y conversion a tiempo
  21. 'conversion de tiempo a valores a cargar en el timer1
  22. '************************************************************************************************
  23. '-------------------------------------Puertos del LCD---------------------------------------------
  24. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  25. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  26. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  27. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  28. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  29. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  30. Define LCD_EBIT = 6  'se usara el RB6 como E
  31. 'Define LCD_RWREG = PORTA  'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
  32. 'Define LCD_RWBIT = 5  'se usara el RA5 como RW (si se suprime el compilador no protesta)
  33. Define LCD_COMMANDUS = 500  '2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
  34. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  35. Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  36. '****************************************************************************************************
  37. Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
  38. '--------------------------------------Reasignacion de nombres---------------------------------------
  39. Symbol led_amarillo = PORTA.7  'led amarillo
  40. Symbol led_verde = PORTB.0  'led verde
  41. Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
  42. '------------------------------------declaracion de variables---------------------------------------
  43. '-------------------------------Bases de tiempos,variables--------------------------------------
  44. Dim timer1_20ms As Word  'base de tiempos, 20mSeg
  45. Dim timer1_20ms_tiempo As Word  'tiempo a temporizar por la base de tiempos * 20mSeg
  46. '-------------------------------Variables del ADC y Rutina division------------------------------
  47. Dim entero As Word  'parte entera
  48. Dim decimal As Word  'los dos decimales
  49. Dim division As Long  'almacenara el numero con los dos decimales
  50. Dim factor_escala As Word  'situa la parte entera del numero
  51. Dim reg_timer1 As Word  'valor maximo que puede contener el registro del TMR1
  52. Dim tiempo_ms As Word  'tiempo a on de la señal de control del servo en mSeg.
  53. Dim aux_adc_4 As Word  'auxiliar
  54. Dim adc_4 As Word  'contiene el valor de la entrada ADC
  55. '----------------------------------------variables calculo y control PWM-----------------------------
  56. Dim pwm As Word  'variable de paso
  57. Dim pwm_nop As Word  'variable de paso
  58. Dim aux_pwm As Long  'calculo del tiempo a ON, de la señal de control
  59. Dim aux_pwm_nop As Long  'calculo del tiempo a OFF, de la señal de cotrol
  60. Dim timer_pwm As Word  'valor del tiempo a on, para ser interpretado
  61. Dim timer_pwm_nop As Word  'valor del tiempo a off, para ser interpretado
  62. Dim flag1_pwm As Byte  'variable que determina si ON o a OFF de la señal de control
  63. '------------------------------------asignacion de valores a las variables--------------------------
  64. pwm = 62535
  65. pwm_nop = 28535
  66. aux_pwm = 62535
  67. flag1_pwm = 1
  68. entero = 0
  69. decimal = 0
  70. division = 0
  71. adc_4 = 0
  72. reg_timer1 = 65535  'maximo valor registro de 16 bit del TMR1
  73. factor_escala = 100  'factor de escala para dos decimal
  74. timer1_20ms_tiempo = 2  '40 mSeg.
  75. timer1_20ms = timer1_20ms_tiempo
  76. '------------------------------------Definicion de puertos------------------------------------------
  77. Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
  78. Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg,
  79.                                                                 'configuracion adc
  80. '_______________registros afectados por Define ADC_CLOCK y ADCIN________________
  81. ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
  82. ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
  83. ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division
  84.                                                         'clock/2 ADCON1.ADCS2=1
  85. '_______________________________________________________________________________
  86. CMCON = 0x07  'comparador a off
  87. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  88. OSCTUNE = 2  'factor de correcion del reloj
  89. TRISA = 0x00  'Puerto A como salidas
  90. TRISB = 0x00  'puerto B como salidas
  91. TRISA.4 = 1  'como entrada (RA4, adc)
  92. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  93. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  94. PORTB.3 = 1  'luz lcd a on (RB3)
  95. PORTA.7 = 1  'led amarillo a off, negado
  96. PORTB.0 = 1  'led verde a off, negado
  97. '------------------------------------Inicializacion de Interrupciones-----------------------------
  98. T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
  99. T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
  100. T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
  101. TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
  102. TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
  103. T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
  104. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  105. Enable  'INTCON.GIE habilita todas las interrupciones globales
  106. '------------------------------------Inicio-------------------------------------------------------
  107. Lcdinit  'inicializa el lcd sin cursor
  108. WaitMs 1000  'espera 1Seg
  109. Lcdout "LCD_Tmr1_ADC_PWM"  'escribe en el lcd
  110. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  111. Lcdout "Servo S3003"  'escribe en el lcd
  112. WaitMs 3000  'espera 3Seg
  113. Lcdcmdout LcdClear  'borra el display
  114. PIE1.TMR1IE = 1  'activa las interrupciones del timer1
  115. '------------------------------------rutinas del Programa----------------------
  116. main:  'comienza el programa principal
  117.         If timer1_20ms >= timer1_20ms_tiempo Then
  118.                 Gosub lee_adc  'salto con retorno a la rutina de lectura del ADC
  119.                 aux_pwm = ((adc_4 + 240) * 250) / (1023 + 370)  'tiempo a ON de la señal de control del servo
  120.                 '240 y 370 fijan los valores minimo y valores maximos del duty cycle
  121.                 aux_pwm_nop = 2000 - aux_pwm  'calculo del tiempo de la señal de control a OFF
  122.                 aux_pwm_nop = 65535 - ((aux_pwm_nop * 100) / 5)  'valor a cargar en el timer1, OFF
  123.                 aux_pwm = 65535 - ((aux_pwm * 100) / 5)  'valor a cargar en el timer1, ON
  124.                 pwm = aux_pwm  'se cambia de long a word, para acelerar la rutina de interrupciones
  125.                 pwm_nop = aux_pwm_nop  'se cambia de long a word, para acelerar la rutina de interrupciones
  126.                 Gosub print_lcd  'salto con retorno a la rutina que muestra los dato por el display
  127.                 tiempo_ms = ((reg_timer1 - pwm) * 5) / 100  'calculo en mSeg.
  128.                 division = dvsion_dcmles(tiempo_ms, factor_escala)  'llama a la funcion dvsion_dcmles,
  129.                                                                                                                                                         'que retorna un Long
  130.                 Gosub formato_decimales  'extrae e imprime con formato decimal
  131.                 timer1_20ms = 0
  132.         Endif
  133. Goto main  'impide que termine el programa principal
  134. End  'es conveniente ponerlo siempre segun el manual
  135. formato_decimales:  '____________________da formato a los decimales y los saca por el lcd
  136.         entero = division.HW  'sede el word alto a entero, parte entera
  137.         decimal = division.LW  'sede el byte alto del word bajo a decimal_1
  138.         Lcdout #entero, "."  'muestra los datos en el lcd
  139.         If decimal < 10 Then Lcdout "0"  'mantiene la plantilla de los decimales, quitar para 1 decimal
  140.         Lcdout #decimal, "         "  'muestra los datos en el lcd
  141. Return                                            
  142. '--------------------------------------Subrrutina lectura ADC
  143. lee_adc:  '_______________________lee la entrada analogica
  144.         Adcin 4, adc_4  'lee el valor de la entrada analogica y lo carga en adc_4
  145. Return                                            
  146. print_lcd:  '____________________muestra los datos por el display
  147.         Lcdcmdout LcdLine1Home  'cursor al principio
  148.         Lcdout "ADC--TMR1--mSeg."  'magnitudes
  149.         Lcdcmdout LcdLine2Home  'selecciona la linea dos del lcd y cursor a inicio
  150.         If adc_4 < 1000 Then Lcdout "0"  'para mantener la plantilla
  151.         If adc_4 < 100 Then Lcdout "0"  'para mantener la plantilla
  152.         If adc_4 < 10 Then Lcdout "0"  'para mantener la plantilla de salida
  153.         Lcdout #adc_4, " ", #pwm, " "  'muestra los datos en el lcd
  154. Return                                            
  155. '________Argumentos de entrada dos variables tipo word, dividendo y divisor,
  156. '________argumento de salida una variable tipo Long
  157. Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '_Rutina funcion division con decimales
  158.         Dim f_entera As Word  'variable local, contendra la parte entera
  159.         Dim f_resto As Word  'varable local, contendra el resto
  160.         Dim f_decimal As Long  'contendra la parte decimal
  161.         f_entera = dvdo / dvsor  'obtengo la division
  162.         f_resto = dvdo Mod dvsor  'obtengo el resto
  163.         f_decimal = (f_resto * 100) / dvsor  'Multiplicar 1xx seguido de tantos ceros como decimales
  164.         dvsion_dcmles.HW = f_entera  'almacena la parte entera en el word alto
  165.         dvsion_dcmles.LW = f_decimal  'almacena la parte decimal word bajo
  166.         'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla
  167.         'especial en este caso de dos digitos
  168. End Function                                      
  169. '--------------------------------Interrupciones---------------------------------------------------
  170. On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
  171. 'Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
  172. '___________Rutina generadora del PWM, para la entrada de control del servomotor
  173.         If flag1_pwm = 1 Then  'controla el tiempo de la señal del servo a OFF
  174.                 RB4 = 0  'salida del servo a OFF
  175.                 TMR1H = timer_pwm_nop.HB  'recarga el contador del timer1 para que desborde, tiempo a off
  176.                 TMR1L = timer_pwm_nop.LB  'recarga el contador del timer1 para que desborde, tiempo a off
  177.                 flag1_pwm = 0  'permite la alternancia entre señal del servo a ON o a OFF
  178.                 timer_pwm = pwm  'recarga la rutina con los nuevos valores del potenciometro
  179.                 timer_pwm_nop = pwm_nop  'recarga la rutina con los nuevos valores del potenciometro
  180.                 If timer1_20ms < timer1_20ms_tiempo Then timer1_20ms = timer1_20ms + 1
  181.         Else
  182.                 RB4 = 1  'salida de la señal de contol del servo a ON
  183.                 TMR1H = timer_pwm.HB  'recarga el contador del timer1 para que desborde, tiempo a on
  184.                 TMR1L = timer_pwm.LB  'recarga el contador del timer1 para que desborde, tiempo a on
  185.                 flag1_pwm = 1  'permite la alternancia entre señal del servo a ON o a OFF
  186.         Endif
  187.         PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
  188. Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
  189. End
Saludos desde Granada, España.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #64 en: 30 de Julio de 2007, 23:05:34 »
dogflu, estuve mirando tu codigo y me cuesta un poco entenderlo... pero tampoco me soluciona nada, porque me di cuenta que el fallo no esta en la configuracion del pic, sino que al programarlo, no se graba la configuracion (la posicion 0x2007 no tiene lo que deberia), todo lo demas se graba correctamente, excepto la configuracion... :cry:
estoy viendo que esto tambien me ocurre con los pic 16f648a...
es raro porque hace unos dias funcionaba todo bien
no se q podra ser...
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #65 en: 02 de Agosto de 2007, 18:58:03 »
Efectivamente a=a+1 es igual a a += 1 y necesita tres posiciones de memoria, dos para los operandos (la variable "a" y "1") mas una posición para la operación con los operandos (+). Sin embargo ++a y a++ solo utilizan dos posiciones, una para la variable y otra para la operación (el 1 es implicito, mientras con la otra instrucción puedes incrementar lo que quieras, con esta solo puedes incrementar la unidad).

Un saludo.

es curioso, apartandome un poco del tema de los servos y volviendo sobre la cantidad de instrucciones que ocupa algo, me di cuenta de lo siguiente:
en el codigo, "ServoActivo" es una variable INT1
Código: C
  1. if(input(PIN_A0) == TRUE)
  2.    ServoActivo = FALSE;
  3. else
  4.    ServoActivo = TRUE;
esto ocupa 12 posiciones de memoria

ahora, hacer esto:
Código: C
  1. ServoActivo = !input(PIN_A0);
ocupa 8 posiciones de memoria...

y esto:
Código: C
  1. ServoActivo = input(PIN_A0);
ocupa 6 posiciones de memoria... aunque en este caso nos daria el valor contrario a los anteriores, para quie esto no ocurra se puede invertir la la logica del hard...

con lo que evitando el if ya ahorramos 4 posiciones... y si nos evitamos la negacion, nos ahorramos 2 posiciones mas...
jfh900 o alguno que entienda mas a fondo el compilador podria decirme que es lo que se compila en cada caso?
y sobre todo... una posicion de memoria se ejecuta en un cliclo? por ejemlo, si mi micro corre a 4mhz, tardare 10uS en ejecutar 10 posiciones de memoria?
gracias y ahora me pongo otra vez con lo servos  :D
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #66 en: 03 de Agosto de 2007, 02:05:09 »
Por alguna razón, tu versión de CCS y la mía no compilan de la misma forma, y la mía compila mejor.

Código: [Seleccionar]
....................    if(input(PIN_A0) == TRUE)
03C0:  MOVLW  00
03C2:  BTFSC  F80.0
03C4:  MOVLW  01
03C6:  SUBLW  01
03C8:  BNZ   03CE
....................          ServoActivo = FALSE;
03CA:  CLRF   2C
....................      else
03CC:  BRA    03D2
....................          ServoActivo = TRUE;
03CE:  MOVLW  01
03D0:  MOVWF  2C

Este primer caso lo compila en 9 instrucciones en lugar de 12.

Código: [Seleccionar]
....................    ServoActivo = !input(PIN_A0);
03D2:  CLRF   2C
03D4:  BTFSS  F80.0
03D6:  INCF   2C,F

Aquí ocupa sólo 3 posiciones en lugar de las 6 que te ocupa a ti.

Código: [Seleccionar]
....................    ServoActivo = input(PIN_A0);
03D8:  CLRF   2C
03DA:  BTFSC  F80.0
03DC:  INCF   2C,F

Y por supuesto, su negación ocupa exactamente lo mismo porque no tiene lógica que ocupe menos: 3 posiciones.

Utilizo la versión 3.242 y estos listados de assembler los puedes ver tú mismo en el menú View -> C/ASM List.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #67 en: 03 de Agosto de 2007, 13:40:43 »
tienes media verdad manolo.... y yo tengo la otra  :P
estuve haciendo unas cuantas pruebas y llegue a la conclusion que tu tienes declarado el puerto como "fast_io"... y yo lo tenia como "standard_io" es por eso las diferencias en la cantidad de instrucciones.
la verdad nunca me habia parado a pensar en esto, siempre use standard para olvidarme de tener que configurar los puertos, pero por lo visto compensa bastante tenerlos declarados correctamente. sobre todo en el tema de los servos, porque como hemos visto antes, mientras menos instrucciones, menos retrasos y mejor funcionaran.
ya puedo tener por seguro que usando esto puedo aumentar la presicion para el el tema de controlar 2 servos. en el programa que estoy haciendo ahora controlaba 4 servos (sin pot) y pase de 56 a 28 instrucciones en el timer1 solo con esto!!
y por cierto... el fixed_io, usa 7 instrucciones para hacer lo mismo... por lo visto el fast_io es el mejor... :-/
lo que no entiendo es porque a ti te compila con instrucciones diferentes que las mias usando los dos el fast:
el tuyo:
Código: ASM
  1. ....................    ServoActivo = input(PIN_A0);
  2. 03D8:  CLRF   2C
  3. 03DA:  BTFSC  F80.0
  4. 03DC:  INCF   2C,F

y el mio:
Código: ASM
  1. ....................       ServoActivo = input(PIN_A0);
  2. 0011:  BCF    20.0
  3. 0012:  BTFSC  05.0
  4. 0013:  BSF    20.0

sera porque usamos pics diferentes? el mio es un 16f88...
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #68 en: 03 de Agosto de 2007, 13:43:15 »
Pos va a ser que sí, el mío es un 18F4550.
Enhorabuena, ya va saliendo.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #69 en: 10 de Agosto de 2007, 13:26:37 »
Una pregunta Manolo, en:

Código: [Seleccionar]
....................    ServoActivo = !input(PIN_A0);
03D2:  CLRF   2C
03D4:  BTFSS  F80.0
03D6:  INCF   2C,F

Desde 03D2 a 03D6 van 5 posiciones de memoria y si tenemos en cuenta que para la última instrucción hacen falta dos posiciones (instrucción + operando) eso nos daría 6 posiciones de memoria (tres instrucciones que ocupan 6 posiciones de memoria), no?

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #70 en: 10 de Agosto de 2007, 13:37:52 »
Sí, Jesús, exacto, cuando dije posiciones debía haber dicho instrucciones.

Desconectado mandoanaiz

  • PIC10
  • *
  • Mensajes: 47
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #71 en: 30 de Agosto de 2007, 11:51:16 »
Help, Houston tengo un froblema.
Habia hecho algo parecido que no terminaba de funcionar como debe de ser, y por esas cosas del curro se traspapeló, al ver el hilo me he estudiado el programita (por cierto mejor hecho que el mio) y al simularlo en protues me da un error con la simulación del rotor.dll y otras cosas raras, alguien sabe como solucionarlo?
Gracias de antemano.
PD adjunto una imagen de los errores.