lunes, 5 de abril de 2010

Programar valores de calibración por defecto en el firmware

Una de las características del SARK100 es la capacidad de permitir la personalización completa del firmware por el usuario y de ser actualizado fácilmente por USB. Como la capacidad de la memoria flash del microcontrolador es limitada, en algunos casos puede ser necesario liberar algo de código para tener suficiente espacio para implementar otras funcionalidades.

Una de las posibilidades para disponer de más espacio, es prescindir de la porción de código utilizado para la calibración y programar los valores de calibración por defecto directamente en el firmware. Como valor añadido, al disponer de los valores de calibración de tu SARK100 en el firmware, no será necesario recalibrar el instrumento después de una actualización de firmware.

Antes de ponerte manos a la obra deberás conocer los procedimientos básicos para desarrollar en el PSoC,  conocer la teoría básica de funcionamiento del software del SARK100, y el procedimiento de actualización del software (descritos en las Secciones 12, 15, y Apéndice F del Manual de Usuario). Adenás deberás tener a mano un programa de comunicaciones, HyperTerminal por ejemplo, configurado a 57600, 8 , n, 1; y el puerto COM del SARK100.

El procedimiento consiste en varios pasos: primeramente configurar el firmware del SARK100 para enviar los valores de calibración por el puerto USB y actualizar el firmware, realizar la calibración y volcar los valores de calibración, modificar el firmware para incluir los nuevos datos de calibración, y opcionalmente comentar las rutinas de calibración.

Vamos paso por paso:

1) Configurar firmware para enviar valores de calibración

- Entra en PSoC Designer y abre el proyecto del firmware del SARK100: "SARK100_SwrAnalyzer_BL"
- Abre el fichero "calibrate_reflectometer.c".
- Cerca de la línea 55 encontrarás la siguiente sentencia:

//#define DEBUG 1 // Uncomment to debug calibration results on USB


- Quita el comentario:

#define DEBUG 1 // Uncomment to debug calibration results on USB

- Salva el archivo y construye (Build) el proyecto tecleando F7 por ejemplo.
- Actualiza el firmware por USB

2) Obtener los valores de calibración

- Con el nuevo firmware y el SARK100 conectado al PC por el puerto USB invoca el programa de terminal (HyperTerminal)
- Realiza la calibración siguiendo el procedimiento descrito en el Apéndice G del Manual de Usuario
- Una vez terminada la calibración los valores de calibración deberán aparecer en la ventana del HyperTerminal. El resultado debería ser similar al siguiente:

Band:0 G=4 VR.S=-80 VR.O=1041 VZ.S=-182 VZ.O=1054 VA.S=102 VA.O=1005
Band:1 G=4 VR.S=-115 VR.O=1049 VZ.S=-175 VZ.O=1054 VA.S=73 VA.O=1011
Band:2 G=4 VR.S=-116 VR.O=1051 VZ.S=-168 VZ.O=1053 VA.S=119 VA.O=1005
Band:3 G=5 VR.S=-103 VR.O=1049 VZ.S=-167 VZ.O=1053 VA.S=208 VA.O=991
Band:4 G=5 VR.S=-150 VR.O=1060 VZ.S=-162 VZ.O=1054 VA.S=256 VA.O=985
Band:5 G=5 VR.S=-118 VR.O=1054 VZ.S=-155 VZ.O=1051 VA.S=356 VA.O=973
Band:6 G=5 VR.S=-123 VR.O=1056 VZ.S=-143 VZ.O=1050 VA.S=534 VA.O=949
Band:7 G=6 VR.S=-119 VR.O=1056 VZ.S=-113 VZ.O=1044 VA.S=732 VA.O=917
Band:8 G=7 VR.S=-95 VR.O=1051 VZ.S=-96 VZ.O=1040 VA.S=1009 VA.O=875
Band:9 G=7 VR.S=-97 VR.O=1051 VZ.S=-80 VZ.O=1037 VA.S=1191 VA.O=851
Band:10 G=7 VR.S=-111 VR.O=1055 VZ.S=-72 VZ.O=1036 VA.S=1398 VA.O=825
Band:11 G=9 VR.S=-48 VR.O=1038 VZ.S=0 VZ.O=1020 VA.S=2584 VA.O=639
Band:12 G=11 VR.S=-549 VR.O=1131 VZ.S=205 VZ.O=975 VA.S=3987 VA.O=384

- Copia estos valores en el portapapeles y pégalos en un archivo de texto para su uso posterior

3) Modificar el firmware para incluir los datos de calibración

- Antes de que no se nos olvide, volvemos a comentar la línea 55 de "calibrate_reflectometer.c".

//#define DEBUG 1 // Uncomment to debug calibration results on USB

- Abre el fichero "glb_data.c". Aproximadamente la línea 113 encontrarás la siguiente inicialización del arreglo:
                                // Default band settings

const BRIDGE_CORRECT_DEFAULTS g_xDefBandSettings[BAND_MAX] =
{
// Gain, VR.Slope, VR.Offset, VZ.Slope, VZ.Offset, VA.Slope, VA.Offset,
{2 , {{-346, 1138}, {-239, 1069}, {-925, 1176}} }, //BAND_160M
{3 , {{-353, 1141}, {-213, 1064}, {-859, 1170}} }, //BAND_80M
{3 , {{-356, 1143}, {-215, 1066}, {-782, 1158}} }, //BAND_40M
{4 , {{-297, 1128}, {-174, 1056}, {-600, 1130}} }, //BAND_30M
{4 , {{-324, 1135}, {-168, 1056}, {-589, 1129}} }, //BAND_25M
{4 , {{-318, 1135}, {-171, 1056}, {-527, 1120}} }, //BAND_20M
{5 , {{-308, 1133}, {-146, 1052}, {-327, 1092}} }, //BAND_17M
{5 , {{-328, 1140}, {-150, 1054}, {-107, 1063}} }, //BAND_15M
{6 , {{-296, 1130}, {-112, 1045}, {123 , 1025}} }, //BAND_12M
{7 , {{-258, 1119}, {-119, 1046}, {265 , 1003}} }, //BAND_11M
{7 , {{-273, 1124}, {-95 , 1041}, {430 , 981}} }, //BAND_10M
{8 , {{-230, 1108}, {-63 , 1036}, {1600, 820}} }, //BAND_8M
{11 , {{-103, 1064}, {25 , 1012}, {2606, 644}} } //BAND_6M
};

- A partir de aquí te recomiendo utilizar un editor de textos que permita seleccionar bloques, ya que te será más fácil copiar y pegar los nuevos valores en el arreglo. Utilizando el botón derecho del ratón en TextPad selecciona "Block Select Mode".
- Primeramente borra los valores anteriores. Tendrás que ir columna por columna, teniendo cuidado de no borrar ninguna llave o coma. El resultado será el siguiente:

const BRIDGE_CORRECT_DEFAULTS g_xDefBandSettings[BAND_MAX] =
{
// Gain, VR.Slope, VR.Offset, VZ.Slope, VZ.Offset, VA.Slope, VA.Offset,
{ , {{, }, {, }, {, }} }, //BAND_160M
{ , {{, }, {, }, {, }} }, //BAND_80M
{ , {{, }, {, }, {, }} }, //BAND_40M
{ , {{, }, {, }, {, }} }, //BAND_30M
{ , {{, }, {, }, {, }} }, //BAND_25M
{ , {{, }, {, }, {, }} }, //BAND_20M
{ , {{, }, {, }, {, }} }, //BAND_17M
{ , {{, }, {, }, {, }} }, //BAND_15M
{ , {{, }, {, }, {, }} }, //BAND_12M
{ , {{, }, {, }, {, }} }, //BAND_11M
{ , {{, }, {, }, {, }} }, //BAND_10M
{ , {{, }, {, }, {, }} }, //BAND_8M
{ , {{, }, {, }, {, }} } //BAND_6M
};

- Copia y pega los valores de calibración que deberás tener guardados en un archivo de texto. Tendrás que ir columna por columna. El resultado final será:
const BRIDGE_CORRECT_DEFAULTS g_xDefBandSettings[BAND_MAX] =
{
// Gain, VR.Slope, VR.Offset, VZ.Slope, VZ.Offset, VA.Slope, VA.Offset,
{4 , {{-80 , 1041}, {-182, 1054}, {102 , 1005}} }, //BAND_160M
{4 , {{-115, 1049}, {-175, 1054}, {73 , 1011}} }, //BAND_80M
{4 , {{-116, 1051}, {-168, 1053}, {119 , 1005}} }, //BAND_40M
{5 , {{-103, 1049}, {-167, 1053}, {208 , 991}} }, //BAND_30M
{5 , {{-150, 1060}, {-162, 1054}, {256 , 985}} }, //BAND_25M
{5 , {{-118, 1054}, {-155, 1051}, {356 , 973}} }, //BAND_20M
{5 , {{-123, 1056}, {-143, 1050}, {534 , 949}} }, //BAND_17M
{6 , {{-119, 1056}, {-113, 1044}, {732 , 917}} }, //BAND_15M
{7 , {{-95 , 1051}, {-96 , 1040}, {1009, 875}} }, //BAND_12M
{7 , {{-97 , 1051}, {-80 , 1037}, {1191, 851}} }, //BAND_11M
{7 , {{-111, 1055}, {-72 , 1036}, {1398, 825}} }, //BAND_10M
{9 , {{-48 , 1038}, {0 , 1020}, {2584, 639}} }, //BAND_8M
{11 , {{-549, 1131}, {205 , 975 }, {3987, 384}} } //BAND_6M
};
 
- Salva el archivo y construye (Build) el proyecto tecleando F7 por ejemplo.

- Actualiza el firmware por USB
- A partir de aquí tendrás los valores de calibración por defecto ajustados para tu instrumento

4) Opcionalmente comentar las rutinas de calibración.
- Abre el archivo "calibrate_reflectometer.c"
- Comenta la rutina Calibrate_Reflectometer(), por ejemplo con compilación condicional:

void Calibrate_Reflectometer (void)

{
#if 0  // Comentado código de calibración
     ...
     ...

#endif
}

- Abre el archivo "main.c"
- Aproximadamente en la línea 140 comenta el siguiente bloque de código. El resultado será el siguiente:

#if 0
if (g_bIsCalibrated == FALSE) // If not calibrated presents warning text

{
    BUZZ_BeepError();
    DISP_Clear();
    LCD_Position(0, 0);
    LCD_PrCString(gErrorUncalibratedStr);
    LCD_Position(1, 0);
    LCD_PrCString(gPressAnyKeyStr);
    // Wait key press
    KEYPAD_WaitKey(TIME_DELAY_TEXT);
    DISP_Clear();
}
#endif

- Salva los archivos y construye (Build) el proyecto tecleando F7 por ejemplo.
- El nuevo firmware ocupará 2900 bytes menos de flash, lo que será siempre de agradecer para tener espacio extra para nuevas funcionalidades

No hay comentarios:

Publicar un comentario en la entrada