trabajo css lenguaje c

32
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

Upload: wilmer-arturo-h

Post on 26-Nov-2015

49 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Trabajo CSS Lenguaje C

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

Page 2: Trabajo CSS Lenguaje C

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”

Page 3: Trabajo CSS Lenguaje C

Haría que la búsqueda tuviera lugar en el directorio actual donde está la

fuente.

Page 4: Trabajo CSS Lenguaje C

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".);

Page 5: Trabajo CSS Lenguaje C

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() {

}

Page 6: Trabajo CSS Lenguaje C
Page 7: Trabajo CSS Lenguaje C
Page 8: Trabajo CSS Lenguaje C

LIBRERÍAS INCORPORADAS

Page 9: Trabajo CSS Lenguaje C

#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.

Page 10: Trabajo CSS Lenguaje C

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,

Page 11: Trabajo CSS Lenguaje C

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...)

Page 12: Trabajo CSS Lenguaje C

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.

Page 13: Trabajo CSS Lenguaje C

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:

Page 14: Trabajo CSS Lenguaje C

#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)

Page 15: Trabajo CSS Lenguaje C
Page 16: Trabajo CSS Lenguaje C

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

Page 17: Trabajo CSS Lenguaje C

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

Page 18: Trabajo CSS Lenguaje C

// 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.

Page 19: Trabajo CSS Lenguaje C

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--)

Page 20: Trabajo CSS Lenguaje C

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

Page 21: Trabajo CSS Lenguaje C

INT_RTCC

INT_TIMER1

INT_PSP

INT_RC

INT_RB

INT_TIMER2

INT_TBE

INT_I2C

INT_AD

INT_CP1

INT_RDA

INT_BUTTON

Page 22: Trabajo CSS Lenguaje C

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();

Page 23: Trabajo CSS Lenguaje C

}

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. */

Page 24: Trabajo CSS Lenguaje C

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.

Page 25: Trabajo CSS Lenguaje 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

Page 26: Trabajo CSS Lenguaje C

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

Page 27: Trabajo CSS Lenguaje C

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

Page 28: Trabajo CSS Lenguaje C

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

Page 29: Trabajo CSS Lenguaje C

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.

Page 30: Trabajo CSS Lenguaje C

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"

Page 31: Trabajo CSS Lenguaje C

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.

Page 32: Trabajo CSS Lenguaje C

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.