Вы находитесь на странице: 1из 25

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Diseo de sistemas microprocesados

Tercera semana: Vectores, punteros, funciones, estructuras y Uniones en ANSI C


Profesor: Mag. Ing. Sergio Salas Arriarn

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Vectores

Los vectores son pilares en el lenguaje C ya que permiten agrupar un conjunto de dato variable. Cada dato tiene una ubicacin en memoria SRAM y es accedido a travs de u La declaracin de un vector sigue el siguiente formato: tipo de dato nombre_del_vector[cantidad de elementos] Se puede inicializar un vector de varias formas, asignando una cadena de caracteres o datos. No es necesario indicar la dimensin en estos casos ya que el compilador autom que la dimensin del vector es igual al nmero de elementos asignados. Por ejemplo: char nombre[] = Arquitectura de computadoras II; char num[] = {1,2,3,4,5,6,7,8,9,10}; unsigned char edad[5]; /*Se crea un vector de nombre edad de 5 elementos, donde cada elemento es de 8 bits*/

void main() { edad[1] = 10; //El segundo elemento toma el valor de 10. PORTB = edad[1]; while(1); }

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Ubicacin de un vector en la SRAM


SRAM
edad[0] edad[1] 0x800

0x801
0x802 0x803 0x804

edad[2]
edad[3] edad[4]

El primer elemento del vector tiene ndice 0. Por defecto en el compilador HI-TECH C los vectores se comienzan a crear a partir de la direccin 0x800. Todos los ndices deben ser siempre nmeros enteros y positivos. Tambin es posible crear vectores de datos de mayor capacidad como por ejemplo 16 bits: unsigned int vector[3]={0x4050,0xCA0F,0x6F58}; en donde: la SRAM se distribuye de la manera siguiente: 0x50 0x40 0x0F 0xCA 0x58 0x6F 0x800 0x801 0x802 0x803 0x804 0x805 0x806

Mag. Ing. Sergio Salas

Restricciones de los vectores (parte I)


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Muchas veces los programadores de ANSI C acostumbrados a trabajar en un entorno rico en recursos como lo es un computador compatible no tienen cuidado con la excesiva cantidad de declaracin de vectores en sus programas. El dsPIC30F3014 posee recursos limitados de memoria por lo cual no se debe abusar del uso de los vectores y menos si estos son declarados con tipos de mas de 16 bits (long, float). Por ejemplo:

float numeros[100]; int detalles[500]; unsigned char coordenadas[600]; unsigned short muestras[400]; void main() { }

Demasiadas variables. La memoria resulta insuficiente.

Mag. Ing. Sergio Salas

Restricciones de los vectores (parte II)


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Por otro lado, es el programador quien debe tener sumo cuidado de no exceder el lmite d vector ya que podra alterar el contenido de otras variables. Por ejemplo: unsigned char edad[4] = {20,30,40,50}; unsigned char peso[4] = {70,80,90,85}; void main() { peso[3] = 51; edad[4] = 55; while(1); }

Dado que no debe tener ndice 4, edad[4] no est especificado e invadir el espacio dime peso[0], con lo cual peso[0] = 55. Esto obviamente no es lo que se quera realizar. Este ti nicamente mencionado por el compilador como advertencia ms no como error.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Matrices
unsigned char tabla[3][4] = {0,1,2,3 10,11,12,13, 20,21,22,23};

Las matrices son realmente vectores, pero son declarados como arreglos bidimiensional poseen dos ndices: uno para indicar el nmero de fila y otro para el nmero de columna

tabla[0][0]

tabla[0][1]

tabla[0][2]

tabla[0][3]

tabla[1][0] tabla[2][0]

tabla[1][1] tabla[2][1]

tabla[1][2] tabla[2][2]

tabla[1][3] tabla[2][3]

No es recomendable el uso de matrices en un microcontrolador dado que la cantidad de necesaria equivale a multiplicar ambos ndices por el nmero de bytes de datos. Por eje tabla utiliza 3x4x1 bytes = 12 bytes de la memoria SRAM. PORTB = tabla[2][2]; //PORTB = 22;

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Punteros

Los punteros son sumamente importantes en C ya que al igual que los vectores relacionar un conjunto de datos a una sola variable. La diferencia radica en que direccin dinmica y puede apuntar a cualquier posicin de la memoria SRAM. declaracin de un puntero es la siguiente: unsigned char *p; char *mensaje = Hola mundo;

En el primer caso se declara un puntero de nombre p que apunta a valores de 8 compilador se encarga de definir la direccin que este puntero posee en la SRA ser modificado por el programador. En el segundo caso se declara un puntero d mensaje el cual ha sido inicializado con una cadena de caracteres ASCII. El com de asignar una direccin para almacenar estos caracteres. Dicha direccin no s misma y depender de cuantas otras variables hayan sido declaradas.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Manejo de punteros
unsigned char mensaje[]=Hola Mundo; unsigned char *p; void main() { TRISB = 0x00; p = &mensaje[0]; //p apunta a mensaje PORTB = *p; //PORTB = H p++; //p apunta a mensaje[1] PORTB = *p; //PORTB = o p[2]='K'; //mensaje[3]= K while(1); }

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Ejemplo de llenado de un puntero

El siguiente programa borra la cadena Hola Mundo del vector mensaje y lo reemplaza unsigned char mensaje[] = "Hola Mundo"; unsigned char *p; char i = 0; void main() { p = &mensaje[0]; for(i=0;i<10;i++) { *p = 0; p++; } while(1); }

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Funciones

Las funciones son rutinas agrupadas dentro de un bloque que posee entradas (argumen (retornos) y se utilizan cuando el programa hace uso de bloques de cdigo que normalm repetitivos como por ejemplo: Inicializar el LCD, transmitir un byte por el USART, convert binario a BCD, etc. Las funciones se caracterizan por tener la siguiente nomenclatura: Tipo de la funcin Nombre de la funcin(tipo1 argumento 1, tipo2 argumento 2, , tipoN argumento N)

Tipo de la funcin: char, un int, un funcin, esta debe

Es el tipo de variable que se va a retornar. Puede ser un unsigned puntero, un vector, etc. Si no se va a retornar ningn valor la

declararse de tipo void. Nombre de la funcin: Puede ser cualquier nombre que no comience con un dgito numrico. El nombre debe ser nico en todo el proyecto para evitar conflictos. Argumentos: Son parmetros iniciales que se ingresan a la funcin para que a partir de dichos Mag. Ing. Sergio Salas valores se genere un nuevo resultado. Cada argumento debe se

Cmo se crea una funcin? La funcin tiene dos etapas:


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

1. La declaracin. 2. La definicin de su estructura. Suponga que quiere desarrollar una funcin que retorne 0 si un nmero es impar. El cdigo es el siguiente: unsigned char PAR_IMPAR(unsigned char num); void main() { TRISB = 0xFF; TRISD = 0; PORTD = PAR_IMPAR(PORTB); while (1); } unsigned char PAR_IMPAR(unsigned char num) { if(num%2 == 0) return(1); else return(0); } Declaracin de la funcin

Invocacin a la funcin.

Estructura de la funcin

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

La sentencia return

Esta sentencia indica el fin de la funcin y permite retornar un valor. El valor de retorno mismo tipo de dato del cual fue declarada la funcin. Una funcin puede poseer mltiple return. Pero, solo una de ellas se puede ejecutar a la vez. Por ejemplo:

unsigned char ff_verifica(unsiged char num) { if(num<50) return(0); else if(num >=50 && num <100) return(1); else if(num >=100 && num<200) return(2); else return(3);
}

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Funciones sin retorno (void)


Muchas veces se requieren funciones nicamente para la ejecucin de procedimientos, pero, no es necesario que para esto retornen un valor. Estas funciones deben ser entonces declaradas del tipo void. De la misma manera, si la funcin no recibiera parmetro alguno se coloca dentro del argumento el parmetro void o simplemente se deja vaco. Por ejemplo:

void presenta(void) { TRISB = 0xFF; TRISD = 0x00; PORTD =~ PORTB; }

void main() { presenta(); PORTD=0; presenta(); while(1); }

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Funciones recursivas
Es posible que una funcin se llame a si misma hasta que en un punto el retorno genere un valor conocido y de ah converja un resultado. Esto se conoce como recursividad. Por ejemplo: unsigned int fact(unsigned int num); unsigned int val=0; void main() { val = fact(5); while(1); } unsigned int fact(unsigned int num) { if ( num <= 1 ) return 1; else return num*fact(num-1); }

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Variables locales y globales

Toda variable declarada fuera del mbito de una funcin es considerada global. Las varia dentro del mbito de una funcin son consideradas locales. Las variables globales puede desde cualquier funcin. Las variables locales solo existen dentro del mbito de una func Por ejemplo: unsigned char a = 0; //variable global void main() { unsigned char b; //variable local TRISB = 0xFF; b = PORTB; a = ~b; while(1); } void config_Puerto(unsigned char config) { TRISD = config; a = 0; }

//la variable global //puede ser usada aqu Mag. Ing. Sergio Salas

Sobrecarga de las variables locales y globales


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Qu sucede si declaramos una variable local y una global con el mismo nomb
unsigned int fc(unsigned int num); unsigned int val=0; unsigned int p; void main() { val = 10; p = fc(40); while(1); } unsigned int fc(unsigned int num) { unsigned int val = 0; val = num/5; return(val); } //Variable global

//La variable local vale 10. //Se invoca a la funcin //val global sigue valiendo 10.

//Variable local del mismo nombre //La variable usada es la local //Retorna 8

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Variables locales
Una variable local siempre es creada al iniciar una funcin y destruida al salir de esta. Por lo tanto, no almacena su valor una vez que la funcin se vuelve a invocar. Ejemplo: unsigned char suma(unsigned char num); unsigned char val; void main() { val = suma(10); //al salir de la funcin p vale 10. val = suma(8); //al entrar a esta funcin p vale 0. val = suma(14); //al entrar a esta funcin p vale 0. while(1); } unsigned char suma(unsigned char num) { unsigned char p = 0; p+= num; return(p); }

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Variables estticas

Cuando se requiere que la variable local almacene el valor que tuvo al dejar por ltima v dicha variable debe ser declarada como esttica. Esto hace que su funcionamiento se pa variable global. Por ejemplo: unsigned char suma(unsigned char num); unsigned char val; void main() { val = suma(10); //Primera vez p vale 10. val = suma(8); //Segunda vez p vale 18 val = suma(14); //Tercera vez p vale 32 while(1); } unsigned char suma(unsigned char num) { static unsigned char p = 0; p+= num; return(p); }

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

El operador typedef
En muchas ocasiones es necesario cambiar el nombre de tipo de dato que se va a declarar para mejorar la legilibilidad del programa o hacerlo de tal manera que pueda ser claramente interpretado por otro programador que utiliza un sistema embebido diferente al suyo. Por ejemplo, al declarar una variable de tipo unsigned int se sabe que esta tiene un tamao de 16 bits sin signo lo que significa que el valor posible de la variable puede alternar entre 0 y 65,535. Sin embargo, programadores de microcontroladores ATMEL u otros fabricantes pueden entender el tipo unsigned int como un valor de otra dimensin (de 8 bits sin signo por ejemplo). Para evitar malos entendidos se puede hacer uso del operator typef de la siguiente manera: typedef unsigned int _8bits_sin_signo; _8bits_sin_signo var=0, num=10;

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Estructuras

Las estructuras son arreglos de datos que se pueden invocar desde una sola variable a vectores. La diferencia principal con estos ltimos radica en que los tipos de datos asoc pueden ser diferentes. Por ejemplo, suponga que queremos crear una variable Persona asociada los siguientes datos: edad, peso, talla, DNI, nombre. La edad de la persona es un valor de 8 bits ya que puede oscilar entre 0 y 255 aos. El peso de la persona tambin es un valor de 8 bits y puede alternar entre 0 y 255 kg. La talla de la persona tambin es un valor de 8 bits y puede alternar entre 0 y 255 cms. El DNI de la persona es un valor de 32 bits sin signo ya que considera 7 cifras. El nombre de la persona es una cadena de caracteres de 30 dgitos.

La asociacin de estas variables a una sola se hace mediante una estructura de la sigu struct{ unsigned char edad; unsigned char peso; unsigned char talla; unsigned long DNI; unsigned char nombre[30]; } Persona;

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Acceso a la estructura
Una vez declarada la estructura ya sea en la zona de variables globales o locales es posible acceder a ella dentro de una funcin. Por ejemplo, para la estructura Persona se tiene: unsigned char nombre[] = Juan Perez; void main() { Persona.edad = 25; Persona.talla = 180; Persona.peso = 80; Persona. DNI = 40722891; Persona.nombre = &nombre[0]; while(1); }

La estructura creada ocupa en la memoria SRAM un total de 3 + 4 + 30 = 37 bytes de d

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Variables de tamao definido por el programador

La ventaja de trabajar con estructuras es que nos permiten generar variables de tamaos predefinidos que pueden ser de hasta 1 bit. Esto nos da una gran ayuda para trabajar algoritmos, en los cuales se tienen que analizar conjuntos binarios que son menores a 8 bits. Por ejemplo observe la siguiente esctructura: void main() struct{ { unsigned char bit0: 1; _bits.bit0 = 1; unsigned char bit1: 1; _bits.bit1 = 0; unsigned char bit2: 1; _bits.bit2 = 1; unsigned char bit3: 1; _bits.bit3 = 0; unsigned char bit4: 1; _bits.bit4 = 0; unsigned char bit5: 1; _bits.bit5 = 1; unsigned char bit6: 1; _bits.bit6 = 1; unsigned char bit7: 1; _bits.bit7 = 0; }_bits; while(1); } Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Uniones

Las uniones tienen una declaracin similar a las estructuras, la diferencia principal radica elementos de las uniones se sobre escriben y ocupan las mismas posiciones en la memo muy til ya que nos permite acceder al mismo espacio de memoria con diferentes nombr variable, con lo cual podemos acceder a todo un byte o word y a cada bit de estos de ma

Por ejemplo: union{ unsigned char val; unsgined char p; }_bytes;

Tanto val como p ocupan el mism Espacio en la memoria SRAM.

void main() { _bytes.val = 5; _bytes.p = 10; while(1); }

Tanto val = 5 y p = 5. Luego p = 10 y por tanto val = 10.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Uniones con variables de diferente tamao


struct{ SRAM variable._bytes.LSB 0x05 0xC0 variable._word = 0xC005

union{

unsigned char LSB; unsigned char MSB;


}_bytes; unsigned int _word; }variable; void main() { variable._bytes.LSB = 0x05; variable._bytes.MSB = 0xC0; while(1); }

variable._bytes.MSB

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Uniones con variables de tamao binario


union{
struct{ unsigned char bit0: 1; unsigned char bit1: 1; unsigned char bit2: 1; unsigned char bit3: 1; unsigned char bit4: 1; unsigned char bit5: 1; unsigned char bit6: 1; unsigned char bit7: 1; }_bits; unsigned char _byte; } dato; void main() { dato._byte = 0x05; while(1); }

//dato._bits.bit0 = 1, dato._bits.bit2 = 1

Mag. Ing. Sergio Salas

Вам также может понравиться