trabajo css lenguaje c
TRANSCRIPT
INTRODUCCION
C es un lenguaje de aplicación general desarrollado por Dennies
Ritchie en el año 1972 en los laboratorios Bell de la empresa AT&T para
implementar el sistema operativo UNIX. A partir de ese momento su
creciente utilización, unida al aumento de la popularidad de los
microcontroladores, hizo que numerosas compañías desarrollaran su
propia versión de C. Por ello en el año 1983 el Instituto de Normalización
Nacional Americano ANSI (American National Standars Institute) decidió
crear un comité para establecer una definición normalizada,
independiente del sistema físico y del sistema operativo en el que se
ejecuten los programas escritos en el lenguaje C. Nació de esta manera,
el ANSI C.
Este lenguaje posee instrucciones que actúan de forma individual
sobre los bits de una combinación binaria al igual que un lenguaje
ensamblador o de bajo nivel, y las combina con potentes instrucciones de
control de flujo (saltos condicionales, etc.), típicas de los lenguajes de
alto nivel.
Además, el lenguaje C proporciona, entre otras, las siguientes ventajas:
Permite realizar programas estructurados y modulares.
Se pueden realizar en él expresiones compactas.
Posee un elevado número de operadores y de tipos de datos.
Reemplaza ventajosamente al lenguaje ensamblador.
Se puede utilizar en un amplio abanico de aplicaciones (programas de Gestión, cálculos matemáticos, diseño de sistemas digitales
implementados con micro controladores, etc.)
Genera programas en lenguaje máquina muy optimizados. Es fácil de aprender
COMPILADOR CCS
Un compilador convierte el lenguaje de alto nivel a instrucciones en
código maquina; un cross-compiler es un compilador que funciona en un
procesador (normalmente en un PC) diferente al procesador objeto. El
compilador CCS C es un cross-compiler. Los programas son editados y
compilados a instrucciones maquina en el entorno de trabajo del PC, el
código maquina puede ser cargado del PC al sistema PIC mediante el
ICD2 ( o mediante cualquier programador) y puede ser depurado (puntos
de ruptura, paso a paso, etc.) desde el entorno del trabajo del PC.
El CCS C es C estándar y, además de las directivas estándar
(#include, etc.), suministra unas directivas especificas para PIC (#device,
etc.); además incluye funciones específicas (bit_set(),etc.). se suministra
con un editor que permite controlar la sintaxis del programa.
Ficheros de Directivas y Encabezamiento (.h)
Estos ficheros contienen directivas, que son instrucciones al
compilador pero normalmente no incluyen sentencias de un programa.
Los ficheros de Encabezamiento (de extensión .h) contienen
información sobre los registros existentes para un determinado micro,
también definen el tratamiento a dar a las funciones integradas en
“librería” por el compilador en cuanto a argumentos que aceptará y los
que devolverán a cada función.
Estos ficheros están pensados para ser incluidos en el código fuente
mediante una directiva del tipo: #include <16f628a.h> que buscaría el
fichero 16f877.h en un directorio distinto al del código fuente, mientras
que con comillas (“ “)
#include “16f628a.h”
Haría que la búsqueda tuviera lugar en el directorio actual donde está la
fuente.
DEFINICIÓN DE FUNCIÓN
El formato de la definición de una función es como sigue:
[calificador_tipo] identificador ([[especificador_tipo identificador]) {
[Cuerpo de la función]
}
El calificador tipo para una función puede ser:
void o un especificador de tipo
La definición de una función puede ir precedida por una de las
siguientes directivas del pro procesador (calificadores de función) para
identificar una característica especial de la función:
#separate #inline #int_...
Cuando utilizamos una de las directivas mencionadas y la función
tiene un prototipo (declaración anterior a la definición de la función, y
colocada al principio del fichero fuente) hay que incluir la misma
#directiva en el prototipo y en la definición de la función.
Una característica no muy corriente, se ha añadido al compilador
para ayudar a evitar los problemas creados por el hecho de que no
pueden crearse punteros a constantes de cadenas.
Una función que tiene un parámetro de tipo char aceptará una
constante de cadena. El compilador generará un bucle que llama a la
función una vez para cada carácter de la cadena.
Ejemplo:
void lcd_putc(char c ) { // definición de la función
...
}
lcd_putc ("Máquina parada".);
Estructura de un programa en C
De forma generalizada, la estructura de un programa en C tiene el
siguiente aspecto:
Declaraciones globales
Prototipos de funciones
main() {
Variables locales;
Bloque de sentencias;
Llamadas a las funciones;
}
funcion_1() {
Variables locales a funcion_1;
Bloque de sentencias;
Llamada a otra/s funciones;
}
funcion_n() {
…
}
LIBRERÍAS INCORPORADAS
#USE DELAY (CLOCK=frecuencia)
Esta directiva indica al compilador la frecuencia del procesador, en ciclos
por segundo, a la vez que habilita el uso de las funciones DELAY_MS() y
DELAY_US().
Opcionalmente podemos usar la función restart_WDT() para que el
compilador reinicie el WDT durante el retardo.
Ejemplos:
#use delay (clock=20000000)
#use delay (clock=32000, RESTART_WDT)
#USE FAST_IO (puerto)
Esta directiva afecta al código que el compilador generará para las
instrucciones de entrada y salida. Este método rápido de hacer I/O
ocasiona que el compilador realice
I/O sin programar el registro de dirección. El puerto puede ser A-G.
Ejemplo:
#use fast_io(A)
#USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...) Esta directiva afecta al código que el compilador generará para las
instrucciones de entrada y salida. El método fijo de hacer I/O causará que
el compilador genere código para hacer que un pin de I/O sea entrada o
salida cada vez que se utiliza. Esto ahorra el byte de RAM usado en I/O
normal.
Ejemplo:
#use fixed_io(a_outputs=PIN_A2 ,PIN_A3)
#USE I2C (master/slave, SDA=Pin, SCL=Pin opciones) La librería I2C contiene funciones para implementar un bus I2C. La
directiva #USE I2C permanece efectiva para las funciones I2C_START,
I2C_STOP, I2C_READ,
I2C_WRITE e I2C_POLL hasta que se encuentre otra directiva #USE
I2C.
Se generan las funciones software a menos que se especifique la opción
NOFORCE_SW. El modo SLAVE sólo debe usarse con las funciones SSP.
Las opciones son:
OPCIONES:
MASTER Establece el modo maestro o principal
SLAVE Modo esclavo
SCL=pin Especifica el pin SCL (es un bit de dirección)
SDA=pin Especifica el pin SDA
ADDRESS=no Especifica la dirección del modo esclavo
FAST Usa la especificación rápida I2C
SLOW Usa la especificación lenta I2C
RESTART_WDT Reinicia el WDT mientras espera en I2C_READ
NOFORCE_SW Usa funciones hardware I2C
Ejemplos:
#use I2C(master, sda=PIN_B0, scl=PIN_B1)
#use I2C(slave,sda=PIN_C4,scl=PIN_C3 address=0xa0,NOFORCE_SW)
#USE RS232 (BAUD=baudios, XMIT=pin, RCV=pin...)
Esta directiva le dice al compilador la velocidad en baudios y los pines
utilizados para la I/O serie. Esta directiva tiene efecto hasta que se
encuentra otra directiva RS232.
La directiva #USE DELAY debe aparecer antes de utilizar #USE
RS232. Esta directiva habilita el uso de funciones tales como GETCH,
PUTCHAR y PRINTF. Si la I/O no es estándar es preciso poner las
directivas FIXED_IO o FAST_IO delante de #USE RS232
OPCIONES:
RESTART_WDT
Hace que GETC() ponga a cero el WDT mientras espera un carácter.
INVERT
Invierte la polaridad de los pines serie (normalmente no es
necesario con el convertidor de nivel, como el MAX232). No puede usarse
con el SCI interno.
PARITY=X Donde X es N, E, u O.
BITS =X Donde X es 5-9 (no puede usarse 5-7 con el SCI).
FLOAT_HIGH Se utiliza para las salidas de colecctor abierto.
ERRORS
Indica al compilador que guarde los errores recibidos en la variable
RS232_ERRORS para restablecerlos cuando se producen.
BRGH1OK
Permite velocidades de transmisión bajas en chips (uC's, memorias,
etc) que tienen problemas de transmisión. Cuando utilizamos dispositivos
con SCI y se especifican los pines SCI, entonces se usará el SCI. Si no se
puede alcanzar una tasa de baudios dentro del
3% del valor deseado utilizando la frecuencia de reloj actual, se
generará un error.
ENABLE=pin El pin especificado estará a nivel alto durante la
transmisión.
FORCE_SW
Usa una UART software en lugar del hardware aun cuando se
especifican los pines del hardware.
La definición de RS232_ERRORS es como sigue:
Sin UART:
El bit 7 es el 9º bit para el modo de datos de 9 bit.
El bit 6 a nivel alto indica un fallo en el modo flotante alto.
Con UART:
Usado sólo para conseguir:
Copia del registro RCSTA, excepto: que el bit 0 se usa para indicar un
error de paridad.
Ejemplo:
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3)
#USE STANDARD_IO (puerto)
Esta directiva afecta al código que el compilador genera para las
instrucciones de entrada y salida. El método standar de hacer I/O causará
que el compilador genere código para hacer que un pin de I/O sea
entrada o salida cada vez que se utiliza. En los procesadores de la serie
5X esto necesita un byte de RAM para cada puerto establecido como I/O
estandar.
Ejemplo:
#use standard_io(A)
La declaración for sirve para establecer un ciclo manejado por una
variable que consiste en tres partes principales: la variable de inicio,
hasta cuando terminará y la manera de aumentar esta variable.
For se declara de la siguiente manera:
for ( i = 0; i < 9; i++) {
// declaraciones
}
Para utilizar esta declaración primero se escribe la palabra for, a
continuación y entre paréntesis se escriben las tres condiciones: primero
el valor inicial de la variable, en este caso es i = 0; después la condición
para que se realicen las declaraciones, o sea, mientras i sea menor que 9
( i < 9 ) la declaración se efectuará; y por último el incremento o
decremento de la variable ( i++ ); las declaraciones son la serie de
funciones que se llevarán a cabo mientras i < 9. Las declaraciones
pueden incluir prácticamente lo que sea, puede ser funciones o lo que
desees. Las declaraciones de las variables van separadas por un punto y
coma ( ; ), pero las tres van entre paréntesis. No es necesario que la
variable sea i, puede tener el nombre que tú quieras como counter o
cualquier palabra que se te ocurra. El valor de la variable, como hemos
visto, no tiene que ser necesariamente numérico, puede ser igual a otra
variable o elemento.
Las declaraciones van entre { }
Ejemplo:
for ( i=0; i<14; i++) {
alert ("El valor de i es igual a " + i )
}
< name="forma">
En el siguiente ejemplo aparecerá, al iniciarse la rutina, un mensaje que
indicará el valor actual de i, el mensaje se repetirá hasta que el valor de i
sea menor que 14 (i < 14)
o sea que el mensaje sera "El valor de i es igual a 0", "El valor de i es
igual a 1", etc
FUNCIONES DE I/O DISCRETA
INPUT(pin)
Devuelve el estado '0' o '1' de la patilla indicada en pin. El método
de acceso de I/O Depende de la última directiva #USE *_IO utilizada. El
valor de retorno es un entero corto.
Ejemplo:
while ( !input(PIN_B1) );
Nota: El argumento para las funciones de entrada y salida es una
dirección de
bit. Por ejemplo, para el bit 3º del port A (byte 5 de los SFR) tendría un
valor
Dirección de 5*8+3=43.
Esto se puede definir como sigue: #define pin3_portA 43. Los pines o
patillas de los dispositivos están definidos como PIN_XX en los archivos
de cabecera *.H. Éstos, se pueden modificar para que los nombres de los
pines sean más significativos para un proyecto determinado.
OUTPUT_BIT(pin, value)
Esta función saca el bit dado en value(0 o 1) por la patilla de I/O
especificada en pin. El modo de establecer la dirección del registro, está
determinada por la última directiva
#USE *_IO.
Ejemplo:
output_bit( PIN_B0, 0); // es lo mismo que output_low(pin_B0);
output_bit( PIN_B0,input( PIN_B1 ) ); // pone B0 igual que B1
output_bit( PIN_B0, shift_left(&data, 1, input(PIN_B1)));
// saca por B0 el MSB de 'data' y al mismo tiempo
// desplaza el nivel en B1 al LSB de data.
OUTPUT_HIGH(pin)
Pone a 'uno' el pin indicado. El método de acceso de I/O depende de la
última directiva #USE *_IO utilizada.
Ejemplo:
output_high(PIN_A0);
OUTPUT_LOW(pin)
Pone a 'cero' el pin indicado. El método de acceso de I/O depende de la
última directiva #USE *_IO.
Ejemplo:
output_low(PIN_A0);
PORT_B_PULLUPS(flag)
Esta función activa/desactiva las resistencias pullups en las entradas del
puerto B. Flag puede ser TRUE (activa) o FALSE (desactiva).
Ejemplo:
port_b_pullups(FALSE);
SET_TRIS_A(value)
SET_TRIS_B(value)
SET_TRIS_C(value)
SET_TRIS_D(value)
SET_TRIS_E(value)
Estas funciones permiten escribir directamente los registros tri-estado
para la configuración de los puertos.
Esto debe usarse con FAST_IO() y cuando se accede a los puertos
de I/O como si fueran memoria, igual que cuando se utiliza una directiva
#BYTE. Cada bit de value representa una patilla. Un '1' indica que la
patilla es de entrada y un '0' que es de salida.
Ejemplo:
SET_TRIS_B( 0x0F ); // pone B0, B1, B2 y B3 como entradas; B4, B5, B6
y B7
// como salidas, en un PIC 16c84
FUNCIONES DE RETARDOS
DELAY_CYCLES(count)
Esta función realiza retardos según el número de ciclos de instrucción
especificado en count; los valores posibles van desde 1 a 255. Un ciclo de
instrucción es igual a cuatro periodos de reloj.
Ejemplo:
delay_cycles( 3 ); // retardo de 3ciclos instrucción; es igual que un NOP
DELAY_MS(time)
Esta función realiza retardos del valor especificado en time. Dicho
valor de tiempo es en milisegundos y el rango es 0-65535. Para obtener
retardos más largos así como retardos 'variables' es preciso hacer
llamadas a una función separada; véase el ejemplo siguiente.
Es preciso utilizar la directiva #use delay(clock=frecuencia) antes
de la llamada a esta función, para que el compilador sepa la frecuencia de
reloj.
Ejemplos:
#use delay (clock=4000000) // reloj de 4MHz
delay_ms( 2 ); // retardo de 2ms
void retardo_segundos(int n) { // retardo de 'n' segundos; 0 <= n =>
255
for (; n!=0; n--)
delay_ms( 1000 ); // 1 segundo
}
· DELAY_US(time)
Esta función realiza retardos del valor especificado en time. Dicho
valor es en microsegundos y el rango va desde 0 a 65535. Es necesario
utilizar la directiva #use delay antes de la llamada a esta función para
que el compilador sepa la frecuencia de reloj.
Ejemplos:
#use delay(clock=20000000)
delay_us(50);
int espera = 10;
delay_us(espera);
FUNCIONES DE CONTROL DEL PROCESADOR
DISABLE_INTERRUPTS (level)
Esta función desactiva la interrupción del nivel dado en level. El nivel
GLOBAL prohíbe todas las interrupciones, aunque estén habilitadas o
permitidas. Los niveles de interrupción son:
GLOBAL
INT_AD
INT_CCP2
INT_COMP
INT_EXT
INT_EEPROM
INT_SSP
INT_ADOF
INT_RTCC
INT_TIMER1
INT_PSP
INT_RC
INT_RB
INT_TIMER2
INT_TBE
INT_I2C
INT_AD
INT_CP1
INT_RDA
INT_BUTTON
Ejemplo:
disable_interrupts(GLOBAL); /* prohíbe todas las interrupciones */
ENABLE_INTERRUPTS (level)
Esta función activa la interrupción del nivel dado en level. Queda a
cargo del técnico definir un procedimiento o rutina de atención, para el caso
que se produzca la interrupción indicada. El nivel GLOBAL permite todas las
interrupciones que estén habilitadas de forma individual. Véase también
DISABLE_INTERRUPTS.
Ejemplo:
disable_interrupts(GLOBAL); // Prohíbe todas las interrupciones
enable_interrupts(INT_AD); // Quedan habilitadas estas dos
interrupciones,enable_interrupts(INT_I2C); //pero hasta que no se habilite
GLOBAL, no //podrán activarse enable_interrupts(GLOBAL); // Ahora sí se
pueden producir las interrupciones
//anteriores.
RESTART_CAUSE()
Esta función devolverá la razón por la que se ha producido el último
reset del procesador. Los valores de retorno pueden ser:
WDT_FROM_SLEEP
WDT_TIMEOUT
MCLR_FROM_SLEEP
NORMAL_POWER_UP
Ejemplo:
switch ( restart_cause() ) {
case WDT_FROM_SLEEP: ;
case WDT_TIMEOUT:
handle_error();
}
SLEEP()
Esta función pone al micro en un estado de REPOSO.
Ejemplo:
SLEEP();
WRITE_BANK(bank, offset, value)
Esta función escribe un byte de datos en el banco de memoria
especificado. Value es el byte de datos a escribir; bank puede ser 1-3 según
el PIC; offset puede ser 0-15.
Ejemplo:
WRITE_BANK(1, 0, 23);
EJEMPLO DE UN PROGRAMA EN LANGUAJE C
/* parpadeo.c Programa que hace parpadear un led en RB7 cada ms
*/
#include <16C84.H> /* tipo de PIC */
#use delay( clock = 4000000 ) /* reloj de 4 MHz */
#byte puerto_b = 06 /* dirección del puerto B */
void main( void )
{
set_tris_b( 0x00 ); /* puerto B como salida */
puerto_b = 0; /* apaga todos los led */
do{
delay_us( 1000 ); /* retardo de 1000 (seg. */
bit_set( puerto_b, 7 ); /* enciende el led RB7 */
delay_us( 1000 ); /* espera 1 ms*/
bit_clear( puerto_b, 7); /* apaga el led */
} while( TRUE ); /* Repetir siempre */
}
Compilador PCW CCS
Algunas de esas características son:
Al compilar genera un código máquina muy compacto y eficiente. Se integra perfectamente con MPLAB y otros simuladores/emuladores
como PROTEUS para el proceso de depuración. Incluye una biblioteca muy completa de funciones pre compiladas para
el acceso al hardware de los dispositivos (entrada/salida,
temporizaciones, conversor A/D, transmisión RS-232,bus I2C….,etc. Incorpora drivers para dispositivos externos, tales como pantallas
LCD, teclados numéricos, memorias EEPROM, conversores A/D, relojes en tiempo real, etc.(los drivers son pequeños programas que sirven de interfaz entre los dispositivos hardware y nuestro programa).
Permite insertar partes de código directamente en Ensamblador, manteniendo otras partes del programa en C.
Características del lenguaje C para este compilador
El lenguaje C estándar es independiente de cualquier plataforma. Sin
embargo, para la programación de micro controladores es necesario disponer de determinados comandos que se refieran a partes específicas de
su hardware, como el acceso a memoria, temporizadores, etc. Por este motivo, además de los comandos, funciones y datos del lenguaje ANSI C, el compilador PCW incluye bibliotecas que incorporan determinados comandos
que no son estándar, sino específicos para la familia de micro controlador PIC. Éstos son básicamente de dos tipos: directivas del preprocesador y
funciones pre compiladas
Directivas del preprocesador.
El compilador PCW dispone de 7 tipos básicos de directivas:
Directivas derivadas del estándar de C, que permiten, entre otras
funciones, un control básico del código y del flujo en el proceso de
compilación:
#DEFINE #ELIF
#ELSE #ENDIF #ERROR
#IF #IFDEF
#IFNDEF #INCLUDE #LIST
#NOLIST #PRAGMA
#UNDEF Directivas asociadas a las bibliotecas precompiladas, que proporcionan
al compilador información relacionada con estas bibliotecas: #USE DELAY
#USE FAST_IO #USE FIXED_IO #USE I2C
#USE RS232 #USE STANDARD_IO
Directivas relacionadas con la especificación del dispositivo, por un
lado, para definir los mapas de memoria y el juego de instrucciones, y
por otro, incluir información necesaria para la programación del dispositivo en los ficheros de salida de la compilación:
#DEVICE #ID
#FUSES #TYPE
Directivas de cualificación de funciones, para identificar características
especiales de una función:
#INLINE #INT_DEFAULT
#INT_GLOBAL #INT_xxxxx #SEPARATE
Directivas de control del compilador, para definir opciones referidas a
la compilación del código del programa: #CASE #OPT
#ORG #PRIORITY
Directivas de control de la memoria del microcontrolador, para
gestionar y reservar el uso de determinadas zonas de memoria para variables:
#ASM
#BIT #BYTE
#ENDASM #LOCATE #RESERVE
#ROM #ZERO_RAM
Identificadores predefinidos. Todas las directivas citadas hasta ahora,
son comandos destinados a ser interpretados por el compilador, no
por el micro controlador. Dentro del término genérico de directiva se incluyen, además de estos comandos, unas variables que contienen
información sobre el proceso de compilación. Estas variables son lo que se denominan identificadores predefinidos del compilador:
__DATE__
__DEVICE__ __PCB__
__PCH__ __PCM__
En un programa, las directivas se reconocen fácilmente porque comienzan por el símbolo #, mientras que los identificadores empiezan y
acaban por doble subrayado (__).
Funciones pre compiladas.
Se puede facilitar considerablemente la tarea de programación si no
es necesario construir por nosotros mismos aquellas funciones que son de
utilización más frecuente, como leer la entrada de un teclado o imprimir un
determinado mensaje en una pantalla LCD conectada como salida. Existen funciones en C incluidas en el compilador PCW para manejar los
diferentes recursos del micro controlador, desde el bus I2C hasta el conversor A/D.
Utilidades adicionales
El entorno PCW incluye, además del IDE y del compilador, una serie de
utilidades adicionales con las que se amplían las posibilidades de éste, y que
se encuentran en los menús View y Tools de la barra de menús, veamos algunas de ellas:
Monitor del puerto serie: Consiste en un terminal que monitoriza la
entrada y la salida del puerto serie del computador.
Selección de dispositivos (Device Selection Tool): Esta utilidad consta de una base de datos con los dispositivos que puede programar el
compilador, incluyendo todas sus características hardware, de manera que se puede emplear para buscar aquellos dispositivos que cumplan una serie de propiedades comunes.
Editor de dispositivos (Device Editor): Este programa también emplea la base de datos de dispositivos, y permite editar los componentes
para modificar sus características hardware, así como añadir nuevos dispositivos o eliminar algunos de ellos.
Conversor numérico: Esta utilidad realiza conversiones entre los tipos
de datos unsigned, signed, hex y float. Extracción de datos de calibrado: Esta opción permite leer los datos de
calibración existentes en la memoria de programa de un determinado dispositivo. Estos datos contienen información particular de cada micro controlador a su salida de fábrica, y se refieren a posibles problemas
especiales que pudieran haber tenido lugar durante el desarrollo y fabricación. Mediante esta opción es posible leer estos datos y
grabarlos en un fichero .H o .C que incorporará una directiva #ROM para dicho dispositivo, con lo que cada vez que se programe el micro
controlador se incluirán estos datos de calibrado. Desensamblador: Esta opción lee un fichero en Código máquina y lo
traduce a su equivalente en Ensamblador, con lo que se podría
insertar este código en un programa en C, mediante las directivas #ASM y #ENDASM.
Puede que haya alguna herramienta de más o de menos, eso dependerá de la versión de compilador que estemos utilizando
Ahora vamos a ver algunas consideraciones a tener en cuenta cuando vayamos a programar:
En el tutorial que estamos siguiendo sobre programación de Micro controladores en lenguaje C Hemos visto cómo hacer algunos ejemplos en C
(la verdad es que pocos de momento ), pero no hemos visto nada sobre
aspectos de optimización de los programas. La optimización suele ser
necesaria en muchas ocasiones, puesto que la memoria del micro controlador es un recurso escaso, y puede ocurrir que un programa que en
un principio ocupa una cantidad de memoria mayor que la disponible, tras una optimización del código reduzca su tamaño de manera que sí pueda programarse. A continuación se indican algunas de las características que
incorpora el compilador sobre este aspecto:
Inserción de código Ensamblador: Mediante las directivas #ASM y #ENDASM es posible insertar código Ensamblador directamente en el código C, con lo que determinados procedimientos se pueden
implementar directamente en Ensamblador, con el ahorro de código y tiempo de ejecución que ello implica.
Gestión automática de páginas de código: los micro controladores PIC disponen de varias páginas de memoria de programa, lo que en la programación manual supone tener en cuenta si los saltos se producen
a otra página de código diferente de la activa, y modificar las páginas de código según corresponda, ( y si no que se lo digan a los que
programan en Ensamblador). Este aspecto es gestionado de manera automática por el compilador, el cual, de manera transparente al
usuario, insertará las instrucciones necesarias para el cambio de página de código. Además, durante el proceso de enlazado se analiza el código objeto, de manera que aquellas funciones que son llamadas
frecuentemente son situadas en la misma página de código que la función que las llama, disminuyendo de este modo el tamaño del
código y el retardo producido por la llamada a la función. Gestión automática de bancos de memoria: El compilador también
gestiona de manera automática el cambio entre bancos de memoria
RAM, y trata de minimizar el cambio entre bancos, intentando agrupar las variables locales utilizadas en cada función dentro de un mismo
banco. Mapeo de la memoria del micro controlador desde el código C: Las
directivas #BIT y #BYTE permiten asignar variables del código C a
determinadas direcciones de la memoria del micro controlador, evitando de este modo que el compilador asigne automáticamente
variables a zonas de memoria que interesa mantener libres. Esta característica también se puede realizar con otros tipos de datos, como las estructuras.
Mapeo de tipos de datos de tamaño bit: El compilador permite utilizar datos de tamaño 1, 8 y 16 bits, y 32 bits en notación de coma
flotante. De estos datos, especial interés tienen los datos de tamaño 1 bit (tipo Short Int), que permite utilizar de manera muy eficiente la memoria del micro controlador. Por ejemplo, en lugar de utilizar una
variable de tipo #BYTE para implementar un indicador o flag, es posible utilizar una variable de tipo #BIT, con lo que la memoria
ocupada es menor y el código relacionado con esta variable se optimiza. Además, las estructuras y uniones también permiten definir campos de bits, optimizando el almacenamiento de información de
estos tipos de datos. Almacenamiento de constantes en memoria de programa: Los tipos de
datos constantes, las cadenas de texto y las matrices o arrays son almacenados en la memoria de programa del microcontrolador, en
lugar de en la memoria de datos. Como consecuencia, y debido a la
arquitectura Harvard de los PIC, en la que los segmentos de memoria de programa y datos son independientes, no es posible tratar las
zonas de memoria de programa como datos, por lo que no se permite el empleo de punteros a arrays de constantes, ni tampoco a funciones, una nota a tener en cuenta para los que saben programar en C, pero
desconocen las características de este compilador. Soporte de punteros y referencias: El compilador PCW permite el uso
de punteros de 8 y 16 bits. Además, también permite el paso de parámetros por referencia de variables, lo que proporciona la misma potencia que los punteros, mejorando al mismo tiempo la legibilidad
del código (esto lo veremos con ejemplos en el curso de C). Eficiente implementación de variables y funciones: La eficiencia de los
algoritmos de optimización empleados en este compilador permite que, en el caso de las variables, éstas sean asignadas a zonas de memoria que se emplee la menor memoria posible de forma global,
reutilizando para ello posiciones de memoria. Por ejemplo, el compilador asigna de manera automática a una misma dirección de
memoria varias variables definidas como locales en funciones diferentes a main, ya que en ningún momento podrá existir más de
una de estas variables de manera simultánea, pues su valor dejará de existir al salir de la función donde se encuentran definidas. En cuanto a las funciones, es posible realizar anidaciones de funciones en niveles
más profundos que el permitido por la pila hardware, debido a una implementación eficiente de las llamadas a estas funciones.
Generación del código estrictamente necesario: En la compilación del código objeto final sólo se incluyen aquellas funciones de las bibliotecas pre compilado que son utilizadas en el programa. De la
misma forma, las funciones de usuario que no son llamadas nunca y las sentencias que no se pueden utilizar debido a la lógica
del programa no son incluidas en el código pre compilado.
SIMULADOR ISIS PROTEUS
Proteus es una compilación de programas de diseño y
simulación electrónica, desarrollado por Labcenter Electronics que consta de
los dos programas principales: Ares e Isis, y los módulos VSM y Electra.
ISIS
El Programa ISIS, Intelligent Schematic Input System (Sistema de
Enrutado de Esquemas Inteligente) permite diseñar el plano eléctrico del
circuito que se desea realizar con componentes muy variados, desde
simples resistencias, hasta alguno que otro microprocesador o
microcontrolador, incluyendo fuentes de alimentación, generadores de
señales y muchos otros componentes con prestaciones diferentes. Los
diseños realizados en Isis pueden ser simulados en tiempo real, mediante el
módulo VSM, asociado directamente con ISIS.
El módulo VSM
Una de las prestaciones de Proteus, integrada con ISIS, es VSM, el
Virtual System Modeling (Sistema Virtual de Modelado), una extensión
integrada con ISIS, con la cual se puede simular, en tiempo real, con
posibilidad de más rapidez; todas las características de varias familias de
microcontroladores, introduciendo nosotros mismos el programa que
controlará el microcontrolador y cada una de sus salidas, y a la vez,
simulando las tareas que queramos que lleve a cabo con el programa. Se
pueden simular circuitos con microcontroladores conectados a distintos
dispositivos, como motores, lcd´s, teclados en matriz, etc. Incluye, entre
otras, las familias de PIC's PIC10, PIC12, PIC16, PIC18, PIC24 y dsPIC33.
ISIS es el corazón del entorno integrado PROTEUS. Combina un entorno de
diseño de una potencia excepcional con una enorme capacidad de controlar
la apariencia final de los dibujos.
ARES
ARES, o Advanced Routing and Editing Software (Software de Edición
y Ruteo Avanzado); es la herramienta de enrutado, ubicación y edición de
componentes, se utiliza para la fabricación de placas de circuito impreso,
permitiendo editar generalmente, las capas superficial (Top Copper), y de
soldadura (Bottom Copper).
Forma Manual
Ejecutando ARES directamente, y ubicando cada componente en el
circuito. Tener cuidado al DRC, Design Rules Checker (Verificador de Reglas
de DISEÑO) Proteus es una potente herrmamienta usada por los
mecatronicos
Forma Automática
El propio programa puede trazar las pistas, si se guarda previamente
el circuito en ISIS, y haciendo clic en el ícono de ARES, en el programa, el
programa compone la Netlist
Método 1 (Autorouter)
Poner SOLO los componentes en la board
Especificar el área de la placa (con un rectángulo, tipo "Board Edge")
Hacer clic en "Autorouter", en la barra de botones superior
Editar la estrategia de ruteo en "Edit Strategies"
Hacer clic en "OK"
Método 2 (Electra Autorouter)
Utilizando el módulo Electra (Electra Auto Router), el cual, una vez
colocados los componentes trazará automáticamente las pistas realizando
varias pasadas para optimizar el resultado.
Con Ares además se puede tener una visualización en 3D del PCB que
se ha diseñado, al haber terminado de realizar la ubicación de piezas, capas
y ruteo, con la herramienta "3D Visualization", en el menú output, la cual se
puede demorar, solo haciendo los trazos un periodo de tiempo un poco más
largo que el de los componentes, los cuales salen al empezar la
visualización en 3D.
CONCLUSIÒN
El compilador de C que vamos a utilizar es el PCW de la casa CCS Inc. A su vez, el compilador lo integraremos en un entorno de desarrollo integrado
(IDE) que nos va a permitir desarrollar todas y cada una de las fases que se compone un proyecto, desde la edición hasta la compilación pasando por la depuración de errores. La última fase, a excepción de la depuración y
retoques hardware finales, será programar el PIC.
Al igual que el compilador de Turbo C, éste "traduce" el código C del archivo fuente (.C) a lenguaje máquina para los microcontroladores PIC, generando
así un archivo en formato hexadecimal (.HEX). Además de éste, también genera otros seis ficheros, tal como se observa en la figura de la siguiente página.
Finalmente, deciros que esta vez os presento los apuntes en soporte
electrónico, a diferencia de ocasiones anteriores que estaban en formato impreso. Es una experiencia nueva y que como toda prueba tiene sus riesgos, aunque espero y deseo que, de una u otra forma logre prender la
llama de la ilusión, o por lo menos despertar el interés por el estudio de la electrónica y en particular de este mundo inacabado de la programación en
C y los microcontroladores.