Programación en C para microcontroladores

Post on 24-Oct-2014

1330 Views

Category:

Documents

9 Downloads

Preview:

Click to see full reader

Transcript

Programación en C para microcontroladores

PICC en HI‐TECHProfesor: Adrián Montero Ulate

EL PIC

HISTORIA DE C

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

ESTRUCTURA DE UN ARCHIVO .C

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

COMENTARIOS

Comentarios

• Dos maneras de hacerlos– Bloque de comentario:

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

– Comentario en una sola línea:

//Comentario corto

VARIABLES

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;

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

Variables

• Las variables son nombres para posiciones de memoria

int factor;

char letra;

float longitud;

Memoria de datos (RAM)

Variables

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

int factor;

char letra;

float longitud;

Memoria de datos (RAM)

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)

IDENTIFICADORES

Identificadores

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

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’

PALABRAS RESERVADAS

Palabras reservadas del ANSI C

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

TIPOS DE DATOS

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

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

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;

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;

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

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

CONSTANTES

FUNCIONES

DECLARACIONES

OPERADORES

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: +, ‐, ++, ‐‐

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

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

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

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

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

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

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

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

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.

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

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

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);

EXPRESIONES

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)

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

SENTENCIAS

Sentencias

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

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

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;

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”

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;

}

DECISIONESEXPRESIONES BOOLEANAS

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)

DECISIONESIF

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

IF ‐ Diagrama

Sintaxis:if (expresión) sentencia

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!!}

}}

DECISIONES IF ELSE

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

IF – ELSE ‐ Diagrama

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

DECISIONESIF ELSE IF

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

IF – ELSE ‐ Diagrama

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

DECISIONES SWITCH

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

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.

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.

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;

}

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

CICLOS FOR

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++)

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

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

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;

CICLOS WHILE

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.

Ciclo WHILE Diagrama

while (expresion) sentencia

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

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;

CICLOS DO WHILE

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.

Ciclo DO‐WHILE Diagrama

do sentencia while (expresion)

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

CICLOS BREAK

CICLOS CONTINUE

ARREGLOS

PUNTEROS

ESTRUCTURAS

ENUMERACIONES

MACROS

INTERRUPCIONES

DELAYS

ARCHIVOS ENLAZADOS

PUERTOS A/D

LEDS

LCD

EEPROM

TIMERS

RS‐232

SPI

PWM

STEPPERS

top related