Ver Mensaje Individual
  #12  
Antiguo 13-03-2008
Avatar de rretamar
[rretamar] rretamar is offline
Miembro Premium
 
Registrado: ago 2006
Ubicación: San Francisco, Córdoba, Argentina
Posts: 1.168
Reputación: 20
rretamar Va camino a la famarretamar Va camino a la fama
Cita:
Empezado por mamu Ver Mensaje
a. Al igual que en C, es muy cómodo, pero yo prefiero el assembler, es cuestión de gusto y de costumbre, pero a veces es cuestión de espacio.
También es cuestión de tiempo y productividad. En especial si es un desarrollo muy complejo.

Por ejemplo en esa placa que mostré (es la placa principal de un equipo de balanceo) usa cálculos angulares y de tensión con punto flotante (incluyendo cálculos trigonométricos), manejo de strings ("campos de edición" numéricos y alnanuméricos en un display LCD), almacenamiento de una tabla de piezas (con sus correspondientes campos), comunicación con la PC, etc. Si no hubiera usado un lenguaje de alto nivel todavía estaría programando.

Ejemplo de un procedimiento de ingreso numérico de datos por teclado, con validación (máximo y mínimo):

Código:
// Mostrar campo de entrada de datos numéricos validado (tipo Word, 5 caracteres de largo)
//
{$ifdef Modo_programacion}
Procedure InputWord(Fila, Columna: Byte; Minimo, Maximo: Word; Var Valor: Word);
Var
  Tecla, Longitud: Byte;
  Valor_Original: Word;
Begin
  Valor_Original:=Valor;                                                  // Respaldar variable (por si se presiona Esc)
  WordToStr(Valor,Cifras);
  Trim5(Cifras);                                                           // Elimina los espacios a la izquierda
  Repeat
    Repeat
      LCD_Cmd(LCD_BLINK_CURSOR_ON);                                       // Activar cursor parpadeante
      Mostrar_Cifras(Fila, Columna);                                      // Mostrar Valor actual
      Tecla:=KeyPressed;                                                  // Esperar hasta que se pulse una Tecla
      Longitud:=StrLen(Cifras);
      If (Longitud < 5) Then                                              // No añadir más de 5 caracteres
         If (Tecla<>Borrar) And (Tecla<>Esc) And                          // Solamente agregar caracteres numéricos
           (Tecla<>ENTER) And (Tecla<>Coma) Then
              StrAppendSuf(Cifras,Tabla_Teclas[Tecla - 1]);               // Agregar dígito al final
      If (Tecla = Borrar) And (Longitud > 0) Then                         // Eliminar el último dígito
        Borrar_Ultimo_Caracter(Cifras);
      Mostrar_Cifras(Fila, Columna);                                      // Actualizar valor en pantalla
      Valor:=Str2Word(Cifras);                                           // Convertir en Valor numérico (se reemplazó la función StrToWord por un bug que presenta en la conversión)
    Until (Tecla = ENTER) Or (Tecla = ESC);
    If ((Valor < Minimo) Or (Valor > Maximo)) And (Tecla <> Esc) Then    // Valor fuera de rango. Advertir con mensaje parpadeante
      LCD_Blink(Fila + 1,'Valor fuera de rango', 0, 6);
    LCD_Cmd(LCD_CURSOR_OFF);                                              // Desactivar cursor      
  Until (Tecla=ESC) Or ((Valor >= Minimo) And (Valor <= Maximo));         // Si Valor=correcto o Tecla=Esc, salir
  If Tecla=ESC Then 
    Begin
      WordToStr(Valor_Original, Cifras);
      Trim5(Cifras);
      Valor:=Valor_Original;                                // Si se presionó Esc, cancelar cambios
    End;  
  Mostrar_Cifras(Fila, Columna);                            // Visualizar Valor final
  Delay_Ms(300);                                            // Demora para que se visualice el Valor final
End;
{$endif}
Un procedimiento de cálculo:
Código:
//
// Analizar los datos capturados en vector Muestras y obtener: promedios angulares, promedios de tensión, máximos y mínimos
// Cálculo de la masa de desequilibrio actual
// Parámetros: número de Muestras -permite el promedio instantáneo a medida que se van adquiriendo los valores desde el uC secundario-
//
Procedure Analizar_Datos(Capturas: Word);
Var
  Contador: Word;
  Suma_Senos, Suma_Cosenos: Real;
Begin
  // Inicializar variables
  Ciclo.Angulo_Medio := 0;     // Promedios
  Ciclo.Valor_Medio  := 0;
  Ciclo.Delta_Valores:=0;      // Deltas
  Ciclo.Delta_Angulos:=0;
  Ciclo.Valor_Minimo:= 4095;   // Mínimos y máximos
  Ciclo.Valor_Maximo:= 0;
  Ciclo.Angulo_Minimo:= 359;
  Ciclo.Angulo_Maximo:= -359;
  //
  Suma_Senos:=0;
  Suma_Cosenos:=0;
  //
  For Contador:=1 To Capturas Do
    Begin
      // Actualizar acumulador de valores de tensión
      Ciclo.Valor_Medio  := Ciclo.Valor_Medio  + Muestras[ Contador ].Valor;
      // Actualizar mínimos y máximos de valores de tensión
      If Muestras[Contador].Valor > Ciclo.Valor_Maximo Then Ciclo.Valor_Maximo := Muestras[ Contador ].Valor;
      If Muestras[Contador].Valor < Ciclo.Valor_Minimo Then Ciclo.Valor_Minimo := Muestras[ Contador ].Valor;
      //
      // Calcular totales de senos y consenos (coordenadas x,y)
      Suma_Senos :=   Suma_Senos   + SIN( Radianes(Muestras [Contador].Angulo) );     // Obtener la suma de los senos   (coordenada y)
      Suma_Cosenos := Suma_Cosenos + COS( Radianes(Muestras [Contador].Angulo) );     // Obtener la suma de los cosenos (coordenada x)
    End;
  //
 // Obtener el ángulo medio a través del arco tangente de las coordenadas
  Ciclo.Angulo_Medio :=  Grados( ATAN2(Suma_Cosenos, Suma_Senos ) );
  If Ciclo.Angulo_Medio < 0 Then Ciclo.Angulo_Medio := Ciclo.Angulo_Medio + 360;  // Reducir ángulos "negativos"
  //
  // Reducir el ángulo a los primeros cuatro cuadrantes
  //
  Ciclo.Delta_Angulos:= Ciclo.Angulo_Maximo - Ciclo.Angulo_Minimo;
  //
  // Calcular diferencias entre máximos y mínimos para los valores de tensión
  Ciclo.Delta_Valores:= Ciclo.Valor_Maximo  - Ciclo.Valor_Minimo;
  // Promediar valores de tensión (siempre positivos o iguales a cero)
   Ciclo.Valor_Medio  := Ciclo.Valor_Medio  / Capturas;
  // Calcular porcentaje de delta T sobre T
  Ciclo.Porcentaje_DeltaT := (100 * Ciclo.Delta_Valores) / Ciclo.Valor_medio;
  // Calcular masa de desequilibrio
  Ciclo.Masa_de_desequilibrio:= Desequilibrio(Ciclo.Radio, Ciclo.Valor_medio, Ciclo.Velocidad, Configuracion.Constante_K );
  // Calcular Valor U medio ("cantidad de desbalanceo") g.mm
  Ciclo.U := Ciclo.Masa_de_desequilibrio * Ciclo.Radio;
End;
Aquí se usan los procedimientos para ingreso de datos desde teclado:

Código:
Procedure Ensayo_Automatico;
Var
  // Variables de respaldo de datos de Ciclo que se modificarán durante el ensayo
  Respaldo_Capturas: Word;
  Respaldo_Velocidad: Word;
Begin
  //
  Detener_motor;
  //
  Borrar_Pantalla;
  LCD_OutC(2,'Parametros');
  LCD_OutC(3,'del ensayo:');
  Delay_Ms(2000);
  Borrar_Pantalla;
  //
  // Permitir modificación de las variables de ensayo (Vmin, Vmax, intervalo)
  LCD_OutC(3,'ENTER: Confirmar');
  LCD_OutC(4,'ESC: No cambiar');
  //
  LCD_Out(1,1,'Vel. Min.:       rpm');
  InputWord(1, 12, 100, 1500 , Velocidad_Minima_ensayo);  // VMin: Valores permitidos: 100 a 1500 rpm
  LCD_Out(1,1,'Vel. Max.:       rpm');
  InputWord(1, 12, 100, 1500 , Velocidad_Maxima_ensayo);  // VMax: Valores permitidos: 100 a 1500 rpm
  LCD_Out(1,1,'Incremen.:       rpm');
  InputWord(1, 12, 1, 500 , Incremento_Velocidad_ensayo); // Incremento: Valores permitidos: 1 a 500 rpm
  LCD_Out(1,1,'Muestras :          ');
  InputWord(1, 12, 1, 300 , Numero_de_Capturas_Ensayo);   // Capturas: Valores permitidos: 1 a 300 rpm
  //
  Borrar_Pantalla;
  LCD_OutC(2,'Ensayo automatico');
  LCD_OutC(3,'Ciclo / Esc: Abortar');
  Direccionar_multiplexor(Salida_microcontrolador_principal);              // Direccionar salida de uC principal hacia port serie
  Usart_Write_Text('Inicio del ensayo'+#10+#13);                           // Enviar "encabezado"
  Delay_Ms(2000);
  // Respaldar variables de ciclo
  Respaldo_Capturas := Configuracion.Numero_de_capturas;                   // Respaldar número de Capturas
  Respaldo_Velocidad := Ciclo.Velocidad;                                   // Respaldar velocidad
  //
  Ciclo.Velocidad := Velocidad_Minima_Ensayo;                              // Setear velocidad minima inicial
  Configuracion.Numero_de_capturas := Numero_de_capturas_ensayo;           // Asignar número de Capturas al Valor de ensayo
  Repeat
     Arrancar_Motor(Ciclo.Velocidad, Ciclo.Sentido , Autodetencion_OFF);  // Arrancar motor
     Indicador_de_progreso;                                                // Mostrar indicador de progreso
     Realizar_Capturas;                                                    // Capturar datos
     Ciclo.Velocidad := Ciclo.Velocidad + Incremento_Velocidad_Ensayo;    // Incrementar velocidad del ensayo
  Until (Ciclo.Velocidad > Velocidad_maxima_ensayo) Or (Ultima_Tecla_Presionada = Pulsador_Ciclo) Or (Ultima_tecla_presionada = Esc); // Finalizar bucle
  // Restaurar variables de Ciclo modificadas durante el ensayo
  Configuracion.Numero_de_capturas := Respaldo_Capturas;                   // Restaurar número de Capturas
  Ciclo.Velocidad := Respaldo_Velocidad;                                   // Restaurar velocidad
  Detener_Motor;                                                           // Fin del ensayo: detener motor y Borrar pantalla
  Borrar_pantalla;
End;
Saludos !
End;

Última edición por rretamar fecha: 14-03-2008 a las 03:58:04.
Responder Con Cita