Kitabı oku: «Compilador C CCS y Simulador Proteus para Microcontroladores PIC», sayfa 2

Yazı tipi:

Figura 48. Mensajes de la herramienta de diagnóstico


Figura 49. La configuración de diagnósticos


Figura 50. Opciones de configuración

Tras la simulación aparecen los diferentes resultados del análisis; en el ítem SOURCE aparece indicado el dispositivo fuente del análisis y tras una pulsación se puede acceder a él (figura 51).


Figura 51. Resultado del diagnóstico

El listado de nodos y patillas se pueden encontrar con la ayuda del DESIGN EXPLORER (a ésta opción podemos acceder a través de distintas opciones: comando DESIGN, botón derecho, etc.). En su ventana de trabajo se muestran todos los nodos y patillas que forman el circuito (figura 52).


Figura 52. La ventana Design Explorer

1.4 Creando nuevos dispositivos

Se va a crear un componente como ejemplo de la creación de nuevos componentes para el ISIS.


Figura 53. Componente a crear

Para dibujar el cuerpo del componente:

1 Seleccionar el icono de 2D Graphics Box Mode y asegurarse de estar en modo componente.Figura 54. 2D Graphics Box Mode

2 Pulsar una vez en un área vacía del esquemático para iniciar la colocación.

3 Mover el ratón hasta conseguir el tamaño de cuerpo deseado. Se puede redimensionar más tarde.

4 Pulsar otra vez para terminar el dibujo.


Figura 55. El cuerpo del componente

Se pueden realizar diseños gráficos bastante complejos por la facilidad y flexibilidad que aporta ISIS.

A continuación se colocan los pines:

1 Seleccionar el modo de pin componente y asegurarse de seleccionar el tipo de pin por defecto en la lista de pines.Figura 56. Seleccionar el tipo de pin

2 Pulsar en el esquemático para iniciar el emplazamiento. Una pequeña cruz al final de la patilla (o pin) indica el lado del pin que será “cableado”, por lo que es importante que esta parte esté colocada en posición contraria al cuerpo.Figura 57. La patilla del pin

3 Mover el ratón para que el otro final del pin toque el borde del cuerpo del componente y hacer una pulsación de nuevo.

4 Automáticamente, aparece un nuevo pin para ser colocado con un simple movimiento del ratón.

5 Repetir el proceso tantas veces como sea necesario.

6 Se puede rotar el pin con las teclas <+> o <->.

7 Pulsar con el botón derecho para terminar el emplazamiento de los pines.


Figura 58. Los pines colocados

Una vez colocados los pines puede cambiarse el tamaño del cuerpo; para ello, debemos pulsar en el borde del cuerpo y arrastrar el ratón hasta conseguir el tamaño deseado. Una vez definido el cuerpo, hay que añadir los nombres a los pines. Esto se puede hacer de la siguiente forma:

1 Pulsar con el botón derecho en el extremo del pin y seleccionar la opción EDIT PROPERTIES del menú.Figura 59. El menú contextual

2 Escribir el nombre del pin (pin name), el número (pin number) y su característica eléctrica (electrical type). Se pueden usar otras opciones como visualizar o no el nombre, etc.Figura 60. Las propiedades del pin

3 Pulsar el botón Next en la parte inferior de la ventana para pasar al siguiente pin de la lista y repetir el proceso.

4 Cuando sea necesario añadir una barra superior al nombre (para pines negados) se debe añadir el signo (‘$’) antes y después del nombre.Figura 61. La nomenclatura para pines negados

5 Pulsar OK para terminar.

Para finalizar la construcción del componente se debe seleccionar completamente mediante una ventana de selección (pulsar con el botón derecho y arrastrando hasta completar la selección). Volver a realizar una pulsación con el botón derecho y debe aparecer una ventana de menú donde se debe seleccionar la opción MAKE DEVICE. Aparece una ventana donde podemos modificar ciertas propiedades del componente, tal vez las más importantes son DEVICE NAME y REFERENCE PREFIX. El referente prefix sirve para generar categorías en el listado de materiales (Bill of materials Output).


Figura 62. Las opción MAKE DEVICE


Figura 63. Las propiedades del componente

Con el botón Next se puede avanzar a la siguiente ventana que permite añadir un FOOTPRINTS al componente (ver el tema 11).


Figura 64. La ventana para modificar el componente

Capítulo 2
Compilador CCS C
2.1 Introducción

El Compilador C de CCS ha sido desarrollado específicamente para PIC MCU, obteniendo la máxima optimización del compilador con estos dispositivos. Dispone de una amplia librería de funciones predefinidas, comandos de preprocesado y ejemplos. Además, suministra los controladores (drivers) para diversos dispositivos como LCD, convertidores AD, relojes en tiempo real, EEPROM serie, etc. Las características generales de este compilador y más información adicional se pueden encontrar en la dirección http://www.ccsinfo.com.

Un compilador convierte el lenguaje de alto nivel a instrucciones en código máquina; 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 crosscompiler. Los programas son editados y compilados a instrucciones máquina en el entorno de trabajo del PC, el código máquina 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 de trabajo del PC.

El CCS C es C estándar y, además de las directivas estándar (#include, etc.), suministra unas directivas específicas 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.


NOTA
En el manual de CCS se da mucha más información de la que a continuación se va a dar. En este capítulo sólo se describirán los elementos más básicos y esenciales para comenzar a programar.

2.2 Estructura de un programa

Para escribir un programa en C con el CCS C se deben tener en cuenta una serie de elementos básicos de su estructura (figura 1).

•DIRECTIVAS DE PREPROCESADO: controlan la conversión del programa a código máquina por parte del compilador.

•PROGRAMAS o FUNCIONES: conjunto de instrucciones. Puede haber uno o varios; en cualquier caso siempre debe haber uno definido como principal mediante la inclusión de la llamada main().

•INSTRUCCIONES: indican como debe comportar el PIC en todo momento.

•COMENTARIOS: permiten describir lo que significa cada línea del programa.


Figura 1. Estructura básica de un programa

2.3 Tipos de datos

CCS C acepta los siguientes tipos de datos:



2.4 Las constantes

Las constantes se pueden especificar en decimal, octal, hexadecimal o en binario:


123Decimal
0123Octal (0)
0x123Hexadecimal (0x)
0b010010Binario (0b)
‘x’Carácter
‘\010’Carácter octal
‘\xA5’Carácter hexadecimal

Además, se pueden definir constantes con un sufijo:


Int8 127U
Long 80UL
Signed INT16 80L
Float 3.14F
Char Con comillas simples ‘C’

También se definen caracteres especiales, algunos como:


\n Cambio de línea
\r Retorno de carro
\t Tabulatión
\b Backspace

2.5 Variables

Las variable se utilizan para nombrar posiciones de memoria RAM; se deben declarar, obligatoriamente, antes de utilizarlas; para ello se debe indicar el nombre y el tipo de dato que se manejará. Se definen de la siguiente forma:

TIPO NOMBRE_VARIABLE [=VALOR INICIAL]

TIPO hace referencia a cualquiera de los tipos de datos vistos en el punto 2.3. El NOMBRE_VARIABLE puede ser cualquiera y el valor inicial es opcional. Veamos un ejemplo:


Las variables definidas en un programa pueden ser de tipo LOCAL o GLOBAL. Las variables locales sólo se utilizan en la función donde se encuentran declaradas; las variables globales se pueden utilizar en todas las funciones del programa. Ambas deben declararse antes de ser utilizadas y las globales deben declararse antes de cualquier función y fuera de ellas. Las variable globales son puestas a cero cuando se inicia la función principal main().


Las variables pueden ser definidas con:

AUTO: (usada por defecto, no hace falta que se indique) donde la variable existe mientras la función esta activa. Estas variables no se inicializan a cero. Su valor se pierde cuando se sale de la función.

STATIC: Una variable local se activa como global, se inicializa a cero y mantiene su valor al entrar y salir de la función.

EXTERN: Permite el uso de variables en compilaciones múltiples.

2.6 Operadores
2.6.1 Asignación


+=Asignacion de suma (x+=y es lo mismo que x=x+y)
- =Asignacion de resta (x-=y es lo mismo que x=x-y)
*=Asignacion de multiplication (x*=y es lo mismo que x=x*y)
/=Asignacion de division (x/=y es lo mismo que x=x/y)
%=Asignacion del resto de la division (x%=y es lo mismo que x=x%y)
«=Asignacion de desplazamiento a la izquierda (x«=y es igual que x=x«y)
»=Asignacion de desplazamiento a derecha (x»=y es igual que x=x»y)
&=Asignacion AND de bits (x&=y es lo mismo que x=x&y)
| =Asignacion OR de bits (x | =y es lo mismo que x=x | y)
^=Asignacion OR EXCLUSIVA de bits (x^A=y es lo mismo que x=x^y)

2.6.2 Aritméticos


+Suma
-Resta
*Multiplicatión
/División
%Módulo, resto de una división entera
--Incremento
++Decremento
sizeofDetermina el tamaño, en bytes, de un operando

En las operaciones de decremento e incremento, en función de la posición del operador, se consigue un preincremento (++A) o un postincremento (A++).


2.6.3 Relacionales


<Menor que
>Mayor que
>=Mayor o igual que
<=Menor igual que
==Igual
!=Distinto
?:Expresión condicional

2.6.4 Lógicos


!NOT
&&AND
||OR

2.6.5 De bits


~Complemento a 1
&AND
^OR EXCLUSIVA
|OR
»Desplazamiento a derechas
«Desplazamiento a izquierdas

2.6.6 Punteros


&Directión
*Indirectión
->Puntero a estructura

Orden de precedencia de los operadores:


2.7 Funciones

Las funciones son bloques de sentencias; todas las sentencias se deben enmarcar dentro de las funciones. Al igual que las variables, las funciones deben definirse antes de utilizarse.

Una función puede ser invocada desde una sentencia de otra función. Una función puede devolver un valor a la sentencia que la ha llamado. El tipo de dato se indica en la definición de la función; en el caso de no indicarse nada se entiende que es un int8 y en el caso de no devolver un valor se debe especificar el valor VOID. La función, además de devolver un valor, puede recibir parámetros o argumentos.

La estructura de una función es:

Tipo_Dato Nombre_Funcion (tipo param1, param2,….)


La forma de devolver un valor es mediante la sentencia RETURN:


Donde expresión debe manejar el mismo tipo de dato que el indicado en la definición de la función. En el caso de no devolver nada se finaliza con RETURN, al encontrar esta sentencia el compilador vuelve a la ejecución de la sentencia de llamada. También se puede finalizar la función sin RETURN, tan sólo con la llave de cierre “}”.

Las funciones pueden agruparse en ficheros de librerías <fichero.h>, que se pueden utilizar mediante la directiva #include <fichero.h>.

2.8 Declaraciones de control

Las declaraciones son usadas para controlar el proceso de ejecución del programa. Las que admite CCS son:

If-Else.

While.

Do-While.

For.

Switch-Case.

Return.

Break, Continue y Goto.

2.8.1 IF-ELSE

Con la ayuda de IF-ELSE se pueden tomar decisiones.



NOTA
Los elementos que se encuentran entre corchetes [ ] son opcionales.

Primero se evalúa la EXPRESIÓN y si es cierta (TRUE o 1) ejecuta la SENTENCIA_1, en el caso contrario (FALSE o 0) ejecuta la SENTENCIA_2.

Pueden anidarse los IF-ELSE dando lugar a los ELSE-IF; esto permite tomar decisiones múltiples.


En este caso las EXPRESIONES se evalúan en orden, si alguna de ellas es cierta la SENTENCIA asociada a ella se ejecutará y se termina la función. En caso contrario se ejecuta la SENTENCIA del ELSE. En ambos casos si existen varias sentencias para ejecutar se deben utiliza las llaves { }:


Ejemplos:




2.8.2 SWITCH

Switch es un caso particular de una decisión múltiple


