Post on 02-May-2017
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