of 35
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
1/35
Profesor:
Mag. Ing. Sergio Salas Arriarn
Diseo de sistemas
microprocesados
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Fundamentos del lenguaje ANSI C
Mag. Ing. Sergio Sala
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
2/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Objetivo general del curso
El alumno disea dispositivos electrnicos basados en sistemas embebidos c
resolver problemas de baja y mediana complejidad haciendo uso para esto d
lenguaje ANSI C con suma destreza.
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
3/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Competencias esperadas en el
curso
1. Diseo de hardware basado en el uso del lenguaje ANSI C.2. Trabajo en equipo.
3. Responsabilidad en el cumplimiento de las tareas y evaluac
4. Honestidad.
5. Motivacin.
Recomendaciones para cumplir con las competencias:
1. Asistir a clases puntualmente. NO FALTE, tome en cuenta
temas del curso carecen de bibliografa completa en la w
2. Estudiar constantemente del material de clases. Resolver
ejercicios propuestos.3. Use su placa de desarrollo en casa para practicar diferent
No olvide llevarla a todas las clases.
4. Mostrar respeto a sus compaeros y al curso.
5. Participacin activa en clases, HAGA PREGUNTAS.
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
4/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Sistema de calificacin
PF = LB1+LB2+LB3+LB4+LB5+LB6+LB7+LB8 min(LB)
7
Donde PF = Promedio final del curso.
LBx = Laboratorio calificado N xLB1 : Semana 4 (Evaluacin terica de programacin)
LB2 : Semana 5 y 6 (Presentacin del mdulo de desarrollo-Trabajo prctico L
LB3 : Semana 7 (Trabajo prctico Teclado, LCD)
LB4 : Semana 10 (Trabajo prctico TIMER 1)
LB5 : Semana 12 (Trabajo prctico ADC)
LB6 : Semana 14 (Trabajo prctico Puerto SERIE)LB7 : Semana 17 (Trabajo prctico PWM)
LB8 : Semana 19 (Trabajo prctico Input Capture)
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
5/35
Herramientas
necesarias para el cursoFacultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
1. Mdulo de desarrollo basado en el dsPIC30F3014.
2. Cable USB tipo A-B.
3. Software MPLAB IDE.
4. Compilador MPLAB C30.5. Informacin del curso dada en clase.
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
6/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera ElectrnicaEl lenguaje ANSI C
El lenguaje C fue diseado en el ao 1972 en los laboratorios Bell. La intencin
principal fue la de reescribir el sistema operativo Unix de una forma portable,
ya que el Unix fue escrito en lenguaje ensamblador y tena que ser
completamente reescrito para cada nueva mquina. El lenguaje C fue basado
en lenguajes previos como el B y BCPL, por lo cual la denominacin de C.
El xito del C en pequeos procesadores se debe al hecho de no es un lenguaje
de alto nivel, sino un macro ensamblador altamente portable, lo cual permite
tener la misma flexibilidad que el lenguaje ensamblador ofreciendo casi el
mismo nivel de eficiencia.
Para un sistema embebido, la aplicacin en C no presenta archivos, sistema
operativo ni editor, en su lugar otra mquina tiene que ser usada para crear y
compilar la aplicacin. El resultado se enva a la mquina definitiva target para
que lo ejecute. La mquina usada para compilar la aplicacin es llamada el
sistema host y la mquina que ejecuta la aplicacin es conocida como sistema
target.
Mag. Ing. Sergio Sala
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
7/35
Ventajas del uso del lenguaje ANSI C
en sistemas embebidos El lenguaje C es universal y por tanto es fcil portar un programa hecho
para un microcontrolador a otro modelo de microcontrolador.
El lenguaje C facilita el trabajo en equipo.
El lenguaje C permite la modularizacin o creacin de libreras especficas
para el manejo de perifricos conocidos como el LCD, puerto RS232,
Display 7 segmentos, etc.
El lenguaje C permite el encapsulado (programas con entradas o
argumentos
y salidas especficas o retornos).
El lenguaje C es una herramienta rpida de programacin.
El lenguaje C permite la incorporacin de bloques de ensamblador.
El compilador utiliza todo el set de instrucciones, por lo tanto convierte el
cdigo en C a un programa eficiente en lenguaje ensamblador.
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
8/35
Desventajas del uso del lenguaje Cen sistemas embebidos
El lenguaje C ocupa mayor espacio en la memoria
FLASH y requiere un mayor consumo de memoria
RAM.
Los buenos compiladores tienen un precio, los
ensambladores son gratuitos.
Los compiladores son programas que pueden teneralgunos inconvenientes.
Los compiladores generan cdigo redundante e
innecesario que muchas veces no es necesario
ejecutar.
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Salas
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
9/35
Estructura de un programa en C#include "p30fxxxx.h
//Macros para la configuracin de los fusibles
_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);_FBORPOR(PBOR_OFF & PWRT_16 & MCLR_EN);
_FGS(CODE_PROT_OFF);
int main()
{El programa principal se ingresa dentro de las
llaves de la funcin primaria main().
}
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
10/35
Comentarios en ANSI C
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Los comentarios pueden ser de dos tipos:
1. Comentarios de una sola lnea. Haciendo uso del operador //
2. Comentarios que abarcan varias lneas. Haciendo uso del operador
/* (inicio del comentario) y */ (fin del comentario)
Por ejemplo:
a = 5; //Esto es un comentario al lado de una instruccin.
/*Esta es una forma de realizar un comentario
compuesto por dos o ms lneas.*/
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
11/35
Fin de las sentencias en ANSI C
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
En el lenguaje C todas las sentencias deben finalizar con ; ya que de no
hacerlo el compilador arrojar un error. Por ejemplo:
a = 5; //Forma correcta
a = 4 //Error
As mismo, puede haber mas de una instruccin en una sola lnea:
a = 4; b = 3; c++;
De la misma manera, los espacios en blanco son ignorados por el compilador:
a = 5 +2; // Forma correcta
a = 5
+ 2; //Tambin es correcto, pero genera desorden en el programa.
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
12/35
Maysculas y minsuculasEn ANSI C las variables escritas con minsculas son diferentes de
las escritas con
Letras maysculas. Por ejemplo:
Variable variable VARIABLE VARIable variablE
Los nombres de las variables jams pueden comenzar con un
dgito o llevar espacios en blanco. Por ejemplo:
int 7seg; // incorrectochar num entero; // incorrecto
La forma adecuada sera:
int sevenseg;
char num_entero;
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
13/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera ElectrnicaTipos de variables
Mag. Ing. Sergio Sala
Tipo Tamao (bits) Rango
bit 1 0 a 1
signed char 8 -128 a 127
unsigned char 8 0 a 255
int 16 -32768 a 32767
unsigned int 16 0 a 65535short 16 -32768 a 32767
unsigned short 16 0 a 65535
signed long 32 2 147 483 648 a +2 147 483
647
unsigned long 32 0 to 4 294 967 295float 32 1.17549E-38 a
6.80565E38
double 32 1.17549E-38 a
6.80565E38
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
14/35
Declaracin de variablesLas variables por defecto se almacenan en la memoria SRAM. Por esta razn, esrecomendable no crear ms variables de las que realmente se necesitan para no
malgastar los recursos de memoria.
unsigned char a = 5; //Variable global (puede ser usada en todo el programa
float pi = 3.1415; //por las diferentes funciones.
void main( )
{
char b = -8; //Variable local (solo puede ser usada en el mbito de la
// funcin main()
unsigned int k = 12000;
}
void sumar( )
{
unsigned char var;
var = a +10; //Correcto. a es una variable global.
var = b +90; //Error b no existe para esta funcin
}
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
15/35
El Complemento a 2
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
char b = -8;b = 1111 1000
El nmero 8 en binario es: 0000 1000
Si lo invertimos obtenemos: 1111 0111
Si le sumamos 1 tenemos: 1111 1000 = -8 complemento a 2
De la misma manera si tenemos -8: 1111 1000
Y luego lo invertimos: 0000 0111
Y finalmente le sumamos 1: 0000 1000
Suponga que quiere sumar 5 8. Entonces:
0000 0101 -> 5
1111 1000 ->-8--------------
1111 1101 -> -3
Suponga que quiere sumar -8 y -3. Entonces:
1111 1000 -> -8
1111 1101 -> -3
-------------
1111 0101 -> -11
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
16/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Constantes
Mag. Ing. Sergio Sala
Muchas veces, es necesario crear variables cuyo contenido se mantenga esttico. Porejemplo, puede recordar las tablas en lenguaje ensamblador en donde se fijaba un
mensaje que se poda presentar en la pantalla LCD o el los Displays 7 segmentos. Dicho
mensaje se almacenaba en la memoria FLASH.
Las variables constantes se almacenan en FLASH y por tanto su contenido no se puede
actualizar. Para declarar una variable constante se hace uso del operador const.
const unsigned char data = 10;
const temp = 36.5;
const charcurso[ ] = {A,r,q,u,i,t,e,c,t,u,r,a};
void main ()
{TRISB = 0x00;
TRISD = 0x00
PORTB = data;
PORTD = curso[4];
}
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
17/35
El comando del preprocesador
#define
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
El comando del pre procesador #define es una macro que define un valor constante
que puede ser reemplazado por un Alias en todo el programa. El abuso de este
tipo de comando no genera ningn gasto en memoria del sistema embebido.
La ventaja del uso del #define es que permite mejorar la legibilidad del programa.
Ejemplo:
#define ES_PAR 0#define ES_IMPAR 1
unsigned char residuo;
void main( )
{
TRISB = 0xFF;
TRISD = 0x00;
residuo = PORTB%2;if(residuo == 0)
PORTD = ES_PAR; //PORTD = 0
else
PORTD = ES_IMPAR; //PORTD = 1
}
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
18/35
Operadores aritmticos en C
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Operador Operacin
+ Suma
- Resta
* Multiplicacin
/ Divisin
%Residuo
++ Autoincremento
-- Autodecremento
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
19/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Ejemplo de operaciones aritmticas
Mag. Ing. Sergio Sala
char a=8, b=-3;
char c;
void main( )
{
c = a + b; //c = 5c = a b; // c = 11
c = a * b; // c = -24
c = a / b; //c = -2
b = 3;
c = a / b; // c = 2
c = a % b; // c = 2c++; // c = 3
c = a++; // c = 8, a = 9
c = ++a; // c = 10, a = 10
c = a- -; // c = 10, a = 9
c = - -a; // c = 8, a = 8
}
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
20/35
Operadores de campo de bit
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Operador Operacin
& AND
| OR
^ XOR
~ NOT
> Corrimiento derecha
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
21/35
Ejemplo de operaciones binarias
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
char a=0b1111 0000, b=0b00110011;
char c;
void main( )
{c = a & b; // c = 00110000 (AND)
c = a | b; // c = 11110011 (OR)
c = a ^ b; // c = 11000011 (XOR)
c = ~ b; // c = 11001100 (NOT)a = 0b10101100;
c = a > 3; // c = 0001 0101
}
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
22/35
Operadores lgicos y relacionales
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Operador Operacin
== Igual a
!= Diferente de
> Mayor que
< Menor que
>= Mayor o igual a
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
23/35
Ejemplo de operaciones lgicas
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
char a= 15, b=15;
char c;
void main(void)
{
c = a == b; // c = 1 (Verdadero)c = a != b; // c = 0 (Falso)
c = a > b; // c = 0 (Falso)
c = a < b; // c = 0 (Falso)
c = a >= b; // c = 1 (Verdadero)
c = a
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
24/35
Sentencias de seleccin if
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
if ( Expresin)
Instruccin 1;
else
Instruccin 2;
Condicin verdadera porque elargumento es mayor a 0.
Caso contrario la condicin es falsa porqu
el argumento es 0.
if (Expresin)
{
Instruccin 1;
Instruccin 2;
}else
{
Instruccin 3;
Instruccin 4;
}
Se utiliza la apertura y cierre de la llave cada
vez que hay ms de una sentencia dentro del
condicional
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
25/35
Ejemplos de condicionales
compuestos
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
if ( (a>b) && (a >c) ) //Si a es mayor que b y a es mayor que c
{
}
if ( (a != b) || (a !=c) ) //Si a es diferente de b o a es diferente de c
{
}
if ( a == b) //Si a es igual a b
{
}
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
26/35
Errores comunes con la sentencia
if
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
unsigned char a = 5, b = 7, c;void main()
{
if ( a = b)
{
c = 10;
}while(1);
}
unsigned char a = 5, b=7,c;
void main()
{
if( a > 4 & b > 6)
{
c = 10;
}
while(1);}
Error a = b, es decir a = 7 y como es una
asignacin vlida el argumento de if es 1 y
por tanto la condicin es considerada verda
por lo cual c = 10.
No afecta el resultado ya que a>4 = 1 y b>6
La operacin AND entre ambos valores da
por tanto la condicin es considerada verda
y c = 10. Sin embargo, es importante tener
cuenta que se est realizando la operacin
y no la operacin lgica.
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
27/35
La evaluacin de varios estados
con if
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
unsigned char k = 0;
void main()
{
TRISB = 0xFF;
while(1)
{ if(PORTB =10 && PORTB 50 && PORTB < 150) k = 100;
else if(PORTB >=150 && PORTB < 200) k =150;
else k = 200;
}
}
El problema de este anidamiento if-else if es que se deben evaluar todas las condicione
vlida. Una vez hallada la condicin vlida se sale de la sentencias if. Si existen mucha
evaluar, el anidamiento if-else if puede resultar ineficiente.
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
28/35
Sentencias de seleccin switch()
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Para resolver el problema de ineficiencia debido a mltiples condiciones posiblespara una variable se puede hacer uso de la sentencia switch() que nicamente
evala la opcin correcta y ejecuta las instrucciones especificadas para dicha
condicin. La sentencia tiene la siguiente estructura:
switch (condicin)
{
case condicin 1:Instrucciones;
break;
case condicin 2:
Instrucciones;
break;
case condicin N:
Instrucciones;
break;
default:
Instrucciones;
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
29/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Ejemplo de uso del switch()unsigned char resul;
void main(){
TRISB = 0xFF;
switch(PORTB)
{
case 0:
resul = 10;break;
case 1:
resul = 11;
break;
..
..
case 200:
resul = 245;
break;
default:
resul = 0;
}
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
30/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Sentencias iterativas: bucle forfor (expresin in icial; con dicin de la exp resin, incremento de la expresin){
Instrucciones
}
unsgined char i;
for (i = 0; i
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
31/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Sentencias iterativas: bucle
while()while (condicin)
{
Instrucciones
}
int p = 10;
while (p
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
32/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Sentencias iterativas: bucle do
while()Aqu al menos las intrucciones se ejecutan una sola vez si es que la condicin dentrodel while() es falsa desde un inicio.
do
{
Instrucciones
}while(condicin);
Ejemplo:
unsgined char a=2,k=0;
void main()
{
k = 5;do
{
a ++;
}while(k
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
33/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Sentencias iterativas: goto
Muy similar a la sentencia goto en lenguaje ensamblador. De la misma manera,
etiquetas. Cierta literatura sobre el lenguaje ANSI C recomienda no abusar de e
sentencia dado que podra ocasionar problemas al compilador. En el caso de A
embebidos esto no aplica ya que la sentencia goto tiene relacin directa con la
lenguaje ensamblador.
Ejemplo:
unsigned char p = 0;
INICIO:p++;
if(p
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
34/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
La sentencia break
Esta sentencia se utiliza para finalizar la iteracin cuando ocurre cierta condici
en su interior.
Ejemplo: Calcular el factorial de 5.unsigned char fact = 1;
void main()
{
for(i = 1; i
7/29/2019 1. Fundamentos Del Lenguaje ANSI C
35/35
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
M I S i S l
La sentencia continue
continue es una sentencia que se utiliza dentro de los bucles iterativos para controlar
Esta instruccin normalmente se utiliza dentro de un condicional if para generar la sig
Ejemplo: Hacer un programa que sume los nmeros pares del 1 al 10.unsigned char suma;
void main()
{
unsigned char i = 0;
for( i = 0; i