Evalúa la expresión y en orden a la CONSTANTE adecuada realiza las sentencias asociadas. Si ninguno de los CASE corresponde a la CONSTANTE se ejecuta DEFAULT (este comando es opcional).

El comando BREAK provoca la salida de SWITCH, de lo contrario se ejecuta el siguiente CASE.


NOTA
No pueden existir dos CASE con la misma CONSTANTE.

Ejemplo:


2.8.3 FOR

Se usa para repetir sentencias.


En las expresiones del FOR la inicialización es una variable a la cual se le asigna un valor inicial con el que controlar el bucle. La condición de finalización sirve para evaluar ANTES de ejecutar las sentencias si es cierta o no, en el caso de ser cierta se ejecutan las sentencias y en caso contrario se sale del FOR. Por último, la expresión de incremento o decremento modifica la variable de control DESPUÉS de ejecutar el bucle.


NOTA
Se pueden anidar bucles FOR utilizando distintas variables de control.

Si se ejecuta la siguiente expresión se consigue un BUCLE SIN FIN:


Ejemplo:


2.8.4 WHILE / DO-WHILE

WHILE se utiliza para repetir sentencias.


La expresión se evalúa y la sentencia se ejecuta mientras la expresión es verdadera, cuando es falsa se sale del WHILE.

DO-WHILE se diferencia del WHILE y del FOR en la condición de finalización, la cual se evalúa al final del bucle, por lo que las sentencias se ejecutan al menos una vez.


Si se ejecutan las siguientes expresiones se consigue un BUCLE SIN FIN:


Ejemplos:



2.8.5 Otros

•Return: se emplea para devolver datos en las funciones.

•Break: permite salir de un bucle, se utiliza para While, For ,Do y Switch.

•Goto: provoca un salto incondicional.

2.9 Comentarios

Los comentarios en el programa facilitan la compresión de las distintas expresiones tanto para el programador como para quién tiene que interpretar dicho programa. No afectan a la compilación por lo que pueden ser tan extensos como el programador quiera. Se pueden colocar en cualquier parte del programa y con dos formatos:

•Utilizando //. Al colocar estos signos se comienza el comentario y finaliza en el final de la línea.


•Utilizando /* y */. Se debe utilizar al inicio y al final de comentario, pero no pueden repetirse dentro del mismo comentario.


2.10 Directivas y funciones (Preprocessor commands y built-in functions)
2.10.1 Directivas

Las directivas de pre-procesado comienzan con el símbolo # y continúan con un comando específico. La sintaxis depende del comando. Algunos comandos no permiten otros elementos sintácticos en la misma expresión. Muchas de las directivas utilizadas por CCS son extensiones del C estándar.


A lo largo del presente libro se irán viendo varias directivas en su ámbito de aplicación particular.

Como ejemplo se pueden comentar:

#DEVICE chip, permite definir el PIC con el que se realizará la compilación.


#FUSES options, la cual permite definir la palabra de configuración para programar un PIC. Por ejemplo, en el PIC16F84 las opciones posibles son:

LP, XT, HS, RC, NOWDT, WDT, NOPUT, PUT, PROTECT, NOPROTECT.


#INCLUDE “filename”, permite incluir fichero en el programa.


#USE DELAY (CLOCK=SPEED), permite definir las frecuencia del oscilador del PIC, el compilador lo utiliza para realizar cálculos de tiempo. Se puede utilizar M, MHZ, K y KHZ para definir la frecuencia.


#ASM y #ENDASM, permiten utilizar código ensamblador en el programa en C. Se utilizan al inicio y al final del bloque ensamblador.


2.10.2 Funciones

CCS suministra una serie de funciones predefinidas para acceder y utilizar el PIC y sus periféricos. Estas funciones facilitan la configuración del PIC sin entrar en el nivel de los registros especiales. Las funciones se clasifican por bloques funcionales.





En los distintos capítulos de este libro se irán estudiando algunas de estas funciones.

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
545 s. 609 illüstrasyon
ISBN:
9788426718648
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi: