79161119 Manual de Manejo de Mikroc

April 24, 2017 | Author: Mariuxi Túqueres | Category: N/A
Share Embed Donate


Short Description

Download 79161119 Manual de Manejo de Mikroc...

Description

c

cc

c

<  <  <  

c

c

c

c

~  

 ~ 





 c c  c    c c c c c ccc c c c   cc  c c  c c cc  c c  ccc c c    c c c c c c c c c c dc c

 c    c c c c c A continuación vamos a presentar a los elementos principales del lenguaje mikroC desarrollado por Mikroelektronika. Este lenguaje es muy similar al C estándar, no obstante en determinados aspectos difiere del ANSI estándar en algunas características. Algunas de estas diferencias se refieren a las mejoras, destinadas a facilitar la programación de los microcontroladores PIC, mientras que las demás son la consecuencia de la limitación de la arquitectura del hardware de los PIC. Aquí vamos a presentar características específicas del lenguaje mikroC en la programación de los microcontroladores PIC. El término C se utilizará para referirse a las características comunes de los lenguajes C y mikroC.

´ Este libro describe una aplicación muy concreta del lenguaje de programación C utilizado en el compilador mikroC PRO for PIC. En este caso, el compilador se utiliza para la programación de los microcontroladores PIC.

3c c

cc   c El proceso de compilación consiste en varios pasos y se ejecuta automáticamente por el compilador. Por con, un conocimiento básico del funcionamiento puede ser útil para entender el concepto del lenguaje mikroC.

El archivo fuente contiene el código en mikroC que usted escribe para programar el microcontrolador. El preprocesador se utiliza automáticamente por el compilador al iniciarse el proceso de la compilación. El compilador busca las directivas del preprocesador (que siempre empiezan por µ#¶) dentro del código y modifica el código fuente de acuerdo con las directivas. En esta fase se llevan a cabo inclusión de archivos, definición de constantes y macros etc., lo que facilita el proceso. Más tarde vamos a describir estas directivas en detalle. El  !"#$%&c '" ()*("*% (parser) elimina toda la información inútil del código (comentarios, espacios en blanco). Luego, elc *%+,"!$%& traduce el código a un archivo binario denominado archivo .mcl. El - !#$%& (linker) recupera toda la información requerida para ejecutar el programa de los archivos externos y la agrupa en un solo archivo (.dbg). Además, un proyecto puede contener más de un archivo fuente y el programador puede utilizar funciones predefinidas y agrupadas dentro de los archivos denominados librerías. Por último, el .- -&$%&c /0-1 produce un archivo .hex. Es el archivo que se va a cargar en el microcontrolador.

´ El proceso entero de la compilación que incluye todos los pasos anteriormente descritos se le denomina š .

¦c c

cc 2 c La idea principal de escribir un programa en C es de ³romper´ un problema mayor en varios trozos más pequeños. Supongamos que es necesario escribir un programa para el microcontrolador para medir la temperatura y visualizar los resultados en un LCD. El proceso de medición se realiza por un sensor que convierte temperatura en voltaje. El microcontrolador utiliza el convertidor A/D para convertir este voltaje (valor analógico) en un número (valor digital) que luego se envía al LCD por medio de varios conductores. En consecuencia, el programa se divide en cuatro partes, de las que cada una corresponde a una acción específica:

1. 2. 3. 4.

Activar y configurar el convertidor A/D incorporado; Medir el valor analógico; Calcular temperatura; y Enviar los datos en el formato apropiado al LCD;

Los lenguajes de programación de alto nivel como es C le permiten solucionar este problema con facilidad al escribir cuatro funciones que se ejecutarán cíclicamente sin parar. La idea general es de dividir el problema en varios trozos, de los que cada uno se puede escribir como una sola función. Todos los programas escritos en mikroC contienen por lo menos una función llamada main() que encierra entre llaves {} las sentencias a ser ejecutadas. Esto es la primera función a ser ejecutada al iniciarse la ejecución de programa. Las otras funciones se pueden llamar dentro de la función main. En otras palabras, podemos decir que la función main() es obligatoria, mientras que las demás son opcionales. Si todavía no ha escrito un programa en C, es probable que todo le resulte confuso. No se preocupe, acéptelo tal como es por el momento y más tarde entenderá la sintaxis.

´ Èc c

R ahora, su primer programa µreal¶! La figura muestra la estructura de programa, señalando las partes en las que consiste.

´ La manera de escribir el código en C es muy importante. Por ejemplo, C difiere entre minúsculas y mayúsculas, así que la función main() no se puede escribir MAIN() o Main(). Además, note que dos líneas del código dentro de la función terminan con un punto y coma. En C todas las sentencias deben terminar con un punto y coma µ;¶, así el compilador puede aislarlas y traducirlas a código máquina.

Ôc c

c

´

c    c Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para proporcionar más información al respecto. El compilador no hace caso a los comentarios y no los compila al código ejecutable. Dicho de manera sencilla, el compilador es capaz de reconocer los caracteres especiales utilizados para designar dónde los comentarios comienzan y terminan y no hace nada de caso al texto entre ellos durante la compilación. Hay dos tipos de tales caracteres. Unos designan los comentarios largos que ocupan varias líneas de programa marcados por la secuencia especial /*...*/, mientras que otros designan los comentarios cortos que caben en una sola línea //. Aunque los comentarios no pueden afectar a la ejecución de programa, son tan importantes como cualquier otra parte de programa. Aquí está el porqué... Con frecuencia es necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar incluso los programas simples sin utilizar los comentarios.

c c

 ccc c c En el lenguaje C, los datos tienen un tipo, o sea, cada dato utilizado en el programa debe tener su tipo especificado. Esto permite al compilador conocer el tamaño de dato (número de bytes requerido en la memoria) y su representación. Hay varios tipos de datos que se pueden utilizar en el lenguaje de programación mikroC dependiendo del tamaño de dato y del rango de valores. La tabla muestra el rango de valores que los datos pueden tener cuando se utilizan en su forma básica.

  c c c

  

 3c 4 5  c  6c

c

c



2c c   c

char

Texto (caracteres)

8

de 0 a 255

int

Valores enteros

16

de -32768 a 32767

float

Valores en punto flotante

32

de ±1.17549435082·10-38 a ±6.80564774407·1038

double

Valores en punto flotante de doble precisión

32

de ±1.17549435082·10-38 a ±6.80564774407·1038

*Debido a las limitaciones impuestas por el hardware del microcontrolador, es imposible alcanzar una mayor precisión de datos que la del tipo float. Por eso, el tipo double en mikroC equivale al tipo float.

Al añadir un prefijo (calificador) a cualquier tipo de dato entero o carácter, el rango de sus posibles valores cambia así como el número de los bytes de memoria necesarios. Por defecto, los datos de tipo int son con signo, mientras que los de tipo char son sin signo. El calificador signed (con signo) indica que el dato puede ser positivo o negativo. El prefijo unsigned indica que el dato puede ser sólo positivo. Note que el prefijo es opcional.

  c c c char

int

  c c c  c  7c

 3c 4 5  c c  6c



2c c   c

signed char

8

de -128 a 128

unsigned int

16

de 0 a 65535

short int

8

de 0 a 255

signed short int

8

de -128 a 127

long int

32

de 0 a 4294967295

signed long int

32

de -2147483648 a 2147483647

Jc c

",%c- (-&%c4" (6c Un entero es un número sin parte fraccionaria que puede estar expresado en los siguientes formatos:

· ·

· ·

0x11 11 -152 011 0b11

Hexadecimal (base 16): el número empieza con 0x (o 0X). Los enteros hexadecimales consisten en los dígitos (de 0 a 9) y/o las letras (A, B, C,D, E, F). Por ejemplo: µ0x1A¶. Decimal (base 10): el número consiste en los dígitos (de 0 a 9). El primer dígito no puede ser 0. En este formato, se puede introducir el signo de número (µ+¶ o µ-¶). Por ejemplo: 569, 25, +1500. Octal (base 8): los números se representan a base 8 utilizando sólo 8 dígitos (de 0 a 7). Los enteros octales empiezan con 0. Por ejemplo: µ056¶. Binario: cuando un entero empieza con 0b (o 0B) se representan como una serie de bits (µ0¶ y µ1¶). Por ejemplo: 0B10011111

// // // // //

formato formato formato formato formato

hexadecimal equivale a decimal 17 decimal decimal octal equivale a decimal 9 binario equivale a decimal 3

",%c,8 (%c9!%( (-c49!%(6c El tipo punto flotante (float) se utiliza para los números reales con el punto decimal. Los datos de tipo float se pueden representar de varias maneras. Un dato float es siempre consigno (signed).

0. -1.23 23.45e6 2e-5 3E+10 .09E34

// // // // // //

= = = = = =

0.0 -1.23 23.45 * 10^6 2.0 * 10^-5 3.0 * 10^10 0.09 * 10^34

",%c*&)*(-&c4*0&6c El tipo char es considerado como un entero por el compilador. No obstante, se utiliza normalmente para los datos de tipo carácter. Un dato de tipo carácter está encerrado entre comillas y codificado en un carácter ASCII.

59 // entero 'p' // carácter ASCII 'p' Una secuencia de caracteres es denominada cadena (string). Las cadenas están encerradas entre comillas dobles, por ejemplo:

Ù esione el botón RA0Ù

óc c

  cc  c c -9" "*"% -'c Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecución de programa. En C, las variables tienen tipo, que significa que es necesario especificar el tipo de dato que se le asigna a una variable (int, float etc.). Las variables se almacenan en la memoria RAM y el espacio de memoria que ocupan (en bytes) depende de su tipo.

/* dos líneas de programa consecutivas. En la primera línea del programa se define el tipo de variable */ ^  a = 1000; // Variable a es de tipo int y equivale a 1000 a = 15; // a equivale a 15 Una constante tiene las mismas características que una variable excepto el hecho de que su valor asignado no puede ser cambiado durante la ejecución de programa. A diferencia de las variables, las constantes se almacenan en la memoria Flash del microcontrolador para guardar el mayor espacio posible de memoria RAM. El compilador las reconoce por el nombre y el prefijo const. En mikroC, el compilador reconoce automáticamente el tipo de dato de una constante, así que no es necesario especificar el tipo adicionalmente.

/* dos líneas de programa consecutivas */ co  A = 1000 // el valor de la constante A está definido A = 15; // ¡ERROR! no se puede modificar el valor de la constante Cada variable o constante debe tener un identificador que lo distingue de otras variables y constantes. Refiérase a los ejemplos anteriores, a y A son identificadores.

9   En mikroC, los identificadores pueden ser tan largos como quiera. Sin embargo, hay varias restricciones:

·

· ·

Los identificadores pueden incluir cualquiera de los caracteres alfabéticos A-Z (a-z), los dígitos 0-9 y el carácter subrayado '_'. El compilador es sensible a la diferencia entre minúsculas y mayúsculas. Los nombres de funciones y variables se escriben con frecuencia con minúsculas, mientras que los nombres de constantes se escriben con mayúsculas. Los identificadores no pueden empezar con un dígito. Los identificadores no pueden coincidir con las palabras clave del lenguaje mikroC, porque son las palabras reservadas del compilador.

6 c c

El compilador mikroC reconoce 33 palabras clave:  cc  c  c

absolute

data

if

return

typedef

asm

default

inline

rx

typeid

at

delete

int

sfr

typename

auto

do

io

short

union

bit

double

long

signed

unsigned

bool

else

mutable

sizeof

using

break

enum

namespace

static

virtual

case

explicit

operator

struct

void

catch

extern

org

switch

volatile

char

false

pascal

template

while

class

float

private

this

code

for

protected

throw

const

friend

public

true

continue

goto

register

try

66c c

Ejemplos de los identificadores válidos e inválidos:

tempeatua_V1 esión no_coesponde dat2sting SuM3 _vtexto 7temp %más_alto especiales ^ reservada j23.07.04 especiales (punto) nombe de vaiable

// // // // // // //

OK OK OK OK OK OK NO -- no puede empezar con un número // NO -- no pueden contener caracteres // NO -- no puede coincidir con una palabra // NO -- no puede contener caracteres

// NO -- no puede contener espacio en blanco

-*!&*": c$-c;&"= 0) u (2*x - y);  u (-2*x + y); } Si la función no devuelve ningún valor, la palabra void debe ser utilizada como un tipo de resultado en la declaración. En este caso, la sentencia return no debe ser seguida por ninguna expresión. Puede ser omitida como en el siguiente ejemplo:

o^ wait_1 (u ^ { cnt ++; // Delay_ms(a) ; // } //

^  a) Incremento de una variable global cnt Ejecución de la función Delay_ms Note que Delay_ms no devuelve nada

 c  cc   c Para utilizar una función, el compilador debe ser consciente de su presencia en el programa. En la programación en C, los programadores normalmente primero escriben la función Ñ  y luego las funciones adicionales. Para avisar al compilador de la presencia de las funciones adicionales, se requiere declarar los prototipos de funciones en el principio de programa antes de la funciónÑ  . Un prototipo de función está compuesto por:

· · · ·

tipo de resultado nombre de función tipos de parámetros un punto y coma (;)

3Jc c

El prototipo de la función main no necesita ser declarado.

o f (o, o); /* no es obligatorio escribir los nombres de los parámetros. Este prototipo informa al compilador: en el programa se utilizará la función f, que utiliza dos parámetros de tipo float y devuelve el resultado del tipo float. */

 c c   c Mientras una función es definida y su prototipo declarado, se puede utilizar en culquier parte de programa. Sin embargo, como la funciónÑ  es 'raiz' del programa, no puede ser llamada de ninguna parte de programa. Para ejecutar una función, es necesario escribir su nombre y los parámetros asociados. Vea los siguientes ejemplos:

o esultado,a,b; // resultado,a,b,time deben coincidir con los tipos // definidos ^  time = 100; // en la declaración de las funciones f y wait_1 a = 10.54; b = 5.2; esultado = f(a,b); // Ejecutar la función f por medio de los parámetros a y b // variable resultado pausa_1(tiempo); la variable tiempo funciónX(); parámetros)

El

valor

devuelto

se

le

asigna

a

la

// Ejecutar la función pausa_1 por medio de // Ejecutar la función funciónX (sin

Cuando se llama una función, el programa salta a la función llamada, la ejecuta, después vuelve a la línea desde la que fue llamada.

c c § c Al llamar una función, se le pasan los parámetros. En C existen dos formas diferentes para pasar parámetros a una función.

El primer método, denominado µpaso por valor¶, es el más fácil. En este caso, los parámetros se pueden considerar como variables locales de la función. Cuando se llama una función, el valor de cada parámetro se copia a un nuevo espacio de memoria reservado durante la ejecución de la función. Como los parámetros se

3óc c

consideran como variables locales por el compilador, sus valores pueden ser modificados dentro de la función, pero sus modificaciones no se quedan en la memoria una vez completada la ejecución de la función.

Tenga en cuenta de que la función devuelve un valor, y no una variable. Además, se crean copias de los valores de los parámetros, por lo que sus nombres en la función f pueden ser diferentes de los parámetros utilizados en la Ñ  . La mayor desventaja del µpaso por el valor¶ es que la única interacción que una función tiene con el resto del programa es el valor devuelto de un solo resultado (o la modificación de las variables globales). El otro método, denominado 'paso por dirección' le permite sobrepasar este problema. En vez de enviar el valor de una variable al llamar a función, se debe enviar la dirección de memoria del valor. Entonces, la función llamada será capaz de modificar el contenido de esta localidad de memoria.

// Función 'sort'ordena los miembros de ascendente // y devuelve el miembro con máximo valor

la

matriz

por

valor

^  sot(^  *); // Prototipo de función co  SIZE = 5; // Número de miembros a ordenar o^ main() { ^  maximum, input[SIZE] = {5,10,3,12,0}; // Declaración de variables en la matriz maximum = sot(input); // Llamar a función y asignarle el máximo // valor a la variable maximum } ^  sot(^  *sequence) { ^  i, temp, pemut; pemut = 1; hecho una permutación

// Declaración de variables // Bandera de bit indica que se ha

h^(pemut!=0) { // Quedarse en el bucle hasta reinicar la bandera pemut = 0; // Bandera reiniciada o (i=0;iMSIZE-1;i++) { // Comparar y oredenar los miembros de la // matriz (dos a dos) ^(sequence [i] > sequence[i+1]){ temp = sequence [i]; sequence[i] = sequence[i+1]; sequence[i+1] = temp; pemut = 1; // Se ha hecho una permutación, bandera de bit //se pone a uno } ¦ c c

} } u miembro

sequence[SIZE-1];

//

Devolver

el

valor

del

último

} // que es al mismo tiempo el miembro con el máximo valor En este ejemplo, por medio de una función se realizan dos operaciones: ordena los miembros de la matriz por valor asdendente y devuelve el máximo valor.

Para utilizar una matriz en una función es necesario asignar la dirección a la matriz (o a su primer miembro). Vea el siguiente ejemplo:

o método_1(^ []); función Método_1 o método_2(int*); función Método_2

// Declaración de prototipo de la // Declaración de prototipo de la

co  NÚMERO_DE_MEDICIONES = 7; // Número de los miembros de la matriz o^ main() { ou pomedio1, pomedio2; // Declaración de las variables promedio1 // y promedio2 ^  voltaje [NÚMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9}; // Declaración de la // matriz voltaje pomedio1 = método_1(&voltaje[0]); // Parámetro de la función es la dirección // del primer miembro pomedio2 = método_2(voltaje); // Parámetro de la función es la dirección de // la matriz } //××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× ××××× o método_1(^  voltaje[]) // Inicio de la función método_1 { ^  i, suma; // Declaración de las variables locales i y suma

¦6c c

o (i=0;iMNÚMERO_DE_MEDICIONES;i++) promedio de voltaje suma += voltaje[i]; *(voltaje+i)en vez de voltaje[i]

//

Cálculo

del

valor

// Es posible utilizar

u (suma/NÚMERO_DE_MEDICIONES); } //××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× ××××× o método_2 (^  *voltaje) //Inicio de la función método_2 { ^  i, suma; // Declaración de las variables locales i y suma o (i=0;iMNÚMERO_DE_MEDICIONES;i++) promedio de voltaje suma += *(voltaje+i); voltaje[i] en vez de *(voltaje+i)

//

Cálculo

del

valor

// Es posible utilizar

u (suma/NÚMERO_DE_MEDICIONES); } Las funciones 'método_1' y 'método_2' son completamente equivalentes. Las dos devuelven el valor promedio de la matriz 'voltaje[]'. Después de declararla, la dirección del primer miembro se puede escribir como 'voltaje' o '&voltaje[0]'.

¦dc c

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF