Programación en C para microcontroladores PICC en HI‐TECH Profesor: Adrián Montero Ulate
Oct 24, 2014
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