Contenido>Indice>Intro CursoC51

PROGRAMACIÓN MODULAR EN C51


Salvo en los programas triviales, el trabajo desarrollado por el software se compone de pequeñas tareas, que deben identificarse antes de empezar a escribir código. Al igual que un sistema electrónico está formado por varios módulos que realizan funciones diferenciadas, un sistema software se construye mediante tareas discretas. En el ejemplo electrónico, cada módulo debe ser diseñado y perfeccionado individualmente antes de construir el equipo. Con el software, las tareas son bloques individuales que se deben reunir para lograr el objetivo final.

De esta forma, el programa completo tiene una estructura modular que le proporciona un formato racional. Las tareas son los bloques más grandes que pueden identificarse en el programa. Estas se construyen con módulos, o ficheros de código fuente creados con un editor. A su vez los módulos, en el caso del lenguaje C, se construyen utilizando funciones.

La base de la programación modular reside en agrupar las secciones de software según la función a que se encuentran asociadas.

Así un sistema para el control de un motor estaría formado por las siguientes tareas:

    Tarea 1
   Proporciona la temporización para los chispazos de los inyectores

    Tarea 2
   Proporciona pulsos de anchura controlada para la inyección del fuel

    Tarea 3
    Permite ajustar los parámetros desde un terminal

A su vez la Tarea 1, estaría formada por los siguientes módulos:

    Tarea 1, Módulo 1
    Determinación de la posición y velocidad del árbol de levas

    Tarea 1, Módulo 2
    Obtención del ángulo de disparo desde una tabla de valores

    Tarea 1, Módulo 3
    Medida de la carga del motor

El módulo 3 contiene una función C que utiliza un convertidor A/D para leer la tensión proporcionada por un sensor, siguiendo una secuencia fija. En el módulo 1, una función de interrupción asociada a una patilla de captura del µC, calcula la velocidad del motor y genera un pulso para la bobina de encendido. En el módulo 2 se encuentra el bucle principal que calcula el ángulo de disparo, basándose en la información proporcionada por otros módulos, sobre la velocidad y la carga del motor. Lógicamente las funciones que recolectan datos, deben pasarlos a las funciones que los procesan y a los que generan las señales. Ello exige que funciones residentes en diferentes módulos o ficheros, tengan la posibilidad de intercambiar valores. En este caso, el flujo de datos sería:

Módulo 1                      Módulo 2                   Módulo 3
Sensor
   |
Entrada de captura                                     Sensor de presión
   |                                                           |
Velocidad de motor ---->  Hallar ángulo de avance  <---  Carga del motor
   |                                |
Angulo de avance   <----------------|
   |
Salida de comparación
   |
Bobina de encendido

Generalmente, las variables se declaran en el módulo que les asigna un valor por primera vez. Por ello la variable carga_motor estaría definida en el módulo 3 que es quien le proporciona los datos de entrada. La declaración de los datos sería:

#define UCHAR unsigned char

Módulo_1.c                      Módulo_2.c                      Módulo_3.c 

/*Declaraciones globales*/ /*Declaraciones globales*/ /*Declaraciones globales */

UCHAR velocidad_motor       UCHAR avance               UCHAR carga_motor

/* Referencias externas */ /* Referencias externas */

extern UCHAR avance        extern UCHAR velocidad_motor, carga_motor

Es importante señalar que cuando un módulo hace referencia a una variable definida en otro módulo, debe declarar el tipo de esa variable utilizando el prefijo extern.

Ahora, con un programa que se extiende por varios módulos, surge el problema de la comunicación y la llamada a funciones entre diferentes módulos. 

La siguiente sección ilustra cómo se realiza el enlazado (linkado) entre módulos.

 

 


   Contenido>Indice>Intro CursoC51