Está en la página 1de 50

NDICE DE LOS APUNTES DE C

Estos apuntes se encuentran estructurados en tres partes:


La primera parte trata sobre la programacin en lenguaje C de una manera
generalista.

La segunda parte trata sobre la programacin en C en el IDE (Integrated
development Enviroment) de arduino ms una parte de prcticas con un
shield creado para llegar a controlar una maqueta de un cruce regulado por
semforos y un tren que simula el funcionamiento de un montacargas.

La tercera parte de este manual trata sobre la programacin ms directa del
microcontrolador AVR que lleva arduino, de nuevo a travs del puerto serie,
pero por medio de plataformas de programacin distintas de la propia de
Arduino.



PARTE 1: PROGRAMACIN GENERALISTA EN C


1.1 PRIMEROS PASOS
1.1.1 ESTRUCTURA DE UN PROGRAMA
1.1.2 COMPONENTES DE UN PROGRAMA DE C. PRIMER PROGRAMA EN C
1.3 VARIABLES
1.3.1 TIPOS DE DATOS
1.3.2 DECLARACIN DE VARIABLES
1.3.3 ASIGNACIN DE VARIABLES
1.3.4 TIPOS DE CONVERSIONES
1.4 FUNCIONES
1.4.1 PASAR ARGUMENTOS A UNA FUNCIN
1.4.2 FUNCIONES PROTOTIPO
1.4.3 USANDO ARGUMENTOS DE FUNCIONES
1.4.4 USANDO FUNCIONES PARA DEVOLVER VALORES
1.5 OPERADORES DE C
1.5.1 OPERADORES ARITMETICOS
1.5.2 OPERADORES RELACIONALES
1.5.3 OPERADORES LGICOS
1.5.4 OPERADORES A NIVEL DE BITS
1.5.5 MEZCLANDO TODO
1.5.6 OPERADORES DE INCREMENTO O DECREMENTO
1.5.7 ORDEN DE PREFERENCIA DE LOS OPERADORES
1.6 SENTENCIAS DE CONTROL DE FLUJO
1.6.1 IF
1.6.2 SENTENCIAS IF-ELSE
1.6.3 BUCLE FOR
1.6.4 WHILE LOOP
1.6.5 DO-WHILE LOOP
1.6.6 PROGRAMAS DE CONTROL DE SENTENCIAS ANIDADOS
1.6.7 SENTENCIA CONTINUE
1.6.8 SENTENCIA SWITCH.
1.6.9 SENTENCIA NULL
1.6.10 SENTENCIA RETURN
1.7 PAUTAS Y RECOMENDACIONES PARA CUALQUIER TIPO DE LENGUAJE
BASADO EN C




PARTE 2: EL C DE ARDUINO


2.1 PRIMEROS PASOS CON ARDUINO: ESTRUCTURA DE UN PROGRAMA
2.1.1 VOID SETUP
2.1.2 VOID LOOP
2.1.3 FUNCIONES DE USUARIO
2.1.4 FUNCIONES DEL COMPILADOR
2.1.5 LLAVES
2.1.6 PUNTO Y COMA
2.2 VARIABLES
2.2.1 DECLARACIN DE UNA VARIABLE
2.2.2 AMBITO DE UNA VARIABLE
2.3 TIPOS DE DATOS
2.4 ARITMETICA
2.5 OPERADORES ARITMTICOS
2.6 OPERADORES COMPARATIVOS
2.7 ASIGNACIONES COMPUESTAS
2.8 OPERADORES BOOLEANOS DE COMPARATIVOS
2.9 CONSTANTES
2.10 SENTENCIAS DE CONTROL DE FLUJO
2.10.1 IF/ IF..ELSE: COMPARADORES
2.10.2 FOR: BUCLE CON CONTADOR
2.10.3 SWITCH CASE: COMPARADOR MULTIPLE
2.10.4 WHILE/DOWHILE
2.10.5 OTRAS SENTENCIAS RELACIONADAS CON EL CONTROL DE FLUJO
2.11 E/S DIGITAL
2.12 INTERRUPCIONES



PARTE 3: PROGRAMACIN AVR


3.1 INTRODUCCIN A LA PROGRAMACIN CON AVR
3.2 HERRAMIENTAS
3.2.1 PASO1: CREAR UN PROYECTO
3.2.2 PASO 2: ENTRAR UN PROGRAMA EN C
3.2.3 PASO 3: COMPILAR UN PROGRAMA EN C Y CREAR EL ARCHIVO.HEX.
3.2.4 PASO 4: DESCARGAR EL ARCHIVO HEX. AL MICROCONTROLADOR
3.3 ASPECTOS PRINCIPALES DE LA PROGRAMACIN EN C.
3.3.1 ESTRUCTURA DE UN PROGRAMA
3.3.2 VARIABLES GLOBALES
3.3.3 EFINICIONES Y MACROS:
3.3.4 RUTINAS DE INTERRUPCIN:
3.3.5 DECLARACIN DE FUNCIONES
3.3.6 CUERPO DEL PROGRAMA
3.3.7 DECLARACIN DE VARIABLES:
3.3.9 INICIALIZACIN DE REGISTROS:
3.3.10 HABILITACIN DE INTERRUPCIONES:
3.3.11 INICIALIZACIN DE FUNCIONES Y VARIABLES
3.4 INTRODUCCIN AL LENGUAJE EN C PARA EL COMPILADOR WINAVR
3.4.1 COMENTARIOS
3.4.2 SENTENCIAS
3.4.3 BLOQUES
3.5 TIPOS DE DATOS Y OPERADORES
3.6 CONTROL DE FLUJO
3.6.1 SENTENCIA CONDICIONAL IF-ELSE
3.6.2 SENTENCIA SWICHT CASE CONDICIONAL
3.6.3 SENTENCIA WHILE
3.6.4 SENTENCIA FOR
3.6.5 SENTENCIAS DO WHILE
3.6.6 OTRAS SENTENCIAS DE RELACIONADAS CON EL CONTROL DE FLUJO
3.7 FUNCIONES
3.8 ENTRADAS Y SALIDAS DIGITALES
3.8.1 ENTRADAS
3.8.2 SALIDAS
3.8.3 EJEMPLOS DE MANEJO DE ENTRADAS Y SALIDAS (I/O)
PARTE1:PROGRAMACINGENERALISTAENC

1.1.PRIMEROSPASOS
En este captulo exponemos aspectos fundamentales bsicos de la programacin en C de una manera
generalistaparaposteriormentehacermsfcillacomprensindelaprogramacinconArduinoyAvr
1.1.1ESTRUCTURADEUNPROGRAMA
DIRECTIVADEPREPROCESADOR
Directiva de preprocesador es un comando de Preprocesador de C (la cual se invoca en el
primer paso de compilacin del programa) las dos ms importantes directivas de preprocesador son la
directiva #define, la cual sustituye texto por un identificador especifico y la directiva #include, la
cualincluyetextodeunarchivoexternodentrodeunprograma.
DECLARACIN
Una declaracin establece nombres y atributos de variables, tambin establece las funciones
usadas en los programas. Las variables globales se declaran al principio del programa y las variables
localessedeclarandentrodelafuncinenlaqueseusan
DEFINICIN
Una definicin establece el contenido de una variable o funcin. Una definicin asigna el
espacionecesarioparalasvariablesyfunciones
EXPRESIN
Unaexpresinesunacombinacindeoperadoresyoperandosalasqueasignaunvalorsimple
SENTENCIA
Lassentenciascontrolanelflujouordendeejecucindelprograma
FUNCION
Es una coleccin de declaraciones, definiciones, expresiones y sentencias que se lleva a cabo
una tarea especfica. Las funciones vienen encerradas entre llaves. Las funciones no pueden ser
anidadas.
FUNCINMAIN
Todoslosprogramascontienenlafuncinmain,dondeseejecutaelprograma,lasllavesque
encierranlafuncinmainsonlasquedelimitandondeempiezayterminaelprograma.
1.1.2 COMPONENTESDEUNPROGRAMADEC.PRIMERPROGRAMAENC
Todos los programas contienen componentes esenciales como funciones y sentencias. Las
sentenciassonpartesdelprogramaquedesempeanoperacionesactualizadas.Todoslosprogramasde
C contienen una o ms funciones. Las funciones son subrutinas, cada una de las cuales, contienen
sentencias y se pueden llamar por otras partes del programa. Cuando escribimos un programa las
sangras,laslneasenblancoyloscomentariosloshacenmscomprensibles.Nosoloparaqueelautor
loscomprendapasadountiempo,sinoparaquepuedanserentendiblesporlosdems.
Ilustramos el programa tpico llamado hello world que se usa para comprobar que el
compilador, hardware y dems, funcionan correctamente, con este programa solo obtenemos una
salidaporpantallaHelloworld
# include <studio.h>
/*My 1st C programe*/
main void ()
{
printf(Hello world);
}
La sentencia #include <studio.h> le dice al compilador que incluya el cdigo fuente dentro del
programa desde el archivo <studio.h> El archivo studio es sinnimo de header file. Un header file
contieneinformacinacercadefuncionesestndarqueseusandentrodelprograma.Alarchivoheader
studio.hselellamaSTandarDInputsandOutputs.Contienemuchasfuncionesdeentradaysalida.Solo
es necesario en nuestro programa usar archivos include que pertenezcan a funciones de librerias
estndar
/*My1stCprograme*/EsuncomentarioenCtodosloscomentariossonprecedidospor/*yterminados
por*/loscomentariossoneliminadosporelcompiladoryademsnoafectanlavelocidadolongituddel
cdigocompilado
Todos los programas tienen una funcin principal llamada main() este es el punto de entrada del
programa.Todaslasfuncionestienenelmismoformato:
nombre_de_la_funcin ()
{
cdigo
}
Las sentencias dentro de una funcin se ejecutan secuencialmente, empezando con la que est ms
prximaalallaveabiertayterminandoporlamslejana.
Losparntesis{y}muestranelempieceyfinaldeunafuncin.
Finalmente la sentencia printf(Hello world); representa una sentencia tpica de programacin en C .
CasitodaslassentenciasenCterminanconpuntoycoma(;).Elcarcterdefindelneanoesreconocido
en lenguaje C. No hay restricciones en la posicin de las sentencias en una lnea ni en el nmero de
sentenciasporlnea.
Todas las lneas de cdigo tienen un punto y coma (;) al final para informar al compilador que ha
alcanzado el final de la sentencia. La no inclusin de esto nos dar un error en la siguiente lnea. La
excepcindeestoeselcomandoifdondeelpuntoycomadeberestarincluidoalfinaldelasiguiente
lnea.
MAIN()
Todoslosprogramastienenquetenerunafuncinmain,lacualpuedeaparecersolounavez.
Dentrodelosparntesisaldefinirlafuncinnosedebenponerparmetros.Comomainestclasificado
comofuncinelcdigodebedeirdentrodellaves:
main()
{
cdigo
}
#INCLUDE
El archivo header (denotado por la extensin .h) contiene informacin de las libreras tales
comolosargumentosquelasfuncionesaceptanocualesargumentosdevuelvelafuncin
Esta informacin es usada por el compilador para linkar todo el hardware especfico y fuente de
programasjuntos
#include<thisfile.h>
Deestamaneraestamosindicandoalpreprocesadorquemireenotrodirectorio
Probablemente notes que la directiva #include no tiene punto y coma al final, la razn es porque
#includenoesunapalabraclavedeC,peroenvezdeestoesunainstruccinparaelcompilador.
Eltododeelarchivoincludeesinsertarelarchivofuenteenlaetapadecompilacin
PRINTFFUNCIN
Printf es una funcin de librera estndar que esta dentro de la librera stuio.h, permite al
programadorhacersalidasporpantalla.Elformatogenerales:
printf(cadenadecontrol,listadeargumento);
Lacadenadecontrolesunacadenaconcomillasencadaextremo,dentrodeestacadenapodemosusar
una combinacin de letras, nmeros y smbolos. A los Smbolos especiales se les llama formato
especficosedenotanpor%Lacadenadecontroldebeestarsiemprepresenteenlafuncinprintf
La lista de argumento puede no estar presente en la funcin printf si no hay formato especfico en la
cadenadecontrol.Lalistadeargumentopuedeestarcompuestadevariablesoconstantes
Lossiguientesejemplosmuestransentenciasprintfusandovariablesyconstantes
printf(helloworld!)
printf(yosoy%d!,1);
El formato especifico %d depende del tipo de dato que se muestre. La siguiente tabla muestra el
formatoespecficoencyeltipodedatoqueafecta
Formatoespecifico Printf
%c SingleCarcter
%uc Unsignedcarcter
%s String
%d Signeddecimalinteger
%f Floating(debeincluircomadecimal)
%e Floatingpoint(cientficoonotacinexponencial)
%g Floatingpoint
%u Unsigneddecimalinteger
%x Unsigneddecimalinteger
%p Pointer
%o Unsignedoctalinterger
1 Prefijousadocon

NOTA:Un0(cero)cuandosigueaun%conunformatostringfuerzaaimprimircerosalaizquierda.El
nmerosiguienteespecificaelanchodelcampodeimpresin
printf(Elhexadecimalde12es%02x\n,12);
Seimprimira
Elhexadecimalde12es0C
VARIABLES
Unavariableesunalocalizacinespecficadememoria.Enestaporcindememoriasepueden
retener varios valores dependiendo de cmo est declarada la variable, En C todas las variables tienen
que ser declaradas antes de ser usadas. Una variable declarada le dice al compilador que tipo de
variable est siendo usada. Todas las declaraciones de variables son sentencias y por lo tanto deben
teneralfinalunpuntoycoma.
HaycincotiposdevariablesenC,char,int,float,double,void,elformatogenerales:
Tipo nombredelavariable;
Unejemplodedeclaracindevariableeschar,queelcompiladorentiendequeesunavariablesinsigno
enterade8bit
CONSTANTES
Unaconstanteesunvalorfijoquenopuedesercambiadoporelprograma,porejemplo25es
unaconstante,lasconstantesenterassonnmerossinningncomponentefraccionario,talescomo100
o-40,lasconstantesdepuntoflotanterequierencomadecimalseguidodelacomponentefraccional.
476,45esunaconstanteconcomaflotante,Loscaracteresconstantesseusanentrecomillastalescomo
Ao&
Cuandoelcompiladorencuentraunaconstanteentuprograma.Eldecidequtipode
constantees.Elcompilador,ajustapordefectoaltipodedatomspequeo,poreso15esunint64000
esununsignedy105020esunlong.Unaconstanteesdeclaradausandounasentencia#define
#define< etiqueta> valor
Etiquetadefineelnombrequetusarsentuprogramayvalor,elvalorquetuasignasa<etiqueta>
#define TRUE 1
#define pi 3,141592
Cpermitedefinirconstantesenformatohexadecimalyoctal.Enhexadecimallasconstantesestn
precedidasde0xcomoporejemplo0XF4
COMENTARIOS
Los comentarios son usados para dar significado y operacin al cdigo fuente. Todos los
comentariossonignoradosporelcompilador.Uncomentariopuedeseremplazadoacualquierpartede
unprogramadeCexceptoenmitaddeunapalabraclave.Loscomentariospuedenusarmuchaslneasy
podranserusadostambintemporalmenteenvezdelneasdecdigo.
Loscomentariostienendostiposdeformatoselprimeroes
/*comentarios*/
yelsegundoes
//comentarios
FUNCIONES
LasfuncionessonlosbloquesmsbsicosdeconstruccindeunprogramaenC.Todoslos
programasenCcontienenalmenosunafuncinqueserlafuncinmain(),muchosdelos
programasquetuescribirsenCcontendrmsdeunafuncin.ElformatodeunprogramaenCcon
muchasfuncioneses:
main()
{
cdigo
}

funcion1()
{
cdigo
}

funcion2()
{
cdigo
}
Main es la primera funcin llamada cuando el programa se est ejecutando. Las dems funciones
funcion1yfuncion2sernllamadasporalgunafuncindentrodelprograma
Tradicionalmentemain()noesllamadaporotrafuncin
PALABRASCLAVEOPALABRASRESERVADAS
El cdigo ANSI C consta de 32 caracteres para usar en lenguaje C. ciertas palabras estn
reservadasparaelusodelcompiladorparadefinirlostiposdedatooparausarenbucles
CiertoscompiladoresdeCtienenreservadaspalabrasparahacerlaprogramacinmsfcileintuitiva:
Acontinuacindamosunalistadeestaspalabrasclave
auto
break
case
char
cosnt
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while

Pasamosaentrarmsendetalledecadaunodelosapartadosquesevieronanteriormente.

1.3. VARIABLES
Uno de los principales aspectos de C es como se almacenan los datos. En este captulo
examinaremosmsestrechamentecomosealmacenanlosdatos.
1.3.1 TIPOSDEDATOS
EnCexisten5tiposdedatosycuatromodificadores.
Tipo Significado Palabraclave
Carcter caracteres char
integer Nmerosenterosconsigno int
Float Nmerosencomaflotante float
double Nmeroscondobleprecisinen
comaflotante
double
Void Vacio Void
Signed Positivoonegativo signed
Unsigned Solamentepositivo unsigned
Long Dobledelalongituddeun
nmero
long
short Mitaddelalongituddeun
nmero
short

Cada uno de los tipos de datos representan unos particulares rangos de nmeros, los cuales
puedencambiardependiendodelosmodificadoresqueusemos.Lasiguientetablamuestralosposibles
rangodevaloresparatodaslaposiblescombinacionesdetiposdedatosymodificadores
Tipodevariable Nmerodebits rango
Bit 1 0a1
Char 8 -128a127
Unsignedchar 8 0a255
Signedchar 8 -128a127
Int 16 -32768a32767
Unsignedint 16 0a65535
Shortint 16 -32768a32767
Unsignedshortint 16 0a65535
Longint 32 -2147483648a2147483647
Unsignedlongint 32 0a4244967295
Float 32 3,410
-38
a3,410
38

Doubl 64 1,710
-308
a1,710
308

Longdoubl 80 3,410
-4932
a3,410
4932

1.3.2 DECLARACINDEVARIABLES
Lasvariablespuedenserdeclaradasdedosformasbsicas.Enunafuncinofueradetodaslas
funciones. Se llaman locales o globales respectivamente. Las variables son declaradas con la siguiente
nomenclatura.
tipo nombre_de_la_variable;
donde tipo es alguno de los tipos de datos del lenguaje C y nombre_de_la_variable es el nombre de la
variable.
Lasvariableslocalessolopuedenserusadasporlassentenciasdelasfuncionesdondefuerondeclaradas
Nosepuedeaccederalvalordelasvariableslocalesporfuncionesdondenofuerondeclaradas.Loms
importante que debes de saber sobre las variables locales es que son declaradas a la entrada de la
funcinydestruidascuandosesaledeella
Se acepta que las variables locales puedan ser usadas en diferentes funciones con el mismo nombre.
Ejemplodeprograma
#include <stuido.h>
void f2 (void){
int contador;
for(contador=0; contador<10;contador++){
printf(%d \n, count);
}

f1()
int count
for(contador=0; contador<10;contador++)
f2()
main(){
int count
f1();
return 0;
}

Esteprogramasacaporpantallalosnmerosdel0al9endiezveces.Elmododeoperacindel
programanoesafectadoporlavariablecontadorqueoperaendosfuncionesalavez.
Porotroladolasvariablesglobalespuedenserusadasenvariasfunciones.Lasvariablesglobalesdeben
serdeclaradasantesdelasfuncionesquelasusan.Lasvariablesglobalesnosedestruyenhastaqueno
haterminadolaejecucindelprograma
1.3.3 ASIGNACINDEVARIABLES
Hastaahorasolohemosdiscutidodecmodeclararunavariableenunprograma,nodecmo
asignarleunvalor.Asignarleunvaloraunavariableessimple:
tipo nombre_de_la_variable=valor;
Una asignacin de variable es una sentencia debemos incluir el punto y coma al final. Un ejemplo de
asignacindevaloraunavariableenteraes.
count= 100;
el valor 100 es llamado constante. En C existen muchos tipos de constantes. Un carcter constante
siempre esta entre comillas como podra ser M Los nmeros enteros se utilizan cuando asignamos
valoresavariablesint.Losnmerosencomaflotantesseusanparaalmacenarvaloresdenmeroscon
comadecimal.Porejemplodecimossiqueremosalmacenar100encomoflotante,tenemosqueescribir
100.00
Enunavariablesepuedealmacenarelvalordeotravariable,elsiguienteprogramamuestraunejemplo
deesteasignacin.
main()
{
int i=0;
int j=1;
j=i;
}
1.3.4 TIPOSDECONVERSIONES
EllenguajeCtepermitemezclardiferentestiposdedatosenunaexpresin,comoporejemploel
siguientefragmentodecdigo:
char ch= 0;
int i=15;
float f=25.6;
resultado doble=ch*i/f
Lamezcladetiposdedatosesgobernadaporunaestrictaconfiguracindereglasdeconversinquele
dicenalcompiladorcomoresolverlasdiferencias.Laprimerapartedelasreglasdeconfiguracinesel
tipodepresentacin
Envezdepermitiralcompiladorquehagaestostiposdeconversin,tpuedesespecificareltipode
conversinusandoelsiguienteformato
(tipo)valor;
Estocausauncambiotemporalenlasvariables.tipoesuntipodevariablevalidoparaCcomochar,
int,etcyvaloreslavariableoconstantequequieresermodificada.
Ejemplo
main()
{
float f
printf(%d,int(f))
}

1.4. FUNCIONES
LasfuncionessonlosbloquesmsbsicosdelaprogramacinenC.Todaslassentenciasdeben
irdentrodeunafuncin.Enestecapitulodiscutiremoscomopasarargumentosaunafuncinycomo
recibirargumentosdeunafuncin.
1.4.1 PASARARGUMENTOSAUNAFUNCIN
Vamosavercomodeclarareinvocarafuncionesenunprogramaporejemplo:
main(){
f1()
}
f1(){
return1
}
Enrealidadesteprogramaproduceunerrorocomopocounwarning.Enrealidadlafuncinf1debeser
declaradaantesdeserusada,aligualquelasvariables.SituquieresusarunafuncinestandartdeC,
debesincluirunarchivoheaderalprincipiodelprograma.Siestasusandounadetusfunciones,tendrs
dosmanerasdecorregirelerror;unaesusarfuncionesprototipocomoveremosdespusyotraes
reorganizartuprogramaas:
f1(){
return1
}

main(){
f1()
}
Nosegenerarerrorporquelafuncinestdefinidaantesqueelmain
1.4.2 FUNCIONESPROTOTIPO
Hay dos mtodos para informar al compilador del el tipo de dato que quieres que devuelva la
funcin,unoes:
tipo nombre_funcion;
Por ejemplo la funcin int suma le dice al compilador que el tipo de dato que devuelve es un entero.
Otramaneradeindicaralcompiladorquetipodedatoquieroquedevuelva,eslafuncinprototipo.Una
funcin prototipo no solo nos da el dato, sino tambin los nmeros y tipos de argumentos que la
funcinacepta.Elprototipodebecoincidirconladeclaracindelafuncin.
Elformatogeneraldelafuncinprototipoeselsiguiente:
tiponombre_funcion(tipovariable1,tipovariable2,tipovariable3)
Enelejemploanteriorcadavariablepuedeserdeuntipo.
Enelsiguienteejemploelprogramacalculaancholargoyalto
#include <studio.h>
int volumen(int s1, int s2, int s3)

void main()
{
int vol;
vol=volumen(7, 5, 12);
printf(volumen: %d\n,vol);
}
int volumen(intS1, int S2, intS3)
{
return s1*s2*s3;
}
Notaquereturnusaunaexpresinenvezdeunavariableounaconstante.Hastaahora,conprogramas
pequeos,lasfuncionesprototiponosonmuyimportantes,siembargoamedidaquelosprogramasse
vayanhaciendomsgrandes,lasfuncionesprototiposerntilesalahoradedepurarerrores.
Una excepcin es cuando una funcin no tiene ningn parmetro de entrada o de salida entonces se
dicequeesunafuncinnothingvoid:void,
Unejemplodeestopodraser:
#include <studio.h>
double pi (void)//defines la funcin
{
return 3,1415926536// con pi devuelves.
}
main()
{
double pi _val;
pi_val=pi;
printf( %d\n,pi_val);
}
1.4.3 USANDOARGUMENTOSDEFUNCIONES
Una argumento de function es un valor que pasa a la funcin cuando la funcin lo llama.C
permite argumentos desde 0 a cualquier valor. El nmero de argumentos que puedan pasar a una
funcin depende del compilador. pero el ANSCIC standart especifica que una funcin puede aceptar
hasta31.
Cuando definimos una funcin declaramos variables especiales que podran recibir un valor, estas
variables son declaradas como parmetros formales, los parmetros son declarados entre parntesis
seguido del nombre de la funcin. Por ejemplo la siguiente funcin calcula e imprime la suma de dos
nmerosenterosquesonenviadosalafuncincuandoestaesllamadas.
sum (int a, int b);
printf(%d\n, a+b);
Unejemplodecomolafuncinpodraserllamadaenesteprogramaes
#include<studio.h>
void sum(int, int)
main
{
sum(1,10);
sum(15,6);
sum(100, 25)
}
void sum (int a, int b){
printf(%d\n, a+b);
}
Cuandosumesllamado,elcompiladorcopiardentrodecadaargumentoelvalordeayb.Es
importanterecordarquelosvalorespasadosalafuncinselesllamanargumentosylasvariablesayb
sonlosllamadosparmetrosformales
1.4.4 USANDOFUNCIONESPARADEVOLVERVALORES
AlgunasfuncionesenCpuedendevolvervaloresenlasrutinasdellamadaaesafuncin.Las
funcionesquedevuelvenvaloressesuelenescribirdelasiguientemanera
tipo nombre_funcion(parmetros formales)
{
//sentencias
return valor;
}
Tipoeseltipodededatodelvalorquedevuelvelafuncinreturnvalor.Unafuncinpuededevolver
cualquiertipodedatoexceptounarray.Sinoseespecificaningntipodedatolafuncindevuelveun
enteroint.Ejemplodefuncinquedevuelveunvalor.
#include <studio.h>
#include<math.h
main() {
double resultado;
resultado=sqrt(16.0);
printf(%f\n,resultado);
}
Este programa llama a la funcin sqrt que devuelve un resultado en coma flotante. Este nmero es
asignadoalavariableresultado.Incluimoselheadermath.hquetienelainformacinparaelcompilador
delafuncinsqurt().
Esimportantequepongaselmismotipodedatoparalavariablealacuallafuncinasignaundatoyel
valorquesedevuelve.Lomismoocurreparalosargumentosqueenvasaunafuncin.
Elformatogeneralparadevolvervaloresdesdeunafuncines
return nombre_variable;
dondenombre_variableesunaconstante,variableoalgunaexpresinquetengalosmismostipos
dedatosqueelvalordevuelto.
Elsiguienteejemplomuestraambostiposdefunciones
main() {
int num;
num= func();
printf(%d\n,num);
}
func() {
return6;
}
sum(int a, int b) {
int result;
result=a+b;
return result;
}
Cuandoelcompiladorseencuentraunasentenciareturnelvaloresenviadoinmediatamentealarutina
dellamada,lassentenciasdespusdelreturnnosernejecutadas.lasentenciareturnnoseutilizapara
asignardatosavariablesoparaserusadaenunaexpresin.

1.5 OPERADORESDEC
EnellenguajeClasexpresionesjueganunpapelimportante.LaprimeraraznesqueCdefine
muchos ms operadores que otros leguajes. Una expresin es una combinacin de operadores y
operando. En muchos casos los operadores de C siguen las reglas del algebray pueden parecernos
familiares.
1.5.1 OPERADORESARITMETICOS
EnellenguajeCsedistinguen5tiposdeoperadoresaritmticosoperacionesdeadiccin
substraccin,multiplicacindivisinymdulo.
Signo Nombre Ejemplo Definicin
= Asignacin Y=X PoneenYelvalor
deX
+ Suma X+Y SumaelvalordeX
masY
- resta X-Y RestaelvalordeXa
Y
* Multiplicacin X*Y MultiplicaXporY
/ Divisin X/Y DivideXentreY
% Mdulo X%Y Nosdaelrestodela
divisindeXentreY

Los operadores +,-,*y /se pueden usar con cualquier tipo de dato, el mdulo solo se puede usar con
enteros.Eloperadormodulo%nosdaelrestodeunadivisinentera
El operador puede usarse de dos maneras la primera como operacin de sustraccin y la segunda
comoelopuestodeunnmero.Porejemplo
a=a-b//operacindesustraccin
a=-a//opuestodeuna
Los operadores aritmticos pueden ser utilizados con una combinacin de variables constantes. Por
ejemplo
result=count-163;
En el lenguaje C tambin pueden usarse algunos tipos de formas abreviadas, por ejemplo a=a-b es lo
mismoquea-=b,estemismomtodopuedeusarsecon+,*,y/
a=a+b a+=b
a=a-b a-=b
a=a/b a/=b
a=a*b a*=b
a=a%b a%=b
a=a<<b a<<=b
a=a>>b a>>=b
a=a&b a&=b
a=a|b a|=b
a=a^b a^=b

1.5.2. OPERADORESRELACIONALES
LosoperadoresrelacionalesenCcomparandosoperadoresydevuelvenunvalorfalsoo
verdaderobasadoenlacomparacin.Losoperadoresrelacionalesson:
Operador Nombre Ejemplo Definicin
== asigncin X==Y VerdaderosiXes
igualaY
= Noesiguala X=Y VerdaderosiXes
distintoqueY
< Menorque X<Y VerdaderosiXes
menorqueY
> Mayorque X>Y VerdaderosiXes
mayorqueY
<= Menoroigualque X<=Y VerdaderosiXes
menoroigualqY
>= Mayoroigualque X>=Y VerdaderosiXmayor
oigualqueY

Losresultadosdecualquieroperacinderelacinsiempreser01.Cdefinecomoverdaderocualquier
valorquenosea0ycomofalsoal0.
Ejemplos:
var>15//sivaresmenoroigualque15elresultadoes0(falso)
var!=15//sivaresmenoromayorque15elresultadoes1(verdadero)
1.5.3. OPERADORESLGICOS
LosoperadoreslgicossonlosoperadoreslgicosbsicoAND,ORyNOT,denuevoestos
operadoresdevuelvenun0paraloscasosfalsosyun1paralosverdaderos,latabladeverdadparaeste
tipodeoperadoreses:
AND OR NOT
P Q P&&Q P||Q !P
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

Losoperadoreslgicosyrelacionalesestnfuertementerelacionadosentrescuandoevaluamosuna
expresin
count>max ||!(max==57)&& var>=0
Estetipoderelacioneslasestudiaremosjuntoconlassentenciasdecontroldeflujo.
1.5.4. OPERADORESANIVELDEBITS
Ccontieneseisoperacionesquerealizanoperacionesbitabitennmeros.Estosoperadoresa
nivel de bit solo se pueden usar con los tipos de datos enteros y caracteres. Los operadores a nivel de
bitsson:
& ANDaniveldebit
| ORaniveldebit
^ XORaniveldebit
~ opuesto
>> Desplazamientodebitaladerecha
<< Desplazamientodebitalaizquierda

Elformatogeneralparautilizardesplazamientosdebites:
variable>>expresin
variable<<expresin
Elvalordeexpresinindicacuantoslugaresaladerechaoalaizquierdasedesplazalavariable
Cadadesplazamientoalaizquierdaprovocaquetodoslosbitssedesplacenunlugarhacialaizquierday
seinserteunceroenelladoderecho.Elbitqueesdesplazadoalaizquierda,sepierde.
Hayquesealarqueelusodeoperadoresdedesplazamientohacialaizquierdaqueundesplazamiento
a la izquierda equivale a multiplicar el nmero por dos y un desplazamiento a la derecha equivale a
dividirelnmeropordos
Unejemplodeoperadoresaniveldebitson:

1.5.5. MEZCLANDOTODO
sum=a+b++

sum=a+b
b=b+1
sum=a+b-- sum=a+b
b=b-1
sum=a+++b b=b+1
sum=a+b
sum=a+--b b=b-1
sum=a+b

1.5.6 OPERADORESDEINCREMENTOODECREMENTO
Como puedes incrementar o decrementar una vez una variable? Probablemente una de estas
sentenciastevengaalacabeza,a=a+1b=b+1
LosqueinventaronChicieronunanotacinreducidaparahaceresto
a++o++aparaincrementos
b--o--bparadecrementos
1.5.7. ORDENDEPREFERENCIADELOSOPERADORES
Cuando hablamos de precedencia nos referimos al orden en el que los operadores son
procesados por el compilador. Por ejemplo si nos encontramos la operacin a+b*c que operacin
ocurrir primero. Suma o multiplicacin? El lenguaje C respeta la precedencia de cada operador. la
siguientetablamuestraelorendeprecedenciadesdeelmsaltoalmsbajo

Algunosdeestosprogramasnosehancomentadoan.Algunosdeelloslosernmsadelante.

1.6. SENTENCIASDECONTROLDEFLUJO
Enestecaptulovamosaverlassentenciasdeflujoparaelcontroldeunprograma.
Mostraremostambincmoseusanlosaperadoresrelacionalesylgicosenestassentenciasdecontrol
deflujo.
1.6.1 IF
lasentenciaifesunasentenciacondicional.elbloquedecdigoasociadoalasentenciaifes
ejecutadobasndoseenelresultadodeunacondicin.denuevocualquiervalorquenoseaceroes
verdadycualquiervalorqueseaceroesfalso.Elformatomssimplees
if(expresin)
sentencia;
La expresin puede ser cualquier expresin valida de C. La sentencia if evalua el resultado de la
expresinsegnseaverdaderoofalso.Sielvaloresverdaderolasentenciaesejecuatada,mientrasque
siesfalso,elprogramacontinasinejecutarlasentencia.Unejemplosimpledeestoes.
if(num>0)
printf(el nmero es positivo\n);
Esteejemplomuestracomoseusanoperadoresrelacionalesensentenciasdecontroldeflujo.
Lasentenciaiftambinpuedeusarseconunbloquedesentencias.comoelsiguienteejemplo:
if(expresin)
{
sentencia
}
loscorchetes{}seutilizanparaenglobartodounbloquedecdigo.Silaexpresinesverdaderase
ejecutatodoelcdigoentrecorchetes
Losoperadoresdecomparacinqueseusanensentencias ifson:

1.6.2. SENTENCIASIF-ELSE
Se utilizar una estructura IF ELSE Cuando tienes dos bloques de cdigo que se basan en una
salida de una expresin. Si la expresin es verdad se ejecutar la primera parte de, pero si es falsa se
ejecutarlasegunda.ElformatoprincipaldeunasentenciaIFELSEes:
if(expresin)
sentencia1;
else
sentencia2;

ElformatogeneraldeIFELSEqueusamsdeunalneadecdigoes:
if(expresin) {
sentencia
}
else {
sentencia
}
Nota: Las sentencia if o else pueden tener todas las sentencias que necesites Los corchetes se
puedenomitircuandosolotenemosunasentenciaparaif oparaelse
El lenguaje C tiene un mtodo para combinar varias estructuras if else para tomar varias decisiones. el
formatogenerales
if(expresin) {
sentencia
}
elseif(expresin){
sentencia
}
elseif(expresin){
sentencia
}
else {
sentencia
}

if(num==1) {
printf(tienes un 1\n);
}
elseif(num==2) {
printf(tienes un 2\n);
}
elseif(num==3) {
printf(tienes un 3\n);
}
else {
printf(no tienes nada\n);
}
1.6.3. BUCLEFOR
Elbucle foresunadelastressentenciasqueseutilizanenCsitutienesunasentenciaouna
configuracindesentenciasquequieresrepetir,conunbucle forsepuedeimplementarestetipode
estructuras.Elformatodelbuclefores:
for(inicializacin :condicin:incremento)
En la seccin de inicializacin se utiliza para darle un valor inicial al contador del bucle. La variable del
contadortienequeserdeclaradaantesdequeelbuclefor lause..Enestaseccinelbucle fores
solo ejecutado una vez. La condicin es evaluada antes de cada ejecucin del bucle. Normalmente en
estaseccinseevala,lavariabledelbuclecontadorparaversiesfalsooverdadera.Silacondicines
verdad el bucle es ejecutado. Si la condicin es falsa se sale del bucle y el programa continua su
ejecucin.Enlaseccindeincrementodelbuclefornormalmenteseincrementalavariabledelbucle
contador.
Esteesunejemplodeunbuclefor
#include<studio.h>
void main (void) {
int i;
for(i=0; i<10; i++)
printf(%d,i);
printf(hecho);
}
Este programa imprime nmeros del 0 al 9 en la pantalla. El programa trabaja as. Primero
inicializamosacerolavariableelcontador,i,acontinuacinseevalalaexpresini<10silasentenciaes
verdadera se ejecuta la sentencia printf(%d,i); despus de haber ejecutado cada vez la sentencia
printf(%d,i);seincrementalavariabledelbuclecontador.Esteprocesocompletocontinuahastaque
la expresin i<10 llega a ser falsa. En este punto se sale del bucle for y la sentencia printf(hecho); se
ejecuta.
Como ya se ha indicado al principio de cada iteracin se comprueba la condicin, por lo tanto si la
condicinesfalsaalempezarelbuclefor noseejecutarnunca.
1.6.4. WHILELOOP
OtrosdelosbuclesdeCeselbucleWhile.Mientrasunaexpresinesverdadera,elbucle
whilerepiteunasentenciaobloquedecdigo.deahvieneelnombrewhile.Esteeselformato
general.
while(expresin) sentencias;
OR
while(expresin) {
sentencias;
}
Expresinescualquierexpresinvalidaenc.Elvalorexpresinescomprobadoencadaiteracindela
sentenciaodelbloquedecontrol.Estosignificaquesilaexpresinesfalsalassentenciasobloquede
cdigonoseejecutan.Aqutenemosunejemplodebuclewhile
#include<studio.h>
#include<conio.h>
void main (void) {
char ch
printf(dame una q\n);
ch=getche();
while(ch!=q)
ch=getche();
printf(consigue una q!\n);
}
Tedarscuentaquelaprimerasentenciatepideuncarcterporelteclado.Entoncesseevalala
expresin.Siemprequeelvalordelavariablechnoseaunaq.Elprogramacontinuarhastaque
obtengaotrocarcterporelteclado.Unavezqueseintroduceunaqatravsdelteclado,seejecutara
lasentenciaprintf()yelprogramaterminar
1.6.5.DO-WHILELOOP
Elultimobucleeneselbucledo.Aqutenemosunacombinacindedoywhile.Elformato
generales:
do {
sentencias
}
while(expresin)
Enestecasolassentenciassonsiempreejecutadasantesquelaexpresinseaevaluada.Expresin
puedesercualquierexpresinvalidaenC
Mostramosunejemplodeunbucledo-while
#include<studio.h>
#include<conio.h>
void main(void) {
char ch;
do {
ch=getche();
while(ch !=q)
printf(dame una q\n);
}
}
1.6.6. PROGRAMASDECONTROLDESENTENCIASANIDADOS
Cuando dentro del cuerpo de un bucle tenemos otro bucle. Se dice que el segundo bucle esta anidado
dentro del primer bucle. El estndar ANSI de C especifica que los compiladores pueden tener hasta 15
niveles de anidamiento. Adems muchos compiladores tienen virtualmente niveles ilimitados de
anidamiento.Unejemplodeanidamientodeunbucleforpodrasereste:
i=0;
while(i<10) {
for(j=0;j<10;j++)
printf(%d,i*10+j);
i++;
}
Estecdigoimprimeporpantallalosnmerosdel0099enpantalla.
1.6.7. SENTENCIABREAK
Lasentenciabreakpermitesalirdecualquierbucledesdeunpuntodeterminadodelprograma.
Lasentenciabreakhaceunbypassenlaejecucinnormaldelprograma.Cuandoelprogramaencuentra
lasentenciabreakhaceunsaltoalasiguientesentenciadespusdelloop.
Porejemplo:
#include <studio.h>
void main(void) {
for(i=0;i<50;i++) {
printf(%d,i);
if(i==15)break;
}
}
Esteprogramaimprimirporpantallalosnmerosdel0al15enlapantalla.LasentenciaCtrabajacon
todoslosbuclesdeC.
1.6.7. SENTENCIACONTINUE
Seasumequecuandosecumpleunaciertacondicinelunbucle.Tupuedessaltaralfinaldel
buclesinsalirdel.Paraello,Cestaprovistodeunasentenciacontinue.Cuandoelprogramaencuentra
estasentenciasaltartodaslassentenciasentrecontinueyellacondicindelbucle.Porejemplo:
#include<studio.h>
void main(void) {
int i;
for(i=0;i<100;i++) {
continue;
printf(%d,i);
}
}
Estebuclejamsejecutaelprintf().Cadavezqueelcontinueesactivado,elprogramasaltaelprintf()y
evalalaexpresini<100.
Uncontinuecausarqueelprogramavayadirectamentealacondicinenlosbuclesfor, while y
do while. En un bucle for, un continue provocar que se produzca el incremento y que la
condicindeltestseaevaluada
1.6.8. SENTENCIASWITCH.
Lasentenciaif esbuenaparausarunpardealternativas,peropuedellegaraserengorroso
cuandoexistenvariasalternativas.ParaelloellenguajeCponeadisposicinunasentenciaswitch.
Unasentenciaswitchesequivalenteamultiplesif else.Laformageneraldeunswitch case
es:
switch(variable) {
case costante1:
sentencias;
break;
case constante2:
sentencias;
break;
case constantan:
sentencias;
break;
default:
sentencias;
}
La variable es comprobada sucesivamente en una lista de constantes enteras o caracteres. cuando se
encuentra, se ejecuta el cuerpo de sentencias asociadas con la constante hasta que el programa se
encuentra el break, si no se encuentra la constante en la lista. se ejecuta las sentencias asociadas a
default.Eldefaultesopcional.Unejemplodeswitches
#include<studio.h>
#include<conio.h>
main() {
char ch
for(;;) {
ch=getch();
if(ch==x)
return0;
switch(ch) {
casse0:
printf(Lunes/n);
break;
case1:
printf(Martes\n);
break;
case2:
printf(Miercoles\n);
break;
case3:
printf(Jueves\n);
break;
case4:
printf(Viernes\n);
break;
case5:
printf(Sabado\n);
break;
case6:
printf(Domingo\n);
break;
default
printf(Entrada no valida\n);
}
}
}
Este ejemplo lee nmeros entre el 1 y el 7. Si el nmero esta fuera de este rango se imprimir el el
mensajeentradanovalida.Losvaloresdentrodeesterangoseconvertirnendasdelasemana
El estndar ANSI afirma que un compilador de C puede soportar hasta 257 sentencias case. No puede
haber dos sentencias case con el mismo valor en el mismo switch. Tambin los switches se pueden
anidarsiempreycuandolosswichtesinterioresyexterioresnotenganconflictosconlosvaloresdelas
variables.Porejemplo
switch(a) {
case1:
switch(b) {
case0:
printf(b is falso);
break;
case1:
printf(b es verdad);
break;
}
break:
case2:
.
.

1.6.9. SENTENCIANULL
Lasentencianullesunasentenciaquesolocontieneunpuntoycoma(;).nullpuedeaparecer
cuandoseesperaununasentencia.Noocurrenadacuandoseejecutaunasentencianull
Lassentenciastalescomodo, for, if y whileexigenqueaparezcaunasentenciaenelcuerpo
desentencias.Lasentencianullesmuytilparaestoscasos.Porejemplo:
for(i=0; i<10:line[+++]=0);
En este ejemplo la expresin de incremento para el bucle line[+++]=0 inicializa los 10 primeros
elementosdelalneaa0.Elcuerpodesentenciasesunnull yaquenoserequiereningncomando
ms
1.6.10. SENTENCIARETURN
La sentencia return termina la ejecucin de una funcin y devuelve el control del programa a la
rutinadellamada.Unvalorpuedeserdevueltoalarutinadellamamientosiserequiereperosiunoes
omitidoelvalordevueltoesindefinido.sinoseincluyelasentenciareturn enlafuncindellamada
el control del programa es devuelto a la rutina de llamada cuando se termina la ejecucin de la ltima
lnea de cdigo Si no se requiere un valor de devolucin, declaramos la funcin para que nos devuelva
unvalortipovoid
GetValue(c)
int c;
{
c++;
return c;
}

void GetNothing(c)
int c;
{
c++;
return c;
}

void GetNothing(c)
int c;
{
c++;
return;
}

main()
{
int x;
x=GetValue();
GetNothing();
}

1.7. PAUTASYRECOMENDACIONESPARACUALQUIERTIPODELENGUAJEBASADOENC
Vamosacomenzardandounaseriedepautasyrecomendacionesparaprogramarcualquier
tipodelenguajebasadoenc
Enprimerlugarvamosaexponeralgunosformalismosinteresantesybsicosparalaprogramacinde
cualquierlenguajebasadoenC
NOMBRESqueencajenconsufuncin
Esrecomendableusarnombresapropiadosquerepresentenloquevahacerdentrodelprograma.Se
sueleusarnombrescompuestosparahacerelcdigomslegible
Porejemplo:
DetectorInterioresesmsfcilqueDETECTORINTERIORES
LLAVES
Lasllavesseusanparadelimitarlassentenciasdentrodeunsentenciasdecontroldeflujo,comoelque
sigue.
if (condicin){
//sentencias
}
Otambinsepuedeusar
if (condicin) {
//sentencias
}
TABULACIONESYSANGA
Usalassangrasparamostrarunaestructuralgicadelprograma.
LONGITUDDELINEA
Mantnlaconfiguracindelneaen78caracteresparaqueseancompatiblesconmonitorese
impresoras
FORMATOELSEIF
Usaelformatoelseifparacubrirmascondiciones
if(condicin1) {
//sentencias
}
elseif(condicin2) {
//sentencias2, si no se da condicin1 y si se da condicin2
}
else
//sentencias3 si no se dan condicin1 ni condicion2
FORMATODECONDICIONES
Cuandoelcompiladorlopermitaponelvalordelaconstantealaizquierdadelacomparacinde
igualdad/desigualdad.Porejemplo
If(6== ErrorNum)
INICIALIZATODASLASVARIABLES
Inicializatodaslasvariablesaunvalorconocido.Paraevitarquesehaganflotantesoaleatorias
COMENTARIOS
Loscomentariossonlaotrapartedelahistoriaqueestasescribiendo.Sirvenpararecordar
dentrodeuntiempocomofuncionaelprogramaquehasescrito.Usacomentariosparamarcarreas
decdigoqueseterminarndespus,erroresdepuradosofuturasmejoras

PARTE2:ELCDEARDUINO
2.1 PRIMEROSPASOSCONARDUINO:ESTRUCTURADEUNPROGRAMA
vamos a proceder a compleLar la lnformacln anLerlor y a llusLrar con programas basados en luL
(lnLegraLed developmenL LnvlromenL) de Ardulno
Ln programacln en el enLorno de Ardulno exlsLe una esLrucLura claramenLe dlferenclada denLro de
cada programa. LsLa esLrucLura dlvlde a cada programa en dos funclones, que veremos a
conLlnuacln, void setup y void loop.
AnLes del vold seLup se pueden deflnlr consLanLes que las uLlllzaremos para dar nombres a los plnes que
usemos como enLradas/salldas. 1amblen se deflnen y se lnlclallzan varlables las cuales camblarn su
valor a lo largo de la e[ecucln del programa
Las dos barras // slrven para lnserLar llneas comenLarlos denLro del programa.
vamos a lnLenLar reallzar un programa bslco que sea encender y apagar un led para ello creamos un
pseudocdlgo:
//Aqu podemos definir variables y constantes
Void setup(){
//definimos los pines como entradas o salidas
}
Void main(){
//apagamos y encendemos el led mediante funciones
}
osLerlormenLe reLomaremos esLe e[emplo para compleLarlo
2.1.1 vClu SL1u.
Ln esLa parLe de la esLrucLura, el cdlgo que se lnserLe aqul solo ser e[ecuLado una vez al
lnlclallzar el programa. Slrve para lnlclallzar varlables, conflgurar los plnes como enLrada o sallda, llamar
a llbrerlas
void setup() {
pinMode(pin13, OUTPUT);//configure el pinX como salidas
}

2.1.2 vClu LCC.
Ll vold loop es la parLe del programa que como su nombre lndlca es un bucle lnflnlLo, lo
uLlllzamos para escrlblr el cuerpo del programa: senLenclas, bloques, eLc.(
void loop() {
digitalWrite(pin,HIGH);//pone a nivel alto la salida pin
delay(1000);
digitalWrite(pin,LOW);//ponen a nivel bajo la salida pin
delay(1000):
}
2.1.3 lunClCnLS uL uSuA8lC
una funcln de usuarlo es una Larea programada que puede ser e[ecuLada LanLas veces como
queramos denLro del vold loop. ara ello Lendremos que deflnlrla al prlnclplo, anLes del vold seLup

uede ser de varlos Llpos lnL o vold dependlendo al Llpo de valor que esLe asoclada
La funcln Llpo lnL devuelve un valor numerlco de Llpo enLero
Lafunclon Llpo vold es una funcln vacla por lo LanLo no devuelve nlngun valor
Sln1AxlS
ara el caso de funcln lnL
int nombredelafuncion (parmetros) {
//sentencias
}
void setup(){}//vacio
void main() {
nombredelafuncion();//llamada a la funcin
}
C para el caso de de funcln Llpo vold, LsLe es el caso mas comun con salldas y enLradas dlglLales
void nombredelafuncion () {
//Sentencias
}
void setup(){}//vacio
void main() {
nombredelafuncion();//llamada a la funcin
}
2.1.4 lunClCnLS uLL CCMlLAuC8
Ln el lengua[e de Ardulno vlenen lmplemenLadas algunos Llpos de funclones las ms usuales y
las que uLlllzaremos son:
FUNCIONESPARAELMANEJODEENTRADASYSALIDAS

pinMode()

luncln empleada para conflgurar los plnes como enLradas o salldas
pinMode(pin, modo)
pln: numero del pln que queremos conflgurar
modo: lnu1 se emplea para conflgurar los plnes como enLradas y Cu1u1 como sallda
L[emplo
pinMode(pin13, OUTPUT);//configure el pinX como salidas
DigitalWrite()
Lscrlbe en un pln dlglLal un valor PlghL o low
Digitalwrite(pin,valor)

ln: numero del pln
valor :PlCP o LCW
L[emplo
digitalWrite(pin,HIGH);//pone a nivel alto la salida pin
digitalRead()
ermlLe leer el valor de un pln dlglLal especlflcado
digitalRead (pin);
devuelve PlCP C LCW segun corresponda
L[emplo
dlglLal8ead(pulsador),//lee el esLado de la enLrada a la que hemos llamado prevlamenLe ledln nos
devuelve un valor PlCP o LCW
usualmenLe colocamos esLe valor en una varlable
L[emplo
LsLadoulsador = dlglLal8ead(pulsador),
FUNCIONESDETIEMPO
Delay()
Pace una pausa en un Llempo deLermlnado expresado en mlllsegundos. duranLe esLe Llempo el
programa no hace nada, no pude nl leer enLradas, hacer salldas, nl e[ecuLar nlngun comando o funcln
delay(ms)
L[emplo:
delay(1000),// hace una pausa en el programa de 1 segundo.
Milis()
uevuelve el Llempo en mlllsegundos desde que el programa se lnlcl. LsLa funcln es usada para hacer
reLardos en nuesLros programas a Lraves de un bucle para que podamos hacer oLras Lareas al mlsmo
Llempo, cosa que no podlamos hacer con la funcln delay()
L[emplo
//Constantes no cambian, las usamos para configurar los pines de
//salida en este caso
const int ledPin = 13; //el nmero del pin que tine //conectado
un led en arduino
/variables que cambiarn
int ledState = LOW; // ledState es una variable para
//configurar el led

long previousMillis = 0; // almacena el tiempo desde //la
ultima vez que el led fu encendido
//las variables son long porque el tiempo se mide en milisegundos,
long interval = 1000; // interval at which to blink
(milliseconds)

void setup() {
//configuramos ledPin como salida:
pinMode(ledPin, OUTPUT);
}

void loop() {
//aqui ponemos el codigo que se ir ejecutando
//** vamos actualizando constantemente el valor de currentmillis, si
la diferencia con previusmillis (ultima vez que el programa entrn en
la estructura if) es mayor que interval entramos en la estructura if e
igualamos el valor de previusmillis y currentmillis y que cambie el
led de estado pasando a estar encendido si estaba apagado y viceversa
**//
unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {
//almacena la ulmima vez que se encendi el led
previousMillis = currentMillis;

// si el led esta apagado se enciende y vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;

//Pone en el pin de salida el estado de la variable:
digitalWrite(ledPin, ledState);
}
}
2.1.3 LLAvLS
Las llaves se usan para dellmlLar las senLenclas denLro de un bloque de conLrol de flu[o, que veremos
mas adelanLe

2.1.6 un1C ? CCMA
Ll punLo y coma se usa comunmenLe cuando hacemos uso de alguna senLencla, sl no hacemos uso
del punLo y coma a la hora de compllar el programa nos devolver errores debldo a mala slnLaxls.

2.2 VARIABLES
Las varlables son espaclos de memorla dedlcados a almacenar un clerLo valor. Los dlsLlnLos bloques
de conLrol de flu[o, senLenclas, eLc. Se relaclonan a Lraves de varlables que usa el programa para su
funclonamlenLo.
int variableX =0;//inicializa una variable entera a 0
variableX=digitalRead(pin);//le asigna el valor que tiene pin a la
variableX
Ln el lengua[e de ardulno las varlables pueden Lomar una serle de valores, segun de que Llpo sean esLas
varlables
PlCP-LCW : PlghL se emplea para deflnlr la sallda de un pln por nlvel alLo y Low por nlvel ba[o
lnu1-Cu1u1: lnu1 se emplea para conflgurar los plnes como enLradas y Cu1u1 como sallda

2.2.1 uLCLA8AClCn uL unA vA8lA8LL
Las varlables solemos declararlas anLes del vold seLup cuando son de mblLo global.Las
varlables suelen ser de Llpo lnL (LnLero), long (largas)o floaL (en coma floLanLe). Las varlables deben ser
lnlclallzadas en su declaracln para evlLar que el compllador las de[e aleaLorlas o floLanLes
2.2.2 AM8l1C uL unA vA8lA8LL
Las varlables en lengua[e C, el cual usa ardulno, Llenen una propledad llamada scope, en
conLraposlcln de oLros lengua[es como 8ASlC en las que Lodas las varlables son varlables globales.
una varlable global es aquella que esL slendo vlsLa por cualquler funcln denLro del programa. Las
varlables locales solo son vlsLas por la funcln donde fue declarada. Ln el enLorno de ardulno cualquler
varlable declarada fuera de un funcln es una varlable global
Cuando un programa se hace largo y comple[o las varlables locales son uLlles para saber que una
varlable local solo va a ser usada por la funcln donde fue declarada. LsLo nos evlLa muchos errores
porque oLras funclones no van a modlflcar el valor de esLa varlable.
L[emplo
//i es una variable de ambito local
for (int t, i<100,i++) {
//sentencias
}
noLa: A la hora de uLlllzar varlables en lnLerrupclones exLernas deberan ser deflnldas de amblLo global
como volLll.

2.3 TIPOSDEDATOS
Los prlnclpales Llpos de daLos en C son :
Char varlable 8 blL enLero
lnL varlable 16 blL enLero
Long lnL 32 blL enLero
Ln ocaslones los Llpos de daLos pueden ser modlflcados por unslgned que modlflca las varlables como
slgue
Char a// rango enLre -1280 127
unslgned char b// rango enLre 0,1,2.233
A modo de resumen:
1lpo de varlable numero de blLs rango
8lL 1 0 a 1
Char 8 -128 a 127
unslgned char 8 0 a 233
Slgned char 8 -128 a 127
lnL 16 -32768 a 32767
unslgned lnL 16 0 a 63333
ShorL lnL 16 -32768 a 32767
unslgned shorL lnL 16 0 a 63333
Long lnL 32 -2147483648 a 2147483647
unslgned long lnL 32 0 a4244967293
lloaL 32 3,4L-38 a 3,4L38
uouble 64 1,7L-308 a 1,7 L+308
Long double 80 3,4 L -4932 a 3,4 L 4932

2.4 ARITMETICA
La arlLmeLlca se usa para hacer operaclones enLre las dlsLlnLas varlables que pueda Lener el
programa. uede ser de cuaLro Llpos: Suma, resLa mulLlpllcacln y dlvlsln.
Pay que presLar aLencln con que Llpo de varlable esLamos operando, por e[emplo, sl operamos dos
varlables de Llpo lnL el resulLado ser un lnL y asl suceslvamenLe. 1amblen puede exlsLlr
desbordamlenLo, por e[emplo sl al operar esLas dos varlables nos devuelve un numero mayor 16blL, es
declr, mayor que 32628
2.5 OPERADORESARITMTICOS
Slgno nombre L[emplo ueflnlcln
= Aslgnacln ?=x one en ? el valor
de x
+ Suma x+? Suma el valor de x
mas ?
- resLa x-? 8esLa el valor de x a
?
* mulLlpllcacln x*? MulLlpllca x por ?
/ dlvlsln ulvlde x enLre ?

2.6 OPERADORESCOMPARATIVOS
Cperador nombre L[emplo ueflnlcln
== aslgncln x==? verdadero sl x es
lgual a ?
}= no es lgual a x}=? verdadero sl x es
dlsLlnLo que ?
< Menor que x<? verdadero sl x es
menor que ?
> Mayor que x>? verdadero sl x es
mayor que ?
<= Menor o lgual que x<=? verdadero sl x es
menor o lgual q ?
>= Mayor o lgual que x>=? verdadero sl x mayor
o lgual que?

2.7 ASIGNACIONESCOMPUESTAS
Aslgnacln nombre L[emplo ueflnlcln
x ++ lncremenLo de x x ++ lgual que x = x + 1, o
lncremenLar x en + 1
x -- uecremenLo de x x -- lgual que x = x - 1, o
decremenLar x en -1
x += y lncremenLo de x en y x += y lgual que x = x + y, o
lncremenLra x en +y
x -= y uecremenLo de x en ? x -= y lgual que x = x - y, o
decremenLar x en -y

x *= y MulLlpllcacln de x por ? x *= y lgual que x = x * y, o
y el resulLado se
almacena en x
mulLlpllcar x por y

x /= y ulvlsln de x enLre ? y el
resulLado se almacena en
x

x /= y lgual que x = x / y, o
dlvldlr x por y

2.8 OPERADORESBOOLEANOSDECOMPARATIVOS
LsLe Llpo de operacln se uLlllza en bloques de conLrol de flu[o como lf, para comparar dos expreslones
Aslgnacl
n
nombr
e
L[emplo ueflnlcln
&& produc
Lo
lglco
lf(dlglLal8ead(ueLecLordelnLerlores)==PlCP)&
&(dlglLal8ead(ueLecLordeexLerlores==LCW)
clerLo sl lo son los dos comandos,
0 sl alguno de los dos no es clerLo
|| suma
lglca
lf(dlglLal8ead(ueLecLordelnLerlores)==PlCP)||
(dlglLal8ead(ueLecLordeexLerlores==LCW)
falso sl alguno los dos comandos
son clerLos , 0 sl son los dos
falsos
! negacl
n
x! Sl x es 1 se ale aslgna un 0 y
vlceversa

2.9 CONSTANTES
Las consLanLes las uLlllzaremos en programacln dlglLal para aslgnar nombres a nuesLras enLradas y
salldas para hacer ms leglble nuesLro programa, es lo prlmero que escrlblremos.
Se denomlna por el Lermlno const que es preferlble usar a #deflne. Los valores que deflnamos como
consL no podrnser camblados a lo largo de la e[ecucln del programa
Sln1AxlS
const int ledPin = 13; // the number of the LED pin

2.10 SENTENCIASDECONTROLDEFLUJO

2.10.1 ll/ ll..LLSL: CCMA8AuC8LS
La esLrucLura lf corresponde a la ldea de sl esLo se cumple hago esLo
L[emplo
odemos uLlllzar esLo para LesLear una enLrada y sl esLa a valor alLo desarrollar unas senLenclas
if (inputPin == HIGH) {
// si el valor de la entrada inputPin es alto
sentencias1; //ejecuta si se cumple la condicin
}

La esLrucLura lf-else corresponde a la ldea de sl esLo se cumple hago esLo, sl no se cumple hago lo oLro

L[emplo

Ll mlsmo caso que el anLerlor sl Lenemos una enLrada en valor alLo desarrollamos las senLenclas1 sl no
desarrollamos las senLenclas2

if (inputPin == HIGH) {
// si el valor de la entrada inputPin es alto
sentencias1; //ejecuta si se cumple la condicin
}
else {
sentencias2; //ejecuta si no se cumple la condicin
}
r
r
rL rrd L yrurl rrL uL rusnL rrrrryugrugrrrrl L d sl rrrrsarreyrrsaqrrl rryurrrryL rryrrrL rynL l rrrrrerr
srrrrrrr/rysrryuL ryrrrgd nerrormL rryuL qrrsrl L ryrrrgd nerr( ryrrrgd nerrryuL rL uL rrormL rryuL rL uL qrrsrl L ryrr
rgd nerrl sl mgl rrrrreryrrL yrrL yryrrl ursL ryrormL rL urrrL yr1r
if(condicin1) {
//sentencias1
}
elseif(condicin2){
//sentencias2, si no se da condicin1 y si se da condicin2
}
else
//sentencias3 si no se dan condicin1 ni condicion2
3quq3 rr r,rrrrrrrrr rrrr rrrrr rr
rrrrrrerrrsl l raL ryrrgyrrnrrrrnrusrgl rl gd rL rrrrl rrryrrrurd sl rrL rgl rreL f grrrrr
yrl url rsryqrurl rd L yrgl rrl rsrrerrf grrsl srsresvrd L yrrl rgl rrsruL rl reL rysryrrrgd nerrerrrL l rsrsl l r
rrrrgurd L yreryryrl url rsryr( rrrrL l usl grrsl l rnL rrrrd L yrrrrrrrgurrrersl rrd rl uL rrrrerrl rsrrerqrrl rrl rvr
orroL rryuL rysrerrl rsrrerrrgd nerrrrrl grl L rerrrL l rsrsl l ryrrrrrrgurl reryryrl url rsryr( ryrrnL rrrrrrer
sl rrd rl uL rgl rrl rvrd ryr( rry rygrrysl rd rl urr
rL rs
rrl url rsrr3r rrl url rsrrr
rL l rsrsl l r
r
rrrrrrrrr
for(inicializacin;condicin;incremento) {
//sentencias
}
sl srsresvrrsl l ryrrygrerrrrasl srrrsl srsresvrrerrl rsrrerrf grrgyrrd L yrrl rrerrgrerr
rL l rsrsl l ,rrL l rsrsl l rf grrrrrrrrgd nesrerrl rsrrerrnrrrf grrrernL mrd rryrrrl rgrl urrrrl uL rrrerrgrerr
sl rrd rl uL ,rL nrrrrerl reL rrrrerrl rsrrerrgl rrl rvrrresvrrrrrrrrrsl urrrsl l r
rrrd neL r
for (int i=0; i<20; i++) {
// declara i, prueba que es menor que 20, incrementa i en 1
digitalWrite(13, HIGH); // enva un 1 al pin 13
delay(250); // espera seg.
digitalWrite(13, LOW); // enva un 0 al pin 13
delay(250); // espera de seg.
}
3quql rr rrrrrrrrr,rrr r rrrrrr rrr rrrrrrrr
rL d nrrrrerl reL rrrrgl rrl rsrrerrrL l rl rsL yr/rryL y1rL rl reL ryrf grrngrrrrsruL d rl rL rryurr
l rsrrerqrrgrl rL rrerl reL rrrrryrrl rsrrerrrL sl rsrrrrL l rrerrrrgl rrryL ryrrrrrrgurl reryryrl url rsryrreL rrrryrr
rrrcryrrgyrrrerasl rerrrrrrrrrrryL rnrrryresrr
rrrrrrrrr
switch(variable){
case (valor1):
// Sentencias
break;
case (valor2):
//sentencias
break;
default:r
r
rrrr rrr r
rerysmgsrl urrrrrd neL rryrgl rryrrgrl rsrrrrregrryqrrrl rd L yrlrerrrrL l rrurrL yrrrerryresrrrlulr( rl3qrl rrrrrr
rryL ryrrl rrsl rrd rl url rL rerrl rsrrerrerryururrrl rgl L rrLrrnuL rrl rrerbeusd L rf grryrrsl srsresvrrrrrrL
//constantes que no cambiarn
const int led1= 30;
const int led2=31;
const int led3=32;
//unica variable que cambiar de valor
int LedState =0;

void setup() {
//configuramos los pines como salidas
pinMode(led1,output);
pinMode(led2,output);
pinMode(led3,output);
}

void loop() {
//vamos cambiando la secuencia de luces cuando cambia
//nuestravariable ledstate
switch (ledState) {
case 0:
digitalWrite(Led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
delay(1000);
ledState++;
break;
case 1:
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
delay(1000);
ledState++;
break;
case 2:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(1000);
ledState=0;
break;

}
}
}
}
3quqn r rrrrerr z r rrrrr
rerrgrerrr oserrryrrrrrrrrgrsl l rrL l usl grrryrrrrsryrrrrrrgurrd srl uryryrrrrsruL rerrrLnrysl l rf grr
or( rrl urrnrvl urysyqrrrrd L rsasrrrsl l rrrrerrrLnrysl l rngrrrryrrrrrsrrrrreryryrl url rsryrrrernL nsL rrgrerr
rrgl rrrl urrrrL rerrugrrrrrgl ryrl yL r
rrrrrrrrr
while (expresin) {
//sentencias que se realizan mientras la expresin sea verdadera
}

rerrgrerrrL ruoserrryrsmgrerf grrreruoserryrel L rf grreryryrl url rsryryrrrrrrgurl rrernsl rsnsL r( regrmL ryrr
rL d ngrrrrerrrL l rsrsl l nL reL rf grrred rl L yryrrrrrrgurrl rgl rrl rvrr
do {
//sentencias
} while (condicin);
3quqC r rrrrrrrrrrrrrrrrrrrrrrr rrrrrrrr rrrrrrr rrrr rrrrrrrrrr r
rrrrrr
rrrcrysl rrnrrryresrrrrgl rreL f grrrrrrL l uL errrraegrL rrL d L rrL ruoserrL raL rL d nsrl rL rrerrgrerr
l L d rerurd rsvl ryrrgusesvrrnrrryresrrrerreL f grrrrryusror
2.10.6 CCn1lnuL
Continue: CmlLe el resLo de lLeraclones de un bucle (do, for o whlle)
8L1u8n
1ermlna una funcln y vuelve al lugar desde donde fue llamada la funcln
CC1C
Lnvla el conLrol del programa a una deLermlnada eLlqueLa
etiqueta:
goto etiqueta;

2.11 E/SDIGITAL
vamos a mosLrar el uso de enLradas y salldas dlglLales con el slgulenLe programa que apaga o
enclende un led conecLado en el led 13 segun pulsemos un lnLerrupLor conecLado en el pln2
// constantes que no cambian a lo largo de la ejecucin del programa
las utilizamos para configurar los pines de entradas y salida
const int buttonPin = 2; // nmero del pin del interruptor
const int ledPin = 13; // numero del pin del interruptor

// variables que cambiarn
int buttonState = 0; // variable para leer el estado del
interruptor

void setup() {
// inicializamos el led como salida
pinMode(ledPin, OUTPUT);
// inicializamos el interruptor como entrada
pinMode(buttonPin, INPUT);
}

void loop(){
// leemos el estado del interruptor

buttonState = digitalRead(buttonPin);

// vemos si el interrupt ha sido pulsado
// si es asi; buttonState is HIGH:
if (buttonState == HIGH) {
// ponemos el led en on:
digitalWrite(ledPin, HIGH);
}
else {
//ponemos el led en off:
digitalWrite(ledPin, LOW);
}
}

2.12 INTERRUPCIONES
Las lnLerrupclones se usan cuando queremos parar la e[ecucln normal de un programa e
lnvocar a una funcln. ara parar la e[ecucln normal de un programa lo hacemos a Lraves de un pln de
enLrada dlglLal. ara ello uLlllzamos sels plnes dlsponlbles que son: la lnLerrupcln 0(pln dlglLal1), la 1( el
pln dlglLal 2), la 2( el pln dlglLal 3), la 3 ( el pln dlglLal 21), la 4(el pln dlglLal20), la 3(el pln dlglLal 19), la 6 (
el pln dlglLal 18).
Sln1AxlS
attachInterrupt(interrupcin, funcin, modo)
Lspeclflca a la funcln a lnvocar cuando se produce una lnLrerrupcln exLerna
lnLerrupcln Ls el parmeLro que lndlca el numero(2,3,4 y 3) que hace referencla al pln donde se ha
conecLado la lnLerrupcln
luncln: luncln que se lnvoca cuando se acLlva la lnLerrupcln. LsLa funcln no debe conLener
parmeLros nl Lampoco devolver nada
Modo lndlca cuado la lnLerrupcln debe ser acLlvada
LCW: ara dlsparar la lnLerrupcln en cualquler momenLo que el pln se encuenLre a valor ba[o LCW
CPAnCL Se acLlvar la lnLerrupcln cuando el pln de enLrada camble de valor
8lSlnC ara acLlvar la lnLerrupcln cuando el pln camble de valor de PlCP a LCW
lALLlnC: acLlvar la lnLerrupcln cuando el pln de enLrada camble de LCW a PlCP

PARTE3:PROGRAMACINAVR

3.1 INTRODUCCINALAPROGRAMACINCONAVR
Programar en el entorno de Avr es un poco ms complicado que en el entorno de Arduino, ya que se
tratadeunlenguajeamsbajonivel.Perolafilosofaeslamisma,puestoqueambosestnbasadosen
ellenguajeCanteriormenteexplicadocondetalle,porlotantovamosprocederaexplicarlospuntosen
losquesediferenciadeArduino.

3.2 HERRAMIENTAS
ParaestaspracticasinstalaremoselAVRStuido5.0.Lopodemosdescargargratuitamenteenlasiguiente
direccin:
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=17212&source=getting_started
InstalamoselsoftwaresiguiendolasinstruccionesqueseencuentranenlawebdeAtmel
3.2.1 PASO1:CREARUNPROYECTO
Createnewproyect
Cejecutableproyect
SeleccionamoseldispositivoquevamosautilizarATMega2560
3.2.2 PASO2:ENTRARUNPROGRAMAENC
3.2.3 PASO3:COMPILARUNPROGRAMAENCYCREARELARCHIVO.HEX.
ElarchivoHEXsecrearenlacarpetadondehemosubicadonuestroproyecto
3.2.4 PASO4:DESCARGARELARCHIVOHEX.ALMICROCONTROLADOR
Paraelloloquenecesitas:
Arduino2560
CableUSB
Software
WinAVREstesoftwarecontieneelavrdude,elcualesnecesario
Asegrate de usar el puerto COM correcto. Para ello haz doble clik en MIpc/administrador de
dispositivos/propiedades/hardware.AnotamoselpuertoCOMqueestamosutilizandoenPuertosCOM
YPLC.
CreamosunacarpetafcilmenteaccesibleparaMS2llamadaporejemploavrenestacarpetavamosa
colocar el archivo que queremos subir a nuestro arduino con la extensin .HEX y otra a la que
denominaremosprog.BATquecrearemosconelblockdenotas
Dentrodeprog.BATincluiremoslossiguientescomandos:
modeCOM23dtr=on
avrdude-cstk500v2-pm2560-PCOM23-b115200-Uflash:w:LedDelay.hex
Donde P es el puerto usado, -b es el baudrate.c es el tipo de programador, -p es el mircroprocesdor
queestasiendoprogramado,-Ulediceaavrdudedondecolocarelarchivo.HEX
AVRdude en un programa que funciona por lnea de comando, por lo que debes abrir la lnea de
comandos de Windows (Inicio-Ejecutar- "cmd") para poder usarlo. Una vez abierto el "cmd", escribe
"avrdude" y presiona Enter. Si la instalacin est correcta entonces se mostrar una lista de opciones
disponibles.Conestoestamoslistosparaenviarcomandosqueprogramarnlatarjeta.

3.3 ASPECTOSPRINCIPALESDELAPROGRAMACINENC.
3.3.1 ESTRUCTURADEUNPROGRAMA
Comohemosvisto,todoslosprogramasdeCtienenunaestructuradivididaendospartes;los
archivosinclude,dondeseinsertanlosarchivosheaderylaestructuramain()queesdondeelprograma
seejecuta
Una posible plantilla para la edicin de los programas, asi sabremos donde se encuentra cada
apartado.Seralasiguiente

//**************************************************************************
//
// Titulo :Plantilla para programacin con AVR
// Autor :
// Fecha :
// Version : 1.0
// Target MCU : Atmel AVR series
//
//**************************************************************************
// -------------------------------------------------------------------------
//************************* Inclusin de Libreras *************************
// -------------------------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include "lcd_lib.h"
// -------------------------------------------------------------------------
//*********************** Definiciones de Variables Globales ***************
// -------------------------------------------------------------------------
// ************************* Definiciones y Macros *************************
// -------------------------------------------------------------------------
// ************************ Rutinas de Interrupcin ************************
// -------------------------------------------------------------------------
// ************************* Declaracin de Funciones **********************
// -------------------------------------------------------------------------
// **************************** Cuerpo del Programa ************************
// -------------------------------------------------------------------------
int main( void ) {
// -------------------------------------------------------------------------
// ********************** DECLARACIN DE VARIABLES *************************
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// ************** CONFIGURACIN DE LOS PUERTOS DE E/S **********************
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// ********************* INICIALIZACIN DE REGISTROS ***********************
// -------------------------------------------------------------------------
// ****************** HABILITACIN DE INTERRUPCIONES ***********************
// -------------------------------------------------------------------------
// ************** INICIALIZACIN DE FUNCIONES Y VARIABLES ******************
// -------------------------------------------------------------------------
// ******************** CICLO PRINCIPAL DE EJECUCIN ***********************
// -------------------------------------------------------------------------
while (1) {
} //Fin while
return 0;
}
// -------------------------------------------------------------------------
//********************* DEFINICIN DE FUNCIONES ****************************
// -------------------------------------------------------------------------

ComoyaconocemoslosaspectosimportantesdelaprogramacinenC.Vamosapasaraver
cadaunodelospuntosdelaestructuradelprograma

3.3.2 VARIABLESGLOBALES

Lasvariablescomunes,slosonaccesiblesdesdelafuncindondeseencuentradefinida,sise
requierequelavariableseaaccesibledesdecualquierpartedelprograma,esnecesariodeclararlacomo
global.
Paraestosimplementesedefineantesdelafuncinmain().

Ejemplo.

Volatile int var_1, var_2;

Es aconsejable aunque no obligatorio definir las variables globales como voltiles para indicarle al
compiladorquenosobrescribasobreestaposicindememoria.

3.3.3 EFINICIONESYMACROS:

Medianteciertasdirectivassepuedeasignaraalgnsmbolodefinidoporelprogramadoruna
determinadaexpresin.

Ejemplos:

#define s1 2
#define larger( x, y) ( (x)>(y) ? (x) : (y))
#define _BV(bit) (1 << (bit))
#define set_bit(value, bit) (value=((value) | _BV(bit)))

3.3.4 RUTINASDEINTERRUPCIN:

Sonfuncionescuyocuerpodefinenloquesedebeejecutarenelmomentoquesepresenteuna
determinadainterrupcin.
Ejemplo.

ISR(TIMER0_OVF_vect) {
PORTA=PORTA ^ 0x02;
}

Noesnecesariohacerunsaltoexplcitoaestafuncin,niejecutaralgunainstruccinderetorno.El
nombredelosdiferentesvectoresdeinterrupcinsedefinenenlalibrera<avr/io.h>.

/* External Interrupt Request 0 */


INT0_vect
/* External Interrupt Request 1 */
INT1_vect
/* External Interrup

3.3.5 DECLARACINDEFUNCIONES

Enestecampodebecolocarseladeclaracindelasfuncionesaemplearconelprototipodelafuncin.
Ej.:

int mi_funcion(int var1, int var2, float var3);

3.3.6 CUERPODELPROGRAMA

Elcuerpodelprogramasiempreempiezaconlafuncinmain()ydesdedondeelprogramaempiezasu
ejecucin.

3.3.7 DECLARACINDEVARIABLES:

Lasvariablesquesedefinanaqutienenunmbitolocal,nosonaccesiblesdesdelasfunciones.

// configura PORTA como salida


PORTA=0;
DDRA = 0xFF;

// configura PORTB como salida
PORTB=0;
DDRB = 0xFF;

// configura PORTC como entrada
PORTC=0;
DDRC = 0x00;

// configura PORTD as entrada
PORTD=0;
DDRD = 0x00;

3.3.9 INICIALIZACINDEREGISTROS:

Seestablecenlosvaloresdelosregistrosdepropsitoespecficodeacuerdoconlasconfiguracionesde
losdiferentesrecursos.

3.3.10 HABILITACINDEINTERRUPCIONES:

Habilitacindelosdiferentesbitsdeinterrupcin
Ejemplo:

TIMSK=(1<<TOIE0);
sei(); //Habilitacin del bit de interrupcin global.

3.3.11 INICIALIZACINDEFUNCIONESYVARIABLES

Sedebeestablecerelestadoinicialdelasdistintasvariablesyejecutarlasfuncionesde
inicializacinrequeridas.
Ejemplo.

LCDinit();

3.4 INTRODUCCINALLENGUAJEENCPARAELCOMPILADORWINAVR

3.4.1 COMENTARIOS

Loscomentariossoneltextoqueelcompiladorignora,parausarunalneasimpledecomentariosusa
dosbarrasinvertidas.porejemplo.

DDRA=0x00.// Configura el puerto a como salidas

Cuandoqueremoshacerunbloquedecomentariosdebemosinicializarlocon/*yterminarlocon*/
3.4.2 SENTENCIAS
Lassentenciascontrolanelflujouordendeejecucindelprograma,consistenenpalabrasclave
expresionesyotrassentencias.Unasentenciaterminaconunpuntoycoma(;).
DDRB=0XFF;// configura el puerto B como salidas.
3.4.3 BLOQUES
Unbloqueesunconjuntodesentenciasencerradoentreparntesis{},enocasioneshayunbloqueque
seestaejecutandoconstantemente,ysesuelecorresponderalsiguienteformato.
while(1) {
sentencias;
}

3.5 TIPOSDEDATOSYOPERADORES
LosprincipalestiposdedatosenCson:
Char variable 8 bit entero
Int variable 16 bit entero
Long int 32 bit entero
Enocasioneslostiposdedatospuedensermodificadosporunsignedquemodificalasvariablescomo
sigue
Char a; // rango entre -1280 127
Unsignedcharb//rangoentre0,1,2.255
Algunosejemplosdeasignaciones
a = 0xA0; // guarda en a el valor hexadecimal A0
b = 1; // guarda en b el cdigo ASCII de carcter 1
c = 2000ul; //guarda en c un unsigned long integuer 2000
Amododeresumen:
Tipodevariable Nmerodebits rango
Bit 1 0a1
Char 8 -128a127
Unsignedchar 8 0a255
Signedchar 8 -128a127
Int 16 -32768a32767
Unsignedint 16 0a65535
Shortint 16 -32768a32767
Unsignedshortint 16 0a65535
Longint 32 -2147483648a2147483647
Unsignedlongint 32 0a4244967295
Float 32 3,4E-38a3,4E38
Doubl 64 1,7E-308a1,7E+308
Longdoubl 80 3,4E-4932a3,4E4932

Signo Nombre Ejemplo Definicin


= Asignacin Y=X PoneenYelvalordeX
+ Suma X+Y SumaelvalordeXmasY
- resta X-Y RestaelvalordeXaY
* multiplicacin X*Y MultiplicaXporY
/ divisin DivideXentreY

Operador Nombre Ejemplo Definicin


== asigncin X==Y VerdaderosiXesigualaY
= Noesiguala X=Y VerdaderosiXesdistintoqueY
< Menorque X<Y VerdaderosiXesmenorqueY
> Mayorque X>Y VerdaderosiXesmayorqueY
<= Menoroigualque X<=Y VerdaderosiXesmenoroigualqY
>= Mayoroigualque X>=Y VerdaderosiXmayoroigualqueY

Asignacin Nombre Ejemplo Definicin


x++ IncrementodeX x++ igualquex=x+1,oincrementarxen+1
x-- DecrementodeX x-- igualquex=x-1,odecrementarxen-1
x+=y Incrementodexeny x+=y igualquex=x+y,oincrementraxen+y
x-=y DecrementodeXenY x-=y igualquex=x-y,odecrementarxen-y
x*=y MultiplicacindeXporYyel
resultadosealmacenaenX
x*=y igualquex=x*y,omultiplicarxpory

x/=y DivisindeXentreYyel
resultadosealmacenaenX

x/=y igualquex=x/y,odividirxpory

Estetipodeoperacinseutilizaenbloquesdecontroldeflujocomoif,paracomparardosexpresiones
Asignacin Nombre Ejemplo Definicin
&& productolgico
ANDlogico
X&&y 1sixeyson1.Sicualquieradelosdoses0,el
resultadoser0
|| sumalgica
ORlgico
X||y 0sixoyson0,delocontrariosern1
! NegacinNOTlgico X! SiXes1sealeasignaun0yviceversa

OPERADOR Nombre Ejemplo Definicin


~ OperadordebitdeComplemento ~x Cambiacualquierbitde1a0o
viceversa
| Operadordebit
ORlgico
x|y OperacinaniveldebitOR
& OperadordebitANDlgico x&y OperacinaniveldebitAND
^ OperadordebitXOR X^y OperadoraniveldebitXORdex
eny
<< Desplazamientolgicoala
izquierda
X<<3 Desplazamientoenxde3bitsala
izquierda
>> Desplazamientolgicoaladerecha X>>1 Desplazamientoenxde1bitala
derecha

3.6 CONTROLDEFLUJO
Pordefectolassentenciasseejecutansecuencialmente.Paradirigirelflujodelprogramase
puedenutilizarseistiposdecontroladoresdeflujo:
3.6.1 SENTENCIACONDICIONALIF-ELSE
SINTAXIS

if (expresin)
sentencia_1;
else
sentencia_2;
3.6.2 SENTENCIASWICHTCASECONDICIONAL
SINTAXIS

switch (expresion) {
case constante_1:
sentencia_1;
break;
case constante_2:
sentencia_2;
break;

case constante_n:
sentencia_n;
break;
default:
otras sentencias;
}

3.6.3 SENTENCIAWHILE
SINTAXIS

while (expression){
sentencias;
}
3.6.4 SENTENCIAFOR
SINTAXIS
for(inicializacin;condicin;incremento) {
//sentencias
}
3.6.5 SENTENCIASDOWHILE
SINTAXIS
do{
//sentencias
} while (condicin);
3.6.6 OTRASSENTENCIASDERELACIONADASCONELCONTROLDEFLUJO
BREAK
breaksirveparasalirdeunbloquedecontroldeflujocomodo,whileofor,rompiendoelbuclenormal,
tambinseutilizaparasalirdelbloquedeswich
CONTINUE
continue:Omiteelrestodeiteracionesdeunbucle(do,forowhile)
RETURN
Terminaunafuncinyvuelveallugardesdedondefuellamadalafuncin
GOTO
Enviaelcontroldelprogramaaunadeterminadaetiqueta
SINTAXIS
etiqueta:
goto etiqueta;

3.7 FUNCIONES
LasfuncionesdeCsonsubrutinasquepuedenserllamadasdesdeelprogramaprincipaluotras
funciones
UnafunindeCpuedetenerunalistadeparmetrosyproducirunadevolucindevalores
vamosaestudiarlasfuncionesatravsdealgunosejemplos
Funcionquecalculaelfactorialdeunnmero
// la funcin acepta un nmero de tipo int y devuelve otro nmero de tipo int
int factorial(int n) {
int prod = 1;
for (int i = 1; i <=n; i++)
prod = prod * i;
return prod; // devuelve el resultado
}
int main(void) {
int n = 5; // ejemplo de valor de n
int v; // variable para almacenar el resultado
v = factorial(n); // llamada a la funcin
return 1;
}

3.8 ENTRADASYSALIDASDIGITALES
Laplacadearduinotiene12puertosde8bitscadauno.Estospuertosestnnumeradosdesde
elpuertoAdeaquenadelantePA,hastaelpuertoL(PL).Cadapuertoesbidireccional,esdecir,puede
serconfiguradocomosalidasocomoentradas.
Acontinuacin exponemos unas tablas en las que se incluyen los puertos disponibles en el shield de
arduinoparalaspracticas
3.8.1 ENTRADAS
44 PL5 05C5C
45 PL4 05C5B
46 PL3 0C5A
47 PL2 T5
48 PL1 ICP5
49 PL0 ICP4
50 PB3 MISO/PCINT3
51 PB2 MOSI/PCINT2
52 PB1 SCK/PCINT1
53 PB0 SS/PCINT0

3.8.2 SALIDAS
22 PA0 AD0
23 PA1 PD023
24 PA2 PD024
25 PA3 PD025
26 PA4 PD026
27 PA5 PD027
28 PA6 PD028
29 PA7 PD029
30 PC7 A15
31 PC6 A14

Cadapuertotiene4registrosimportantes:
DataDirectionRegister(DDRx)
ImputPinAddsess(PINx)
DataRegister(PORTx)
DataDirectionRegister(DDRx)Esteregistroseusaparaconfigurarunbitopuertocomounaentradao
salida
3.8.3 EJEMPLOSDEMANEJODEENTRADASYSALIDAS(I/O)
EJEMPLO:CmoconfiguramoselpuertoApara4entradasy4salidas?
DDRA = 0b11110000; // configura pins

DataRegister(PORTx)Seusaparaparaescribirsalidasenelpuerto
EJEMPLO:Escribimosu0enelbit6yentodoslosdemsun1
PORTA=0b10111111;
ImputPinAddsess(PINx)Seusaparaleerentradasdesdeunpuerto
EJEMPLO:LecturadeentradasdesdeelpuertoA
Unsigned char termp;
temp=PINA;

EJEMPLO:ManejodeI/O
DDRB = 0x1F;
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 <<
DDB4);//Equivalente a la expresin anterior
PORTB = 0x04;
PORTB = PORTB | 0x04;
PORTB |= (1<<PB2); Equivalente a la instruccines anteriores.
PORTB |= (1<<PB4) | (1<<PB5); Pone los pines 4 y 5 en alto sin alterar
los dems.
PORTB &= ~( (1<<PB4) | (1<<PB5) ); Pone los pines 4 y 5 en 0 sin
alterar los dems.
Formasdeexaminarunpin.
if ( PINC & (1<<PINC1) ) { //Ser verdadero si el pin 1 est en alto.
/* action */
}
if ( !(PINB & (1<<PINB2)) ) { //Ser verdadero si el pin 1 est en
bajo.
/* action */
}
Parasimplificarlaescriturapuedendefinirseciertasmacros
#define _BV( bit ) (1 << (bit))
#define E0 ((variable) & _BV(0)) Test sobre el bit 0
#define set_E0 (variable | = _BV(0))
#define clr_E0 (variable &= ~_BV(0))