Programación en C Para Microcontroladores

102
Programación en C para microcontroladores PICC en HI-TECH Profesor: Adrián Montero Ulate

Transcript of Programación en C Para Microcontroladores

PowerPoint Presentation

Programacin en C para microcontroladoresPICC en HI-TECHProfesor: Adrin Montero Ulate

El pic

Historia de C

Historia y particularidadesC fue inventado en 1974 para escribir el sistema operativo UNIXC es ms bajo nivel que otros lenguajes de alto nivel (bueno para microcontroladores)C soporta diversas arquitecturas de CC puede hacer prcticamente cualquier cosa que se pueda hacer en ensambladorC es ms rpido que ensamblador para programar

Estructura de un archivo .C

Estructura#include

#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;}}ComentarioDeclaracin de variableDeclaracin de constanteArchivo de encabezado

Funcin

6

Comentarios

ComentariosDos maneras de hacerlosBloque de comentario:

/* Esto es un comentario de dos lneas */

Comentario en una sola lnea:

//Comentario corto

Variables

VariablesUna variable es un nombre que representa una o ms 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;

miVariable

Variables - Ejemplo#include

#define PI 3.14

void main(){

intradio, area;//Calcular el rea del crculoradio = 12;area = PI * radio * radio;}

Tipo de datoDeclaracin de variables

Tipo de datoVariables en uso

VariablesLas variables son nombres para posiciones de memoria

int factor;char letra;float longitud;Memoria de datos (RAM)

VariablesLa declaracin consiste en un identificador nico (nombre)

int factor;char letra;

float longitud;Memoria de datos (RAM)

VariablesY un tipo de datoDetermina el tamaoDetermina como se interpreta el dato

int factor;

char letra;

float longitud;Memoria de datos (RAM)

Identificadores

IdentificadoresNombres dados a elementos tales comoVariablesFuncionesArreglosOtros elementos

IdentificadoresCaracteres vlidos en identificadores

Sensible a maysculas y minsculasSolo reconoce los primeros 31 caracteresIDENTIFICADORPrimer Caracter_ (guin bajo)A a la Za a la zCaracteres Restantes_ (guin bajo)A a la Za a la z0 al 9

Palabras reservadas

Palabras reservadas del ANSI C

Otros compiladores podran incorporar ms palabras reservadas

Tipos de datos

Tipos de datos fundamentalesTipoDescripcinbitscharCaracter simple8IntEntero16floatComa flotante32doubleComa flotante de doble precisin64

El tamao de un int vara de un compilador a otroMPLAB C30 int es de 16-bitsMPLAB C18 int es de 16-bitsCCS PCB, PCM & PCH int es de 8-bitsHi-Tech PICC int es de 16-bits

Calificadores de tipos de datoCalificadores: unsigned, signed, short y longCalificadorMinMaxBitsunsigned char0255 8char, signed char-1281278unsigned short int06553516short int, signed short int-327683276716unsigned int06553516int, signed int-327683276716unsigned long int0232 - 132long int, signed long int-23123132unsigned long long int0264 - 164long long int, signed long long int-23123164

Declaracin de variablestipo identificador1, , identificadorn;

Una variable debe ser declarada antes de poder ser usada.El compilador necesita saber cuanto espacio asignarle y como manejar sus valores.Ejemplosint x, y, z;float factor;char textounsigned int indice;

Declaracin de variablesLas variables se pueden declarar de varias maneras:SintaxisUna declaracin en una lnea tipo identificador;

Una declaracin en una lnea con valor inicialtipo identificador = ValorInicial;

Mltiples declaraciones del mismo tipo en una lneatipo identificador1, identificador2, identificador3;

Mltiples declaraciones del mismo tipo en una lnea 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 notacin camel case para las variables: primera palabra en minscula y todas las siguientes con la primera letra en mayscula.Ejemplo:unaVariable, estoEsUnNombreLargo, otroNombreAlternativo

VariablesAlgunas veces las variables (y otros elementos) son declarados en un archivo separado llamado archivo de encabezadoLos archivos de encabezado terminan con la extensin .hSe enlazan al programa principal por medio de la directiva #include

MiPrograma.hMiPrograma.c

Literales

Literal o constante literal: es un valor, como un nmero, caracter o cadena de caracteres, que puede ser asignado a una variable o una constante. Puede ser usado directamente como parmetro en una funcin u operando en una expresin.LiteralesSon valores codificados fijosPueden ser caracteres, nmeros o cadenasPueden ser representados en cualquier formato: decimal, hexadecimal, binario, carcter, etc.Siempre representan la misma cantidad (un 5 siempre representa la cantidad cinco)Constantes literales

Constante vs. LiteralCual es la diferencia?Los trminos se usan generalmente como intercambiables en la mayora de los lenguajes de programacinUn literal es una constante, pero una constante no es un literal#define MAXINT 32767const int MAXINT = 32767;Para el presente documento:Constantes son etiquetas que representan un literalLiterales son valores, que generalmente se asignan a constantes o variables simblicas.

29

Operadores

OperadoresDefinicin: una expresin aritmtica es una expresin que contiene uno o ms operandos y operadores aritmticosLos operandos pueden ser variables, constantes o funciones que retornan un valorGeneralmente se trata los registros de un C como variablesExisten 9 operadores aritmticos:Operadores binarios: +, -, *, /, %Operadores unarios: +, -, ++, --

OperadoresOperadorOperacinEjemploResultado*Multiplicacinx * yProducto de x por y/Divisinx / yCociente de x entre y%Modulox % yResiduo de x entre y+Sumax + ySuma de x ms y-Restax yResta de x menos y+(unario)Positivo+ xValor de x-(unario)Negativo-xValor opuesto de x

Conversiones implcitasEn algunas expresiones, el tipo de un operando ser temporalmente promovido al tipo ms grande de operando

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

Jerarqua de conversin implcita

El tipo ms pequeo es convertido al tipo ms grande en la expresin

Incremento y decrementoOperadorOperacinEjemploResultado++Incrementox++++xUsa x y luego incrementa por 1Incrementa x por 1 y luego lo usa--Decrementox----xUsa x y luego decrementa por 1Decrementa x por 1 y luego lo usa

Ejemplo con sufijox = 5;y = (x++) + 5;//y = 10//x = 6

Ejemplo con prefijox = 5;y = (++x) + 5;//y = 11//x = 6

35

Sentencias de asignacinDefinicin: una sentencia de asignacin es una sentencia que asigna un valor a una variableHay dos tipos de sentencias de asignacin:Asignacin simplevariable = expresin;La expresin se evala y luego se asigna a la variableAsignacin compuestavariable = variable operador expresin;La variable aparece de los dos lados del igual

Operadores de asignacin

OperadorOperacinEjemploResultado=Asignacinx = yAsigna a x el valor de y+=Asignacin compuestax += yx = x + y-=x -= yx = x y*=x *= yx = x * y/=x /= yx = x / y%=x %= yx = x % y&=x &= yx = x & y^=x ^= yx = x ^ y|=x |= yx = x | y> y

Operadores relacionales

OperadorOperacinEjemploResultado=Mayor o igual quex >= y1 si x es mayor o igual a y, sino 0==Igual ax == y1 si x es igual a y, sino 0!=Diferente dex != y1 si x es diferente de y, sino 0

Diferencia entre = y === es el operador de asignacinx = 5 //Asigna 5 a la variable x== es el operador relacional igual ax == 5 //REVISA si x es igual a 5

Operadores LgicosOperadorOperacinEjemploResultado&&AND Lgicox && y1 si x 0 y y 0, sino 0||OR Lgicox || y0 si si x = 0 y y = 0, sino 1!NOT Lgico!x1 si x =0, sino 0

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

Operadores Lgicos de bits

La operacin se lleva a cabo en cada bit del primer operando comparado al bit correspondiente del segundo operandoOperadorOperacinEjemploResultado (para cada bit en el dato)&AND (bits)x & y1, si hay un 1 en ambos x,y0, si hay un 0 en uno o ambos x,y||OR (bits)x | y1, si hay un 1 en x O y0, si hay un 0 en ambos x,y^XOR (bits)x ^ y1, si hay un 1 en x O y, pero no en los dos0, si hay un 0 1 en ambos x,y~NOT (bits)~x1, si hay 0 en x0, si hay 1 en x

Diferencias entre operadores lgicos & y &&

& es el operador AND entre bits0b1010 & 0b1101 = 0b1000&& es el operador Lgico AND 0b1010 && 0b1101 = 0b0001 (TRUE) && = 1 (TRUE)

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

Operador condicionalSintaxis:(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

ExpresionesRepresentan un solo dato (ej: caracter, nmero, etc)Puede consistir de:Entidad simple (una constante, variable, etc)Combinacin de entidades conectadas por operadores (+, -, +, /, etc)

Ejemplos de Expresionesa + bx = yvelocidad = dist / tiempoz = kc 5){if(banda == 2.0){if((frecuencia > 144) && (frecuencia < 148)){//Frecuencia adecuada!!}}}

Decisiones IF ELSE

IF - ELSESintaxis:if (expresin) sentencia1else sentencia2La expresin es evaluada por un valor booleano: Verdadero ( 0) Falso (= 0)Si expresin es verdadero se ejecuta la sentencia1, sino se ejecuta la sentencia2

IF ELSE - DiagramaSintxis:if (expresin) sentencia1else sentencia2

DecisionesIF else if

IF ELSE IFSintaxis:if (expresin1) sentencia1else if (expresin2) sentencia2else sentencia3La expresin1 es evaluada por un valor booleano: Verdadero ( 0) Falso (= 0)Si es verdadero se ejecuta sentencia 1Si es falso, se evala la expresin 2Si es verdadero se ejecuta la sentencia2Si es falso se ejecuta la sentencia3

IF ELSE - DiagramaSintaxis:if (expresion1) sentencia1else if (expresion2) sentencia2else sentencia3

Decisiones switch

SWITCHSintaxis:switch (expresion){case const-expr1: sentencia1case const-expr2: sentencia2default: sentencian+1}else sentencia2

expresion es evaluado contra cada valor de const-expr en cada caseLa sentencia en el case adecuado es la que se ejecutaSi ninguna condicin se cumple se ejecuta la sentencia en el default

SWITCH Diagrama (pre-definido)

Ntese 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 automticamente insertamos un break a cada bloque de cdigo dentro de las sentencias.Esto permite que se ejecute nicamente la porcin de cdigo 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(Estacin VHF); break;case 9..12:printf(Estacin VHF); break;case 3:case 8:case 13:printf(Seal Dbil); break;case 14..69: printf(Estacin UHF); break;default: printf(No hay seal 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 condicin de prueba, el ciclo continuar mientras esta condicin sea cierta (ej: i