PDF de programación - Programación en C para microcontroladores

Imágen de pdf Programación en C para microcontroladores

Programación en C para microcontroladoresgráfica de visualizaciones

Publicado el 1 de Octubre del 2018
1.176 visualizaciones desde el 1 de Octubre del 2018
209,5 KB
20 paginas
Creado hace 19a (11/01/2005)
Introducción.
C es un lenguaje bastante conciso y en ocasiones desconcertante. Considerado ampliamente como un
lenguaje de alto nivel, posee muchas características importantes, tales como: programación
estructurada, un método definido para llamada a funciones y para paso de parámetros, potentes
estructuras de control, etc.

Sin embargo gran parte de la potencia de C reside en su habilidad para combinar comandos simples
de bajo nivel, en complicadas funciones de alto nivel, y en permitir el acceso a los bytes y words del
procesador. En cierto modo, C puede considerarse como una clase de lenguaje ensamblador
universal. La mayor parte de los programadores familiarizados con C, lo han utilizado para programar
grandes máquinas que corren Unix, MS-DOS, e incluso Windows (programación de drivers). En estas
máquinas el tamaño del programa no es importante, y el interface con el mundo real se realiza a través
de llamadas a funciones o mediante interrupciones DOS. Así el programador en C sólo debe
preocuparse en la manipulación de variables, cadenas, matrices, etc.

Con los modernos microcontroladores de 8 bits, la situación es algo distinta. Tomando como
ejemplo el 8051, el tamaño total del programa debe ser inferior a los 4 u 8K (dependiendo del tamaño
de la EEPROM), y debe usarse menos de 128 o 256 bytes de RAM. Idealmente, los dispositivos reales
y los registros de funciones especiales deben ser direccionados desde C. Las interrupciones, que
requieren vectores en direcciones absolutas también deben ser atendidas desde C. Además, se debe
tener un cuidado especial con las rutinas de ubicación de datos para evitar la sobre escritura de datos
existentes.

Uno de los fundamentos de C es que los parámetros (variables de entrada) se pasan a las funciones
(subrutinas) en la pila, y los resultados se devuelven también en la pila. Así las funciones pueden ser
llamadas desde las interrupciones y desde el programa principal sin temor a que las variables locales
sean sobre escritas.

Programación en C para microcontroladores.

Una seria restricción de la familia 8051 es la carencia de una verdadera pila. En un procesador como
el 8086, el apuntador de la pila tiene al menos 16 bits. Además del apuntador de pila, hay otros
registros que pueden actuar como apuntadores a datos en la pila, tal como el BP (Base Pointer). En C,
la habilidad para acceder a los datos en la pila es crucial. Como ya ha sido indicado, la familia 8051
está dotada de una pila que realmente sólo es capaz de manejar direcciones de retorno. Con 256 bytes
disponibles, como máximo, para la pila no se pueden pasar muchos parámetros y realizar llamadas a
muchas funciones.

De todo ello, puede pensarse que la implementación de un lenguaje que como C haga un uso
intensivo de la pila, es imposible en un 8051. Hasta hace poco así ha sido. El 8051, hace tiempo que
dispone de compiladores C, que en su mayor parte han sido adaptados de micros más potentes, tal
como el 68000. Por ello la aproximación al problema de la pila se ha realizado creando pilas
artificiales por software. Típicamente se ha apartado un área de RAM externa para que funcione como
una pila, con la ayuda de rutinas que manejan la pila cada vez que se realizan llamadas a funciones.
Este método funciona y proporciona capacidad de repetir variables locales a distintos niveles sin sobre
escritura, pero a costa de hacer los programas muy lentos. Por lo tanto, con la familia 8051, la
programación en lenguaje ensamblador ha sido la única alternativa real para el desarrollo de pequeños
sistemas en los que el tiempo es un factor crítico.

Sin embargo, en 1980, Intel proporcionó una solución parcial al problema al permitir la
programación del 8051 en un lenguaje de alto nivel llamado PLM51. Este compilador no era perfecto,
había sido adaptado del PLM85 (8085), pero Intel fue lo suficientemente realista para evitar el uso de
un lenguaje totalmente dependiente del uso de la pila.

La solución adoptada fue sencillamente pasar los parámetros en áreas definidas de memoria. Así
cada función o procedure tenía su propia área de memoria en la que recibía los parámetros, y devolvía
los resultados. Si se utilizaba la RAM interna para el paso de parámetros, la sobrecarga de las llamadas

1

a funciones era muy pequeña. Incluso utilizando RAM externa, siempre más lenta que la RAM
interna, se consigue mayor velocidad que con una pila artificial.

El problema que tiene esta especie de "pila compilada" es que la sobrecarga de variables no es
posible. Esta aparentemente seria omisión, en la práctica no tiende a causar problemas con los típicos
programas del 8051. Sin embargo las últimas versiones de C51 permiten la sobrecarga de variables
selectiva, es decir permiten que unas pocas funciones críticas tengan sobrecarga, sin comprometer la
eficiencia de todo el programa.

Otras consideraciones dignas de destacar para el C en un microcontrolador son:

• Control de los periféricos internos y externos del chip.
• Servicio de las interrupciones.
• Hacer el mejor uso de los limitados conjuntos de instrucciones.
• Soportar diferentes configuraciones de ROM/RAM.
• Un alto nivel de optimización para conservar el espacio de código.
• Control de la conmutación de registros.
• Soporte para los derivados de la familia (87C751, 80C517 etc.).

El compilador Keil C51 contiene todas las extensiones para el uso del lenguaje C con
microcontroladores. Este compilador C utiliza todas las técnicas apuntadas por Intel con su PLM51,
pero añade características propias tales como la aritmética en coma flotante, la entrada/salida (I/O) con
formato, etc. Se trata de la implementación del estándar ANSI C específico para los procesadores
8051.


Configuración de memoria del 8051

Localización física de los espacios de memoria
Inicialmente la cosa más confusa sobre el 8051 es quizás la existencia de varios espacios de

memoria, que comienzan en la misma dirección.

Otros µC, tales como el 68HC11, tienen una configuración de memoria mucho más sencilla, en la

que solo existe un área de memoria de tipo Von Neuman, residente en uno o en varios chips.

Dentro del 8051 hay un espacio de RAM llamado DATA. Este espacio comienza en la dirección
D:00 (el prefijo 'D:' indica segmento DATA) y termina en la dirección 0x7F (127 en decimal). Este
área RAM puede utilizarse para almacenar las variables del programa. Se trata de una región
direccionable directamente en la que pueden utilizarse instrucciones como 'MOV A,direcc'. Por
encima de la dirección 0x7F se encuentran los registros de funciones especiales (SFR), que también
son accesibles mediante direccionamiento directo. Sin embargo, en algunos derivados del 8051 existe
otro espacio de memoria entre las direcciones 0x80 y 0xFF, llamado IDATA (Indirect DATA), que
sólo resulta accesible por direccionamiento indirecto (MOV A,@Ri). Para esta región que se solapa
con los SFR se utiliza el prefijo 'I:'. El 8051 carece de estos 128 bytes del espacio IDATA, que se
añadieron cuando apareció el 8052. Esta región resulta adecuada para la pila a la que siempre se
accede indirectamente a través del apuntador de pila SP (Stack Pointer). Y para hacer las cosas más
confusas, resulta que los 128 bytes de RAM comprendidos en las direcciones 0..0x7F también pueden
ser accedidos indirectamente con la instrucción MOV A,@Ri



2

Fig.1. - Los espacios de memoria del 8051.



Un tercer espacio de memoria, el segmento CODE, también comienza en la dirección cero, pero está
reservado para el programa o para almacenar valores constantes, ya que el µC no puede escribir en
esta región. Se extiende desde C:0000 hasta C:0xFFFF (65536 bytes); parte de este área puede residir
dentro del µC y la otra parte, si es necesaria, debe residir en chips externos de memoria EPROM o
FLASH. El acceso al contenido del segmento CODE se realiza mediante el contador de programa PC
(Program Counter) en los ciclos de búsqueda de instrucciones y con el DPTR (Data Pointer) para la
lectura de los datos constantes.

La cuarta región de memoria, llamada XDATA reside en una RAM externa al µC. Comienza en
X:0000 y se extiende hasta X:0xFFFF (65536 bytes). El acceso a esta región se realiza mediante el
registro de 16 bits DPTR (Data Pointer). En esta región se puede seleccionar un pequeño espacio de
256 bytes, llamado PDATA (acceso paginado), al que se accede con un apuntador de 8 bits (registros
R0 o R1). La dirección inicial de esta región PDATA viene dada por 16 bits, siendo los 8 bits de
mayor peso los contenidos en el SFR P2, estando a 0 los 8 bits restantes.

Una pregunta inmediata es: "¿Cómo evita el 8051 que el acceso a un dato en D:00, realice también

un acceso al dato X:0000?

La respuesta reside en el hardware del 8051: Cuando la CPU intenta acceder a D:00, habilita la
RAM interna mediante una señal READ interna, que no provoca cambios en la patilla /RD, utilizada
para leer la RAM externa.

MOV A,40H ; Lleva el valor de la dirección D:0x40 al acumulador.



MOV R0,#0A0H



Este modo de direccionamiento (directo) se utiliza en el modelo de memoria SMALL.

MOV A,@R0 ; Lleva el valor de la dirección I:0xA0 al acumulador

Este modo de direccionamiento se utiliza para acceder a la región de RAM interna de acceso indirecto
situada por encima de la dirección 0x7F, aunque también es una forma alternativa de acceso a los 128
bytes situados debajo de la dirección 0x80.

Una variación de DATA es BDATA (bit data). Esta es un área de 16 bytes (128 bits) que se extiende
  • Links de descarga
http://lwp-l.com/pdf13682

Comentarios de: Programación en C para microcontroladores (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad