Sunteți pe pagina 1din 41

ING.

JOSE ESTRADA MONTES


Ventajas del uso del lenguaje ANSI C
1. El lenguaje C es soportado por los
compiladores para una amplia variedad de
arquitecturas de MCU
2. El lenguaje C puede hacer casi cualquier cosa
que el lenguaje ensamblador puede hacer.
3. El lenguaje C permite la incorporación de
bloques de ensamblador.
4. El lenguaje C es generalmente más fácil y
más rápido para escribir código que el
lenguaje ensamblador.
5. El lenguaje C es confiable y requiere
normalmente poco conocimiento de la
arquitectura del MCU.

ING. JOSE ESTRADA M.


Desventajas del uso del lenguaje ANSI C
 El C no es tan portátil entre las arquitecturas o
compiladores como se dice por lo siguiente:
características del lenguaje ANSI son portátiles.
• Las bibliotecas específicas del procesador NO
SON portátiles.
• El código específico del procesador
(periféricos, E/S, interrupciones,
características especiales) NO SON
portátiles.

 El C no es tan eficiente como el ensamblador.


• Una buena programación en ensamblador puede
hacerlo mejor que el compilador C, sin
importar el nivel de optimización UTILIZARA
más memoria
ING. JOSE ESTRADA M.
Consejos del uso del lenguaje ANSI C

 No hay nada como el código autodocumentado


a pesar de lo que digan sobre el C:
• El C hace que sea posible escribir código
muy confuso.
• No todas las líneas necesitan ser
comentadas, pero la mayoría de los
bloques de código deben serlo.

 Debido a que hay muchos accesos directos


disponibles, el C no siempre es amigable para
los nuevos usuarios de ahí la necesidad de
los comentarios.

ING. JOSE ESTRADA M.


Herramientas de Desarrollo del Flujo de datos
C Source Files
.c
C Compiler

Compiler
Assembly Source Files Driver
.s Program
(.asm or .s)

Assembly Source Files


.s
Assembler
(.asm or .s)

Archiver Object
Files Executable
(Librarian) .o

.hex
Object File Libraries
(Archives) Linker
.a
(.lib or .a)
.cof
MPLAB X® IDE
Debug Tool
Linker Script Debug File
.gld
(.lkr or .gld)

ING. JOSE ESTRADA M.


Herramientas de Desarrollo del Flujo de datos

C Compiler

.c Preprocessor .h
C Source File C Header File

Compiler

Assembly Source File .s

ING. JOSE ESTRADA M.


Entorno de ejecución del C
 Compilador C establece un entorno de
ejecución
• Asigna espacio para el Stack.
• Inicializa el puntero de Stack.
• Asigna espacios para todo lo demás.
• Copias valores de la Flash/ROM a variables
en la RAM que fueron declarados con
valores iniciales.
• Limpia la RAM no inicializada.
• Deshabilita todas las interrupciones.
• Llama a la función main( ) (donde comienza
el código).

ING. JOSE ESTRADA M.


Estructura de un programa en C
#include <stdio.h> /*directiva de preprocesado incluido en el archivo
de cabecera del C standard */
#define PI 3.142 //otra directiva preprocesador, define constante
float area; //declaracion global
int alCuadrado (int r); //declaracion del prototipo de funcion alCuadrado
main( )
{ //inicio de la funcion principal & programa
int radio_alCuadrado; //declaracion local de variable
int radio = 3; //declaracion de variable e inicializacion
radio_alCuadrado = alCuadrado(radio); // pasa un valor de una funcion
area = PI * radio_alCuadrado; //sentencia de asignacion
printf(“area es %6.4f metros 2\n”, area); /*llama a funcion printf( )
para mostrar el valor area por terminal*/
} //fin de la funcion principal & programa
alCuadrado(int r)
{ //inicio de la funcion alCuadrado
int r_alCuadrado; //declaracion solo conocido en la funcion alCuadrado
r_alCuadrado = r * r;
return (r_alCuadrado); //sentencia del retorno del valor al llamado
}
ING. JOSE ESTRADA M.
Directivas de Preprocesamiento - MPLAB XC16

ING. JOSE ESTRADA M.


Variables
Una variable es un nombre que representa una
o mas direcciones de memoria que pueden
guardar datos usados en un programa.

int miVariable;
miVariable = 5;

ING. JOSE ESTRADA M.


Variables
Las declaraciones de variables consisten la
combinación de un tipo de dato (que determina el
tamaño y cómo se interpretan los valores) y en un
identificador único (nombre). 15 Data Memory (RAM) 0

int factorDeformacion; 4116

char primeraLetra; ‘A’

5.74532370373175
float longitud; × 10-44

ING. JOSE ESTRADA M.


Variables y tipos de datos
Un simple programa en C:
#include <stdio.h>
#define PI 3.14159
int main(void)
{
declaraciones
Tipo de float radio, area; de variable
dato
//Calcula area del circulo
Variables en uso

radio = 12.0;
area = PI *radio*radio;
printf(“area = %f”,area);
}

ING. JOSE ESTRADA M.


Identificador
Un identificador es un nombre dado a un
elemento de programa como una variable,
función, ó arreglo (array). Este nombre puede
ser usado para referirse al elemento del
programa sin conocimiento de su dirección
especifica de memoria.

En cuanto a los identificadores, es sensible en


cuanto a las letras mayúsculas y minúsculas y
jamás pueden comenzar con un dígito o llevar
espacios en blanco, por ejemplo:
int Radio ≠ int RadiO ≠ int RADIO ≠ int _radio ≠ int Ra_Dio

ING. JOSE ESTRADA M.


Palabras reservadas (Keywords)
Son palabras reservadas por el lenguaje C los
cuales tienen un significado especial, que no
deben ser usados como nombre de
identificadores, como son:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
ING. JOSE ESTRADA M.
Tipos de datos fundamentales
Tipo Descripcion Bits
char carácter simple 8
int entero 16
float numero de punto flotante de simple precisión 32
double numero de punto flotante de doble precisión 64

El tamaño de un int varia de un compilador a


otro compilador.

MPLAB-XC16 int es de 16-bits


MPLAB-XC8 int es de 16-bits
MPLAB XC32 int es de 16-bits
CCS PCB, PCM & PCH int es de 8-bits

ING. JOSE ESTRADA M.


Tipos de datos calificadores
Tipos de enteros modificados, los calificadores
son: unsigned, signed, short y long
Tipo de calificado Min Max Bits
unsigned char 0 255 8
char, signed char -128 127 8
unsigned short int 0 65535 16
short int, signed short int -32768 32767 16
unsigned int 0 65535 16
int, signed int -32768 32767 16
unsigned long int 0 232-1 32
long int, signed long int -231 231-1 32
unsigned long long int 0 264-1 64
long long int, -263 263-1 64
signed long long int
ING. JOSE ESTRADA M.
Tipos de datos calificadores
Tipos de modificacion de punto flotante
Tipo de calificacion Absoluto Min Absoluto Max Bits
float ± ~10-44.85 ± ~1038.53 32

double (1) ± ~10-44.85 ± ~1038.53 32

long double ± ~10-323.3 ± ~10308.3 64

XC16:(1) double es equivalente a long double si


– fno-short-double es usado.

XC16 Usa formato de punto flotante IEEE-754

ING. JOSE ESTRADA M.


Como declarar un variable
Las variables pueden ser declaradas de pocas
maneras:
Sintaxis

One declaration on a line


type identifier;

One declaration on a line with an initial value


type identifier = InitialValue;

Multiple declarations of the same type on a line


type identifier1, identifier2, identifier3;
Multiple declarations of the same type on a line with initial values
type identifier1 = Value1, identifier2 = Value2;

ING. JOSE ESTRADA M.


Como declarar una variable
Ejemplo:

unsigned int x;
unsigned y = 12;
int a, b, c;
long int miVar = 0x12345678;
long z;
char primero = ‘a’, segundo, tercero= ‘c’;
float numero_grande = 6.02 e+23;

Es habitual que si el nombre se compone de


varias palabras, todas las palabras después de
la primera comenzará con una letra mayúscula
(por ejemplo: miGranNombreDeVariable).
ING. JOSE ESTRADA M.
Como declarar una variable
Las variables por defecto se almacenan en la
memoria SRAM. Por esta razón, es
recomendable no crear más variables, de las
que realmente se necesitan para no malgastar
los recursos de memoria.
A veces, las variables (y otros elementos del
programa) se declaran en un archivo
independiente denominado archivo de cabecera.
Los nombres de los archivos de cabecera
habitualmente terminan en .h
Los archivos de cabecera están asociados con
un programa a través de la directiva:
#include

ING. JOSE ESTRADA M.


Como declarar una variable
Las variables por defecto se almacenan en la
memoria SRAM. Por esta razón, es
recomendable no crear más variables, de las
que realmente se necesitan para no malgastar
los recursos de memoria.
A veces, las variables (y otros elementos del
programa) se declaran en un archivo
independiente denominado archivo de cabecera.
Los nombres de los archivos de cabecera
habitualmente terminan en .h
Los archivos de cabecera están asociados con
un programa a través de la directiva:
#include

ING. JOSE ESTRADA M.


La directiva #include
Hay 3 formas de usar la directiva #include:

include <file.h>
Busca el archivo en el path (ruta) de busqueda
del compilador.
La ruta de búsqueda del compilador por lo
general incluye el directorio del compilador y
todos sus subdirectorios.
Por ejemplo: C:\Program Files\Microchip\XC16\v1.10\*.*
#include “file.h”
Busca el archivo solo en el directorio de
proyecto.
#include “c:\MyProject\file.h”
Usa la ruta específica para encontrar archivo
de inclusion (include)
ING. JOSE ESTRADA M.
La directiva #include
Hay 3 formas de usar la directiva #include:
.h main.h .c main.c

unsigned int a; #include "main.h"


unsigned int b;
unsigned int c; int main(void)
{
a = 5;
El contenido de main.h
son efectivamente b = 2;
pegados dentro de c = a+b;
main.c empezando en la }
linea de la directiva
#include

ING. JOSE ESTRADA M.


La directiva #include
main.c
Una vez ejecutado el
.c

preprocesador, así es unsigned int a;


como el compilador ve unsigned int b;
el archivo main.c unsigned int c;

El contenido del int main(void)


archivo de cabecera en {
realidad no son a = 5;
copiados a su archivo b = 2;
c = a+b;
fuente principal, pero
}
se comportan como si
se copiaron Equivalente a archivo
main.c sin #include

ING. JOSE ESTRADA M.


Constantes
Las variables constantes se almacenan en la
FLASH y su contenido no se puede actualizar
(Por ejemplo una tabla Lookup). Para declarar
una variable constante se hace uso del
operador const.
const unsigned char data = 10;
const temp = 36.5;
const char curso[ ] = { ‘M’ ,‘C’ ,‘U’, ‘&’, ‘D’, ‘S’, ‘C’};
void main( )
{
TRISB = 0x00;
TRISD = 0x00;
PORTB = data;
PORTD = curso[6];
}

ING. JOSE ESTRADA M.


Operadores aritméticos en C
El comando del preprocesador #define es una
macro que define un texto que puede ser
reemplazado por un etiqueta en todo el
programa. El abuso de este tipo de comando no
genera ningún gasto en memoria.
La ventaja del uso del #define es que
el programa sea mas legible.
#define etiqueta texto

Ejemplos:
#define PI 3.14159
#define MCU "PIC24FJ128GA010"
#define mol 6.02E23
#define COEF 2*PI
ING. JOSE ESTRADA M.
Manejo de Bits
ENMASCARAMIENTO
Lee los bits del Puerto y realiza la operación
AND con ‘0’ para ignorar los bits.
TECLA=(PORTB & 0x0F); /* 0000B3B2B1B0 */

EVALUAR VARIAS OPCIONES


Realiza la operación OR para aumentar los
casos y compararlo con otras opciones.
TECLA = (PORTB & 0x80); //B70000000
if( TECLA == (KEY_UP | KEY_RIGHT))

CAMBIANDO A VALOR OPUESTO


Lee dato de Puerto y realiza la operación XOR.
/*Si PORTB = 0x12 inicialmente 00010010 */
PORTB = (PORTB ^0b00110111);//00100101
ING. JOSE ESTRADA M.
Funcion printf()

printf(Control String, arg1,…argn);

Todo se impreme textualmente dentro de la


cadena, excepto los %d que se sustituye por
los valores de los argumentos de la lista

int a = 5, b= 10;
printf(“a = %d\n b = %d\n”, a , b);

resulta: a = 5
b = 10
NOTA: La 'd' en %d es el carácter de
conversión.
ING. JOSE ESTRADA M.
Carácter de conversión en Funcion printf()
Caracter de
Conversion Significado

%c Carácter simple
%s String (todos los caracteres hasta '\0')
%d Entero decimal con signo
%o Entero octal sin signo
%u Entero decimal sin signo
%x Entero hexadecimal sin signo con dígitos minúscula (1a5e)
%X Entero hexadecimal sin con dígitos mayúscula (ej. 1A5E)
%f Valor decimal con signo (punto flotante)
%e Decimal con signo con exponente (ej. 1.26e-5)
%E Decimal con signo, usa E como exponente (ej. 1.26E-5)
%g Como e o f, pero depende en tamaño o precisión del valor
%G Como g, pero usa E como exponente

ING. JOSE ESTRADA M.


Funcion printf()
printf(Control String, arg1,…argn);

ING. JOSE ESTRADA M.


Sentencias de control de Programa

El C usa para controlar el flujo de ejecucion


del programa, lo siguiente, dichas sentencias
son:
1. If
2. If-Else
3. If-Else-If
4. Switch
5. For
6. While
7. Do-While
8. Break
9. Continue

ING. JOSE ESTRADA M.


Sentencia If
Se ejecuta una sentencia o sentencias si la
expresión que acompaña al if tiene un valor
distinto a cero (verdadero). Si es cero (falso)
continúa sin ejecutar la sentencia o bloque de
sentencias.

if (expresión) expresión ≠ 0
{ expresión V
sentencia 1;
sentencia 2; sentencia(s)
expresión = 0 F
…… Ing. Jose Estrada
}

ING. JOSE ESTRADA M.


Sentencia If-Else
Se evalúa una expresión, si es cierta, se
ejecuta el primer bloque de código (o sentencia
1), y si es falsa, se ejecuta el segundo bloque
de código (o sentencia 2).

if (expresión) expresión ≠ 0
sentencia 1; expresión V sentencia 1
Else
sentencia 2; expresión = 0 F

sentencia 2
Ing. Jose Estrada

ING. JOSE ESTRADA M.


Sentencia If-Else-If
Se evalúa la expresión 1, si es cierta, se
ejecuta la sentencia 1, si es falsa, se evalua la
expresión 2, si es cierta ejecuta la sentencia 2
y si es falsa se ejecuta la sentencia 3.

if (expresión 1)
sentencia 1; expresión 1 V sentencia 1

else if (expresión 2) F

sentencia 2;
else expresión 2 V sentencia 2
sentencia 3; F

sentencia 3
Ing. Jose Estrada

ING. JOSE ESTRADA M.


Sentencia Switch
Compara una expresión con una lista de
constantes enteras (o caracteres), cuando
coincide, el grupo de sentencias asociadas a
esa constante se ejecuta hasta el break.
switch (expresion)
{
case constante 1: constante 1 V
sentencias 1
break
grupo de sentencias 1; F
break;
case constante 2: constante 2 V
sentencias 2
break
grupo de sentencias 2;
break; default
F

default: sentencias n
grupo de sentencias n; Ing. Jose Estrada

}
ING. JOSE ESTRADA M.
Sentencia de bucle For
Se usa para repetir una sentencia(s). La
expresion1 inicializa el valor de la variable de
conteo de bucle. La expresion2 si es verdadera,
ejecuta el bucle, si es falso sale del mismo. La
expresion3 se ejecuta al final de la iteración del
bucle, modifica la variable de conteo del bucle.
También es posible anidar bucles.
expresion1
for (expresion1; expresion2; expresion3 )
{ expresion3
sentencias (s);
} sentencia(s)
Ing. Jose Estrada

expresion2 V

ING. JOSE ESTRADA M.


Sentencia de bucle While
La repetición de la sentencia(s) se lleva a cabo
mientras sea cierta la expresión. La expresión se
evalúa antes de cualquier iteración. Si es falsa,
no se ejecuta la sentencia (o bloque se
sentencias) sale del bucle y el programa continua.

while (expresión) Ing. Jose Estrada

{
expresion V sentencia(s)
sentencias(s);
} F

ING. JOSE ESTRADA M.


Sentencia de bucle Do-While
Este bucle es una combinación de do (hacer) y
while (mientras). Las sentencias se ejecutan
antes de que se evalúe la expresión (condición),
por lo que el bucle se ejecuta siempre al menos
una vez.

do
{ sentencia(s)
sentencia(s);
} Ing. Jose Estrada

while (expresión) expresion V

ING. JOSE ESTRADA M.


Sentencia Break
Provoca la terminación inmediata de un bucle
incluso si la condición de salida no se ha cumplido
Sale de una sentencia switch, de modo que la
ejecución no se caiga a través de la cláusula
siguiente case. En el extracto de programa se ve
la sentencia break dentro
del diagrama de Flujo de Ing. Jose Estrada

una sentencia while.


int i=0; expresion V sentencia(s)
while (i<10)
F break
{
i++; sentencia(s)
if (i==5) break;
printf(“Iteracion de bucle %d\n”,i);
}
ING. JOSE ESTRADA M.
Sentencia Continue
Causa que el programa salte de nuevo al principio
de un bucle sin completar la iteración.
En el extracto de programa se ve
la sentencia continue dentro
del diagrama de Flujo de
una sentencia while.
Ing. Jose Estrada

int i=0;
while (i<5) expresion V sentencia(s)
{ F
i++; continue
if (i==2) continue;
sentencia(s)
printf(“Iteracion de bucle %d\n”,i);
}

ING. JOSE ESTRADA M.


SISTEMAS DIGITALES BASADOS EN
MICROPROCESADORES

MUCHAS GRACIAS

ING. JOSE ESTRADA MONTES

S-ar putea să vă placă și