PROGRAMACIÓN EN C para uc MCS-5
Resumen de contenidos - Objetivos 2 - Justificación 3 - Compiladores cruzados 4 - Compiladores Keil uvision2 5 - Uso del entorno de programación 6 - Ejemplos 7 - Bibliografía PROGRAMACIÓN EN C 2
- Objetivos PROGRAMACIÓN EN C 3
- Objetivos Conocer la posibilidad de programación de los microcontroladores en lenguajes de alto nivel Programar sistemas empotrados en C Analizar las extensiones de ANSI C disponibles para la familia MCS5 Ejercitarse en el uso de la herramientas de programación seleccionada PROGRAMACIÓN EN C 4
2 - Justificación PROGRAMACIÓN EN C 5
2 - Justificación Los microprocesadores y microcontroladores ejecutan secuencias de instrucciones máquina particulares El lenguaje ensamblador es una traducción inmediata de los códigos máquina, por lo que son muy dependientes del procesador (código no exportable) Los lenguajes de alto nivel: Son más independientes del procesador Facilitan la escritura de programas al estar más cercanos a un razonamiento lógico-matemático PROGRAMACIÓN EN C 6
3 - Compiladores cruzados PROGRAMACIÓN EN C 7
3 - Compiladores cruzados Hay compiladores para muchos lenguajes de programación de alto nivel (Pascal, C, Ada, Forth, etc.) que generan código para microcontrolador Son normalmente COMPILADORES CRUZADOS, donde el equipo de desarrollo tiene un procesador diferente (por ejemplo un PC con Pentium) al equipo destino (por ejemplo un freno ABS con T89C5CC0) sfr P0=0x80; sfr P=0x90; void main(void){ while() P=~P0; } Equipo de desarrollo Equipo destino Sin duda el lenguaje más extendido es C, por la disponibilidad de compiladores, depuradores, librerías, ejemplos de aplicación, etc. C genera código máquina eficiente PROGRAMACIÓN EN C 8
4 Entorno Compilador uvision2 de Keil PROGRAMACIÓN EN C 9
4 - Compilador µvision2 Hay versiones gratuitas de evaluación (con capacidades recortadas) de este compilador Otro compiladores C con versiones de evaluación gratis IAR http://www.iar.com Franklin http://www.fsinc.com Compilador C gratuito (GNU) SDCC sdcc.sourceforge.net PROGRAMACIÓN EN C 0
4 - Compilador µvision2 Características generales 00 % compatible con ANSI-C Librerías estándar C disponibles para sistemas empotrados Aritmética en punto flotante compatible con IEEE Extensiones para características MCS5 Generación de código Optimización seleccionable entre tamaño o velocidad Compatible con depuradores de alto nivel (C-SPY,...) Generación de código PROMABLE en diferentes formatos PROGRAMACIÓN EN C
Gestión de memoria Diferentes modelos de memoria (zonas donde se crean las variables) Existen tres modelos: 4 - Compilador µvision2 SMALL: Todas las variables se almacenan en la memoria interna. El acceso a las variables es muy eficiente. Existe limitación en cuanto al tamaño de la memoria interna. Es el mejor modelo. COMPACT: Las variables se almacenan en la memoria externa. Puede almacenar un máximo de 256 bytes de variables. LARGE: Todas las variables se almacenan en memoria externa sin limitación es el menos efectivo de los tres. PROGRAMACIÓN EN C 2
Gestión de memoria 4 - Compilador µvision2 Localización de variables flexible DATA: zona direccionamiento directo IDATA: zona direccionamiento indirecto XDATA: zona memoria de datos externa CODE: zona de memoria de programa PROGRAMACIÓN EN C 3
4 - Compilador µvision2 Gestión de memoria El modelo de memoria elegido influye drásticamente en la velocidad y tamaño del código Por ejemplo, suponiendo la instrucción en C int i=520; al compilarlo, en función del modelo de memoria, quedaría: Código DATA IDATA XDATA MOV R0,#i MOV @R0,#2 INC R0 MOV @R0,#8 MOV i,#2 MOV i+,#8 Byte/Ciclos maq. 6/4 7/4 0/9 Rango direcciones 0-7F 0-FF 0-FFFF MOV DPTR,#i MOV A,#2 MOVX @DPTR,A INC DPTR MOV A,#8 MOVX @DPTR,A PROGRAMACIÓN EN C 4
Representación de los datos Tipos estándar Tipo de dato signed char unsigned char signed int unsigned int signed short unsigned short signed long unsigned long float double 4 - Compilador µvision2 Bytes ocupados 2 2 4 Rango -28..27 0..255-32768..32767 0..65535-32768..32767 0..65535-247483648..247483647 0..4294967295 Notas -2 5..2 5-0..2 6 - como int -2 3..2 3-0..2 32-4?.8e -38..?3.39e +38 como float Extensiones para la familia MCS5 Tipo de dato Bytes ocupados Rango Notas bit bit 0.. área DATA direccionable por bit sbit bit 0.. área SFR sfr 0..255 área SFR PROGRAMACIÓN EN C 5
4 - Compilador µvision2 Tipo unsigned char Permite declarar un entero positivo en el rango 0...255 Ocupa en memoria byte Como el microcontrolador es de 8 bits es el tipo de dato más eficiente en cuanto a velocidad y tamaño del código Declaración unsigned char nombre_variable; Ejemplo unsigned char a,b; b=35; a=0x0f; a=a*b; Tipo signed char Permite declarar un entero en el rango -28..27 Ocupa en memoria byte Declaración signed char nombre_variable; PROGRAMACIÓN EN C 6
4 - Compilador µvision2 Tipo int, signed int, short, short int Permite declarar un entero en el rango -32768...32767 Ocupa en memoria 2 bytes Declaración int nombre_variable; Ejemplo int a,b; b=35; a=0x0f; a=a*b; Tipo unsigned int, unsigned short, unsigned short int Permite declarar un entero positivo en el rango 0..65535 Ocupa en memoria 2 bytes Declaración unsigned int nombre_variable; PROGRAMACIÓN EN C 7
4 - Compilador µvision2 Tipo long, long int Permite declarar un entero en el rango -247483648..247483647 Ocupa en memoria 4 bytes Declaración long nombre_variable; Ejemplo long a,b; b=35; a=0x0f; a=a*b; Tipo unsigned long, unsigned long int Permite declarar un entero positivo en el rango 0..4294967295 Ocupa en memoria 4 bytes Declaración unsigned long nombre_variable; PROGRAMACIÓN EN C 8
4 - Compilador µvision2 Tipo float, double, long double Permite declarar un real en el rango?.8e-38..? 3.39e+38 Ocupa en memoria 4 bytes Usa el formato IEEE 754 de simple precisión (precisión de 7 dígitos decimales) 3 30 23 22 0 S EXPONENTE MANTISA Las operaciones con reales son lentas y ocupan mucha memoria por lo que se debe intentar evitarlas Declaración float nombre_variable; Ejemplo float a,b; b=35.5; a=0.07; a=a*b; Valor=(-) Signo 2 (Exponente-27).Mantisa PROGRAMACIÓN EN C 9
Tipo sfr Permite declarar un entero positivo en el rango 0..255 Corresponde a una variable en la zona de registros especiales (SFR) Se usa igual que un unsigned char Declaración sfr nombre_variable =dirección de memoria; Ejemplo sfr P0=0x80; sfr P=0x90; void main(void){ while() P=~P0; } 4 - Compilador µvision2 PROGRAMACIÓN EN C 20
4 - Compilador µvision2 Tipo bit Permite declarar un entero positivo en el rango 0.. La variable se crea en la zona direccionable bit a bit de memoria directa (20h a 2Fh) Declaración bit nombre_variable; Tipo sbit Permite declara posiciones direccionables bit a bit en la zona SFR Dirección terminada en 0h u 8h (80h, 88h, 90h...) Declaración sbit nombre_variable =dirección de memoria; Ejemplo bit lleno; sbit valvula=0x90^0; /* bit 0 puerto digital P, P.0 */ lleno = ; if (lleno==) valvula = ; else valvula = 0; PROGRAMACIÓN EN C 2
4 - Compilador µvision2 Actividad Definir en lenguaje C las siguientes variables: De la zona SFR los registros: PSW, IEN, TMOD, TH, P4 De la zona SFR los bits: 80h bit 7, 88h bit 4, 90h bit 7 Asignar el valor cero a: IEN, TH, P4, 88h bit 4 (Nota: En el caso de los bits se le asignará cualquier nombre) PROGRAMACIÓN EN C 22
4 - Compilador µvision2 Funciones de interrupción Permiten definir fácilmente las rutinas de servicio de interrupción Declaración: void nombre_funcion (void) interrupt N { } PROGRAMACIÓN EN C 23
4 - Compilador µvision2 Funciones de interrupción Permiten definir fácilmente las rutinas de servicio de interrupción Ejemplo: Instalación de una rutina de interrupción que cada vez que desborde el Timer0 (vector 0x000b) incremente una variable tiempo. long tiempo=0; void incrementar_tiempo(void) interrupt { tiempo++; } PROGRAMACIÓN EN C 24
5 - Uso del entorno de programación PROGRAMACIÓN EN C 25
5 - Uso del entorno de programación Se deberá realizar la práctica 3 para tener un contacto con el entorno de programación. PROGRAMACIÓN EN C 26
6 - Ejemplos PROGRAMACIÓN EN C 27
6 - Ejemplos: puertos PROGRAMA EJEMPLO sfr P=0x90; sfr P2=0xA0; void main(void) { while () P2=P+5; } Actividad: Editar, compilar y generar el fichero hexadecimal. Ver el ensamblador generado. PROGRAMACIÓN EN C 28
6 - Ejemplos: puertos sfr P=0x90; unsigned char i; void main(void) { i=0; while () { P=i; i=(i+)%0; } } Actividad: Editar, compilar y generar el fichero hexadecimal. Ver el ensamblador generado. Repetir lo hecho cambiando unsigned char por int. PROGRAMACIÓN EN C 29
6 - Ejemplos: puertos UN PRIMER PROGRAMA EJEMPLO sfr P=0x90; void main(void){ P=0xaa; /* Enviar al Puerto P el Dato: 0000 */ while();} /* Espera Indefinida */ Actividad: Editar, compilar y generar el fichero hexadecimal. Ver el ensamblador generado. PROGRAMACIÓN EN C 30
6 - Ejemplos: puertos Ejemplo de Decodificador de 3 Entradas a 8 Salidas Código P3.0..P3.2 Pulsadores del Entrenador Salida P.0..P.7 Diodos Luminiscentes del Entrenador Lógica sfr P=0x90; sfr P3=0xB0; void main(void){ Negativa-Negativa unsigned char contador,codigo,salida; while(){ codigo=((~p3)&0x07); for(salida=0x0,contador=0;contador<codigo;contador++) salida=salida<<; P=~salida;}} Ejemplo: P3.0 P3. P3.2 0 LSB MSB 0 2 3 4 5 6 7 0 P.0 P. P.2 P.3 P.4 P.5 P.6 P.7 PROGRAMACIÓN EN C 3
6 - Ejemplos: puertos sfr P=0x90; sfr P3=0xB0; void main(void){ unsigned char contador,codigo,salida; while(){ codigo=((~p3)&0x07); for(salida=0x0,contador=0;contador<codigo;contador++) salida=salida<<; P=~salida;}} Actividad: Realizar una traza de ejecución del programa suponiendo que el valor binario en P3 es: 0 00. PROGRAMACIÓN EN C 32
6 - Ejemplos: puertos Codificador de 8 Entradas a 3 Salidas (Código por Defecto = 0) sfr P=0x90; Entrada P3.0..P3.7 Pulsadores del Entrenador Código P.0..P.2 Diodos Luminiscentes del Entrenador Lógica Negativa-Negativa sfr P3=0xB0; void main(void){ unsigned char contador,entrada,codigo; while(){ entrada=~p3; for(codigo=0,contador=0;(!(entrada==)&&(contador<8));contador++, entrada>>) codigo++; P=~codigo;}} Ejemplo: P3.0 P3. P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 0 0 2 3 4 5 6 7 LSB MSB 0 P.0 P. P.2 PROGRAMACIÓN EN C 33
6 - Ejemplos: puertos sfr P=0x90; sfr P3=0xB0; void main(void){ unsigned char contador,entrada,codigo; while(){ entrada=~p3; for(codigo=0,contador=0;(!(entrada==)&&(contador<8));contador++, entrada>>) codigo++; P=~codigo;}} Actividad: Realizar una traza de ejecución del programa suponiendo que el valor binario en P3 es: 0. PROGRAMACIÓN EN C 34
7 - Bibliografía PROGRAMACIÓN EN C 35
7 - Bibliografía www.atmel.com Introducción a los Microcontroladores; Hardware, Software y Aplicaciones; 8x52, 8x5 José Adolfo González Vázquez McGraw-Hill The 805 family of microcontrollers Richard H. Barnett Prentice Hall, 995 http://www.disca.upv.es/aperles/web5 PROGRAMACIÓN EN C 36