Sei sulla pagina 1di 25

SISTEMA DE NUMERACIN BINARIO

SISTEMA DE NUMERACIN HEXADECIMAL

CONVERSIN DE NMEROS BINARIOS A DECIMALES

CONVERSIN DE NMEROS HEXADECIMALES A DECIMALES

CONVERSIN DE NMEROS HEXADECIMALES A BINARIOS

No es necesario realizar ningn clculo para convertir un nmero hexadecimal a binario. Los dgitos hexadecimales se reemplazan simplemente por los cuatro dgitos binarios apropiados. Ya que el dgito hexadecimal mximo es equivalente al nmero decimal 15, es necesario utilizar cuatro dgitos binarios para representar un dgito hexadecimal. Por ejemplo:

MARCAR LOS NMEROS

El sistema de numeracin hexadecimal, junto con los sistemas binario y decimal, se consideran los ms importantes para nosotros. Es fcil realizar una conversin de cualquier nmero hexadecimal a binario, adems es fcil de recordarlo. Sin obstante, estas conversiones pueden provocar una confusin. Por ejemplo, qu significa en realidad la sentencia: Es necesario contar 110 productos en una cadena de montaje? Dependiendo del sistema en cuestin (binario, decimal o hexadecimal), el resultado podra ser 6, 110 o 272 productos, respectivamente. Por consiguiente, para evitar equivocaciones, diferentes prefijos y sufijos se aaden directamente a los nmeros. El prefijo $ o 0x as como el sufijo h marca los nmeros en el sistema hexadecimal. Por ejemplo, el nmero hexadecimal 10AF se puede escribir as: $10AF, 0x10AF o 10AFh. De manera similar, los nmeros binarios normalmente obtienen el sufijo % o 0B. Si un nmero no tiene ni sufijo ni prefijo se considera decimal. Desafortunadamente, esta forma de marcar los nmeros no es estandarizada, por consiguiente depende de la aplicacin concreta. La siguiente es tabla comparativa que contiene los valores de nmeros 0-255 representados en tres sistemas de numeracin diferentes. Esto es probablemente la manera ms fcil de entender lgica comn aplicada a todos los sistemas de numeracin.

NMEROS NEGATIVOS

Como ya hemos visto, para escribir un nmero negativo en matemticas, basta con aadirle el prefijo - (signo menos). Sin embargo, en la programacin, al acabarse el proceso de la compilacin, se quedan slo los nmeros binarios, volvindose las cosas ms complicadas. Se utilizan slo dos dgitos - 0 y 1, mientras que todos los dems nmeros, smbolos y signos se forman por medio de las combinaciones de estos dos dgitos. En el caso de los nmeros negativos, la solucin es la siguiente: En los nmeros negativos, el bit ms significativo (el bit del extremo izquierdo) representa el signo del nmero (donde 0 ser positivo y 1 negativo). En el caso de un nmero de 8 bits, para representar un valor numrico slo quedan 7 bits. De acuerdo a este tipo de codificacin el nmero +127 es el mayor nmero positivo con signo que se puede representar con 8 bits. Asimismo, hay cero (0) positivo y negativo (refirase a la tabla de la derecha). La siguiente pregunta sera: Cmo es posible saber de qu nmero se trata? Por ejemplo, si ponemos el nmero 10000001, es -1 o 129? No se preocupe, de eso se encarga el compilador. sta es la razn por la que se declaran variables al escribir el programa. Bueno, de eso vamos a hablar a continuacin.

BYTE

REGISTROS

Un registro o una celda de memoria es un circuito electrnico que puede memorizar el estado de un byte.
REGISTROS SFR

A diferencia de los registros que no tienen ninguna funcin especial y predeterminada, cada microcontrolador dispone de un nmero de registros de funciones especiales (SFR), con la funcin predeterminada por el fabricante. Sus bits estn conectados a los circuitos internos del microcontrolador tales como temporizadores, convertidores A/D, osciladores entre otros, lo que significa que directamente manejan el funcionamiento de estos circuitos, o sea del microcontrolador. Imagnese ocho interruptores que manejan el funcionamiento de un circuito pequeo dentro del microcontrolador. Los registros SFR hacen exactamente lo mismo.

En otras palabras, el estado de los bits de registros se fija dentro de programa, los registros SFR dirigen los pequeos circuitos dentro del microcontrolador, estos circuitos se conectan por los pines del microcontrolador a un dispositivo perifrico utilizado para... Bueno, depende de usted.
PUERTOS DE ENTRADA/SALIDA (E/S)

Para hacer til un microcontrolador, hay que conectarlo a un dispositivo externo, o sea, a un perifrico. Cada microcontrolador tiene uno o ms registros (denominados puertos) conectados a los pines en el microcontrolador. Por qu se denominan como puertos de entrada/salida? Porque usted puede cambiar la funcin de cada pin como quiera. Por ejemplo, usted desea que su dispositivo encienda y apague los tres seales LEDs y que simultneamente monitoree el estado lgico de 5 sensores o botones de presin. Uno de los puertos debe estar configurado de tal manera que haya tres salidas (conectadas a los LEDs) y cinco entradas (conectadas a los sensores). Eso se realiza simplemente por medio de software, lo que significa que la funcin de algn pin puede ser cambiada durante el funcionamiento. Una de las caractersticas ms importantes de los pines de entrada/salida (E/S) es la corriente mxima que pueden entregar/recibir. En la mayora de los microcontroladores la corriente obtenida de un pin es suficiente para activar un LED u otro dispositivo de baja corriente (10-20mA). Mientras ms pines de E/S haya, ms baja es la corriente mxima de un pin. En otras palabras, todos los puertos de E/S comparten la corriente mxima declarada en la hoja de especificacin tcnica del microprocesador. Otra caracterstica importante de los pines es que pueden disponer de los resistores pull-up. Estos resistores conectan los pines al polo positivo del voltaje de la fuente de alimentacin y su efecto se puede ver al configurar el pin como una entrada conectada a un interruptor mecnico o a un botn de presin. Las ltimas versiones de los microcontroladores tienen las resistencias pull-up configurables por software. Cada puerto de E/S normalmente est bajo el control de un registro SFR especializado, lo que significa que cada bit de ese registro determina el estado del pin correspondiente en el el microcontrolador. Por ejemplo, al escribir un uno lgico (1) a un bit del registro de control (SFR), el pin apropiado del puerto se configura automticamente como salida. Eso

significa que el voltaje llevado a ese pin se puede leer como 0 o 1 lgico. En caso contrario, al escribir 0 al registro SFR, el pin apropiado del puerto se configura como salida. Su voltaje (0V o 5V) corresponde al estado del bit apropiado del registro del puerto.
INTERRUPCIN

La mayora de programas utilizan interrupciones durante ejecucin de programa regular. El propsito del microcontrolador generalmente consiste en reaccionar a los cambios en su entorno. En otras palabras, cuando ocurre algo, el microcontrolador reacciona de alguna manera... Por ejemplo, al apretar el botn del mando a distancia, el microcontrolador lo registra y responde al comando cambiando de canal, subiendo o bajando el volumen etc. Si el microcontrolador pasar la mayora del tiempo comprobando varios botones sin parar las horas, los das, esto no sera nada prctico. Por lo tanto, el microcontrolador aprendi un truco durante su evolucin. En vez de seguir comprobando algn pin o bit, el microconrolador deja su trabajo de esperar a un experto que reaccionar slo en caso de que suceda algo digno de atencin. La seal que informa al procesador central acerca de tal acontecimiento se denomina INTERRUPCIN.
TEMPORIZADORES/CONTADORES

El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no se trata de la solucin ms simple, hay muchas razones para utilizarlo. La frecuencia del oscilador es definida con precisin y muy estable, as que siempre genera los pulsos del mismo ancho, lo que los hace perfectos para medicin de tiempo. Tales osciladores se utilizan en los relojes de cuarzo. Si es necesario medir el tiempo transcurrido entre dos eventos, basta con contar los pulsos generados por este oscilador. Esto es exactamente lo que hace el temporizador. La mayora de los programas utiliza estos cronmetros electrnicos en miniatura. Generalmente son registros SFR de 8 o 16 bits cuyo contenido se aumenta automticamente con cada pulso. Una vez que se llena el registro, se genera una interrupcin! Si el temporizador utiliza el oscilador de cuarzo interno para su funcionamiento, es posible medir el tiempo entre dos eventos (el valor de registro en el momento de iniciar la medicin es T1, en el momento de finalizar la medicin es T2, el tiempo transcurrido es igual al resultado de la resta T2 - T1). Si los registros se aumentan con los pulsos que vienen de la fuente externa, tal temporizador se convierte en un contador. Esto es una explicacin simple de su funcionamiento. Es un poco ms complicado en prctica. CMO FUNCIONAN LOS TEMPORIZADORES?

En prctica, los pulsos generados por el oscilador de cuarzo son llevados al circuito una vez por cada ciclo de mquina directamente o por el pre-escalador, lo que aumenta el nmero en el registro del temporizador. Si una instruccin (un ciclo de mquina) dura cuatro perodos del oscilador de cuarzo, este nmero ser cambiado un milln de veces por segundo (cada microsegundo) al incorporar al cuarzo que oscila con una frecuencia de 4 MHz

Es fcil de medir los intervalos de tiempo cortos de la manera descrita anteriormente (hasta 256 microsegundos porque es el mayor nmero que un registro puede contener). Esta obvia desventaja se puede superar de varias maneras: al utilizar el oscilador ms lento, por medio de registros con ms bits, del pre-escalador o de la interrupcin. Las primeras dos soluciones tienen algunas debilidades as que se recomienda utilizar el pre-escalador y/o la interrupcin. UTILIZAR UN PREESCALADOR EN EL FUNCIONAMIENTO DEL TEMPORIZADOR Un pre-escalador es un dispositivo electrnico utilizado para dividir la frecuencia por un factor predeterminado. Esto quiere decir que se necesita llevar 1, 2, 4 o ms pulsos a su entrada para generar un pulso a la salida. La mayora de los microcontroladores disponen de uno o ms pre-escaladores incorporados y su tasa de divisin puede ser cambiada dentro del programa. El pre-escalador se utiliza cuando es necesario medir los perodos de tiempo ms largos. Si el temporizador y el temporizador perro guardin comparten un preescalador, ste no se puede utilizar por los dos simultneamente.

UTILIZAR UNA INTERRUPCIN EN EL FUNCIONAMIENTO DEL TEMPORIZADOR Si el registro del temporizador es de 8 bits, el mayor nmero que se puede escribir en l es 255 (en los registros de 16 bits es el nmero 65.535). Si se excede este nmero, el temporizador se reinicia automticamente y el conteo comienza de nuevo en cero. Esto es denominado desbordamiento o sobreflujo (overflow). Permitido por el programa, el desbordamiento puede provocar una interrupcin, lo que abre completamente nuevas posibilidades. Por ejemplo, el estado de registros utilizados para contar segundos, minutos o das puede ser implementado en una rutina de interrupcin. El proceso entero (excepto la rutina de interrupcin) se lleva a cabo internamente, lo que permite que los circuitos principales del microcontrolador funcionen regularmente.

La figura anterior describe el uso de una interrupcin en el funcionamiento del temporizador. Al asignarle un pre-escalador al temporizador, se producen retrasos de duracin arbitraria con mnima interferencia en la ejecucin del programa principal. CONTADORES Si un temporizador se suministra por los pulsos ingresados por el pin de entrada en el microcontrolador, se produce un contador. Evidentemente, es el mismo circuito electrnico. La nica diferencia es que los pulsos para contar se ingresan por el pin de entrada y que su duracin (anchura) no es definida. Por eso, no se pueden utilizar para medicin de tiempo, sino que se utilizan para otros propsitos, por ejemplo: contar los productos en la cadena de montaje, nmero de rotaciones del eje de un motor, pasajeros etc. (dependiendo del sensor utilizado. TEMPORIZADOR PERRO GUARDIN (WATCHDOG) El perro guardin es un temporizador conectado a un oscilador RC completamente independiente dentro del microcontrolador. Si el perro guardin est habilitado, cada vez que cuenta hasta el mximo valor en el que ocurre el desbordamiento del registro se genera una seal de reinicio del microcontrolador

y la ejecucin de programa inicia en la primera instruccin. El punto es evitar que eso ocurra al utilizar el comando adecuado. La idea se basa en el hecho de que cada programa se ejecuta en varios bucles, ms largos o cortos. Si las instrucciones que reinician el temporizador perro guardin se colocan en lugares estratgicos del programa, aparte los comandos que se ejecutan regularmente, el funcionamiento del perro guardin no afectar a la ejecucin del programa. Si por cualquier razn (ruidos elctricos frecuentes en la industria) el contador de programa se queda atrapado dentro de un bucle infinito, el valor del registro continuar aumentado por el temporizador perro guardin alcanzar el mximo valor, el registro se desbordar y, aleluya! Ocurre el reinicio!

TIPO DE DATO char int float

DESCRIPCIN Texto (caracteres) Valores enteros Valores en punto flotante Valores en punto flotante de doble precisin

TAMAO (NMERO DE BITS) 8 16 32

RANGO DE VALORES de 0 a 255 de -32768 a 32767 de 1.1754943508210-38 a 6.805647744071038 de 1.1754943508210-38 a 6.805647744071038

double

32

TIPO DE DATO char

TIPO DE DATO CON PREFIJO signed char unsigned int short int

TAMAO (NMERO DE BITS) 8 16 8 8 32 32

RANGO DE VALORES de -128 a 128 de 0 a 65535 de 0 a 255 de -128 a 127 de 0 a 4294967295 de -2147483648 a 2147483647

int

signed short int long int signed long int

Tipo entero (int) Un entero es un nmero sin parte fraccionaria que puede estar expresado en los siguientes formatos: Hexadecimal (base 16): el nmero empieza con 0x (o 0X). Los enteros hexadecimales consisten en los dgitos (de 0 a 9) y/o las letras (A, B, C,D, E, F). Por ejemplo: 0x1A. Decimal (base 10): el nmero consiste en los dgitos (de 0 a 9). El primer dgito no puede ser 0. En este formato, se puede introducir el signo de nmero (+ o -). Por ejemplo: 569, -25, +1500. Octal (base 8): los nmeros se representan a base 8 utilizando slo 8 dgitos (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 0x11 // formato hexadecimal equivale a decimal 17 11 // formato decimal -152 // formato decimal 011 // formato octal equivale a decimal 9 0b11 // formato binario equivale a decimal 3 Tipo punto flotante (float) El tipo punto flotante (float) se utiliza para los nmeros reales con el punto decimal. Los datos de tipo float se pueden representar de varias maneras. Un dato float es siempre consigno (signed). 0. // = 0.0 -1.23 // = -1.23 23.45e6 // = 23.45 * 10^6 2e-5 // = 2.0 * 10^-5 3E+10 // = 3.0 * 10^10

.09E34 // = 0.09 * 10^34 Tipo carcter (char) El tipo char es considerado como un entero por el compilador. No obstante, se utiliza normalmente para los datos de tipo carcter. Un dato de tipo carcter est encerrado entre comillas y codificado en un carcter ASCII. 59 // entero 'p' // carcter ASCII 'p' Una secuencia de caracteres es denominada cadena (string). Las cadenas estn encerradas entre comillas dobles, por ejemplo: "Presione el botn RA0" Es posible introducir directamente el valor de una constante dentro de la lista de enumeraciones. El incremento se detiene al asignar un valor a un elemento de matriz, despus se reinicia a partir del valor asignado. Vea el siguiente ejemplo: enum surtidores {AGUA,GASLEO=0,CLORO}; // AGUA = 0; GSOLEO = 0; CLORO =1 Las constantes de enumeracin se utilizan de la siguiente manera: int Velocidad_de_ascensor enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO}; Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2 Definir los nuevos tipos de datos La palabra clave typedef le permite crear con facilidad los nuevos tipos de datos. typedef unsigned int positivo; // positivo es un sinnimo para el tipo sin signo int positivo a,b; // Variables a y b son de tipo positivo a = 10; // Variable a equivale a 10 b = 5; // Variable b equivale a 5
Clases de almacenamiento

Las clases de almacenamiento se utilizan para definir el mbito y la vida de variables, constantes y funciones dentro de un programa. En mikroC se pueden utilizar diferentes clases de almacenamiento: auto es una clase de almacenamiento por defecto para las variables locales, as que se utiliza raramente. Se utiliza para definir que una variable local tiene duracin local. La clase de almacenamiento auto no se puede utilizar con variables globales.

static es una clase de almacenamiento por defecto para las variables globales. Especifica que una variable es visible dentro del archivo. A las variables locales declaradas con el prefijo static se les puede acceder dentro del archivo fuente (o sea se comportan como variables globales). extern: la palabra clave extern se utiliza cuando el programa est compuesto por diferentes archivos fuente. Esto le permite utilizar una variable, una constante o una funcin declarada en otro archivo. Por supuesto, para compilar y enlazar este archivo correctamente, el mismo debe ser incluido en su proyecto. En los siguientes ejemplos, el programa consiste en dos archivos: File_1 y File_2. El File_1 utiliza una variable y una funcin declaradas en File_2.

File 1:

extern int cnt; // Variable cnt es visible en File_1 extern void hello(); // Funcin hello()se puede utilizar en File_1 void main(){ PORTA = cnt++; visible en File_2 hello(); }
File 2:

// Cualquier modificacin de cnt en File_1 ser // Funcin hello()se puede llamar desde aqu

int cnt = 0; void hello(); void hello(){ // Modificaciones que afectan a la . // cnt en File_1 son visibles aqu . . }

EJEMPLO OPERADOR Expresin += -= *= /= %= a += 8 a -= 8 a *= 8 a /= 8 a %= 8 Equivalente a=a+8 a=a-8 a=a*8 a=a/8 a=a%8

OPERADORES DE INCREMENTO Y DECREMENTO Las operaciones de incremento y decremento por 1 se denotan con "++" y "--". Estos caracteres pueden preceder o seguir a una variable. En primer caso (++x), la variable x ser incrementada por 1 antes de ser utilizada en la expresin. De lo contrario, la variable se utilizar en la expresin antes de ser aumentada por 1. Lo mismo se aplica a la operacin de decremento. OPERADOR ++ A++ --B -B-int a, b, c; a = b = 5; c = 1 + a++; // c = 6 b = ++c + a // b = 7 + 6 = 13 OPERADOR > >= < <= == != DESCRIPCIN MAYOR QUE MAYOR O IGUAL QUE MENOR QUE MENOR O IGUAL QUE IGUAL QUE DESIGUAL QUE EJEMPLO B > A A >= 5 A < B A <= B A == 6 A != B CONDIC IN DE VERACID AD SI B ES MAYOR QUE A SI A ES MAYOR O IGUAL QUE 5 SI A ES MENOR QUE B SI A ES MENOR O IGUAL QUE B SI A ES IGUAL QUE 6 SI A ES DESIGUAL QUE B EJEMPLO ++A DESCRIPCIN VARIABLE "A" ES INCR EMENTADA POR 1 VARIABLE "A" ES DECR EMENTADA POR 1

int prop; int var = 5; prop = var < 10; // Expresin es evaluada como verdadera, prop = 1 OPERADORES LGICOS Hay tres tipos de operaciones lgicas en el lenguaje C: Y (AND) lgico, O (OR) lgico y negacin - NO (NOT) lgico. Los operadores lgicos devuelven verdadero (1 lgico) si la expresin evaluada es distinta de cero. En caso contrario, devuelve falso (0 lgico) si la expresin evaluada equivale a cero. Esto es muy importante porque las operaciones lgicas se realizan generalmente sobre las expresiones, y no sobre las variables (nmeros)

particulares en el programa. Por lo tanto, las operaciones lgicas se refieren a la veracidad de toda la expresin. Por ejemplo: 1 && 0 es igual a (expresin verdadera) && (expresin falsa) El resultado 0, o sea - Falso en ambos casos. OPERADOR && || ! FUNCIN Y O NO

OPERADORES DE MANEJO DE BITS A diferencia de las operaciones lgicas que se realizan sobre los valores o expresiones, las operaciones de manejo de bits se realizan sobre los bits de un operando. Se enumeran en la siguiente tabla:

OPERADOR ~ << >>

DESCRIPCIN COMPLEMENTO A UNO DESPLAZAMIENTO A LA IZQUIERDA DESPLAZAMIENTO A LA DERECHA Y LGICO PARA MANEJ O DE BITS

EJEMPLO A = ~B A = B << 2 A = B >> 2

RESULTADO B = 5 B = 11110011 B = 11110011 A = 11100011 B = 11001100 A = 11100011 B = 11001100 A = 11100011 B = 11001100 A = -5 A = 11001100 A = 00011110 C = 11000000

&

C = A & B

O LGICO PARA MANEJ O DE BITS

C = A | B

C = 11101111

EXOR LGICO PARA MANEJ O DE BITS

C = A ^ B

C = 00101111

Note que el resultado de la operacin de desplazamiento a la derecha depende del signo de la variable. En caso de que el operando se aplique a una variable sin signo o positiva, se introducirn los ceros en el espacio vaco creado por desplazamiento. Si se aplica a un entero con signo negativo, se introducir un 1 para mantener el signo correcto de la variable. CMO UTILIZAR LOS OPERADORES? Aparte de los operadores de asignacin, dos operadores no deben estar escritos uno junto al otro. o x*%12; // esta expresin generar un error Cada operador tiene su prioridad y asociatividad como se muestra en la tabla: Similar a las expresiones aritmticas, los operadores se agrupan juntos por medio de parntesis. Primero se calculan las expresiones encerradas entre parntesis. Si es necesario, se pueden utilizar los parntesis mltiples (anidados). PRIORIDAD Alta OPERADORES () [] -> . ! ~ ++ -- +(unitario) -(unitario) *Puntero &Puntero */% +<> < <= > >= == != & ^ | && || ?: Baja = += -= *= /= /= &= ^= |= <= >= int a, b, res; a = 10; b = 100; res = a*(a + b); // resultado = 1100 res = a*a + b; // resultado = 200 ASOCIATIVIDAD de izquierda a derecha de derecha a izquierda de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de derecha a izquierda de derecha a izquierda de izquierda a derecha

CONVERSIN DE TIPOS DE DATOS Algunas operaciones implican conversin de datos. Por ejemplo, si divide dos valores enteros, hay una alta posibilidad de que el resultado no sea un entero. El mikroC realiza una conversin automtica cuando se requiera. Si dos operandos de tipo diferente se utilizan en una operacin aritmtica, el tipo de operando de la prioridad ms baja se convierte automticamente en el tipo de operando de la prioridad ms alta. Los tipos de datos principales se colocan segn el siguiente orden jerrquico:

La autoconversin se realiza asimismo en las operaciones de asignacin. El resultado de la expresin de la derecha del operador de la asignacin siempre se convierte en el tipo de la variable de la izquierda del operador. Si el resultado es de tipo de la prioridad ms alta, se descarta o se redondea para coincidir con el tipo de la variable. Al convertir un dato real en un entero, siempre se descartan los nmeros que siguen al punto decimal. int x; // A la variable x se le asigna el tipo integer (un entero) x = 3; // A la variable x se le asigna el valor 3 x+ = 3.14; // El valor 3.14 se agrega a la variable x al // realizar la operacin de asignacin /* El resultado de la adicin es 6 en vez de 6.14, como era de esperar. Para obtener el resultado esperado sin descartar los nmeros que siguen al punto decimal, se debe declarar x como un punto flotante. */ Para realizar una conversin explcita, antes de escribir una expresin o una variable hay que especificar el tipo de resultado de operacin entre parntesis. double distancia, tiempo, velocidad; distancia = 0.89; tiempo = 0.1; velocidad = (int)(a/b); // c = (int)8.9 = 8.0 velocidad = ((int)a)/b; // c = 0/0.1 = 0.0 El operador if-else se puede sustituir por el operador condicional '?:': (expresin1)? expresin2 : expresin3 Si el valor de la expresin1 es distinto de 0 (verdadero), el resultado de la expresin entera ser equivalente al resultado obtenido de laexpresin2. De lo contrario, si la expresin1 es 0

(falso), el resultado de la expresin entera ser equivalente al resultado obtenido de laexpresin3. Por ejemplo: maximum = (a>b)? a : b // A la variable maximum se le asigna el // valor de la variable mayor(a o b)

MATRICES

Una matriz es una lista de elementos del mismo tipo colocados en localidades de memoria contiguas. Cada elemento es referenciado por un ndice. Para declarar una matriz, es necesario especificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el nmero de sus elementos encerrados entre corchetes. Todos los elementos de una matriz tienen el mismo tipo.
tipo_de_matriz nombre_de_matriz [n_de_elementos];

Los elementos de una matriz se identifican por su posicin. En C, el ndice va desde 0 (el primer elemento de una matriz) a N-1 (N es el nmero de elementos contenidos en una matriz). El compilador tiene que saber cuntas localidades de memoria debe alojar al declarar una matriz. El tamao de una matiz no puede ser una variable. Por eso, se pueden utilizar dos mtodos:
// mtodo 1 int display [3]; // Declaracin de la matriz display capaz de contener 3 enteros // mtodo 2 const DGITOS = 5; char Matriz_nueva[DGITOS]; // Declaracin de la matriz Matriz_nueva // capaz de contener 5 enteros

Una matriz se puede inicializar a la vez que se declara, o ms tarde en el programa. En ambos casos, este paso se realiza al utilizar llaves:

int array_1[3] = {10,1,100};

Para leer o modificar un elemento de matriz del ejemplo anterior, basta con introducir su ndice encerrado entre corchetes:
/* Se supone que a ha sido declarado anteriormente como un entero */ a = array_1[0]; // A la variable a se le asigna el valor del miembro de matriz // con ndice 0 (a = 10)

array_1[2] = 20; // Miembro de matriz array_1[2] es modificado (nuevo valor es 20)

El siguiente programa cambia el orden de los elementos de una matriz. Note que el ndice se puede expresar mediante variables y operaciones bsicas.
void main() { const MUESTRAS_DE_AGUA = 4; // Valor de la constante MUESTRAS_DE_AGUA es 4 int i, temp; // Variables i y temp son de tipo int int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987};// Todos // los miembros de la matriz profundidad // de sonda son de tipo int for(i=0;i<(MUESTRAS_DE_AGUA/2);i++){ // Bucle se ejecuta 2 veces temp = profundiad_de_sonda [i]; // temp se utiliza para guardar un valor // temporalmente profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1i]; profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp; } // Aqu tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] = {1987,1,25,24} }

MATRICES BIDIMENSIONALES

Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores, el lenguaje C le permite declarar matrices multidimensionales. En esta parte vamos a describir slo las matrices bidimensionales, tambin denominadas tablas o matrices. Una matriz bidimensional se declara al especificar el tipo de dato de matriz, el nombre de matriz y el tamao de cada dimensin.
tipo_de_matriz nombre_de_matriz [nmero_de_filas] [nmero_de_columnas];

En la declaracin de esta matriz nmero_de_filas y nmero_de_columnas representan el nmero de filas y columnas en las que consiste una tabla, respectivamente. Vea la siguiente matriz bidimensional:
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas
Esta matriz se puede representar en la forma de una tabla.
tabla[0][0] tabla[1][0] tabla[2][0] tabla[0][1] tabla[1][1] tabla[2][1] tabla[0][2] tabla[1][2] tabla[2][2] tabla[0][3] tabla[1][3] tabla[2][3]

Similar a las matrices unidimesionales, es posible asignar los valores a los elementos de una tabla en la lnea de declaracin. La asignacin debe ser realizada lnea a lnea como en el siguiente ejemplo. Como hemos visto anteriormente, esta matriz tiene dos filas y tres columnas:
int Tabla [2][3]= { {3,42,1},{7,7,19} };

La matriz anterior se puede representar tambin en la forma de una tabla de valores:


3 7 42 7 1 19

PUNTEROS

Un puntero es una variable destinada a recibir una direccin. Un puntero apunta a una localidad de memoria, referenciada por una direccin. En C, la direccin de un objeto se puede obtener por medio un operador unitario &. Para acceder al contenido de la memoria en una direccin especfica (tambin llamado objeto apuntado), se utiliza un operador de indireccin (*).

'&n' es la direccin de la localidad de memoria 'n'. '*(&n)' es el contenido de la direccin '(&n)', o sea de 'n'. Para declarar un puntero, se debe que especificar el tipo de la variable apuntada:
tipo_de_variable *puntero;

En esta etapa, el puntero mi_puntero apunta al valor almacenado en esta localidad de memoria, o sea, a un valor desconocido. As que, una inicializacin es muy recomendable:
puntero = &variable;

Ahora, puntero contiene la direccin de variable. Para acceder al contenido de la variable apuntada, debe utilizar *. El siguiente ejemplo muestra el contenido de memoria dependiendo de la accin realizada por medio del puntero.

Los punteros son muy tiles para manejar las matrices. En este caso, un puntero se utilizar para apuntar al primer elemento de una matriz. Debido al hecho de que es posible realizar operaciones bsicas sobre los punteros (aritmtica de punteros), es fcil manejar los elementos de una matriz. Fjese en la diferencia entre *v+1 y *(v+1) en el siguiente ejemplo:
short int voltio[3] = short int *v; v = &(voltio[0]); // *(v+1) = 2; // voltio[2] = *v+1; // *(v+2) = *(v+1); // v++; // *v = 1; // {0,5,10}; v contiene la direccin de voltio[0] voltio[1] = 2 tab[2] = 1 (tab[0] + 1) voltio[2] = 2 v contiene la direccin de voltio[1] voltio[1] = 1

Los punteros tambin pueden ser declarados con el prefijo const. En este caso, su valor no puede ser modificado despus de la inicializacin, similar a una constante. A diferencia de C, el mikroC no admite alojamiento dinmico.

ESTRUCTURAS

Ya hemos visto cmo agrupar los elementos dentro de matrices. No obstante, al utilizar este mtodo todos los elementos deben ser del mismo tipo. Al utilizar estructuras, es posible agrupar diferentes tipos de variables bajo el mismo nombre. Las variables dentro de una estructura se le denominan los miembros de la estructura. Las estructuras de datos se declaran al utilizar la siguiente sintaxis:
struct nombre_de_estructura { tipo1_de_miembro1 miembro1; tipo2_de_miembro2 miembro2; tipo3_de_miembro3 miembro3; .. };

No es posible inicializar variables dentro de la declaracin de la estructura de datos:


struct generador { int voltaje; char corriente;

};

Entonces, podr definir los objetos denominados turbina en el cdigo. A cada uno de estos tres objetos (turbinas) se le asignan las variables corriente y voltaje.
struct generadores turbina_1, turbina_2, turbina_3;

Para acceder a las variables, es preciso utilizar el operador '.'


turbina_3.voltaje = 150; turbina_3.corriente = 12;

Por supuesto, igual que al utilizar los punteros, todava se le permite realizar operaciones por medio de operadores y sentencias definidos en las partes anteriores. Si est familiarizado con el lenguaje C, recuerde que mikroC no admite la inicializacin de los miembros de estructura por medio de las llaves. Por ejemplo, conjunto_1 ={15,m}; devuelve un error en mikroC.
DIRECTIVAS DEL PREPROCESADOR

DIRECTIVAS FUNCIONES #define Define una sustitucin de macro #undef Quita una definicin de nombre de macro #define Especifica un archivo a ser incluido #ifdef Prueba para definicin de macro #endif Especificar el final de #if #ifndef Prueba si una macro no est definida #if Prueba las condiciones de compilar #else Especifica alternativas cuando la prueba de #if falla #elif Especifica alternativas cuando ms de dos condiciones se necesitan
#define PI 3.14159 // Sustitucin simple, PI ser sustituido por // el valor 3.14159 en todas las partes del programa

Tambin puede utilizar los parmetros para realizar substituciones ms complejas:


#define VOLUMEN (D,H) (((D/2)*(D/2)*PI))*H // Macro con parmetros

Entonces, en el cdigo, la siguiente sentencia:

Tanque_1 = VOLUMEN (Dimetro,altura);

ser sustituida por:


Tanque_1 = (((Dimetro/2)*(Dimetro/2)*PI)*altura;

Por medio de la directiva #undef es posible quitar una definicin de nombre de macro. As se especifica que la substitucin que se ha definido anteriormente ya no va ocurrir en el siguiente cdigo. Esto es til cuando usted quiere restringir la definicin slo a una parte particular del programa.
#undef TANQUE // Quitar la definicin del macro VOLUMEN

ACCESO A LOS REGISTROS DE FUNCIONES ESPECIALES (SFR)

Como todos los microcontroladores, los de familia PIC tienen los registros de funciones especiales (SFR). Para programar un PIC, es necesario acceder a estos registros (para leerlos o escribir en ellos). Al utilizar el compilador mikroC PRO for PIC es posible de acceder a cualquier SFR del microcontrolador de cualquier parte del cdigo (los SFR se consideran como variables globales) sin necesidad de declararlo anteriormente. Los registros de funciones especiales se definen en un archivo externo e incluido dentro del compilador (archivo .def). Este archivo contiene todos los SFR del microcontrolador PIC a programar.
TRISB = 0; // todos los pines del puerto PORTB se configuran como salidas PORTB = 0; // todos los pines del PORTB se ponen a 0

ACCESO A LOS BITS INDIVIDUALES

El compilador mikroC PRO for PIC le permite acceder a los bits individuales de variables de 8 bits por su nombre o su posicin en byte:
INTCON.B0 = 0; // Poner a 0 el bit 0 del registro INTCON ADCON0.F5 = 1; // Poner a 1 el bit 5 del registo ADCON0 INTCON.GIE = 0; // Poner a 0 el bit de interrupcin global (GIE)

Para acceder a un bit individual, se puede utilizar '.FX' as como '.BX' (X es un entero entre 0 y 7 que representa la posicin de bit).

TIPO SBIT

Si quiere declarar una variable que corresponde a un bit de un SFR, hay que utilizar el tipo sbit. Una variable de tipo sbit se comporta como un puntero y se debe declarar como una variable global:
sbit Botn_PARADA at PORTA.B7; // Botn_PARADA est definido ... void main() { // Cualquier modificacin de Botn_PARADA afectar a PORTA.B7 ... // Cualquier modificacin de PORTA.B7 afectar a Botn_PARADA }

En este ejemplo, El Botn_PARADA es una variable declarada por el usuario, mientras que PORTA.B7 (bit 7 del puerto PORTA) ser automticamente reconocido por el compilador.
TIPO BIT

El compilador mikroC PRO for PIC proporciona un tipo de datos bit que se puede utilizar para declarar variables. No se puede utilizar en las listas de argumentos, punteros y los valores devueltos de funciones. Adems, no es posible declarar e inicializar una variable de tipo bit en la misma lnea. El compilador determina el bit en uno de los registros disponibles para almacenar las variables.
bit bf; bit *ptr; // // // bit bg = 0; // bit bg; bg = 0; // Variable de tipo bit vlida Varibale de tipo bit invlida. No hay punteros a una variable de tipo bit ERROR ; declaracin con inicializacin no est permitida Declaracin e inicializacin vlidas

FUNCIN DE INTERRUPCIN

Una interrupcin detiene la ejecucin normal de un programa para ejecutar las operaciones especficas. Una lista de sentencias a ejecutar debe estar escrita dentro de una funcin particular denominada interrupt(). La sintaxis de una interrupcin en mikroC se parece a lo siguiente:
void interrupt() { cnt++ ; // Al producirse una interrupcin // la cnt se incrementa en 1 PIR1.TMR1IF = 0; // Poner a 0 el bit TMR1IF }

A diferencia de las funciones estndar, no es necesario declarar el prototipo de la funcin interrupt(). Adems, como la ejecucin de esta funcin no forma parte de la ejecucin de programa regular, no se debe llamar de ninguna parte de programa (se

ejecutar automticamente dependiendo de las condiciones que el usuario ha definido en el programa). En el siguiente captulo vamos a dar una clara explicacin de la ejecucin y definicin de subrutinas de interrupcin.

Potrebbero piacerti anche