ÍNDICE DE LOS APUNTES DE C
Estos apuntes se encuentran estructurados en tres partes: •
•
•
La primera parte trata sobre la programación en lenguaje C de una manera generalista. La segunda parte trata sobre la programación en C en el IDE (Integrated development Enviroment) de arduino más una parte de prácticas con un shield creado para llegar a controlar una maqueta de un cruce regulado por semáforos y un tren que simula el funcionamiento de un montacargas. La tercera parte de este manual trata sobre la programación más directa del microcontrolador AVR que lleva arduino, de nuevo a través del puerto serie, pero por medio de plataformas de programación distintas de la propia de Arduino.
PARTE 1: PROGRAMACIÓN GENERALISTA EN C 1.1
PRIMEROS PASOS
1.1.1 1.1.2 1.3
VARIABLES
1.3.1 1.3.2 1.3.3 1.3.4 1.4
1.5
1.6
TIPOS DE DATOS DECLARACIÓN DE VARIABLES ASIGNACIÓN DE VARIABLES TIPOS DE CONVERSIONES CONVERSIO NES
FUNCIONES
1.4.1 1.4.2 1.4.3 1.4.4
PASAR ARGUMENTOS A UNA FUNCIÓN FUNCIONES PROTOTIPO USANDO ARGUMENTOS DE FUNCIONES USANDO FUNCIONES PARA DEVOLVER VALORES
1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7
OPERADORES OPERADORE S ARITMETICOS OPERADORES RELACIONALES OPERADORES LÓGICOS OPERADORES OPERADORE S A NIVEL DE BITS MEZCLANDO TODO OPERADORES DE INCREMENTO O DECREMENTO ORDEN DE PREFERENCIA DE LOS OPERADORES
OPERADORES OPERADORE S DE C
SENTENCIAS DE CONTROL DE FLUJO
1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.6.10 1.7
ESTRUCTURA DE UN PROGRAMA COMPONENTES DE UN PROGRAMA DE C. PRIMER PROGRAMA EN C
IF SENTENCIAS IF-ELSE BUCLE FOR WHILE LOOP DO-WHILE LOOP PROGRAMAS DE CONTROL DE SENTENCIAS ANIDADOS SENTENCIA CONTINUE SENTENCIA SWITCH. SENTENCIA NULL SENTENCIA RETURN
PAUTAS Y RECOMENDACIONES PARA CUALQUIER TIPO DE LENGUAJE BASADO EN C
PARTE 1: PROGRAMACIÓN GENERALISTA EN C 1.1
PRIMEROS PASOS
1.1.1 1.1.2 1.3
VARIABLES
1.3.1 1.3.2 1.3.3 1.3.4 1.4
1.5
1.6
TIPOS DE DATOS DECLARACIÓN DE VARIABLES ASIGNACIÓN DE VARIABLES TIPOS DE CONVERSIONES CONVERSIO NES
FUNCIONES
1.4.1 1.4.2 1.4.3 1.4.4
PASAR ARGUMENTOS A UNA FUNCIÓN FUNCIONES PROTOTIPO USANDO ARGUMENTOS DE FUNCIONES USANDO FUNCIONES PARA DEVOLVER VALORES
1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7
OPERADORES OPERADORE S ARITMETICOS OPERADORES RELACIONALES OPERADORES LÓGICOS OPERADORES OPERADORE S A NIVEL DE BITS MEZCLANDO TODO OPERADORES DE INCREMENTO O DECREMENTO ORDEN DE PREFERENCIA DE LOS OPERADORES
OPERADORES OPERADORE S DE C
SENTENCIAS DE CONTROL DE FLUJO
1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.6.10 1.7
ESTRUCTURA DE UN PROGRAMA COMPONENTES DE UN PROGRAMA DE C. PRIMER PROGRAMA EN C
IF SENTENCIAS IF-ELSE BUCLE FOR WHILE LOOP DO-WHILE LOOP PROGRAMAS DE CONTROL DE SENTENCIAS ANIDADOS SENTENCIA CONTINUE SENTENCIA SWITCH. SENTENCIA NULL SENTENCIA RETURN
PAUTAS Y RECOMENDACIONES PARA CUALQUIER TIPO DE LENGUAJE BASADO EN C
PARTE 2: EL C DE ARDUINO 2.1
2.2
2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10
PRIMEROS PASOS CON ARDUINO: ESTRUCTURA DE UN PROGRAMA
2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6
VOID SETUP VOID LOOP FUNCIONES DE USUARIO FUNCIONES DEL COMPILADOR LLAVES PUNTO Y COMA
2.2.1 2.2.2
DECLARACIÓN DECLARACIÓ N DE UNA VARIABLE AMBITO DE UNA VARIABLE
VARIABLES
TIPOS DE DATOS ARITMETICA OPERADORES ARITMÉTICOS OPERADORES COMPARATIVOS ASIGNACIONES COMPUESTAS OPERADORES BOOLEANOS DE COMPARATIVOS CONSTANTES SENTENCIAS DE CONTROL DE FLUJO
2.10.1 2.10.2 2.10.3 2.10.4 2.10.5 2.11 2.12
IF/ IF..ELSE: COMPARADORES COMPARAD ORES FOR: BUCLE CON CONTADOR SWITCH CASE: COMPARADOR COMPARAD OR MULTIPLE WHILE/DO …WHILE OTRAS SENTENCIAS RELACIONADAS CON EL CONTROL DE FLUJO
E/S DIGITAL INTERRUPCIONES
PARTE 3: PROGRAMACIÓN AVR 3.1 3.2
INTRODUCCIÓN A LA PROGRAMACIÓN CON AVR HERRAMIENTAS
3.2.1 3.2.2 3.2.3 3.2.4 3.3
3.4
3.5 3.6
ASPECTOS PRINCIPALES DE LA PROGRAMACIÓN EN C.
3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.9 3.3.10 3.3.11
ESTRUCTURA DE UN PROGRAMA VARIABLES GLOBALES EFINICIONES Y MACROS: RUTINAS DE INTERRUPCIÓN: INTERRUPCI ÓN: DECLARACIÓN DE FUNCIONES CUERPO DEL PROGRAMA DECLARACIÓN DE VARIABLES: INICIALIZACIÓN DE REGISTROS: HABILITACIÓN DE INTERRUPCIONES: INTERRUPCIO NES: INICIALIZACIÓN DE FUNCIONES Y VARIABLES
3.4.1 3.4.2 3.4.3
COMENTARIOS SENTENCIAS BLOQUES
INTRODUCCIÓN AL LENGUAJE EN C PARA EL COMPILADOR WINAVR
TIPOS DE DATOS Y OPERADORES CONTROL DE FLUJO
3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.7 3.8
PASO1: CREAR UN PROYECTO PASO 2: ENTRAR UN PROGRAMA PROGRAM A EN C PASO 3: COMPILAR UN PROGRAMA EN C Y CREAR CREAR EL ARCHIVO.HEX. PASO 4: DESCARGAR EL ARCHIVO HEX. AL MICROCONTROLADOR
SENTENCIA CONDICIONAL CONDICIONA L IF-ELSE SENTENCIA SWICHT CASE CONDICIONAL SENTENCIA WHILE SENTENCIA FOR SENTENCIAS DO WHILE OTRAS SENTENCIAS DE RELACIONADAS CON EL CONTROL DE FLUJO
FUNCIONES ENTRADAS Y SALIDAS DIGITALES
3.8.1 3.8.2 3.8.3
ENTRADAS SALIDAS EJEMPLOS DE MANEJO DE ENTRADAS Y SALIDAS (I/O)
PARTE1:PROGRAMACIÓNGENERALISTAENC 1.1.PRIMEROSPASOS Enestecapítuloexpone Enestecapítuloexponemosaspec mosaspectosfunda tosfundament mentalesbási alesbásicosdela cosdela programac programaciónenC iónenC deunamanera generalistaparaposteriormentehacermásfácillacomprensióndelaprogramaciónconArduinoyAvr
1.1.1ESTRUCTURADEUNPROGRAMA DIRECTIVADEPREPROCESADOR Direct Directiva iva de prepro preproces cesado ador r es un comand comando o de Prepro Preproce cesad sador or de C (la (la cual cual se invoca invoca en el primerpasodecompilacióndelprograma)lasdosmásimportantesdirectivasdepreprocesadorsonla directiva #define,lacualsustituyetextoporunidentificadorespecificoyladirectiva #include ,la cualincluyetextode cualincluyetextodeunarchiv unarchivoexternodentro oexternodentrodeunprogram deunprograma. a.
DECLARACIÓN Unadeclaració Unadeclaración n establec establece e nombresy nombresy atributos atributos devariables,tambié devariables,también n establec establecelas elas funcione funciones s usadas usadas en losprogramas. losprogramas. Lasvariables Lasvariables globales globales se declaran declaran al principi principio o delprograma y lasvariables lasvariables localessedeclarandentrodelafunciónenlaqueseusan
DEFINICIÓN Una defini definici ción ón establ establece ece el conten contenido ido de una varia variable ble o funci función. ón. Una defini definici ción ón asigna asigna el espacionecesarioparalasvariablesyfunciones
EXPRESIÓN Unaexpresiónesunacombi Unaexpresiónesunacombinacióndeoper nacióndeoperadoresyoper adoresyoperandosalas andosalasqueasigna queasignaunvalorsim unvalorsimple ple
SENTENCIA Lassentenciascontrola Lassentenciascontrolanelflujo nelflujouordendeej uordendeejecucióndel ecucióndelprograma programa
FUNCION Esuna colecci colecciónde ónde declarac declaracione iones,definic s,definiciones iones,expresio ,expresionesy nesy sentencia sentenciasque sque sellevaa cabo una una tare tarea a espe especí cífi fica ca. . Las Las func funcio ione nes s vien vienen en ence encerr rrad adas as entr entre e llav llaves es. . Las Las func funcio ione nes s no pued pueden en ser ser anidadas.
FUNCIÓNMAIN Todoslosprogramascontienenlafunciónmain,dondeseejecutaelprograma,lasllavesque encierranlafunciónmainsonlasquedelimitandondeempiezayterminaelprograma.
1.1.2
COMPONENTE COMPONENTESDE SDEUNP UNPROGRA ROGRAMAD MADEC. EC.PRIME PRIMERPROG RPROGRAMA RAMAENC ENC
Todos Todos los progra programas mas contie contienen nen compon component entes es esenci esenciale ales s como como funci funcione ones s y senten sentencia cias. s. Las sentenciassonpartesdelprogramaquedesemp sentenciassonpartesdelprogramaquedesempeñanoperacionesac eñanoperacionesactualizadas.Todoslosprogr tualizadas.Todoslosprogramasde amasde C conti contiene enen n una o más funcio funciones nes. . Las funcio funciones nes son subrut subrutina inas, s, cada cada una de las cuale cuales, s, contie contienen nen senten sentencia cias s y se pueden pueden llama llamar r por otras otras partes partes del progra programa. ma. Cuando Cuando escrib escribimo imos s un progra programa ma las sangrías,laslíneasenblancoyloscomentariosloshacenmáscomprensibles.Nosoloparaqueelautor loscomprendapasadounti loscomprendapasadountiempo,sino empo,sinoparaquepued paraquepuedanserentendi anserentendiblesporlosd blesporlosdemás. emás. Ilus Ilustr tram amos os el prog progra rama ma típi típico co llam llamad ado o hell hello o worl world d que que se usa usa para para comp compro roba bar r que que el compil compilado ador, r, hardwa hardware re y demás, demás, funcio funcionan nan correc correctam tament ente, e, con este este progra programa ma solo solo obtene obtenemos mos una salidaporpantalla“H salidaporpantalla“Helloworld” elloworld”
# include
/*My 1st C programe*/ main void () { printf(“Hello world”); }
Lasentencia#includeledicealcompiladorqueincluyaelcódigofuentedentrodel programa desde el archivo El archivo studio es sinónimo de header file. Un header file contieneinformaciónacercadefuncionesestándarqueseusandentrodelprograma.Alarchivoheader studio.hselellamaSTandarDInputsandOutputs.Contienemuchasfuncionesdeentradaysalida.Solo es necesario en nuestro programa usar archivos include que pertenezcan a funciones de librerias estándar /*My1stCprograme*/EsuncomentarioenCtodosloscomentariossonprecedidospor/*yterminados por*/loscomentariossoneliminadosporelcompiladoryademásnoafectanlavelocidadolongituddel códigocompilado Todos los programas tienen una función principal llamada main() este es el punto de entrada del programa.Todaslasfuncionestienenelmismoformato: nombre_de_la_función () { código }
Lassentenciasdentrodeunafunciónseejecutansecuencialmente,empezandoconlaqueestámás próximaalallaveabiertayterminandoporlamáslejana. Losparéntesis{y}muestranelempieceyfinaldeunafunción. Finalmentelasentenciaprintf(“Helloworld”);representaunasentenciatípicadeprogramaciónenC. CasitodaslassentenciasenCterminanconpuntoycoma(;).Elcarácterdefindelíneanoesreconocido enlenguajeC.Nohayrestriccionesenlaposicióndelassentenciasenunalíneanienelnúmerode sentenciasporlínea. Todaslas líneas decódigo tienen un punto y coma (;) alfinal para informaral compilador que ha alcanzadoelfinaldelasentencia.Lanoinclusióndeestonosdaráunerrorenlasiguientelínea.La excepcióndeestoeselcomandoifdondeelpuntoycomadeberáestarincluidoalfinaldelasiguiente línea.
MAIN() Todoslosprogramastienenquetenerunafunciónmain,lacualpuedeaparecersolounavez. Dentrodelosparéntesisaldefinirlafunciónnosedebenponerparámetros.Comomainestáclasificado comofunciónelcódigodebedeirdentrodellaves: main() { código }
#INCLUDE El archivo header (denotado por la extensión .h) contiene información de las librerías tales comolosargumentosquelasfuncionesaceptanocualesargumentosdevuelvelafunción Esta información es usada por el compilador para linkar todo el hardware específico y fuente de programasjuntos #include
Deestamaneraestamosindicandoalpreprocesadorquemireenotrodirectorio Probablemente notes que la directiva #include no tiene punto y coma al final, la razón es porque #includenoesunapalabraclavedeC,peroenvezdeestoesunainstrucciónparaelcompilador. Eltododeelarchivoincludeesinsertarelarchivofuenteenlaetapadecompilación
PRINTFFUNCIÓN Printf es una función de librería estándar que esta dentro de la librería stuio.h, permite al programadorhacersalidasporpantalla.Elformatogenerales: printf(“cadenadecontrol”,listadeargumento); Lacadenadecontrolesunacadenaconcomillasencadaextremo,dentrodeestacadenapodemosusar una combinación de letras, números y símbolos. A los Símbolos especiales se les llama formato específicosedenotanpor%Lacadenadecontroldebeestarsiemprepresenteenlafunciónprintf Lalistadeargumentopuedeno estarpresenteen lafunciónprintfsino hayformatoespecíficoen 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 formatoespecíficoencyeltipodedatoqueafecta Formato especifico %c %uc %s %d %f %e %g %u %x %p %o 1
Printf Single Carácter Unsigned carácter String Signed decimal integer Floating ( debe incluir coma decimal) Floating point (científico o notación exponencial) Floating point Unsigned decimal integer Unsigned decimal integer Pointer Unsigned octal interger Prefijo usado con
NOTA:Un0(cero)cuandosigueaun%conunformatostringfuerzaaimprimircerosalaizquierda.El númerosiguienteespecificaelanchodelcampodeimpresión printf(“Elhexadecimalde12es%02x\n”,12); Seimprimiría Elhexadecimalde12es0C
VARIABLES Unavariableesunalocalizaciónespecíficadememoria.Enestaporcióndememoriasepueden retenervariosvaloresdependiendodecómoestédeclaradalavariable,EnCtodaslasvariablestienen que ser declaradas antes de ser usadas. Una variable declarada le dice al compilador que tipo de
variableestásiendousada.Todaslasdeclaracionesdevariablessonsentenciasyporlotantodeben teneralfinalunpuntoycoma. HaycincotiposdevariablesenC,char,int,float,double,void,elformatogenerales: Tipo nombredelavariable;
Unejemplodedeclaracióndevariableeschar,queelcompiladorentiendequeesunavariablesinsigno enterade8bit
CONSTANTES Unaconstanteesunvalorfijoquenopuedesercambiadoporelprograma,porejemplo25es unaconstante,lasconstantesenterassonnúmerossinningúncomponentefraccionario,talescomo100 o-40,lasconstantesdepuntoflotanterequierencomadecimalseguidodelacomponentefraccional. 476,45esunaconstanteconcomaflotante,Loscaracteresconstantesseusanentrecomillastalescomo ‘A’o‘&’ Cuandoelcompiladorencuentraunaconstanteentuprograma.Eldecidequétipode constantees.Elcompilador,ajustapordefectoaltipodedatomáspequeño,poreso15esunint64000 esununsignedy105020esunlong.Unaconstanteesdeclaradausandounasentencia#define #define< etiqueta> valor
Etiquetadefineelnombrequetúusarásentuprogramayvalor,elvalorquetuasignasa #define TRUE 1 #define pi 3,141592
Cpermitedefinirconstantesenformatohexadecimalyoctal.Enhexadecimallasconstantesestán precedidasde0x…comoporejemplo0XF4
COMENTARIOS Los comentarios son usados para dar significado y operación al código fuente. Todos los comentariossonignoradosporelcompilador.Uncomentariopuedeseremplazadoacualquierpartede unprogramadeCexceptoenmitaddeunapalabraclave.Loscomentariospuedenusarmuchaslíneasy podríanserusadostambiéntemporalmenteenvezdelíneasdecódigo. Loscomentariostienendostiposdeformatoselprimeroes /*comentarios*/ yelsegundoes //comentarios
FUNCIONES LasfuncionessonlosbloquesmásbásicosdeconstruccióndeunprogramaenC.Todoslos programasenCcontienenalmenosunafunciónqueserálafunciónmain(),muchosdelos programasquetuescribirásenCcontendrámásdeunafunción.ElformatodeunprogramaenCcon muchasfuncioneses: main() { código } funcion1() {
código } funcion2() { código }
Main es la primera función llamada cuando el programa se está ejecutando. Las demás funciones funcion1yfuncion2seránllamadasporalgunafuncióndentrodelprograma Tradicionalmentemain()noesllamadaporotrafunción PALABRASCLAVEOPALABRASRESERVADAS El código ANSI C consta de 32 caracteres para usar en lenguaje C. ciertas palabras están reservadasparaelusodelcompiladorparadefinirlostiposdedatooparausarenbucles CiertoscompiladoresdeCtienenreservadaspalabrasparahacerlaprogramaciónmásfácileintuitiva: Acontinuacióndamosunalistadeestaspalabrasclave 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
Pasamosaentrarmásendetalledecadaunodelosapartadosquesevieronanteriormente.
1.3.
VARIABLES
Uno de los principales aspectos de C es como se almacenan los datos. En este capítulo examinaremosmásestrechamentecomosealmacenanlosdatos.
1.3.1
TIPOSDEDATOS EnCexisten5tiposdedatosycuatromodificadores.
Tipo Carácter integer Float double Void Signed Unsigned Long short
Significado caracteres Números enteros con signo Números en coma flotante Números con doble precisión en comaflotante Vacio Positivo o negativo Solamente positivo Doble de la longitud de un número Mitad de la longitud de un número
Palabra clave char int float double Void signed unsigned long short
Cadaunodelostiposdedatosrepresentanunosparticularesrangosdenúmeros,loscuales puedencambiardependiendodelosmodificadoresqueusemos.Lasiguientetablamuestralosposibles rangodevaloresparatodaslaposiblescombinacionesdetiposdedatosymodificadores Tipo de variable Bit Char Unsigned char Signed char Int Unsigned int Short int Unsigned short int Long int Unsigned long int Float Doublé Long doublé
1.3.2
Número de bits 1 8 8 8 16 16 16 16 32 32 32 64 80
rango 0a1 -128 a 127 0 a 255 -128 a 127 -32768 a 32767 0 a 65535 -32768 a 32767 0 a 65535 -2147483648 a 2147483647 0 a4244967295 -38 38 3,4 10 a3,410 -308 308 1,7 10 a1,710 -4932 4932 3,4 10 a3,410
DECLARACIÓNDEVARIABLES
Lasvariablespuedenserdeclaradasdedosformasbásicas.Enunafunciónofueradetodaslas funciones.Sellamanlocalesoglobalesrespectivamente.Lasvariablessondeclaradasconlasiguiente nomenclatura. tipo nombre_de_la_variable;
dondetipoesalgunodelostiposdedatosdellenguajeCy nombre_de_la_variableeselnombredela variable. Lasvariableslocalessolopuedenserusadasporlassentenciasdelasfuncionesdondefuerondeclaradas Nosepuedeaccederalvalordelasvariableslocalesporfuncionesdondenofuerondeclaradas.Lomás importante que debesde sabersobre las variables locales esque son declaradasa laentrada dela funciónydestruidascuandosesaledeella Seacepta quelas variables localespuedanserusadasen diferentes funciones conel mismonombre. Ejemplodeprograma #include 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; }
Esteprogramasacaporpantallalosnúmerosdel0al9endiezveces.Elmododeoperacióndel programanoesafectadoporlavariablecontadorqueoperaendosfuncionesalavez. Porotroladolasvariablesglobalespuedenserusadasenvariasfunciones.Lasvariablesglobalesdeben serdeclaradasantesdelasfuncionesquelasusan.Lasvariablesglobalesnosedestruyenhastaqueno haterminadolaejecucióndelprograma
1.3.3
ASIGNACIÓNDEVARIABLES
Hastaahorasolohemosdiscutidodecómodeclararunavariableenunprograma,nodecómo asignarleunvalor.Asignarleunvaloraunavariableessimple: tipo nombre_de_la_variable=valor;
Unaasignacióndevariableesunasentenciadebemosincluirelpuntoycomaalfinal.Unejemplode asignacióndevaloraunavariableenteraes. count= 100;
el valor 100 es llamado constante. En C existen muchos tipos de constantes. Un carácter constante siempreesta entre comillas comopodríaser ‘M’Los números enteros se utilizancuando asignamos valoresavariablesint.Losnúmerosencomaflotantesseusanparaalmacenarvaloresdenúmeroscon comadecimal.Porejemplodecimossiqueremosalmacenar100encomoflotante,tenemosqueescribir 100.00 Enunavariablesepuedealmacenarelvalordeotravariable,elsiguienteprogramamuestraunejemplo deesteasignación. main() { int i=0; int j=1; j=i; }
1.3.4
TIPOSDECONVERSIONES
EllenguajeCtepermitemezclardiferentestiposdedatosenunaexpresión,comoporejemploel siguientefragmentodecódigo: char ch= ‘0’; int i=15; float f=25.6; resultado doble=ch*i/f
Lamezcladetiposdedatosesgobernadaporunaestrictaconfiguracióndereglasdeconversiónquele dicenalcompiladorcomoresolverlasdiferencias.Laprimerapartedelasreglasdeconfiguraciónesel tipodepresentación Envezdepermitiralcompiladorquehagaestostiposdeconversión,túpuedesespecificareltipode conversiónusandoelsiguienteformato (tipo)valor;
Estocausauncambiotemporalenlasvariables. tipo esuntipodevariablevalidoparaCcomo char, int, etcyvaloreslavariableoconstantequequieresermodificada. Ejemplo main() { float f
printf(“%d”,int(f)) }
1.4.
FUNCIONES
LasfuncionessonlosbloquesmásbásicosdelaprogramaciónenC.Todaslassentenciasdeben irdentrodeunafunción.Enestecapitulodiscutiremoscomopasarargumentosaunafunciónycomo recibirargumentosdeunafunción. 1.4.1
PASARARGUMENTOSAUNAFUNCIÓN Vamosavercomodeclarareinvocarafuncionesenunprogramaporejemplo:
main(){ f1() } f1(){ return1 }
Enrealidadesteprogramaproduceunerrorocomopocounwarning.Enrealidadlafunciónf1debeser declaradaantesdeserusada,aligualquelasvariables.SituquieresusarunafunciónestandartdeC, debesincluirunarchivoheaderalprincipiodelprograma.Siestasusandounadetusfunciones,tendrás dosmanerasdecorregirelerror;unaesusarfuncionesprototipocomoveremosdespuésyotraes reorganizartuprogramaasí: f1(){ return1 } main(){ f1() }
Nosegeneraráerrorporquelafunciónestádefinidaantesqueelmain
1.4.2
FUNCIONESPROTOTIPO
Haydosmétodosparainformaralcompiladordeleltipodedatoquequieresquedevuelvala función,unoes: tipo nombre_funcion;
Porejemplolafunciónintsumaledicealcompiladorqueeltipodedatoquedevuelveesunentero. Otramaneradeindicaralcompiladorquetipodedatoquieroquedevuelva,eslafunciónprototipo. Una función prototipo no solo nos da el dato, sino también los números y tipos de argumentos que la funciónacepta.Elprototipodebecoincidirconladeclaracióndelafunción. Elformatogeneraldelafunciónprototipoeselsiguiente: tiponombre_funcion(tipovariable1,tipovariable2,tipovariable3) Enelejemploanteriorcadavariablepuedeserdeuntipo. Enelsiguienteejemploelprogramacalculaancholargoyalto #include 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;
} Notaquereturnusaunaexpresiónenvezdeunavariableounaconstante.Hastaahora,conprogramas pequeños,lasfuncionesprototiponosonmuyimportantes,siembargoamedidaquelosprogramasse vayanhaciendomásgrandes,lasfuncionesprototiposeránútilesalahoradedepurarerrores. Unaexcepciónes cuandounafunciónno tieneningúnparámetrodeentradao de salidaentoncesse dicequeesunafunciónnothingvoid:void, Unejemplodeestopodríaser: #include double pi (void)//defines la función { return 3,1415926536// con pi devuelves…. } main() { double pi _val; pi_val=pi; printf(“ %d\n”,pi_val); }
1.4.3
USANDOARGUMENTOSDEFUNCIONES
Unaargumentodefunctionesunvalorquepasaalafuncióncuandolafunciónlollama.C permite argumentos desde 0 a cualquier valor. El número de argumentos que puedan pasar a una función depende del compilador.pero el ANSCIC standart especifica que una funciónpuede aceptar hasta31. Cuando definimos una función declaramos variables especiales que podrían recibir un valor, estas variables sondeclaradascomo parámetros formales, losparámetros son declarados entre paréntesis seguidodelnombredela función. Porejemplola siguientefuncióncalculae imprimelasumade dos númerosenterosquesonenviadosalafuncióncuandoestaesllamadas. sum (int a, int b); printf(“%d\n, a+b);
Unejemplodecomolafunciónpodríaserllamadaenesteprogramaes #include 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,elcompiladorcopiarádentrodecadaargumentoelvalordeayb.Es importanterecordarquelosvalorespasadosalafunciónselesllamanargumentosylasvariablesayb sonlosllamadosparámetrosformales 1.4.4
USANDOFUNCIONESPARADEVOLVERVALORES
AlgunasfuncionesenCpuedendevolvervaloresenlasrutinasdellamadaaesafunción.Las funcionesquedevuelvenvaloressesuelenescribirdelasiguientemanera tipo nombre_funcion(parámetros formales) { //sentencias return valor; } Tipoeseltipodededatodelvalorquedevuelvelafunción“returnvalor”.Unafunciónpuededevolver
cualquiertipodedatoexceptounarray.Sinoseespecificaningúntipodedatolafuncióndevuelveun entero“int”.Ejemplodefunciónquedevuelveunvalor. #include #include
Esteprograma llama a la función sqrt que devuelve un resultadoen coma flotante. Estenúmero es asignadoalavariableresultado.Incluimoselheadermath.hquetienelainformaciónparaelcompilador delafunciónsqurt(). Esimportantequepongaselmismotipodedatoparalavariablealacuallafunciónasignaundatoyel valorquesedevuelve.Lomismoocurreparalosargumentosqueenvíasaunafunción. Elformatogeneralparadevolvervaloresdesdeunafunciónes return nombre_variable;
dondenombre_variable esunaconstante,variableoalgunaexpresiónquetengalosmismostipos 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,lassentenciasdespuésdelreturnnoseránejecutadas.lasentenciareturnnoseutilizapara asignardatosavariablesoparaserusadaenunaexpresión.
1.5
OPERADORES DE C
EnellenguajeClasexpresionesjueganunpapelimportante.LaprimerarazónesqueCdefine muchos más operadores que otros leguajes. Una expresión es una combinación de operadores y operando. En muchos casos los operadores de C siguen las reglas del algebray pueden parecernos familiares.
1.5.1
OPERADORESARITMETICOS
EnellenguajeCsedistinguen5tiposdeoperadoresaritméticosoperacionesdeadicción substracción,multiplicacióndivisiónymódulo. Signo =
Nombre Asignación
Ejemplo Y=X
+
Suma
X+Y
-
resta
X-Y
* / %
Multiplicación División Módulo
X*Y X/Y X%Y
Definición Pone en Y el valor deX Suma el valor de X masY Resta el valor de X a Y Multiplica X por Y Divide X entre Y Nos da el resto de la divisióndeXentreY
Losoperadores+,-,*y/sepuedenusarconcualquiertipodedato,elmódulosolosepuedeusarcon enteros.Eloperadormodulo%nosdaelrestodeunadivisiónentera Eloperador–puedeusarsededosmaneraslaprimeracomooperacióndesustracciónylasegunda comoelopuestodeunnúmero.Porejemplo a=a-b//operacióndesustracción a=-a//opuestodeuna Los operadores aritméticos pueden ser utilizados con una combinación de variables constantes. Por ejemplo result=count-163; Enel lenguaje Ctambiénpueden usarsealgunos tipos deformas abreviadas, porejemploa=a-bes lo mismoquea-=b,estemismométodopuedeusarsecon+,*,y/ a=a+b a=a-b a=a/b a=a*b a=a%b a=a<>b a=a&b a=a|b
a+=b a-=b a/=b a*=b a%=b a<<=b a>>=b a&=b a|=b
a=a^b
a^=b
1.5.2.
OPERADORESRELACIONALES
LosoperadoresrelacionalesenCcomparandosoperadoresydevuelvenunvalorfalsoo verdaderobasadoenlacomparación.Losoperadoresrelacionalesson: Operador ==
Nombre asignción
Ejemplo X==Y
¡=
No es igual a
X¡=Y
<
Menor que
X
>
Mayor que
X>Y
<=
Menor o igual que
X<=Y
>=
Mayor o igual que
X>=Y
Definición Verdadero si X es igualaY Verdadero si X es distintoqueY Verdadero si X es menorqueY Verdadero si X es mayorqueY Verdadero si X es menoroigualqY Verdadero si X mayor oigualqueY
Losresultadosdecualquieroperaciónderelaciónsiempreserá0ó1.Cdefinecomoverdaderocualquier valorquenosea0ycomofalsoal0. Ejemplos: var>15//sivaresmenoroigualque15elresultadoes0(falso) var!=15//sivaresmenoromayorque15elresultadoes1(verdadero)
1.5.3.
OPERADORESLÓGICOS
LosoperadoreslógicossonlosoperadoreslógicosbásicoAND,ORyNOT,denuevoestos operadoresdevuelvenun0paraloscasosfalsosyun1paralosverdaderos,latabladeverdadparaeste tipodeoperadoreses:
P 0 0 1 1
Q 0 1 0 1
AND P&&Q 0 0 0 1
OR P||Q 0 1 1 1
NOT !P 1 1 0 0
Losoperadoreslógicosyrelacionalesestánfuertementerelacionadosentresícuandoevaluamosuna expresión count>max ||!(max==57)&& var>=0
Estetipoderelacioneslasestudiaremosjuntoconlassentenciasdecontroldeflujo.
1.5.4.
OPERADORESANIVELDEBITS
Ccontieneseisoperacionesquerealizanoperacionesbitabitennúmeros.Estosoperadoresa niveldebitsolosepuedenusarconlostiposdedatosenterosy caracteres.Losoperadoresanivelde bitsson: & | ^ ~ >>
AND a nivel de bit OR a nivel de bit XOR a nivel de bit opuesto Desplazamiento de bit a la derecha
<<
Desplazamiento de bit a la izquierda
Elformatogeneralparautilizardesplazamientosdebites: variable>>expresión variable<
1.5.5.
MEZCLANDOTODO
sum=a+b++ sum=a+b-sum=a+ ++b sum = a+ --b
sum=a+b b=b+1 sum=a+b b=b-1 b=b+1 sum=a+b b=b-1 sum=a+b
1.5.6 OPERADORESDEINCREMENTOODECREMENTO Comopuedesincrementarodecrementarunavezunavariable?Probablementeunadeestas sentenciastevengaalacabeza,a=a+1ób=b+1 LosqueinventaronChicieronunanotaciónreducidaparahaceresto 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 operación a+b*c que operación ocurriráprimero. ¿Suma o multiplicación?El lenguajeC respeta laprecedenciade cada operador. la siguientetablamuestraelorendeprecedenciadesdeelmásaltoalmásbajo
Algunosdeestosprogramasnosehancomentadoaún.Algunosdeellosloseránmásadelante.
1.6.
SENTENCIASDECONTROLDEFLUJO
Enestecapítulovamosaverlassentenciasdeflujoparaelcontroldeunprograma. Mostraremostambiéncómoseusanlosaperadoresrelacionalesylógicosenestassentenciasdecontrol deflujo. 1.6.1
IF
lasentenciaifesunasentenciacondicional.elbloquedecódigoasociadoalasentenciaifes ejecutadobasándoseenelresultadodeunacondición.denuevocualquiervalorquenoseaceroes verdadycualquiervalorqueseaceroesfalso.Elformatomássimplees if(expresión) sentencia;
La expresión puede ser cualquier expresión valida de C. La sentencia if evalua elresultado de la expresiónsegúnseaverdaderoofalso.Sielvaloresverdaderolasentenciaesejecuatada,mientrasque siesfalso,elprogramacontinúasinejecutarlasentencia.Unejemplosimpledeestoes. if(num>0) printf(“el número es positivo\n”);
Esteejemplomuestracomoseusanoperadoresrelacionalesensentenciasdecontroldeflujo. Lasentenciaiftambiénpuedeusarseconunbloquedesentencias.comoelsiguienteejemplo: if(expresión) { sentencia }
loscorchetes{}seutilizanparaenglobartodounbloquedecódigo.Silaexpresiónesverdaderase ejecutatodoelcódigoentrecorchetes Losoperadoresdecomparaciónqueseusanensentencias ifson:
1.6.2.
SENTENCIASIF-ELSE
SeutilizaráunaestructuraIF ELSECuandotienesdosbloquesde códigoquese basanen una salidadeuna expresión.Sila expresiónesverdadse ejecutarála primerapartede,perosi esfalsase ejecutarálasegunda.ElformatoprincipaldeunasentenciaIFELSEes: if(expresión) sentencia1; else sentencia2;
ElformatogeneraldeIFELSEqueusamásdeunalíneadecódigoes: if(expresión) { sentencia } else { sentencia }
Nota: Las sentencia if o else pueden tener todas las sentencias que necesites Los corchetes se puedenomitircuandosolotenemosunasentenciaparaif oparaelse EllenguajeCtieneunmétodoparacombinarvariasestructurasifelseparatomarvariasdecisiones.el formatogenerales if(expresión) { sentencia } elseif(expresión){ sentencia } elseif(expresión){ sentencia } else { sentencia } if(num==1) { printf(“tienes un } elseif(num==2) { printf(“tienes un } elseif(num==3) { printf(“tienes un } else { printf(“no tienes }
1\n”);
2\n”);
3\n”);
nada\n”);
1.6.3.
BUCLEFOR
Elbucle foresunadelastressentenciasqueseutilizanenCsitutienesunasentenciaouna configuracióndesentenciasquequieresrepetir,conunbucle for sepuedeimplementarestetipode estructuras.Elformatodelbucle for es: for(inicialización :condición:incremento)
Enlaseccióndeinicializaciónseutilizaparadarleunvalorinicialalcontadordelbucle.Lavariabledel contadortienequeserdeclaradaantesdequeelbucle for lause..Enestasecciónelbucle fores solo ejecutado unavez.Lacondiciónesevaluadaantesdecadaejecucióndelbucle. Normalmenteen estasecciónseevalúa,lavariabledelbuclecontadorparaversiesfalsooverdadera.Silacondiciónes verdad el bucle es ejecutado. Si la condición es falsa se sale del bucle y el programa continua su ejecución.Enlaseccióndeincrementodelbucle for normalmenteseincrementalavariabledelbucle contador. Esteesunejemplodeunbuclefor #include void main (void) { int i; for(i=0; i<10; i++) printf(%d”,i); printf(“hecho”); }
Este programaimprimenúmerosdel 0 al 9 enla pantalla. Elprograma trabaja así. Primero inicializamosacerolavariableelcontador,i,acontinuaciónseevalúalaexpresióni<10silasentenciaes verdadera se ejecuta la sentencia printf(%d”,i); después de haber ejecutado cada vez la sentencia printf(“%d“,i);seincrementalavariabledelbuclecontador.Esteprocesocompletocontinuahastaque laexpresióni<10llegaaserfalsa.Enestepuntosesaledelbucleforylasentenciaprintf(“hecho”);se ejecuta. Como ya seha indicado al principio decada iteraciónse comprueba lacondición, por lotanto sila condiciónesfalsaalempezarelbucle for noseejecutaránunca.
1.6.4.
WHILELOOP
OtrosdelosbuclesdeCeselbucleWhile.Mientrasunaexpresiónesverdadera,elbucle whilerepiteunasentenciaobloquedecódigo.deahívieneelnombrewhile. Esteeselformato general. while(expresión) sentencias;
OR while(expresión) { sentencias; }
Expresiónescualquierexpresiónvalidaenc.Elvalorexpresiónescomprobadoencadaiteracióndela sentenciaodelbloquedecontrol.Estosignificaquesilaexpresiónesfalsalassentenciasobloquede códigonoseejecutan.Aquítenemosunejemplodebuclewhile #include #include void main (void) { char ch printf(“dame una q\n”); ch=getche(); while(ch!=´q´)
ch=getche(); printf(“consigue una q!\n”); }
Tedaráscuentaquelaprimerasentenciatepideuncarácterporelteclado.Entoncesseevalúala expresión.Siemprequeelvalordelavariablechnoseaunaq.Elprogramacontinuaráhastaque obtengaotrocarácterporelteclado.Unavezqueseintroduceunaqatravésdelteclado,seejecutara lasentenciaprintf()yelprogramaterminará
1.6.5.DO-WHILELOOP Elultimobucleeneselbucledo.Aquítenemosunacombinacióndedoywhile.Elformato generales: do { sentencias } while(expresión)
Enestecasolassentenciassonsiempreejecutadasantesquelaexpresiónseaevaluada.Expresión puedesercualquierexpresiónvalidaenC Mostramosunejemplodeunbucledo-while #include #include void main(void) { char ch; do { ch=getche(); while(ch !=´q´) printf(“dame una q\n”); } }
1.6.6. PROGRAMASDECONTROLDESENTENCIASANIDADOS Cuandodentrodelcuerpodeunbucletenemosotrobucle.Sedicequeelsegundobucleestaanidado dentrodelprimerbucle.ElestándarANSIdeCespecificaqueloscompiladorespuedentenerhasta15 niveles de anidamiento. Además muchos compiladores tienen virtualmente niveles ilimitados de anidamiento.Unejemplodeanidamientodeunbucleforpodríasereste: i=0; while(i<10) { for(j=0;j<10;j++) printf(“%d”,i*10+j); i++; }
Estecódigoimprimeporpantallalosnúmerosdel00–99enpantalla.
1.6.7.
SENTENCIABREAK
Lasentenciabreakpermitesalirdecualquierbucledesdeunpuntodeterminadodelprograma. Lasentenciabreakhaceunbypassenlaejecuciónnormaldelprograma.Cuandoelprogramaencuentra lasentenciabreakhaceunsaltoalasiguientesentenciadespuésdelloop. Porejemplo: #include void main(void) { for(i=0;i<50;i++) {
printf(“%d”,i); if(i==15)break; } }
Esteprogramaimprimiráporpantallalosnúmerosdel0al15enlapantalla.LasentenciaCtrabajacon todoslosbuclesdeC.
1.6.7.
SENTENCIACONTINUE
Seasumequecuandosecumpleunaciertacondiciónelunbucle.Tupuedessaltaralfinaldel buclesinsalirdeél.Paraello,Cestaprovistodeunasentenciacontinue.Cuandoelprogramaencuentra estasentenciasaltarátodaslassentenciasentrecontinueyellacondicióndelbucle.Porejemplo: #include void main(void) { int i; for(i=0;i<100;i++) { continue; printf(“%d”,i); } }
Estebuclejamásejecutaelprintf().Cadavezqueelcontinueesactivado,elprogramasaltaelprintf()y evalúalaexpresióni<100. Uncontinuecausaráqueelprogramavayadirectamentealacondiciónenlosbucles for, while y do while . En un bucle for, un continue provocará que se produzca el incremento y que la condicióndeltestseaevaluada
1.6.8.
SENTENCIASWITCH.
Lasentenciaif esbuenaparausarunpardealternativas,peropuedellegaraserengorroso cuandoexistenvariasalternativas.ParaelloellenguajeCponeadisposiciónunasentencia switch . Unasentencia switch esequivalenteamultiplesif else .Laformageneraldeun switch case es: switch(variable) { case costante1: sentencias; break; case constante2: sentencias; break; case constantan: sentencias; break; default: sentencias; }
Lavariablees comprobada sucesivamenteen unalista deconstantesenteraso caracteres. cuandose 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 ejecutalas sentencias asociadas a default.Eldefaultesopcional.Unejemplode switches #include #include main() { char ch for(;;) {
ch=getch(); if(ch==´x´) return0; switch(ch) { casse´0´: printf(“Lunes/n”); break; case´1´: printf(“Martes\n”); break; case´2´: printf(“Miercoles\n”); break; case´3´: printf(“Jueves\n”); break; case´4´: printf(“Viernes\n”); break; case´5´: printf(“Sabado\n”); break; case´6´: printf(“Domingo\n”); break; default printf(“Entrada no valida\n”); } } }
Esteejemploleenúmerosentreel1yel7.Sielnúmeroestafueradeesterangoseimprimiráelel mensaje“entradanovalida”.Losvaloresdentrodeesterangoseconvertiránendíasdelasemana ElestándarANSIafirmaqueuncompiladordeC puedesoportarhasta257sentenciascase.Nopuede haberdossentenciascaseconelmismovalorenelmismoswitch .Tambiénlosswitchessepueden 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 while exigenqueaparezcaunasentenciaenelcuerpo desentencias.Lasentencia null esmuyútilparaestoscasos.Porejemplo: for(i=0; i<10:line[+++]=0) ;
En este ejemplo la expresión de incremento para el bucle line[+++]=0 inicializa los 10 primeros elementosdelalíneaa0.Elcuerpodesentenciasesunnull yaquenoserequiereningúncomando más
1.6.10. SENTENCIARETURN La sentencia return termina laejecuciónde una funcióny devuelve elcontroldel programaa la rutinadellamada.Unvalorpuedeserdevueltoalarutinadellamamientosiserequiereperosiunoes omitidoelvalordevueltoesindefinido.sinoseincluyelasentencia return enlafuncióndellamada elcontroldelprogramaesdevueltoalarutinadellamadacuandoseterminalaejecucióndelaúltima líneadecódigoSinoserequiereunvalordedevolución,declaramoslafunciónparaquenosdevuelva 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 Enprimerlugarvamosaexponeralgunosformalismosinteresantesybásicosparalaprogramaciónde cualquierlenguajebasadoenC NOMBRESqueencajenconsufunción Esrecomendableusarnombresapropiadosquerepresentenloquevahacerdentrodelprograma.Se sueleusarnombrescompuestosparahacerelcódigomáslegible
Porejemplo: DetectorInterioresesmásfácilqueDETECTORINTERIORES LLAVES Lasllavesseusanparadelimitarlassentenciasdentrodeunsentenciasdecontroldeflujo,comoelque sigue. if (condición){ //sentencias }
Otambiénsepuedeusar if (condición) { //sentencias }
TABULACIONESYSANGÍA Usalassangríasparamostrarunaestructuralógicadelprograma. LONGITUDDELINEA Manténlaconfiguracióndelíneaen78caracteresparaqueseancompatiblesconmonitorese impresoras FORMATOELSEIF Usaelformatoelseifparacubrirmascondiciones if(condición1) { //sentencias } elseif(condición2) { //sentencias2, si no se da condición1 y si se da condición2 } else //sentencias3 si no se dan condición1 ni condicion2
FORMATODECONDICIONES Cuandoelcompiladorlopermitaponelvalordelaconstantealaizquierdadelacomparaciónde igualdad/desigualdad.Porejemplo If(6== ErrorNum)…
INICIALIZATODASLASVARIABLES Inicializatodaslasvariablesaunvalorconocido.Paraevitarquesehaganflotantesoaleatorias COMENTARIOS Loscomentariossonlaotrapartedelahistoriaqueestasescribiendo.Sirvenpararecordar dentrodeuntiempocomofuncionaelprogramaquehasescrito.Usacomentariosparamarcaráreas decódigoqueseterminarándespués,erroresdepuradosofuturasmejoras
PARTE2:ELCDEARDUINO 2.1 PRIMEROSPASOSCONARDUINO:ESTRUCTURADEUNPROGRAMA VamosaprocederacompletarlainformaciónanterioryailustrarconprogramasbasadosenIDE (IntegrateddevelopmentEnviroment)deArduino En programaciónen el entorno de Arduino existe una estructura claramente diferenciada dentro de cada programa. Esta estructura divide a cada programa en dos “funciones”, que veremos a continuación, void setup y void loop . Antesdelvoidsetupsepuedendefinirconstantesquelasutilizaremosparadarnombresalospinesque usemoscomoentradas/salidas.Tambiénsedefinenyseinicializanvariableslascualescambiaránsu valoralolargodelaejecucióndelprograma Lasdosbarras“//”sirvenparainsertarlíneascomentariosdentrodelprograma. Vamosaintentarrealizarunprogramabásicoqueseaencenderyapagarunledparaellocreamosun pseudocódigo: //Aquí podemos definir variables y constantes Void setup(){ //definimos los pines como entradas o salidas } Void main(){ //apagamos y encendemos el led mediante funciones }
Posteriormenteretomaremosesteejemploparacompletarlo 2.1.1
VOIDSETUP.
Enesta partede laestructura, elcódigoque seinserte aquí solo será ejecutado una vez al inicializarelprograma.Sirveparainicializarvariables,configurarlospinescomoentradaosalida,llamar alibrerías… void setup() { pinMode(pin13, OUTPUT);//configure el pinX como salidas }
2.1.2
VOIDLOOP.
Elvoidloopeslapartedelprogramaquecomosunombreindicaesunbucleinfinito,lo utilizamosparaescribirelcuerpodelprograma:sentencias,bloques,etc.( 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
FUNCIONESDEUSUARIO
Unafuncióndeusuarioesunatareaprogramadaquepuedeserejecutadatantasvecescomo queramosdentrodelvoidloop.Paraellotendremosquedefinirlaalprincipio,antesdelvoidsetup
Puedeserdevariostiposintovoiddependiendoaltipodevalorqueestéasociada
Lafuncióntipointdevuelveunvalornuméricodetipoentero Lafunciontipovoidesunafunciónvaciaporlotantonodevuelveningúnvalor SINTAXIS Paraelcasodefunciónint int nombredelafuncion (parámetros) { //sentencias } void setup(){}//vacio void main() { nombredelafuncion();//llamada a la función }
Oparaelcasodedefuncióntipovoid,Esteeselcasomascomúnconsalidasyentradasdigitales void nombredelafuncion () { //Sentencias } void setup(){}//vacio void main() { nombredelafuncion();//llamada a la función }
2.1.4
FUNCIONESDELCOMPILADOR
EnellenguajedeArduinovienenimplementadasalgunostiposdefuncioneslasmásusualesy lasqueutilizaremosson: FUNCIONESPARAELMANEJODEENTRADASYSALIDAS
pinMode() Funciónempleadaparaconfigurarlospinescomoentradasosalidas pinMode(pin, modo)
pin:númerodelpinquequeremosconfigurar modo:INPUTseempleaparaconfigurarlospinescomoentradasyOUTPUTcomosalida Ejemplo pinMode(pin13, OUTPUT);//configure el pinX como salidas
DigitalWrite() EscribeenunpindigitalunvalorHightolow Digitalwrite(pin,valor)
Pin:númerodelpin Valor:HIGHoLOW Ejemplo
digitalWrite(pin,HIGH);//pone a nivel alto la salida pin
digitalRead() Permiteleerelvalordeunpindigitalespecificado digitalRead (pin);
devuelveHIGHOLOWsegúncorresponda Ejemplo digitalRead(pulsador);//leeelestadodelaentradaalaquehemosllamadopreviamenteledPinnos devuelveunvalorHIGHoLOW Usualmentecolocamosestevalorenunavariable Ejemplo EstadoPulsador=digitalRead(pulsador); FUNCIONESDETIEMPO
Delay() Haceunapausaenuntiempodeterminadoexpresadoenmilisegundos.duranteestetiempoel programanohacenada,nopudenileerentradas,hacersalidas,niejecutarningúncomandoofunción delay(ms) Ejemplo: delay(1000);//haceunapausaenelprogramade1segundo.
Milis() Devuelveeltiempoenmilisegundosdesdequeelprogramaseinició.Estafunciónesusadaparahacer retardosennuestrosprogramasatravésdeunbucleparaquepodamoshacerotrastareasalmismo tiempo,cosaquenopodíamoshacerconlafuncióndelay() Ejemplo //Constantes no cambian, las usamos para configurar los pines de //salida en este caso const int ledPin = 13; //el número del pin que tine //conectado un led en arduino /variables que cambiarán int ledState = LOW; // ledState es una variable para //configurar el led long previousMilli s = 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 entrón 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 if (ledState ledState = else ledState =
esta apagado se enciende y vice-versa: == LOW) HIGH; LOW;
//Pone en el pin de salida el estado de la variable: digitalWrite(ledPin, ledState); } }
2.1.5
LLAVES
Lasllavesseusanparadelimitarlassentenciasdentrodeunbloquedecontroldeflujo,queveremos masadelante
2.1.6
PUNTOYCOMA
Elpuntoycomaseusacomúnmentecuandohacemosusodealgunasentencia,sinohacemosuso delpuntoycomaalahoradecompilarelprogramanosdevolverá“errores”debidoamalasintaxis.
2.2 VARIABLES Lasvariablessonespaciosdememoriadedicadosaalmacenarunciertovalor.Losdistintosbloques decontroldeflujo,sentencias,etc.Serelacionanatravésdevariablesqueusaelprogramaparasu funcionamiento. int variableX =0;//inicializa una variable entera a 0 variableX=digitalRead(pin);//le asigna el valor que tiene pin a la variableX
Enellenguajedearduinolasvariablespuedentomarunaseriedevalores,segúndequétiposeanestas variables HIGH-LOW:HightseempleaparadefinirlasalidadeunpinporNivelaltoyLowpornivelbajo INPUT-OUTPUT:INPUTseempleaparaconfigurarlospinescomoentradasyOUTPUTcomosalida
2.2.1
DECLARACIÓNDEUNAVARIABLE
Lasvariablessolemosdeclararlasantesdelvoidsetupcuandosondeámbitoglobal.Las variablessuelenserdetipoint(Entero),long(largas)ofloat(encomaflotante).Lasvariablesdebenser inicializadasensudeclaraciónparaevitarqueelcompiladorlasdejealeatoriasoflotantes 2.2.2
AMBITODEUNAVARIABLE
LasvariablesenlenguajeC,elcualusaarduino,tienenunapropiedadllamadascope,en contraposicióndeotroslenguajescomoBASICenlasquetodaslasvariablessonvariablesglobales. Unavariableglobalesaquellaqueestásiendovistaporcualquierfuncióndentrodelprograma.Las variableslocalessolosonvistasporlafuncióndondefuedeclarada.Enelentornodearduinocualquier variabledeclaradafueradeunfunciónesunavariableglobal Cuandounprogramasehacelargoycomplejolasvariableslocalessonútilesparasaberqueuna variablelocalsolovaaserusadaporlafuncióndondefuedeclarada.Estonosevitamuchoserrores porqueotrasfuncionesnovanamodificarelvalordeestavariable. Ejemplo //i es una variable de ambito local for (int t, i<100,i++) { //sentencias
} Nota:Alahoradeutilizarvariableseninterrupcionesexternasdeberanserdefinidasdeambitoglobal comovolátil.
2.3 TIPOSDEDATOS LosprincipalestiposdedatosenCson: Charvariable8bitentero Intvariable16bitentero Longint32bitentero Enocasioneslostiposdedatospuedensermodificadospor“unsigned”quemodificalasvariablescomo sigue Chara//rangoentre-128…0…127 Unsignedcharb//rangoentre0,1,2….255 Amododeresumen: Tipo de variable Bit Char Unsigned char Signed char Int Unsigned int Short int Unsigned short int Long int Unsigned long int Float
Número de bits 1 8 8 8 16 16 16 16 32 32 32
rango 0a1 -128 a 127 0 a 255 -128 a 127 -32768 a 32767 0 a 65535 -32768 a 32767 0 a 65535 -2147483648 a 2147483647 0 a4244967295 3,4E-38 a 3,4E38
Doublé Long doublé
64 80
1,7E-308 a 1,7 E+308 3,4 E -4932 a 3,4 E 4932
2.4 ARITMETICA Laaritméticaseusaparahaceroperacionesentrelasdistintasvariablesquepuedatenerel programa.Puedeserdecuatrotipos:Suma,restamultiplicaciónydivisión. Hayqueprestaratenciónconquétipodevariableestamosoperando,porejemplo,sioperamosdos variablesdetipo“int”elresultadoseráun“int”yasisucesivamente.Tambiénpuedeexistir desbordamiento,porejemplosialoperarestasdosvariablesnosdevuelveunnúmeromayor16bit,es decir,mayorque32628 2.5 OPERADORESARITMÉTICOS Signo =
Nombre Asignación
Ejemplo Y=X
+
Suma
X+Y
-
resta
X-Y
* /
multiplicación división
X*Y
Definición Pone en Y el valor deX Suma el valor de X masY Resta el valor de X a Y Multiplica X por Y Divide X entre Y
2.6 OPERADORESCOMPARATIVOS Operador ==
Nombre asignción
Ejemplo X==Y
¡=
No es igual a
X¡=Y
<
Menor que
X
>
Mayor que
X>Y
<=
Menor o igual que
X<=Y
>=
Mayor o igual que
X>=Y
Definición Verdadero si X es igualaY Verdadero si X es distintoqueY Verdadero si X es menorqueY Verdadero si X es mayorqueY Verdadero si X es menoroigualqY Verdadero si X mayor oigualqueY
2.7 ASIGNACIONESCOMPUESTAS Asignación x ++
Nombre Incremento de X
Ejemplo x ++
x --
Decremento de X
x --
x += y
Incremento de x en y
x += y
x -= y
Decremento de X en Y
x -= y
x *= y
Multiplicación de X por Y
x *= y
Definición igual que x = x + 1, o incrementarxen+1 igual que x = x - 1, o decrementarxen-1 igual que x = x + y, o incrementraxen+y igual que x = x - y, o decrementarxen-y igual que x = x * y, o
yelresultadose almacenaenX División de X entre Y y el resultadosealmacenaen X
x /= y
multiplicarxpory x /= y
igual que x = x / y, o dividirxpory
2.8 OPERADORESBOOLEANOSDECOMPARATIVOS Estetipodeoperaciónseutilizaenbloquesdecontroldeflujocomoif,paracomparardosexpresiones Asignaci ón &&
||
!
Nombr e produc to lógico suma lógica
Ejemplo
Definición
If(digitalRead(Detectordeinteriores)==HIGH)& &(digitalRead(Detectordeexteriores==LOW)
ciertosilosonlosdoscomandos, 0sialgunodelosdosnoescierto
If(digitalRead(Detectordeinteriores)==HIGH)|| (digitalRead(Detectordeexteriores==LOW)
Negaci ón
X!
falsosialgunolosdoscomandos sonciertos,0sisonlosdos falsos Si X es 1 se ale asigna un 0 y viceversa
2.9 CONSTANTES Lasconstanteslasutilizaremosenprogramacióndigitalparaasignarnombresanuestrasentradasy salidasparahacermáslegiblenuestroprograma,esloprimeroqueescribiremos. Sedenominaporelterminoconstqueespreferibleusara#define.Losvaloresquedefinamoscomo constnopodránsercambiadosalolargodelaejecucióndelprograma SINTAXIS const int ledPin =
13;
// the number of the LED pin
2.10 SENTENCIASDECONTROLDEFLUJO 2.10.1
IF/IF..ELSE:COMPARADORES Laestructuraifcorrespondealaideade“siestosecumplehagoesto”
Ejemplo Podemosutilizarestoparatestearunaentradaysiestaavaloraltodesarrollarunassentencias if (inputPin == HIGH) { // si el valor de la entrada inputPin es alto sentencias1; //ejecuta si se cumple la condición }
Laestructuraif-elsecorrespondealaideade“siestosecumplehagoesto,sinosecumplehagolootro” Ejemplo Elmismocasoqueelanteriorsitenemosunaentradaenvaloraltodesarrollamoslassentencias1sino desarrollamoslassentencias2
if (inputPin == HIGH) { // si el valor de la entrada inputPin es alto sentencias1; //ejecuta si se cumple la condición } else { sentencias2; //ejecuta si no se cumple la condición }
t
s t l s si l
l u l s 3
l u l s …
t d t y u l ó t uót usnt yuóg ugó l t d sl sa ey saq l yu yt “ y t óó ynt l e s / ys yut y gd ne o mt yut q s l t y gd ne ( y gd ne yut t uót “ o mt yut t uót q s l t y gd ne l sl mgl e y t y t y y l u óst ó y o mt t uó t y T if(condición1) { //sentencias1 } elseif(condición2){ //sentencias2, si no se da condición1 y si se da condición2 } else //sentencias3 si no se dan condición1 ni condicion2
3q…Uq3
,
e ó si l at ó y gy n ó ó n usó gl l gd ót I y u ód sl t gl et f g y l u l s yqu l d t y gl I ós e f g sl s s esv d t y l gl s óut I et óys y gd ne e t l s si l r gu d t y e y y l u l s y ( t l usl g si l nót d t y r gu ó esl ó d l ut e I ós e q l I v o ot yut ys e I ós e gd ne l g I t e t l s si l “ y r gu l e y y l u l s y ( y nót e sl ó d l ut gl I v d y ( y yg ysI d l u
for(inicialización;condición;incremento) { //sentencias }
sl s s esv si l y yg e asl só sl s s esv ó e I ós e f g gy ó d t y l e g e t l s si l , t l s si l f g gd nesó e I ós e n ó f g enót mó d y l g l uó l uót e g e sl ó d l ut , t n ó e I et ó e I ós e gl I v ó esv sl u ó si l r d net for (int i=0; i<20; i++) { // declara i, prueba que es menor que 20, incrementa i en 1 digitalWrite(13, HIGH); // envía un 1 al pin 13 delay(250); // espera ¼ seg. digitalWrite(13, LOW); // envía un 0 al pin 13 delay(250); // espera ¼ de seg. }
3q…UqF
,
t d n ó e I et ó gl I ós e t l I óst y / yt yT t I et ó y f g ng só ut d l t yu I ós e q g l t e I et ó y I ós e t sl s t l e gl yt y r gu l e y y l u l s y et r y ó c y gy easl e yt n ó y esó switch(variable){ case (valor1): // Sentencias break; case (valor2):
//sentencias break; default:
e ysmgs l u r d net y gl y g l s eg yq l d t y F e t l u t y e y es FU“F… ( F3q l yt y I sl ó d l u l t e I ós e e yu u l gl t E nut l ebeusd t f g y sl s s esv ót //constantes que no cambiarán 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; } } } }
3q…UqN é z e g e ose y r g si l t l usl g “ y só y r gu d s l uó y y s óut e Enó ysi l f g o ( l uó n óVl u ysyq d t sas si l e Enó ysi l ng y ó s e y y l u l s y enót nst g e “ gl l uó t e ugó gl y l yt ó while (expresión) { //sentencias que se realizan mientras la expresión sea verdadera }
e g e t D ose y smg ef g eDose y eI t f g e y y l u l s y y r gu l enósl snst ( eg mt y t d nóg e t l s si l “nt ó et f g ed l t y y r gu ó l gl I v do { //sentencias } while (condición);
3q…UqC
ó c ysóI n ó y esó gl et f g t l uót e aegrt t d t t “ Dose t at ó“ ót d ns l t e g e l t ód e“ u d sVl y gusesv n ó y esó e et f g yD s o
2.10.6
CONTINUE Continue: Omiteelrestodeiteracionesdeunbucle(do,forowhile)
RETURN Terminaunafunciónyvuelveallugardesdedondefuellamadalafunción GOTO Envíaelcontroldelprogramaaunadeterminadaetiqueta etiqueta: goto etiqueta;
2.11 E/SDIGITAL Vamosamostrarelusodeentradasysalidasdigitalesconelsiguienteprogramaqueapagao enciendeunledconectadoenelled13segúnpulsemosuninterruptorconectadoenelpin2 // constantes que no cambian a lo largo de la ejecución del programa las utilizamos para configurar los pines de entradas y salida const int buttonPin = 2; // número del pin del interruptor const int ledPin = 13; // numero del pin del interruptor // variables que cambiarán int buttonState = 0; interruptor
// variable para leer el estado del
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 interrupciones se usan cuando queremos parar la ejecución normal de un programa e invocaraunafunción.Parapararlaejecuciónnormaldeunprogramalohacemosatravésdeunpinde
entradadigital.Paraelloutilizamosseispinesdisponiblesqueson:lainterrupción0(pindigital1),la1(el pindigital2),la2(elpindigital3),la3(elpindigital21),la4(elpindigital20),la5(elpindigital19),la6( elpindigital18). SINTAXIS attachInterrupt(interrupción, función, modo)
Especificaalafunciónainvocarcuandoseproduceunaintrerrupciónexterna InterrupciónEselparámetroqueindicaelnúmero(2,3,4y5)quehacereferenciaalpindondeseha conectadolainterrupción Función:Funciónqueseinvocacuandoseactivalainterrupción.Estafunciónnodebecontener parámetrosnitampocodevolvernada ModoIndicacuadolainterrupcióndebeseractivada LOW:ParadispararlainterrupciónencualquiermomentoqueelpinseencuentreavalorbajoLOW CHANGESeactivarálainterrupcióncuandoelpindeentradacambiedevalor RISINGParaactivarlainterrupcióncuandoelpincambiedevalordeHIGHaLOW FALLING:activarálainterrupcióncuandoelpindeentradacambiedeLOWaHIGH
PARTE3:PROGRAMACIÓNAVR
3.1
INTRODUCCIÓNALAPROGRAMACIÓNCONAVR
ProgramarenelentornodeAvresunpocomáscomplicadoqueenelentornodeArduino,yaquese tratadeunlenguajeamásbajonivel.Perolafilosofíaeslamisma,puestoqueambosestánbasadosen ellenguajeCanteriormenteexplicadocondetalle,porlotantovamosprocederaexplicarlospuntosen losquesediferenciadeArduino.
3.2
HERRAMIENTAS
ParaestaspracticasinstalaremoselAVRStuido5.0.Lopodemosdescargargratuitamenteenlasiguiente dirección: 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.
ElarchivoHEXsecrearáenlacarpetadondehemosubicadonuestroproyecto 3.2.4
PASO4:DESCARGARELARCHIVOHEX.ALMICROCONTROLADOR
Paraelloloquenecesitas: •
•
Arduino2560 CableUSB
Software •
WinAVREstesoftwarecontieneelavrdude,elcualesnecesario
Asegúrate de usar el puerto COM correcto. Para ello haz doble clik en MIpc/administrador de dispositivos/propiedades/hardware.AnotamoselpuertoCOMqueestamosutilizandoenPuertosCOM YPLC. CreamosunacarpetafácilmenteaccesibleparaMS2llamadaporejemploavrenestacarpetavamosa colocar el archivo que queremos subir a nuestro arduino con la extensión .HEX y otra a la que denominaremosprog.BATquecrearemosconelblockdenotas Dentrodeprog.BATincluiremoslossiguientescomandos:
modeCOM23dtr=on avrdude-cstk500v2-pm2560-PCOM23-b115200-Uflash:w:LedDelay.hex Donde –Pesel puertousado,-bes elbaudrate.ces eltipodeprogramador, -pesel mircroprocesdor queestasiendoprogramado,-Ulediceaavrdudedondecolocarelarchivo.HEX AVRdude en un programa que funciona por línea de comando, por lo que debes abrir la línea de comandosdeWindows(Inicio-Ejecutar-"cmd")parapoderusarlo.Unavezabiertoel"cmd",escribe "avrdude" ypresionaEnter.Sila instalaciónestácorrectaentoncessemostraráunalistade opciones disponibles.Conestoestamoslistosparaenviarcomandosqueprogramaránlatarjeta.
3.3
ASPECTOSPRINCIPALESDELAPROGRAMACIÓNENC.
3.3.1
ESTRUCTURADEUNPROGRAMA
Comohemosvisto,todoslosprogramasdeCtienenunaestructuradivididaendospartes;los archivosinclude,dondeseinsertanlosarchivosheaderylaestructuramain()queesdondeelprograma seejecuta Unaposibleplantillaparalaedicióndelosprogramas,asisabremosdondeseencuentracada apartado.Seríalasiguiente //************************************************************************** // // Titulo :Plantilla para programación con AVR // Autor : // Fecha : // Version : 1.0 // Target MCU : Atmel AVR series // //************************************************************************** // ------------------------------------------------------------------------//************************* Inclusión de Librerías ************************* // ------------------------------------------------------------------------#include #include #include #include #include #include "lcd_lib.h" // ------------------------------------------------------------------------//*********************** Definiciones de Variables Globales *************** // ------------------------------------------------------------------------// ************************* Definiciones y Macros ************************* // ------------------------------------------------------------------------// ************************ Rutinas de Interrupción ************************ // ------------------------------------------------------------------------// ************************* Declaración de Funciones ********************** // ------------------------------------------------------------------------// **************************** Cuerpo del Programa ************************ // ------------------------------------------------------------------------int main( void ) { // ------------------------------------------------------------------------// ********************** DECLARACIÓN DE VARIABLES ************************* // ------------------------------------------------------------------------// ------------------------------------------------------------------------// ************** CONFIGURACIÓN DE LOS PUERTOS DE E/S ********************** // ------------------------------------------------------------------------// ------------------------------------------------------------------------// ********************* INICIALIZACIÓN DE REGISTROS *********************** // -------------------------------------------------------------------------
// // // // // //
****************** HABILITACIÓN DE INTERRUPCIONES *********************** ------------------------------------------------------------------------************** INICIALIZACIÓN DE FUNCIONES Y VARIABLES ****************** ------------------------------------------------------------------------******************** CICLO PRINCIPAL DE EJECUCIÓN *********************** ------------------------------------------------------------------------while (1) { } //Fin while return 0;
} // ------------------------------------------------------------------------//********************* DEFINICIÓN DE FUNCIONES **************************** // -------------------------------------------------------------------------
ComoyaconocemoslosaspectosimportantesdelaprogramaciónenC.Vamosapasaraver cadaunodelospuntosdelaestructuradelprograma
3.3.2
VARIABLESGLOBALES
Lasvariablescomunes,sólosonaccesiblesdesdelafuncióndondeseencuentradefinida,sise requierequelavariableseaaccesibledesdecualquierpartedelprograma,esnecesariodeclararlacomo global. Paraestosimplementesedefineantesdelafunciónmain(). Ejemplo.
Volatile int var_1, var_2; Es aconsejable aunque no obligatorio definir las variables globales como volátiles para indicarle al compiladorquenosobrescribasobreestaposicióndememoria.
3.3.3 EFINICIONESYMACROS: Medianteciertasdirectivassepuedeasignaraalgúnsímbolodefinidoporelprogramadoruna determinadaexpresión. Ejemplos:
#define #define #define #define
3.3.4
s1 2 larger( x, y) ( (x)>(y) ? (x) : (y)) _BV(bit) (1 << (bit)) set_bit(value, bit) (value=((value) | _BV(bit)))
RUTINASDEINTERRUPCIÓN:
Sonfuncionescuyocuerpodefinenloquesedebeejecutarenelmomentoquesepresenteuna determinadainterrupción. Ejemplo.
ISR(TIMER0_OVF_vect) { PORTA=PORTA ^ 0x02; } Noesnecesariohacerunsaltoexplícitoaestafunción,niejecutaralgunainstrucciónderetorno.El nombredelosdiferentesvectoresdeinterrupciónsedefinenenlalibrería.
/* External Interrupt Request 0 */ INT0_vect /* External Interrupt Request 1 */ INT1_vect
/* External Interrup
3.3.5
DECLARACIÓNDEFUNCIONES
Enestecampodebecolocarseladeclaracióndelasfuncionesaemplearconelprototipodelafunción. Ej.:
int mi_funcion(int var1, int var2, float var3);
3.3.6
CUERPODELPROGRAMA
Elcuerpodelprogramasiempreempiezaconlafunciónmain()ydesdedondeelprogramaempiezasu ejecución .
3.3.7
DECLARACIÓNDEVARIABLES:
Lasvariablesquesedefinanaquítienenunámbitolocal,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
INICIALIZACIÓNDEREGISTROS:
Seestablecenlosvaloresdelosregistrosdepropósitoespecíficodeacuerdoconlasconfiguracionesde losdiferentesrecursos.
3.3.10 HABILITACIÓNDEINTERRUPCIONES: Habilitacióndelosdiferentesbitsdeinterrupción Ejemplo:
TIMSK=(1<
3.3.11 INICIALIZACIÓNDEFUNCIONESYVARIABLES Sedebeestablecerelestadoinicialdelasdistintasvariablesyejecutarlasfuncionesde inicializaciónrequeridas. Ejemplo.
LCDinit(); 3.4
INTRODUCCIÓNALLENGUAJEENCPARAELCOMPILADORWINAVR
3.4.1
COMENTARIOS
Loscomentariossoneltextoqueelcompiladorignora,parausarunalíneasimpledecomentariosusa dosbarrasinvertidas.porejemplo.
DDRA=0x00.// Configura el puerto a como salidas Cuandoqueremoshacerunbloquedecomentariosdebemosinicializarlocon/*yterminarlocon*/ 3.4.2
SENTENCIAS
Lassentenciascontrolanelflujouordendeejecucióndelprograma,consistenenpalabrasclave expresionesyotrassentencias.Unasentenciaterminaconunpuntoycoma(;).
DDRB=0XFF;// configura el puerto B como salidas. 3.4.3
BLOQUES
Unbloqueesunconjuntodesentenciasencerradoentreparéntesis{},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 Enocasioneslostiposdedatospuedensermodificadospor“unsigned”quemodificalasvariablescomo sigue
Char a; // rango entre -128…0… 127 Unsignedcharb//rangoentre0,1,2….255 Algunosejemplosdeasignaciones
a = 0xA0; // guarda en a el valor hexadecimal A0 b = ‘1’; // guarda en b el código ASCII de carácter ‘1’ c = 2000ul; //guarda en c un unsigned long integuer 2000 Amododeresumen: Tipo de variable Bit Char Unsigned char Signed char Int
Número de bits 1 8 8 8 16
rango 0a1 -128 a 127 0 a 255 -128 a 127 -32768 a 32767
Unsigned int Short int Unsigned short int Long int Unsigned long int Float Doublé Long doublé
16 16 16 32 32 32 64 80
0 a 65535 -32768 a 32767 0 a 65535 -2147483648 a 2147483647 0 a4244967295 3,4E-38 a 3,4E38 1,7E-308 a 1,7 E+308 3,4 E -4932 a 3,4 E 4932
Signo = + * /
Nombre Asignación Suma resta multiplicación división
Ejemplo Y=X X+Y X-Y X*Y
Definición Pone en Y el valor de X Suma el valor de X mas Y Resta el valor de X a Y Multiplica X por Y Divide X entre Y
Operador == ¡= < > <= >=
Nombre asignción No es igual a Menor que Mayor que Menor o igual que Mayor o igual que
Ejemplo X==Y X¡=Y XY X<=Y X>=Y
Definición Verdadero si X es igual a Y Verdadero si X es distinto que Y Verdadero si X es menor que Y Verdadero si X es mayor que Y Verdadero si X es menor o igual q Y Verdadero si X mayor o igual queY
Asignación x ++ x -x += y x -= y x *= y
Nombre Incremento de X Decremento de X Incremento de x en y Decremento de X en Y Multiplicación de X por Y y el resultadosealmacenaenX División de X entre Y y el resultadosealmacenaenX
Ejemplo x ++ x -x += y x -= y x*=y
Definición igual que x = x + 1, o incrementar x en + 1 igual que x = x - 1, o decrementar x en -1 igual que x = x + y, o incrementra x en +y igual que x = x - y, o decrementar x en -y igualquex=x*y,omultiplicarxpory
x/=y
igualquex=x/y,odividirxpory
x /= y
Estetipodeoperaciónseutilizaenbloquesdecontroldeflujocomoif,paracomparardosexpresiones Asignación &&
!
Nombre producto lógico ANDlogico suma lógica ORlógico Negación NOT lógico
OPERADOR ~
Nombre Operador de bit de Complemento
Ejemplo ~x
|
Operador de bit ORlógico Operador de bit AND lógico
x|y
Definición Cambia cualquier bit de 1 a 0 o viceversa Operación a nivel de bit OR
x&y
Operación a nivel de bit AND
||
&
Ejemplo X&&y X||y
Definición 1sixeyson1.Sicualquieradelosdoses0,el resultadoserá0 0sixoyson0,delocontrarioserán1
X!
Si X es 1 se ale asigna un 0 y viceversa
^
Operador de bit XOR
X^y
<<
Desplazamiento lógico a la izquierda Desplazamiento lógico a la derecha
X<<3
>>
3.6
X>>1
Operador a nivel de bit XOR de x eny Desplazamiento en x de 3 bits a la izquierda Desplazamiento en x de 1 bit a la derecha
CONTROL DE FLUJO
Pordefectolassentenciasseejecutansecuencialmente.Paradirigirelflujodelprogramase puedenutilizarseistiposdecontroladoresdeflujo:
3.6.1 SENTENCIACONDICIONALIF-ELSE SINTAXIS if (expresión) 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(inicialización;condición;incremento) { //sentencias }
3.6.5
SENTENCIASDOWHILE
SINTAXIS
do{ //sentencias } while (condición);
3.6.6 OTRASSENTENCIASDERELACIONADASCONELCONTROLDEFLUJO BREAK breaksirveparasalirdeunbloquedecontroldeflujocomodo,whileofor,rompiendoelbuclenormal, tambiénseutilizaparasalirdelbloquedeswich CONTINUE continue:Omiteelrestodeiteracionesdeunbucle(do,forowhile)
RETURN Terminaunafunciónyvuelveallugardesdedondefuellamadalafunción
GOTO Enviaelcontroldelprogramaaunadeterminadaetiqueta SINTAXIS
etiqueta: goto etiqueta;
3.7
FUNCIONES
LasfuncionesdeCsonsubrutinasquepuedenserllamadasdesdeelprogramaprincipaluotras funciones UnafunióndeCpuedetenerunalistadeparámetrosyproducirunadevolucióndevalores vamosaestudiarlasfuncionesatravésdealgunosejemplos Funcionquecalculaelfactorialdeunnúmero // la función acepta un número de tipo int y devuelve otro número 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 función return 1; }
3.8
ENTRADASYSALIDASDIGITALES
Laplacadearduinotiene12puertosde8bitscadauno.Estospuertosestánnumeradosdesde elpuertoAdeaquíenadelantePA,hastaelpuertoL(PL).Cadapuertoesbidireccional,esdecir,puede serconfiguradocomosalidasocomoentradas. Acontinuaciónexponemosunastablasenlasqueseincluyenlospuertosdisponiblesenelshieldde arduinoparalaspracticas 3.8.1
ENTRADAS
44 45 46 47 48 49 50 51 52
PL5 PL4 PL3 PL2 PL1 PL0 PB3 PB2 PB1
53
PB0
3.8.2
05C5C 05C5B 0C5A T5 ICP5 ICP4 MISO/PCINT3 MOSI/PCINT2 SCK/PCINT1 SS/PCINT0
SALIDAS
22 23 24 25 26 27 28 29 30
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PC7
AD0 PD023 PD024 PD025 PD026 PD027 PD028 PD029 A15
31
PC6
A14
Cadapuertotiene4registrosimportantes: •
•
•
DataDirectionRegister(DDRx) ImputPinAddsess(PINx) DataRegister(PORTx)
DataDirectionRegister(DDRx)Esteregistroseusaparaconfigurarunbitopuertocomounaentradao salida 3.8.3
EJEMPLOSDEMANEJODEENTRADASYSALIDAS(I/O)
EJEMPLO:¿CómoconfiguramoselpuertoApara4entradasy4salidas? DDRA = 0b11110000; // configura pins
DataRegister(PORTx)Seusaparaparaescribirsalidasenelpuerto EJEMPLO:Escribimosu0enelbit6yentodoslosdemásun1
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 expresión anterior PORTB = 0x04; PORTB = PORTB | 0x04; PORTB |= (1<
if ( PINC & (1<
#define _BV( bit ) (1 << (bit)) #define E0 ((variable) & _BV(0)) Test sobre el bit 0