Programación en C Integrado en Microcontroladores
Programación en C Integrado en Microcontroladores
com/8avr:ioports
PROGRAMACIÓN EN C
INTEGRADO EN
MICROCONTROLADORES
https://microchipdeveloper.com/8avr:ioports
Ordenadores
Ordenador, computador o computadora.
Máquinas formadas por elementos de tipo electrónico, capaces de aceptar unos datos de
entrada, realizar con ellos gran variedad de tareas (operaciones) y proporcionar la
información resultante a través de un medio de salida, bajo el control de unas instrucciones
(programa), previamente almacenadas en el propio computador.
Hoy en día presentes en prácticamente cualquier actividad.
Por tratamiento automático de la información entendemos:
Tipos de Ordenadores
Atendiendo a sus prestaciones los ordenadores se pueden clasificar en
Informática
Conjunto de conocimientos científicos y técnicos que hacen posible el tratamiento
automático de la información por medio de los ordenadores.
Dato
• Dato en informática: representación formalizada de hechos o conceptos susceptible de ser
comunicada o procesada.
• Un conjunto de datos ordenado constituye información.
Tipos de Datos: Lenguajes recomendados para ...
• Numéricos (12, 28.5): reales o enteros Microcontrolador: Lenguaje C
• Alfabéticos (Ana): son los characters.
Microprocesador: Lenguaje Phyton
• Alfanuméricos: 23456X, M-6995
• Imágenes, sonido, video,…
https://microchipdeveloper.com/8avr:ioports
Representación de la Información
Los medios electrónicos de almacenamiento / procesamiento sólo disponen de dos estados
BIT y BYTE
BIT: (1/0)
• Los dígitos en el sistema de numeración binario se llaman bits (BIT= Binary digit)
• Es la unidad más pequeña de información, un uno o un cero.
BYTE: (0000 0000) (MSBXXX XXXLSB)
MSB(BIT más significativo) LSB(BIT menos significativo)
• Conjunto de 8 bits
• También se llama Octeto o Carácter (porque con un byte se suele codificar un
carácter).
Half Word = 16 BITS (Conjunto de 2 BYTE).
Single Word o Word = 32 BITS (Conjunto de 4 BYTE)
Double Word = 64 BITS
Quad Word = 128 BITS
Nibble = 4 BITS (Medio BYTE)
Representación de números
Enteros
• Se representan por separado los tres elementos del número en notación científica:
base, mantisa y exponente FPU(Floating point unit)
Ejemplo: 0,123 x 10-4
Se representan por separado base (10), mantisa Una unidad de coma flotante es un
(0,123) y exponente (-4) circuito integrado que maneja todas las
operaciones matemáticas que tienen
• Permite representar rangos grandes de números algo que ver con números o fracciones
usando pocos bits de coma flotante
• Actualmente se usa un sistema normalizado: norma IEEE 754
32 bits
Base 2, está predeterminada, por lo que no es necesario codificarla
Signo: un bit, 0 = +, 1= -
Exponente: 8 bits
Mantisa:23 bits
Ejemplo:
• Código ASCII extendido
✓ American Standard Code for Information Interchange Char ch = ‘f’;
✓ ASCII : solo 7 bits de los 8 que forman el byte
Es lo mismo que
El bit más significativo (izquierda) no se utilizaba
Se pueden representar 27 = 128 caracteres distintos Char ch=102;
https://microchipdeveloper.com/8avr:ioports
Programas
• Definición
✓ Conjunto de órdenes que se le dan a un ordenador para que realice un
determinado proceso
✓ Es el resultado de traducir un algoritmo a un lenguaje que entiende el
ordenador (lenguaje de programación).
✓ Resuelve un problema mediante el uso de un ordenador
• Una instrucción es una orden lanzada al ordenador
✓ Un programa es un conjunto de instrucciones
Recapitulando
Hay herramientas que facilitan el desarrollo de algoritmos; las de uso más común
son
✓ Diagramas de flujo (también llamados organigramas)
✓ Pseudocódigo
https://microchipdeveloper.com/8avr:ioports
Pseudocódigo
Ejemplos:
• SI (Condicional)
• Repetitivas
Ejemplos:
✓ Algoritmo que escriba 100 veces hola
✓ Algoritmo que escriba los números del uno al 100
✓ Algoritmo que sume 100 números introducidos por teclado
Para y mientras:
Escribir un algoritmo que dados dos números diga cuál es mayor, el primero o el segundo
https://microchipdeveloper.com/8avr:ioports
Software
Software: conjunto de elementos lógicos necesarios para realizar las tareas
• Software básico
✓ Conjunto de programas necesarios para correcto funcionamiento del
ordenador y de los periféricos
✓ Sistema operativo: conjunto de programas que realiza las tareas básicas del
sistema: control, reparto de recursos, gestión de entrada y salida
✓ Parte del software básico está cargado permanentemente en memoria (el
sistema operativo, algunos programas de utilidad o de comunicaciones y
programas antivirus)
• Software específico o software de aplicación
✓ Conjunto de programas que permiten la consecución de tareas específicas
para la resolución de los problemas del usuario
✓ También se llaman aplicaciones
Paquetes de ofimática, aplicaciones de gestión, juegos, etc.
Programas desarrollados para resolver problemas concretos
Lenguaje Ensamblador
• Se sustituye binario por nombres mnemotécnicos, pero son las mismas instrucciones
✓ a esos nombres se les llama etiquetas
✓ sigue dependiendo estrechamente de la computadora en la que se ejecuta el
programa
✓ Ofrece al programador elementos de muy bajo nivel que no facilitan la
expresión de soluciones de problemas complejos
✓ requieren del uso de un programa traductor (ensamblador) que traduzca las
instrucciones a lenguaje máquina.
• Las órdenes están escritas de forma similar al lenguaje natural, fáciles de recordar
https://microchipdeveloper.com/8avr:ioports
• Es necesario traducir las instrucciones a código máquina: para ello se utilizan los
programas traductores Compiladores e interpretes
Traductores de Lenguajes
• Los programas traductores transforman las instrucciones escritas en lenguaje
ensamblador o en lenguajes de alto nivel en instrucciones en lenguaje máquina
✓ Entrada: programa escrito en un determinado lenguaje de programación,
llamado programa o código fuente.
✓ Salida: programa equivalente escrito en código máquina
• Además de traducir pueden detectar errores en la escritura del programa (errores
sintácticos) e informar al programador para ayudarle a corregirlos
• Tipos de programas traductores
✓ Ensambladores
✓ Compiladores .EXE
✓ Intérpretes
• Programas ensambladores
Transforman programas escritos en ensamblador a programas escritos en lenguaje
máquina, que son directamente ejecutables.
• Programas compiladores
Transforman programas escritos en un lenguaje de alto nivel (código fuente) a
programas escritos en un lenguaje de bajo nivel (programa objeto).
• Programas intérpretes
Transforman programas escritos en un lenguaje de alto nivel (código fuente) en las
instrucciones necesarias en código máquina y las ejecutan inmediatamente.
Compiladores
Intérpretes
• Instrucción a instrucción
• Analizan cada instrucción y la traducen a código máquina
• La ejecución es supervisada por el programa intérprete
✓ Tiene que estar instalado el intérprete en el ordenador en el que ejecuto el
programa
• No se genera un programa objeto independiente
• El proceso de traducción se repite hasta finalizar las instrucciones del programa en
lenguaje de alto nivel, o hasta que se produzca un error
Comparativa Intérprete-Compilador
Memoria RAM
• Es la memoria principal
• RAM = Random Access Memory = Memoria de acceso aleatorio
• Se utiliza para almacenar los programas, los datos que éstos utilizan y el sistema
operativo residente.
• Se borra al apagar el ordenador
• Es de lectura y escritura
• Cuanto más memoria RAM tenga un ordenador mayor número de programas podrán
funcionar al mismo tiempo y programas más grandes podrán permanecer en
memoria
• Expansible usando módulos DIMM (anteriormente SIMM)
https://microchipdeveloper.com/8avr:ioports
Variables Globales:
Pueden ser usadas en
cualquier parte del
código.
NOTA:
En microcontroladores la
Formato:
%f : float
%d: Entero
%x: Hexadecimal
%ch: letra
pow(base, elevado)
%(cifras significativas).(decimales)(tipo)
Nota:
Stdint.h : Estándar int
Más común en la
Unsigned char num (Entero sin signo)
programación de
Char num (Entero con signo) microcontroladores.
https://microchipdeveloper.com/8avr:ioports
Base hexadecimal
5𝐹16
A base decimal
5𝐹16 = 161 𝑥5 + 160 𝑥15
5𝐹16 = 9510
%f : float
%d: Entero
%X: Hexadecimalx`
%ch: letra
%p : punteros
2.4e-3
“hola”
Formas de representar V o F:
Ejemplo:
La librería #include<string.h>
tiene funciones para el uso de
cadena de caracteres.
Ejemplo: strcpy
https://microchipdeveloper.com/8avr:ioports
En este lenguaje C, No
es aplicable para
comparar cadenas de
caracteres.
_Numeros
_Codigo Asccii
_Letras
https://microchipdeveloper.com/8avr:ioports
https://microchipdeveloper.com/8avr:ioports
Ejemplo:
Siempre cuando se trabaja con
microcontroladores, se debe usar
bien la memoria para optimizarla.
El resultado dará un
1 si es V
0 si es F
Otro Ejemplo:
https://microchipdeveloper.com/8avr:ioports
No importa si la variable es
local o global.
Valor Variable
https://microchipdeveloper.com/8avr:ioports
EJEMPLO:
Otra forma
https://microchipdeveloper.com/8avr:ioports
EJEMPLO EN MICROCONTROLADORES
https://microchipdeveloper.com/8avr:ioports
Ejemplo
https://microchipdeveloper.com/8avr:ioports
stddef.h
https://microchipdeveloper.com/8avr:ioports
%u : unsigned
%g
EJEMPLO:
https://microchipdeveloper.com/8avr:ioports
Scanf
https://microchipdeveloper.com/8avr:ioports
https://microchipdeveloper.com/8avr:ioports
Ejercicio 1
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(void) {
int fecha;
printf("\tEjercicio 1\n");
printf("Ingrese su a%co de nacimiento: ",164);
scanf("%d",&fecha);
int edad=2023-fecha;
printf("Si usted nacio en %d este a%co cumple %d\n ",fecha,164,edad);
system ("PAUSE");
return 0;
}
Ejercicio 2
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int suma;
int a,b,c;
int *ptra,*ptrb,*ptrc,*ptrsuma;
ptra=&a;
ptrb=&b;
ptrc=&c;
ptrsuma=&suma;
printf("\tEjercicio 2\n");
printf("Ingrese los valores a sumar\n");
printf("a= ");
scanf("%d",&a);
printf("b= ");
scanf("%d",&b);
printf("c= ");
scanf("%d",&c);
suma=a+b+c;
printf("La suma de %d, %d y %d es %d\n",*ptra,*ptrb,*ptrc,*ptrsuma);
system ("PAUSE");
return 0;
}
Ejercicio 4
#include <stdio.h>
#include <stdlib.h>
https://microchipdeveloper.com/8avr:ioports
int main(void) {
int h,b;
float area;
printf("\tEjercicio 4\n");
printf("Area de un triangulo rectangulo:\n");
printf("Altura: ");
scanf("%d",&h);
printf("Base: ");
scanf("%d",&b);
area=(float)(b*h)/2;
system("PAUSE");
return 0;
}
https://microchipdeveloper.com/8avr:ioports
Si la instrucción es de
solo una línea no es
necesario usar
corchetes. (Ya que
usarlas llenamos más
las líneas de códigos.)
https://microchipdeveloper.com/8avr:ioports
if ( ) {
}
else {
if ( ) {
}
}
Se puede usar la
mayor cantidad
necesaria de else if
https://microchipdeveloper.com/8avr:ioports
https://microchipdeveloper.com/8avr:ioports
Solución ejercicio 6:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void) {
float x;
float fx;
printf("\tEjercicio de ua funcion\n");
printf("Dado f(x), ingrese el valor de x: ");
scanf("%f",&x);
if(x<=0)
fx=x+3;
else
fx=pow(x,2)+2*x;
4.2.2 Switch
x
https://microchipdeveloper.com/8avr:ioports
Ejercicio 13
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
int main(void) {
uint8_t selector;
float area=0;
uint32_t a,b,B;
printf("CALCULO DE AREAS\n");
printf("================\n");
printf("1. Calcula el area de un triangulo.\n");
printf("2. Calcula el area de un trapecio.\n");
printf("3. Calcula el area de un rectangulo.\n");
printf("Opcion --> ");
scanf("%c",&selector);
switch (selector){
case '1':
printf("\tArea de triangulo\n");
printf("base: ");
scanf("%d",&b);
printf("Altura: ");
scanf("%d",&a);
area=(float)(b*a)/2;
break;
case '2':
printf("\tArea de trapecio\n");
printf("Base mayor: ");
scanf("%d",&B);
printf("Base menor: ");
scanf("%d",&b);
printf("Altura: ");
scanf("%d",&a);
area=(float)((b+B)/2)*a;
break;
case '3':
printf("\tArea de rectangulo\n");
printf("Base: ");
scanf("%d",&b);
printf("Altura: ");
scanf("%d",&a);
area=b*a;
break;
default:
printf("La seleccion no es valida!!!\n.");
}
if(area>0)
printf("AREA---> %.2f\n",area);
system ("PAUSE");
return 0;
}
https://microchipdeveloper.com/8avr:ioports
4.3.1 While
https://microchipdeveloper.com/8avr:ioports
https://microchipdeveloper.com/8avr:ioports
4.3.2 Do-While
https://microchipdeveloper.com/8avr:ioports
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int numterminos;
int suma=0,i=0;
printf("\tSERIE DE NUMEROS MULTIPLOS DE 5\n");
do{
printf("Numero de terminos: ");
scanf ("%d",&numterminos);
}while(numterminos<=0);
/***************************************************/
/***************************************************/
while(i<numterminos){
suma=suma+5;
printf("%d",suma);
if(i<numterminos-1)
printf(", ");
i ++;
}
printf("\n");
system ("PAUSE");
return 0;
}
https://microchipdeveloper.com/8avr:ioports
4.3.3 For
https://microchipdeveloper.com/8avr:ioports
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int numero;
int suma=0;
int mayor;
int menor;
float media;
do{
printf("Numero %d°: ",i+1);
scanf("%d",&numero);
}while(numero<=0);
/******************************************/
if(i==0){
mayor=numero;
menor=numero;
}
/*****************************************/
//SUMA
suma+=numero;
//MAYOR
if(mayor<numero)
mayor=numero;
//MENOR
if(menor>numero)
menor=numero;
}
media=(float)suma/10.0;
printf("\nSUMA----->%d\n",suma);
printf("MAYOR---->%d\n",mayor);
printf("MENOR---->%d\n",menor);
printf("MEDIA---->%.2f\n",media);
system ("PAUSE");
return 0;
}
TEMA 5: FUNCIONES
5.1 Programación Modular
Módulo=SubPrograma=Función
https://microchipdeveloper.com/8avr:ioports
No devuelve
ningún valor
En un archivo heater (h.), solo va ir las declaraciones de los prototipos de las funciones.
Tambien puede ir las definiciones de constantes.
https://microchipdeveloper.com/8avr:ioports
If not define
Para macros:
Documentación
Otra forma
de
documenta
@param[n]: ción
Cuando hay más de dos parámetros:
@param[m]:
DEFINICIÓN DE UNA FUNCIÓN
https://microchipdeveloper.com/8avr:ioports
Bloque de código
Dentro de una
función podemos
tener varios
return.
Y luego se eliminan.
https://microchipdeveloper.com/8avr:ioports
Ejemplo:
https://microchipdeveloper.com/8avr:ioports
Ejemplo
main.c
Arrays o arreglos.
Ejercicio:
#include <stdio.h>
#include <stdlib.h>
/*
*Definimos los tamaños de los vectores como constantes
*/
/*DECLARACION DE VECTORES*/
//<tipo> <nombre> <dimensiones>
int array1 [LEN1]; // VECTOR 1 Se trabaja con función porque asi
int array2 [LEN2]; // VECTOR 2 se ahorra escribir repetidamente
int array3 [LEN3]; // VECTOR 3 alguna instrucción.
/**
* @brief: Funcion para ingresar los elementos de un vector
*/
void imputArray(int ptr[],int len);
/**
* @brief: Funcion para copia de vectores a un tercer vector
*/
void ArrayCopy(int *dest,int *scr1 ,int *scr2,int len1,int len2); //(donde se hara
la copia), (los vectores que se copiaran),(los tamaños de los vectores)
/**
* @brief: Funcion para mostrar en pantalla
*/
void ShowRes(int *ptr, int len);
/*
* Funcion principal
*/
int main(void) {
printf("Ingrese los valores del array 1:\n");
imputArray(array1,LEN1);
printf("Ingrese los valores del array 2:\n");
imputArray(array2,LEN2);
/*********************************************/
ArrayCopy(array3,array1,array2,LEN1,LEN2);
printf("El array 3 tiene los siguientes valores:\n");
ShowRes(array3, LEN3);
https://microchipdeveloper.com/8avr:ioports
system ("PAUSE");
return 0;
}
/**
* @brief: Funcion para ingresar los elementos de un vector
*/
void imputArray(int ptr[], int len){
for(int i=0;i<len;i++){
printf("elemento [%d]-->",i);
scanf("%d",&ptr[i]);
}
}
/**
* @brief: Funcion para copia de vectores a un tercer vector
*/
void ArrayCopy(int *dest,int *scr1 ,int *scr2,int len1,int len2){
for(int i=0;i<len1;i++){
dest[i]=scr1[i]; //Copia del primer array
}
for(int i=len1;i<len1+len2;i++){
dest[i]=scr2[i-len1]; //Copia del segundo array
}
/**
* @brief: Funcion para mostrar el tercer vector
*/
void ShowRes(int *ptr, int len){
for(int i=0;i<len;i++){
printf("Elemento[%d]:%d\n",i,ptr[i]);
}
return;
} Otra forma:
https://microchipdeveloper.com/8avr:ioports
No tenemos que preocuparnos en añadir el carácter nulo, ya que el mismo programa lo añade:
Como vemos, el vector que almacena la cadena de caracteres, presenta 6 elementos: E-S-T-O-\n-nulo.
Además se ve que hacemos uso de un macro. Este macro nos servirá para saber la cantidad de
elementos de la cadena de caracteres o vector.
https://microchipdeveloper.com/8avr:ioports
NOTA
https://microchipdeveloper.com/8avr:ioports
Ejemplo:
Entonces:
https://microchipdeveloper.com/8avr:ioports
Otra forma:
https://microchipdeveloper.com/8avr:ioports
https://microchipdeveloper.com/8avr:ioports
https://microchipdeveloper.com/8avr:ioports
El microprocesador es solo
CPU.
Memoria de programa
o Memoria Flash
Al ser en paralelo, el
procesador funciona mucho
más rápido.
Instrucciones complejas.
Se usan en Windows.
7. 5 Memoria de datos
PIC 18F4550
• S./25
• Necesita de un reloj de cristal + condensadores S./2
• Necesita un Pickit3 S./100 o S./80
https://microchipdeveloper.com/8avr:ioports
dsPIC30F4013
Stm32f407
Tarjeta tm4c123gh6pm
• Más caro
• Micro de 32 bits
Launchxl-f28379d
• Micros industriales
https://microchipdeveloper.com/8avr:ioports
• include
• define
• ifndef
• ifdef
• warning
• error
DIRECTIVAS DEL PREPROCESADOR
• if
• elif
• else
• #
• ##
https://microchipdeveloper.com/8avr:ioports
Elimina la definición.
Para advertencias.
https://microchipdeveloper.com/8avr:ioports
• Si no está definido:
ASI SE ESCRIBE
• Si está definido: LIBRERÍAS MÁS
COMPACTAS.
Cuando NUM1 es
30, se sombrea el
#if, #elif.
Segundo caso
https://microchipdeveloper.com/8avr:ioports
Cuando NUM1 es
10, se sombrea el
#if, #else.
Uso del ##
Establecer:
Clear:
Complemento:
REG: registro
Estas macros flexibilizan para poner 1 o 0
en los registros.
https://microchipdeveloper.com/8avr:ioports
Capacitancia
parásita
https://microchipdeveloper.com/8avr:ioports
Ejemplo
https://microchipdeveloper.com/8avr:ioports
Main.c
https://microchipdeveloper.com/8avr:ioports
Se copia y se pega
en el entorno main.
https://microchipdeveloper.com/8avr:ioports
EJEMPLO: