Está en la página 1de 80

MICROPROCESADORES

ING. BRAULIO ELIAS CHI SALAVARRIA


¿Qué es un microprocesador?
Desde el punto de vista funcional, un
microprocesador es un circuito integrado que
incorpora en su interior una unidad central de
proceso (CPU) y todo un conjunto de
elementos lógicos que permiten enlazar otros
dispositivos como memorias y puertos de
entrada y salida (I/O), formando un sistema
completo para cumplir con una aplicación
específica dentro del mundo real.
Microcontrolador
• Procesador
Es la parte encargada del procesamiento de las
instrucciones. Debido a la necesidad de conseguir
elevados rendimientos en este proceso, se ha
desembocado en el empleo generalizado de procesadores
de arquitectura Harvard frente a los tradicionales que
seguían la arquitectura de von Neumann.
Esta última se caracterizaba porque la CPU se conectaba con
una memoria única, donde coexistían datos e
instrucciones, a través de un sistema de buses.
Von Neumann
Harvard
MICROCONTROLADOR
PROGRAMACIÓN C
PARA SISTEMAS EMBEBIDOS
ING. BRAULIO ELÍAS CHI SALAVARRIA
INTRODUCCION A LENGUAJE C EMBEBIDO

El lenguaje de programación C fue desarrollado e


implementado bajo el sistema operativo UNIX.
Una de las mejoras características de este lenguaje
es que no esta atado bajo ningún hardware o
sistema en particular.
El lenguaje C es llamado lenguaje de programación
nivel medio, que combina los elementos de un
lenguaje de alto nivel, con la eficiencia de un
lenguaje ensamblador.
Ventajas
• C es un lenguaje con características de bajo
nivel.
• Es un lenguaje estructurado
• C es un lenguaje que te permite crear
cualquier tarea que tengas en mente.
• C te da un control completo de nivel de
programación.
• Portable
C ANSI
La primera estandarización del lenguaje C fue en
ANSI, con el estándar X3.159-1989. El lenguaje
que define este estándar fue conocido
vulgarmente como ANSI C. Posteriormente, en
1990, fue ratificado como estándar ISO
(ISO/IEC 9899:1990). La adopción de este
estándar es muy amplia por lo que, si los
programas creados lo siguen, el código es
portátil entre plataformas y/o arquitecturas.
Cuerpo de un Programa
Un programa muy conocido, el hola mundo:

#include <stdio.h>

main (){
printf(“HOLA MUNDO\r”);
}
Cuerpo de un programa para sistemas
embebidos
Como vimos anteriormente, el esquema de un
programa en C ANSI, ahora, nosotros
tendremos que agregarlo unas cuantas cosas
para que sea nuestro cuerpo de un programa
en C para sistemas embebidos, esto es, un
ciclo for infinito.
Cuerpo de un programa C embebido
Representado los valores
Es muy importante mencionar que hay varias formas de
representar valores numéricos e incluso caracteres en C.
Existen varias formas de representar un valor, entre ellas
son
• Hexadecimal
• Decimal
• Octal
• Binario
• ASCII (para los caracteres)
Ejercicio
Veamos el valor decimal 20 representado de
diferentes maneras:
Decimal : 20
Hexadecimal : 0x14
Octal: 24
Binario : 0b10100
Convirtiendo valores binarios a
hexadecimales y viceversa
Será muy frecuente en sistemas embebidos que
hagamos este tipo de conversiones, es por
esto que es de importancia mencionar una
manera fácil y rápida de lograr esto:

Convertir el valor 0b10101000 a hexadecimal


Convertir el valor 0x45 a binario
EJERCICIO
EJERCICIO
ASCII
El código ASCII (acrónimo inglés de American
Standard Code for Information Interchange —
(Código Estadounidense Estándar para el
Intercambio de Información), pronunciado
generalmente [áski], es un código de
caracteres basado en el alfabeto latino tal
como se usa en inglés moderno y en otras
lenguas occidentales.
TABLA DE CODIGOS ASCII
TABLA DE CODIGO ASCII
Representando Valores
Teniendo todo esto en cuenta, es posible
representar un valor de diferentes maneras,
por ejemplo, representemos una variable
llamada val con el valor decimal en sus
diferentes formas:

49
unsigned char Val;

Val =49; //DECIMAL


Val=0x31; //hexadecimal
Val=‘1’; //ASCII
Como podemos ver, las 3 lineas representan el
mismo valor.
VARIABLES
Existen diversos tipos de variables, cada una con
sus propias características y particularidades.
Para declarar una variable en C tipo entera
“signed” ponemos:

int variable;
int variable=0;
TIPO “char”

La variable tipos “char” es una variable que


cuenta con un tamaño de 8 bits, o lo que es
igual a 1 byte, este tipo de variables se utilizan
principalmente en cadenas y para imprimir
caracteres ASCII, en sistemas embebidos
también lo utilizamos como banderas, por ser
las variables de menor tamaño.
Ejemplo
Declaramos una variable char:

char flag;

unsigned char flag;


TIPO int
Estas son las variables mas usadas en la mayoria
de programas, su tamaño consta de 16 bits
para este tipo de variables se utilizan conteos,
cuentas, etc. Un ejemplo:
int var;
unsigned int var;
Los tipos de datos enteros son: short, int, long y
long long.
TIPO float
El tipo de dato flotante en lenguaje C sólo tiene
dos tamaños: el float y el double, que son 4
bytes y 8 bytes respectivamente. Se los puede
utilizar tanto para representar números
decimales, como para representar números
enteros con un orden de magnitud muy
grande.
Ejemplo float
• Algunos ejemplos:
• float a;
• double a = 1e23;
• double a = 3.1416;
• float a = 4e-9;
• double a = -78;
Cadenas
Como su nombre lo indica, una cadena de
caracteres, que irán en secuencia y con un
tamaño definido por la palabra.

char cadena[4]="hola";
char[4]={‘h’,’o’,’l’,’a’,’\0’};
Veamos más de cerca
Arreglos de Cadenas
También podemos representar una cadena
vectorizada, esto quiere decir que tendrá
tanto x columnas y x filas, para entender
mejor esta definición, veamos un ejemplo:

char vector [2][3]={0x31,0x02,0x34,0x32,


0x45,0x65,0x67,0x90,
0x78,0x23,0x12,0x41};
Arreglo de cadena
Accediendo a nuestro arreglo
Si queremos acceder a una dirección en
particular de nuestro arreglo de cadena, lo
podemos hacer de la siguiente manera:

Point= vector [2][0];


Esto quiere decir que Point tendrá un valor de
0x78
Ejercicio
PALABRAS RESERVADAS
El lenguaje C está  formado por un conjunto pequeño de
palabras clave (reservadas) o comandos (keywords), y una
serie de operadores. Hay cerca de 40 palabras clave, frente a
las 150 del BASIC o 200 que poseen otros lenguajes, como el
COBOL y el PASCAL. Estas palabras son:
auto break case char const continue default do double else
enum extern float for goto if int long register return short
signed sizeof static struct typedef union unsigned void
volatile while
A este conjunto de palabras se les denomina "palabras
reservadas".
CONTROL DE FLUJO
Las proposiciones de control de flujo de un lenguaje
especifican el orden en que se realiza el procesamiento.
• If
• Else if
• Switch
• While
• For
• Break
• Go to
if-else
• La proposición if-else se utiliza para expresar
decisiones. Formalmente la sintaxis es
if(expresión)
proposición1
else
proposición2
Ejemplo
if(val==1)led=1;
else led=0;
---------------------------------------------------------------
if(val)led=1;
else led=0;
---------------------------------------------------------------
if(val==0)led=1;
else led=0;
----------------------------------------------------------------
if(!val)led=1;
else led=0;
else if
Esta secuencia de proposiciones if es la forma
más general de escribir una decisión múltiple.

Las expresiones se evalúan en orden :


Ejemplo
if (a > b) {
     print "a es mayor que b";
} elseif (a == b) {
     print "a es igual que b";
} else {
     print "a es menor que b";
}
Ejercicio
Ahora pondremos como ejemplo, monitorear
cuando se presione un botón determinado, en
este caso serán 3 botones
Sw1
Sw2
Sw3
if(Sw1)led1=1;
else if (Sw2)led2=0;
else if (Sw3) led3=1;
else led4=1;
for
En el ciclo for, se utiliza para un ciclo ascendente
o descendente, tomando ciertos parámetros
desde su configuración:

for (inicialización; condición; incremento)


{ instrucción(es); };
Ejemplo
Un simple ejemplo, puede ser un delay por
software, esto quiere decir que si necesitamos
de una rutina que lo único que haga es
esperar, entonces podemos hacernos de este
ciclo.
Led=0;
for(temp=3000;temp;temp--);
Led=1;
for(temp=3000;temp;temp--);
switch
switch(var int o char)
{
case const1: instrucción(es);
break;
case const2: instrucción(es);
break;
case const3: instrucción(es);
break; ………………
default: instrucción(es);
};
Ejemplo
Un ejemplo es que a partir del valor de una
variable que adquiera el valor de un canal ADC,
determine el ancho de PWM para un valor en
particular:
switch (valor_ADC){
case 0x00: duty_cycle=0;
break;
case 0x50: duty_cycle=100;
break;
case 0x200: duty_cycle=250;
break;
}
Comentarios
Una buena practica en C, es poner comentarios
en nuestro programa de todo lo que estamos
realizando, esto que quiere decir, que
podemos poner un comentario de alguna
línea de código, y esto no afecta a la hora de
compilación en el tamaño de nuestro
programa.
Poner comentarios
Los caracteres que se utilizan para poner
comentarios son:
// solo una línea de comentario
o
/* adentro el comentario con n
líneas para poner */
Ejercicio
FUNCIONES
Las funciones dividen tareas grandes de
computación en varias pequeñas, y permiten
la posibilidad de construir sobre lo que otros
ya han hecho, en lugar de comenzar desde
cero.
El lenguaje C se diseño para que las funciones
fueran eficientes y fáciles de usar.
Ejemplo
Para poder explicar de que se trata una función,
pongamos como ejemplo una tarea que ya
hemos realizado anteriormente, un delay, solo
que ahora, nosotros podremos acceder al
delay siendo posible cambiar el valor de
retardo, sin tener que escribir siempre el
mismo código una y otra vez.
DEFINIENDO UNA FUNCIÓN

void delay (unsigned int temp) {


for(;temp;temp--);
}
Cuerpo de la Función
Utilizando nuestra primera función
main (){
for(;;){
Led=0;
delay(3000);
Led=1;
delay(2500);
}
}
Tipos de Funciones
La función que acabamos de escribir, es
una función tipo void, esto quiere decir
que no devuelve ningún tipo de valor,
pero también hay funciones que pueden
devolver cualquier tipo de variable, como
int, char, double, etc.
Funcion tipo int
En este ejercicio, escribiremos una función tipo
int, que ejecutara una tarea leer un botón y
determinar el tiempo que se mantiene
presionado, devolviéndonos el valor que se
mantuvo presionado como una variable tipo
int.
Función time_sw()
unsigned int time_sw (void){

unsigned int i=0;


i++;
if (i>64000)i=0;

return i;

}
Utilizando nuestra función
int time;
do{

time=time_sw();

}while(sw);
Preprocesador C
C proporciona ciertas facilidades de lenguaje por
medio de un preprocesador, que
conceptualmente es un primer paso separado
de compilación. Los dos elementos que se
usan con más frecuencia son #include y
#define.
Inclusión de Archivos
La inclusion de archivos facilita el manejo de
grupos de #define y declaraciones, cualquier
linea fuente de

#include “miarchivodecabecera.h”
o
#include <miarchivodecabecera.h>
Ejemplo de archivo de cabecera
Los archivos .h se asocian a definiciones o
macros, así como también la mención de
funciones que están alojadas en un archivo .c
Empecemos realizando nuestro primer
archivo .h donde alojará las definiciones de
nuestros puertos de entrada y salida de leds, y
puertos de entrada, así como también nuestra
función delay.
Definiendo nuestro archivo .h

A nuestro archivo .h lo llamaremos como


“my_library.h” teniendo esto en cuenta
empezaramos definiendo nuestro
archivo:
Creando mi archivo .c
Ya que tenemos nuestro archivo de
cabecera listo, ahora pasaremos a
escribir nuestro archivo .c, en este caso
lo nombraremos igual que el archivo.h,
con la diferencia que tendrá una
extensión .c, ejemplo my_library.c el cual
contendrá por el momento a la función
delay.
Haciendo uso de nuestra libreria
Ahora para hacer uso de nuestra librería,
basta mencionar el archivo de cabecera
en nuestro archivo principal, y podremos
utilizar todas las definiciones que
hayamos hecho, tanto las funciones que
hemos escrito en c y mencionado en .h
Ejemplo
/*+++++++++++++++++++++++++++++++++++++++++++
** MENU PRINCIPAL
**+++++++++++++++++++++++++++++++++++++++++*/
#include "derivative.h"
#include "my_library.h"

main(){

for(;;){

led=0;
delay(3000);
led=1;
delay(3000);
}
}
Código Selectivo
Tenemos muchas herramientas en el
preprocesador, una de ellas es la
posibilidad de compilar secciones de
código solo sí se cumplen ciertas
condiciones, cabe mencionar que toda
esto pasa a un nivel mas primario que
nuestro código principal.
Código Selectivo
Para poder utilizar estas funciones C nos ofrece
las siguientes palabras reservadas:

#if
#elif
#ifdef y #ifndef
#else
#endif
Ejemplo
En este ejemplo, compilaremos el código
dependiendo si se cumple con una
palabra definida, para ser más claros,
cuando queramos definir los puertos que
utilizaremos del microcontrolador para
que se comunique con una LCD 16x2

También podría gustarte