Você está na página 1de 36

PROGRAMACIN EN C para uC MCS-51

Resumen de contenidos

1 - Objetivos 2 - Justificacin 3 - Compiladores cruzados 4 - Compiladores Keil uVision2 5 - Uso del entorno de programacin 6 - Ejemplos 7 - Bibliografa

PROGRAMACIN EN C

1 - Objetivos

PROGRAMACIN EN C

1- Objetivos

Conocer la posibilidad de programacin 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 programacin seleccionada

PROGRAMACIN EN C

2 - Justificacin

PROGRAMACIN EN C

2 - Justificacin
Los microprocesadores y microcontroladores ejecutan secuencias de instrucciones mquina particulares

El lenguaje ensamblador es una traduccin inmediata de los cdigos mquina, por lo que son muy dependientes del procesador (cdigo no exportable)

Los lenguajes de alto nivel:


Son ms independientes del procesador Facilitan la escritura de programas al estar ms cercanos a un razonamiento lgico-matemtico

PROGRAMACIN EN C

3 - Compiladores cruzados

PROGRAMACIN EN C

3 - Compiladores cruzados
Hay compiladores para muchos lenguajes de programacin de alto nivel (Pascal, C, Ada, Forth, etc.) que generan cdigo 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 ms extendido es C, por la disponibilidad de compiladores, depuradores, libreras, ejemplos de aplicacin, etc. C genera cdigo mquina eficiente
PROGRAMACIN EN C 8

4 Entorno Compilador uVision2 de Keil

PROGRAMACIN EN C

4 - Compilador Vision2

Hay versiones gratuitas de evaluacin (con capacidades recortadas) de este compilador

Otro compiladores C con versiones de evaluacin gratis


IAR http://www.iar.com Franklin http://www.fsinc.com

Compilador C gratuito (GNU)


SDCC sdcc.sourceforge.net

PROGRAMACIN EN C

10

4 - Compilador Vision2

Caractersticas generales
100 % compatible con ANSI-C Libreras estndar C disponibles para sistemas empotrados Aritmtica en punto flotante compatible con IEEE Extensiones para caractersticas MCS51

Generacin de cdigo
Optimizacin seleccionable entre tamao o velocidad Compatible con depuradores de alto nivel (C-SPY,...) Generacin de cdigo PROMABLE en diferentes formatos

PROGRAMACIN EN C

11

4 - Compilador Vision2
Gestin 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 limitacin en cuanto al tamao de la memoria interna. Es el mejor modelo. COMPACT: Las variables se almacenan en la memoria externa. Puede almacenar un mximo de 256 bytes de variables. LARGE: Todas las variables se almacenan en memoria externa sin limitacin es el menos efectivo de los tres.

PROGRAMACIN EN C

12

4 - Compilador Vision2
Gestin de memoria
Localizacin de variables flexible

DATA: zona direccionamiento directo IDATA: zona direccionamiento indirecto XDATA: zona memoria de datos externa CODE: zona de memoria de programa

PROGRAMACIN EN C

13

4 - Compilador Vision2 Gestin de memoria


El modelo de memoria elegido influye drsticamente en la velocidad y tamao del cdigo Por ejemplo, suponiendo la instruccin en C int i=520; al compilarlo, en funcin del modelo de memoria, quedara:
DATA MOV i,#2 MOV i+1,#8 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

Cdigo

MOV MOV INC MOV

Byte/Ciclos maq. Rango direcciones

6/4 0-7F

7/4 0-FF

PROGRAMACIN EN C

14

4 - Compilador Vision2 Representacin de los datos


Tipos estndar
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 -128..127 0..255 -32768..32767 0..65535 -32768..32767 0..65535 -2147483648..2147483647 0..4294967295 ? 1.18e-38 .. ? 3.39e+38 Notas

-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 0..1 0..1 0..255 Notas rea DATA direccionable por bit rea SFR rea SFR

PROGRAMACIN 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 ms eficiente en cuanto a velocidad y tamao del cdigo

Declaracin 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

Declaracin signed char nombre_variable;


PROGRAMACIN 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

Declaracin 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

Declaracin unsigned int nombre_variable;

PROGRAMACIN EN C

17

4 - Compilador Vision2
Tipo long, long int
Permite declarar un entero en el rango -2147483648..2147483647 Ocupa en memoria 4 bytes

Declaracin 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

Declaracin unsigned long nombre_variable;

PROGRAMACIN 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 precisin (precisin de 7 dgitos decimales)
31 S 30 EXPONENTE 23 22 MANTISA 0

Valor=(-1)Signo2(Exponente-127)1.Mantisa
Las operaciones con reales son lentas y ocupan mucha memoria por lo que se debe intentar evitarlas

Declaracin float nombre_variable; Ejemplo


float a,b; b=35.5; a=0.07; a=a*b;

PROGRAMACIN 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

Declaracin sfr nombre_variable =direccin de memoria; Ejemplo


sfr P0=0x80; sfr P1=0x90; void main(void){ while(1) P1=~P0; }

PROGRAMACIN 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)

Declaracin bit nombre_variable; Tipo sbit


Permite declara posiciones direccionables bit a bit en la zona SFR Direccin terminada en 0h u 8h (80h, 88h, 90h ...)

Declaracin sbit nombre_variable =direccin 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;
PROGRAMACIN 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)

PROGRAMACIN EN C

22

4 - Compilador Vision2 Funciones de interrupcin


Permiten definir fcilmente las rutinas de servicio de interrupcin

Declaracin: void nombre_funcion (void) interrupt N { }

PROGRAMACIN EN C

23

4 - Compilador Vision2 Funciones de interrupcin


Permiten definir fcilmente las rutinas de servicio de interrupcin

Ejemplo:
Instalacin de una rutina de interrupcin que cada vez que desborde el Timer0 (vector 0x000b) incremente una variable tiempo . long tiempo=0; void incrementar_tiempo(void) interrupt 1 { tiempo++; }

PROGRAMACIN EN C

24

5 - Uso del entorno de programacin

PROGRAMACIN EN C

25

5 - Uso del entorno de programacin


Se deber realizar la prctica 3 para tener un contacto con el entorno de programacin.

PROGRAMACIN EN C

26

6 - Ejemplos

PROGRAMACIN 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.

PROGRAMACIN 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.
PROGRAMACIN 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.


PROGRAMACIN EN C 30

6 - Ejemplos: puertos Ejemplo de Decodificador de 3 Entradas a 8 Salidas


Cdigo Salida Lgica 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<codigo;contador++) salida=salida<<1; P1=~salida;}}
PROGRAMACIN EN C

0 1 2 3 4 5 6 7

1 1 1 1 0 1 1 1

P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7

31

6 - Ejemplos: puertos
sfr P1=0x90; sfr P3=0xB0; void main(void){ unsigned char contador,codigo,salida; while(1){ codigo=((~P3)&0x07); for(salida=0x01,contador=0;contador<codigo;contador++) salida=salida<<1; P1=~salida;}}

Actividad: Realizar una traza de ejecucin del programa suponiendo que el valor binario en P3 es: 1101 1010.
PROGRAMACIN EN C 32

6 - Ejemplos: puertos
Codificador de 8 Entradas a 3 Salidas (Cdigo por Defecto = 0)
Entrada Cdigo Lgica P3.0..P3.7 Pulsadores del Entrenador P1.0..P1.2 Diodos Luminiscentes del Entrenador Negativa-Negativa Ejemplo:
P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 1 1 1 1 0 1 1 1

LSB sfr P1=0x90; P1.0 1 P1.1 sfr P3=0xB0; 0 P1.2 MSB void main(void){ unsigned char contador,entrada,codigo; while(1){ entrada=~P3; for(codigo=0,contador=0;(!(entrada==1)&&(contador<8));contador++, entrada>>1) codigo++; P1=~codigo;}}
PROGRAMACIN EN C 33

0 1 2 3 4 5 6 7

6 - Ejemplos: puertos
sfr P1=0x90; sfr P3=0xB0; void main(void){ unsigned char contador,entrada,codigo; while(1){ entrada=~P3; for(codigo=0,contador=0;(!(entrada==1)&&(contador<8));contador++, entrada>>1) codigo++; P1=~codigo;}}

Actividad: Realizar una traza de ejecucin del programa suponiendo que el valor binario en P3 es: 1111 1011.
PROGRAMACIN EN C 34

7 - Bibliografa

PROGRAMACIN EN C

35

7 - Bibliografa
www.atmel.com Introduccin a los Microcontroladores; Hardware, Software y Aplicaciones; 8x52, 8x51
Jos Adolfo Gonzlez Vzquez McGraw-Hill

The 8051 family of microcontrollers


Richard H. Barnett Prentice Hall, 1995

http://www.disca.upv.es/aperles/web51

PROGRAMACIN EN C

36

Você também pode gostar