Story Transcript
PROGRAMACIÓN EN C para uC MCS-51
Resumen de contenidos
1 - 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
1 - Objetivos
PROGRAMACIÓN EN C
3
1- 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 MCS51 • 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 T89C51CC01)
sfr P0=0x80; sfr P1=0x90; void main(void){ while(1) P1=~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
10
4 - Compilador µVision2
• Características generales – – – –
100 % 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 MCS51
• 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
11
4 - Compilador µVision2 • Gestión de memoria – Diferentes modelos de memoria (zonas donde se crean las variables) – Existen tres modelos: • 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
12
4 - Compilador µVision2 • Gestión de memoria – 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
13
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 MOV i,#2 MOV i+1,#8
Byte/Ciclos maq. Rango direcciones
6/4 0-7F
MOV MOV INC MOV
7/4 0-FF
IDATA R0 ,#i @R0,#2 R0 @R0,#8
XDATA MOV DPTR,#i MOV A ,#2 MOVX @DPTR,A INC DPTR MOV A,#8 MOVX @DPTR,A 10/9 0-FFFF
PROGRAMACIÓN EN C
14
4 - Compilador µVision2 • 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
Bytes ocupados 1 2 2 4 4
Rango
Notas
-128..127 0..255 -32768..32767 0..65535 -32768..32767 0..65535 -2147483648..2147483647 0..4294967295 ? 1.18e-38 .. ? 3.39e+38
-215..215-1 0..216 -1 como int -231..231-1 0..232 -1 como float
– Extensiones para la familia MCS51 Tipo de dato bit sbit sfr
Bytes ocupados 1 bit 1 bit 1
Rango
Notas
0..1 0..1 0..255
área DATA direccionable por bit área SFR área SFR
PROGRAMACIÓN EN C
15
4 - Compilador µVision2 Tipo unsigned char Permite declarar un entero positivo en el rango 0...255 Ocupa en memoria 1 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 -128..127 Ocupa en memoria 1 byte
Declaración signed char nombre_variable; PROGRAMACIÓN EN C
16
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
17
4 - Compilador µVision2 Tipo long, long int Permite declarar un entero en el rango -2147483648..2147483647 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
18
4 - Compilador µVision2 Tipo float, double, long double
Permite declarar un real en el rango ? 1.18e-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) 31
30
23
S
EXPONENTE
22
0 MANTISA
Valor=(-1)Signo2(Exponente-127)1.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;
PROGRAMACIÓN EN C
19
4 - Compilador µVision2 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 P1=0x90; void main(void){ while(1) P1=~P0; }
PROGRAMACIÓN EN C
20
4 - Compilador µVision2 Tipo bit Permite declarar un entero positivo en el rango 0..1 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 P1, P1.0 */ lleno = 1; if (lleno==1) valvula = 1; else valvula = 0; PROGRAMACIÓN EN C
21
4 - Compilador µVision2 Actividad • Definir en lenguaje C las siguientes variables: – De la zona SFR los registros: PSW, IEN1, TMOD, TH1, P4 – De la zona SFR los bits: 80h bit 7, 88h bit 4, 90h bit 7
• Asignar el valor cero a: IEN1, TH1, 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 1 { 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 P1=0x90; sfr P2=0xA0; void main(void) { while (1) P2=P1+15; }
Actividad: Editar, compilar y generar el fichero hexadecimal. Ver el ensamblador generado.
PROGRAMACIÓN EN C
28
6 - Ejemplos: puertos sfr P1=0x90; unsigned char i; void main(void) { i=0; while (1) { P1=i; i=(i+1)%10; } }
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 P1=0x90; void main(void){ P1=0xaa; /* Enviar al Puerto P1 el Dato: 10101010 */ while(1);} /* 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 Salida Lógica
P3.0..P3.2 Pulsadores del Entrenador P1.0..P1.7 Diodos Luminiscentes del Entrenador Negativa-Negativa
Ejemplo: P3.0 1 P3.1 1 P3.2 0
LSB
sfr P1=0x90; MSB sfr P3=0xB0; void main(void){ unsigned char contador,codigo,salida; while(1){ codigo=((~P3)&0x07); for(salida=0x01,contador=0;contador