Top Banner
Programación en C para microcontroladores PICC en HITECH Profesor: Adrián Montero Ulate
106

Programación en C para microcontroladores

Oct 24, 2014

Download

Documents

Kira1721_
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programación en C para microcontroladores

Programación en C para microcontroladores

PICC en HI‐TECHProfesor: Adrián Montero Ulate

Page 2: Programación en C para microcontroladores

EL PIC

Page 3: Programación en C para microcontroladores

HISTORIA DE C

Page 4: Programación en C para microcontroladores

Historia y particularidades

• C fue inventado en 1974 para escribir el sistema operativo UNIX

• C es “más” bajo nivel que otros lenguajes de alto nivel (bueno para microcontroladores)

• C soporta diversas arquitecturas de µC• C puede hacer prácticamente cualquier cosa que se pueda hacer en ensamblador

• C es más rápido que ensamblador para programar

Page 5: Programación en C para microcontroladores

ESTRUCTURA DE UN ARCHIVO .C

Page 6: Programación en C para microcontroladores

Estructura#include <htc.h>

#define _XTAL_FREQ 8000000

void main(){

unsigned char var;

TRISC = 0b00000000; //Configurar Puerto C como salidas

PORTC = 0b00000001;

while (1){if(RD5 == 0){

PORTC = 0xF0;}else{

PORTC = 0x0F;}var = var + 2;

}}

ComentarioDeclaración de variable

Declaración de constante

Archivo de encabezado

Función

Page 7: Programación en C para microcontroladores

COMENTARIOS

Page 8: Programación en C para microcontroladores

Comentarios

• Dos maneras de hacerlos– Bloque de comentario:

/* Esto es un comentario de dos líneas */

– Comentario en una sola línea:

//Comentario corto

Page 9: Programación en C para microcontroladores

VARIABLES

Page 10: Programación en C para microcontroladores

Variables

Una variable es un nombre que representa una o más posiciones de memoria utilizadas para guardar datos del programa.• Puede ser visto como un contenedor que puede guardar datos usados en el programa

int miVariable;miVariable = 5;

Page 11: Programación en C para microcontroladores

Variables ‐ Ejemplo#include <htc.h>

#define PI 3.14

void main(){

int radio, area;

//Calcular el área del círculoradio = 12;area = PI * radio * radio;

}

Tipo de dato

Declaración de variables

Tipo de dato

Variables en uso

Page 12: Programación en C para microcontroladores

Variables

• Las variables son nombres para posiciones de memoria

int factor;

char letra;

float longitud;

Memoria de datos (RAM)

Page 13: Programación en C para microcontroladores

Variables

• La declaración consiste en un identificadorúnico (nombre)

int factor;

char letra;

float longitud;

Memoria de datos (RAM)

Page 14: Programación en C para microcontroladores

Variables

• Y un tipo de dato– Determina el tamaño– Determina como se interpreta el dato

int factor;

char letra;

float longitud;

Memoria de datos (RAM)

Page 15: Programación en C para microcontroladores

IDENTIFICADORES

Page 16: Programación en C para microcontroladores

Identificadores

• Nombres dados a elementos tales como– Variables– Funciones– Arreglos– Otros elementos

Page 17: Programación en C para microcontroladores

Identificadores

• Caracteres válidos en identificadores

• Sensible a mayúsculas y minúsculas• Solo reconoce los primeros 31 caracteres

IDENTIFICADORPrimer Caracter‘_’ (guión bajo)

‘A’ a la ‘Z’‘a’ a la ‘z’

Caracteres Restantes‘_’ (guión bajo)

‘A’ a la ‘Z’‘a’ a la ‘z’‘0’ al ‘9’

Page 18: Programación en C para microcontroladores

PALABRAS RESERVADAS

Page 19: Programación en C para microcontroladores

Palabras reservadas del ANSI C

• Otros compiladores podrían incorporar más palabras reservadas

Page 20: Programación en C para microcontroladores

TIPOS DE DATOS

Page 21: Programación en C para microcontroladores

Tipos de datos fundamentalesTipo Descripción bitschar Caracter simple 8Int Entero 16float Coma flotante 32double Coma flotante de doble precisión 64

• El tamaño de un int varía de un compilador a otro– MPLAB C30 int es de 16‐bits– MPLAB C18 int es de 16‐bits– CCS PCB, PCM & PCH int es de 8‐bits– Hi‐Tech PICC int es de 16‐bits

Page 22: Programación en C para microcontroladores

Calificadores de tipos de dato• Calificadores: unsigned, signed, short y longCalificador Min Max Bitsunsigned char 0 255 8char, signed char ‐128 127 8unsigned short int 0 65535 16short int, signed short int ‐32768 32767 16unsigned int 0 65535 16int, signed int ‐32768 32767 16unsigned long int 0 232 ‐ 1 32long int, signed long int ‐231 231 32unsigned long long int 0 264 ‐ 1 64long long int, signed longlong int

‐231 231 64

Page 23: Programación en C para microcontroladores

Declaración de variables

tipo identificador1, … , identificadorn;

• Una variable debe ser declarada antes de poder ser usada.• El compilador necesita saber cuanto espacio asignarle y como 

manejar sus valores.• Ejemplos

int x, y, z;float factor;char textounsigned int indice;

Page 24: Programación en C para microcontroladores

Declaración de variables

• Las variables se pueden declarar de varias maneras:

Sintaxis

Una declaración en una línea tipo identificador;

Una declaración en una línea con valor inicialtipo identificador = ValorInicial;

Múltiples declaraciones del mismo tipo en una líneatipo identificador1, identificador2, identificador3;

Múltiples declaraciones del mismo tipo en una línea con valor inicialtipo identificador1 = Valor1, identificador2 = Valor2;

Page 25: Programación en C para microcontroladores

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

*Se acostumbra usar la notación “camel case” para las variables: primera palabra en minúscula y todas las siguientes con la primera letra en mayúscula.Ejemplo:unaVariable, estoEsUnNombreLargo, otroNombreAlternativo

Page 26: Programación en C para microcontroladores

Variables

• Algunas veces las variables (y otros elementos) son declarados en un archivo separado llamado archivo de encabezado

• Los archivos de encabezado terminan con la extensión ‘.h’

• Se enlazan al programa principal por medio de la directiva #include

MiPrograma.h

MiPrograma.c

Page 27: Programación en C para microcontroladores

CONSTANTES

Page 28: Programación en C para microcontroladores

FUNCIONES

Page 29: Programación en C para microcontroladores

DECLARACIONES

Page 30: Programación en C para microcontroladores

OPERADORES

Page 31: Programación en C para microcontroladores

OperadoresDefinición: una expresión aritmética es una expresión que contiene uno o más operandos y operadores aritméticos

• Los operandos pueden ser variables, constantes o funciones que retornan un valor– Generalmente se trata los registros de un µC como variables

• Existen 9 operadores aritméticos:– Operadores binarios: +, ‐, *, /, %– Operadores unarios: +, ‐, ++, ‐‐

Page 32: Programación en C para microcontroladores

Operadores

Operador Operación Ejemplo Resultado

* Multiplicación x * y Producto de x por y

/ División x / y Cociente de x entre y

% Modulo x % y Residuo de x entre y

+ Suma x + y Suma de xmás y

‐ Resta x – y Resta de x menos y

+(unario) Positivo + x Valor de x

‐(unario) Negativo ‐x Valor opuesto de x

Page 33: Programación en C para microcontroladores

Conversiones implícitas

• En algunas expresiones, el tipo de un operando será temporalmente “promovido” al tipo más grande de operando

int x = 10;float y = 2.0, z;z = x * y; //x es promovido a float durante la operación

Page 34: Programación en C para microcontroladores

Jerarquía de conversión implícitaEl tipo

 más peq

ueño

 es convertid

o al tipo

 más grand

e en

 la expresión

Page 35: Programación en C para microcontroladores

Incremento y decrementoOperador Operación Ejemplo Resultado

++ Incremento x++++x

Usa x y luego incrementa por 1Incrementa x por 1 y luego lo usa

‐‐ Decremento x----x

Usa x y luego decrementa por 1Decrementa x por 1 y luego lo usa

Ejemplo con sufijo

x = 5;y = (x++) + 5;//y = 10//x = 6

Ejemplo con prefijo

x = 5;y = (++x) + 5;//y = 11//x = 6

Page 36: Programación en C para microcontroladores

Sentencias de asignación

Definición: una sentencia de asignación es una sentencia que asigna un valor a una variable

• Hay dos tipos de sentencias de asignación:– Asignación simple

• variable = expresión;

La expresión se evalúa y luego se asigna a la variable

– Asignación compuesta• variable = variable operador expresión;

La variable aparece de los dos lados del igual

Page 37: Programación en C para microcontroladores

Operadores de asignaciónOperador Operación Ejemplo Resultado

= Asignación x = y Asigna a x el valor de y

+=

Asignación compuesta

x += y x = x + y

‐= x ‐= y x = x – y

*= x *= y x = x * y

/= x /= y x = x / y

%= x %= y x = x % y

&= x &= y x = x & y

^= x ^= y x = x ^ y

|= x |= y x = x | y

<<= x <<= y x = x << y

>>= x >>= y x = x >> y

Page 38: Programación en C para microcontroladores

Operadores relacionalesOperador Operación Ejemplo Resultado

< Menor que x < y 1 si x es menor que y, sino 0

<= Menor o igual que x <= y 1 si x es menor o igual a y, sino 0

> Mayor que x > y 1 si x es mayor que y, sino 0

>= Mayor o igual que x >= y 1 si x es mayor o igual a y, sino 0

== Igual a x == y 1 si x es igual a y, sino 0

!= Diferente de x != y 1 si x es diferente de y, sino 0

Page 39: Programación en C para microcontroladores

Diferencia entre = y ==

• = es el operador de asignaciónx = 5 //Asigna 5 a la variable x

• == es el operador relacional “igual a”x == 5 //REVISA si x es igual a 5

Page 40: Programación en C para microcontroladores

Operadores LógicosOperador Operación Ejemplo Resultado

&& AND Lógico x && y 1 si x ≠ 0 y y ≠ 0, sino 0

|| OR Lógico x || y 0 si si x = 0 y y = 0, sino 1

! NOT Lógico !x 1 si x =0, sino 0

Cualquier valor diferente de cero es interpretado como TRUE (Verdadero).Un 0 siempre es falso.

Page 41: Programación en C para microcontroladores

Operadores Lógicos de bits

• La operación se lleva a cabo en cada bit del primer operando comparado al bit correspondiente del segundo operando

Operador Operación Ejemplo Resultado (para cada bit en el dato)

& AND (bits) x & y 1, si hay un 1 en ambos x,y0, si hay un 0 en uno o ambos x,y

|| OR (bits) x | y 1, si hay un 1 en x O y0, si hay un 0 en ambos x,y

^ XOR (bits) x ^ y 1, si hay un 1 en x O y, pero no en los dos0, si hay un 0 ó 1 en ambos x,y

~ NOT (bits) ~x 1, si hay 0 en x0, si hay 1 en x

Page 42: Programación en C para microcontroladores

Diferencias entre operadores lógicos & y &&

• & es el operador AND entre bits0b1010 & 0b1101 = 0b1000

• && es el operador Lógico AND0b1010 && 0b1101 = 0b0001 (TRUE)

<No‐cero> && <No‐cero> = 1 (TRUE)•

Tenga cuidado de no confundir el & con el &&. No son intercambiables

Page 43: Programación en C para microcontroladores

Operador condicional

• Sintaxis:(expr-prueba) ? hacer-si-cierto : hacer-si-falso;

Ejemplo:int x = 5;(x % 2 != 0) ?

printf(“%d es impar”, x) :printf(“%d es par”, x);

Page 44: Programación en C para microcontroladores

EXPRESIONES

Page 45: Programación en C para microcontroladores

Expresiones

• Representan un solo dato (ej: caracter, número, etc)

• Puede consistir de:– Entidad simple (una constante, variable, etc)– Combinación de entidades conectadas por operadores (+, ‐, +, /, etc)

Page 46: Programación en C para microcontroladores

Ejemplos de Expresionesa + bx = yvelocidad = dist / tiempoz = kc <= 7x == 25contador++d = a + 5

Page 47: Programación en C para microcontroladores

SENTENCIAS

Page 48: Programación en C para microcontroladores

Sentencias

• Ocasionan una acción• Hay tres tipos de sentencias en C:

– Sentencias de expresión– Sentencias compuestas– Sentencias de control

Page 49: Programación en C para microcontroladores

Expresiones

• Una expresión es seguida por un ‘;’• El ejecutar la sentencia de expresión hace que la expresión sea evaluada

Ej:i = 0;i++;a = 5 + i;y = (m * x) + b;

Page 50: Programación en C para microcontroladores

Sentencias compuestas

• Un grupo de expresiones individuales agrupadas por corchetes { y }

• Puede contener cualquier tipo de sentencias, inclusive otras compuestas

• Permite incluir sentencias dentro de otras• NO termina con un ;• También llamados “bloques de código”

Page 51: Programación en C para microcontroladores

Sentencias de control

• Usadas para lazos, decisiones y pruebas lógicas

• Usualmente requieren otra expresión dentro de ellas

Ejemplo:while (distancia < 400){

printf(“Siga corriendo”);distancia += 0.1;

}

Page 52: Programación en C para microcontroladores

DECISIONESEXPRESIONES BOOLEANAS

Page 53: Programación en C para microcontroladores

Expresiones booleanas

• C NO tiene tipo de dato booleano• Las expresiones booleanas retornan un valor entero (int)– 0: Falso– 1: Verdadero (diferente de cero, no es 1 garantizado)

Page 54: Programación en C para microcontroladores

DECISIONESIF

Page 55: Programación en C para microcontroladores

IF

Sintaxis:if (expresión) sentencia

• La expresión es evaluada por un valor booleano: Verdadero (≠ 0) ó Falso (= 0)

• Si expresión es verdadero se ejecuta la sentencia

Page 56: Programación en C para microcontroladores

IF ‐ Diagrama

Sintaxis:if (expresión) sentencia

Page 57: Programación en C para microcontroladores

IF ‐ Anidadosint potencia = 10;float banda = 2.0;float frecuencia = 146.52;if (potencia > 5){

if(banda == 2.0){if((frecuencia > 144) && (frecuencia < 148)){

//Frecuencia adecuada!!}

}}

Page 58: Programación en C para microcontroladores

DECISIONES IF ELSE

Page 59: Programación en C para microcontroladores

IF ‐ ELSE

Sintaxis:if (expresión) sentencia1else sentencia2

• La expresión es evaluada por un valor booleano: Verdadero (≠ 0) ó Falso (= 0)

• Si expresión es verdadero se ejecuta la sentencia1, sino se ejecuta la sentencia2

Page 60: Programación en C para microcontroladores

IF – ELSE ‐ Diagrama

Sintáxis:if (expresión) sentencia1else sentencia2

Page 61: Programación en C para microcontroladores

DECISIONESIF ELSE IF

Page 62: Programación en C para microcontroladores

IF – ELSE IFSintaxis:

if (expresión1) sentencia1else if (expresión2) sentencia2else sentencia3

• La expresión1 es evaluada por un valor booleano: Verdadero (≠ 0) ó Falso (= 0)

• Si es verdadero se ejecuta sentencia 1• Si es falso, se evalúa la expresión 2• Si es verdadero se ejecuta la sentencia2• Si es falso se ejecuta la sentencia3

Page 63: Programación en C para microcontroladores

IF – ELSE ‐ Diagrama

Sintaxis:if (expresion1) sentencia1else if (expresion2) sentencia2else sentencia3

Page 64: Programación en C para microcontroladores

DECISIONES SWITCH

Page 65: Programación en C para microcontroladores

SWITCHSintaxis:

switch (expresion){

case const-expr1: sentencia1…case const-expr2: sentencia2default: sentencian+1

}else sentencia2

• “expresion” es evaluado contra cada valor de           const‐expr en cada “case”

• La sentencia en el “case” adecuado es la que se ejecuta• Si ninguna condición se cumple se ejecuta la sentencia en 

el default

Page 66: Programación en C para microcontroladores

SWITCH Diagrama (pre‐definido)

Nótese que el comportamiento pre‐definido del switch es el de continuar con el siguiente caso una vez que se ejecuta el presente.

Page 67: Programación en C para microcontroladores

SWITCH Diagrama (modificado)

Para evitar que luego de una sentencia se ejecute la siguiente automáticamente insertamos un break a cada bloque de código dentro de las sentencias.Esto permite que se ejecute únicamente la porción de código deseada.

Page 68: Programación en C para microcontroladores

SWITCH – Ejemplo 1switch (puerto){

case 1: PORTA = 0xFF; break;case 2: PORTB = 0xFF; break;case 3: PORTC = 0xFF; break;case 4: PORTD = 0xFF; break;default: PORTA = 0x00;

}

Page 69: Programación en C para microcontroladores

SWITCH – Ejemplo 2switch (canal){

case 4..7: printf(“Estación VHF”); break;

case 9..12:printf(“Estación VHF”); break;

case 3:case 8:case 13:

printf(“Señal Débil”); break;case 14..69:

printf(“Estación UHF”); break;default:

printf(“No hay señal disponible”);}

Casos 3 y 8 “caen” al caso 13, ya que no tienen un break;

Aplicar a los casos: 4, 5, 6 y 7

Page 70: Programación en C para microcontroladores

CICLOS FOR

Page 71: Programación en C para microcontroladores

Ciclo FORSintaxis:

for (expresion1; expresion2, expresion3)sentencia

• expresion1 inicializa una variable para el conteo al inicio del ciclo (ej: i = 0)

• expresion2 es la condición de prueba, el ciclo continuará mientras esta condición sea cierta (ej: i <=10)

• expresion3 se ejecuta al final de cada iteración, usualmente para modificar la variable de conteo. (Ej: i++)

Page 72: Programación en C para microcontroladores

Ciclo FOR Diagrama

Inicializar variable para el ciclo

i = 0

Probar variable  ante condición de salida

Modificar variable de ciclo

i++

for (expresion1; expresion2, expresion3)sentencia

Page 73: Programación en C para microcontroladores

Ciclo FOR – Ejemplo 1int i;

for (i = 0; i < 5; i++){

PORTB = i;//Cada ciclo el valor de i varía por 1, y se cambia lo que se muestra en el puerto.

}Salida en el Puerto B:

0x000x010x020x030x04

Page 74: Programación en C para microcontroladores

Ciclo FOR Particularidades• Cualquiera de las expresiones puede obviarse en el for, pero deben aparecer los ‘;’

• Si expresion1 o expresion3 faltan, sus acciones simplemente desaparecen, o no se lleva a cabo ninguna acción.

• Si la expresion2 falta, se asume que es verdadera.

for ( ; ; ){

…}

for ( ; ; ){

…}

Este ciclo se ejecutará indefinidamente, o hasta que se salga de él con un break;

Page 75: Programación en C para microcontroladores

CICLOS WHILE

Page 76: Programación en C para microcontroladores

Ciclo WHILE

Sintaxis:while (expresion) sentencia

• Si expresion es verdadera, sentencia será ejecutada. Luego expresion será re‐evaluada para determinar si se ejecuta de nuevo sentencia o no.

• Es posible que sentencia nunca se ejecute si al evaluar por primera vez expresion esta es falsa.

Page 77: Programación en C para microcontroladores

Ciclo WHILE Diagrama

while (expresion) sentencia

Page 78: Programación en C para microcontroladores

Ciclo WHILE – Ejemploint i = 0;

while (i < 5){

PORTB = i;i++;//Cada ciclo el valor de i varía por 1, y se cambia lo que se muestra en el puerto.

}Salida en el Puerto B:

0x000x010x020x030x04

Se inicializa la variable afuera del ciclo

La condición se verifica al inicio de cada iteración

Ciclo incrementado manualmente

Page 79: Programación en C para microcontroladores

Ciclo WHILE Particularidades

• La expresion SIEMPRE debe aparecer, no se puede obviar.

• Es utilizado más frecuentemente que el forpara hacer ciclos infinitos.

while (1){

…}

while (1){

…}

Este ciclo se ejecutará indefinidamente, o hasta que se salga de él con un break;

Page 80: Programación en C para microcontroladores

CICLOS DO WHILE

Page 81: Programación en C para microcontroladores

Ciclo DO‐WHILE

Sintaxis:do sentencia while (expresion)

• sentencia es ejecutada y luego expresion se evalúa para determinar si se debe o no ejecutar de nuevo la sentencia.

• sentencia SIEMPRE se va a ejecutar al menos 1 vez, aún cuando expresion sea falsa cuando se inicie el ciclo.

Page 82: Programación en C para microcontroladores

Ciclo DO‐WHILE Diagrama

do sentencia while (expresion)

Page 83: Programación en C para microcontroladores

Ciclo DO‐WHILE – Ejemploint i = 0;

do{

PORTB = i;i++;//Cada ciclo el valor de i varía por 1, y se cambia lo que se muestra en el puerto.

} while (i < 5)Salida en el Puerto B:

0x000x010x020x030x04

Se inicializa la variable afuera del ciclo

La condición se verifica al final de cada iteración

Ciclo incrementado manualmente

Page 84: Programación en C para microcontroladores

CICLOS BREAK

Page 85: Programación en C para microcontroladores
Page 86: Programación en C para microcontroladores
Page 87: Programación en C para microcontroladores

CICLOS CONTINUE

Page 88: Programación en C para microcontroladores
Page 89: Programación en C para microcontroladores
Page 90: Programación en C para microcontroladores

ARREGLOS

Page 91: Programación en C para microcontroladores

PUNTEROS

Page 92: Programación en C para microcontroladores

ESTRUCTURAS

Page 93: Programación en C para microcontroladores

ENUMERACIONES

Page 94: Programación en C para microcontroladores

MACROS

Page 95: Programación en C para microcontroladores

INTERRUPCIONES

Page 96: Programación en C para microcontroladores

DELAYS

Page 97: Programación en C para microcontroladores

ARCHIVOS ENLAZADOS

Page 98: Programación en C para microcontroladores

PUERTOS A/D

Page 99: Programación en C para microcontroladores

LEDS

Page 100: Programación en C para microcontroladores

LCD

Page 101: Programación en C para microcontroladores

EEPROM

Page 102: Programación en C para microcontroladores

TIMERS

Page 103: Programación en C para microcontroladores

RS‐232

Page 104: Programación en C para microcontroladores

SPI

Page 105: Programación en C para microcontroladores

PWM

Page 106: Programación en C para microcontroladores

STEPPERS