Microsoft PowerPoint - 2 Introduccion C WinAVR Curso [Modo de Compatibilidad]

25
14/08/2014 1 Programación C para AVR Programacion C Escuela Militar de Ingenieria Ing. Germán Pereira Muñoz 07/22/10 Ing. Germán Pereira Muñoz Programacion C para AVR

description

microcontroladores

Transcript of Microsoft PowerPoint - 2 Introduccion C WinAVR Curso [Modo de Compatibilidad]

14/08/20141Programacin C para AVRProgramacion CEscuela Militar de IngenieriaIng. Germn Pereira Muoz07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR14/08/2014207/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR3Herramientas de Programacion Editor Compilador Linker Loader Debugger IntegratedDevelopmentEnvironment Algunas veces solo esuna interface paracomandos basicos:Programmers Notepad[WinAVR]07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR4WinAVR WinAVR es un ejecutable, pertenece a lasherramientas de desarrollo (open sourcesoftware) para Atmel AVR de la serie demicroprocesadores RISC para plataformaWindows. Incluye GNU GCC compiladorpara C y C++. http://winavr.sourceforge.net/14/08/2014307/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR5Comentarios en C /* Comentariosde variaslineas */ //Comentarios para fin de linea07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR6Includes Include es un archivo tipicamente es un archivocabecera que contiene declaraciones #include Es un archivo include de sistema estandar #include "mystuff.h" Archivo include para un proyecto especifico14/08/2014407/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR7Definiciones #define simbolo cualquier asignacion Esto se llama macro Define a cualquier cosa para ser un cadenaestring de texto Ejemplo: #define FALSE 0 #define Cadena hola #define PI3.141607/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR8Prototipos de Funcion(Cabeceras) Las Funciones deben ser declaradas antes de su uso: Una declaracion no es mas que cabecera de la funcion no la funcionen si Las declaraciones de Funcion(cabeceras) puden ser incluidas en unaarchivo include La definicion de la funcion es incluida en el cuerpo de la funcion void function_name(int, float); //cabecera Retorno de tipo es requerido; void significa que no retorna nada Tipos de Argumentos (los nombres no son necesarios, pero se puedeincluir los nombres si se decea)14/08/2014507/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR9Main Cualquier programa C necesita una funcionllamada main Generalmente definida (no declarada)int main(void){int x; //variable localx = add(3, 9); //llamada a funcionreturn 0;} El cuerpo de programa se encuentra entrelaves { } Esta funcion tradicionalmente retorna 007/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR10Otras Funciones Otras definiciones de funcion sonusualmente puestas por debajo de la funcionmain o en un archivo separadoint add(int a, int b){return a+b;}Arguentos pasadospor valor a lafuncion14/08/2014607/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR11Variables Especificado por a tipo, scope, lifetime, y name Tipo con char, int, float, etc Los Tipos especialesde AVR comouint8_t, int16_t, etc Scope son Local (block) declaradas dentro de las funciones Global (file) declaradas fuera de las funciones Program (external) Usadas para enlazar entre varios archivos Lifetime son Automatic (por defecto para variables locales) (en el stack) Static (por defecto para variables globales y de programa) (en la ram) Dynamic (programa controlado de asignacion de almacenamiento) (enla estructura de datos heap)07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR12Asignacion de Variablesuint8_t x = 3; //asignacion e inicializacion externaint8_t loquesea(uint_8 a)//parametro local automatico{int_8 negOne = 0xFF; // local automaticostatic int8_t serial = 1;//local staticoreturn (serial++) + a + negOne;} Locales automaticos existen solo cuando dura lallamada de la funcion Los datos globales y static son creados e inicializadosuna sola vez en el programa; estos retiene valores entrellamadas de funciones14/08/2014707/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR13Literales Los enteros pueden ser expresados en varias bases decimal: 29, -13, 0 octal: 0377 hexadecimal: 0x34F2 binario: 0b011011 Characteres 'a' String Es un Strig terminado en NUL almacenado enun ARRAY"07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR14Arrays Declaracion de ARRAYSuint8_t edad[10];int16_t temp[5];int8_t ejemplo[] = {-1, 2, -5}; Si es posible los Arrays son Dinamicamenteasignados arrays, pero requieren unafuncion de asignacion de memoria14/08/20148Estructuras (struct) Basicamente las Structuras no son mas quecoleccion de variables llamadas miembros Las Variables dentro de la estructura no tienen elmismo tipo Declaracion general de una estructura:07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR15struct structure_tag_name{type member1;type member2;...type memberX} structure_variable_namestruct structure_tag_name{type member1;type member2;...type memberX};Ejemplo: structstruct posicion {int x;int y;}robot;Tambien se puede utilizar lo siguiente:robot.x=10;robot.y=15;O simplementerobot={10,15};07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR1614/08/20149Enumeracion de Variables Similar a #define donde se puede describir un conjunto deconstantes. Usando #define tenemos: #define cero 0 #define uno 1 #define dos 2 La alternativa es usando una enumeracion usando enum: enum (cero=0,uno, dos); //cero=0, uno=1; dos=2 La Enumercacion por defecto asigna los valores de 007/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR17EjemploUsando el siguiente ejemploint n;enum (cero=0,uno, dos);n=uno;//n=1Se puede usar la enumeracion de la siguiente manera:enum escapes {BELL ='\a', BACKSPACE ='\b', HTAB ='\t',RETURN ='\r',NEWLINE ='\n', VTAB ='\v' };o enum boolean {FALSE =0, TRUE };La ventaja usar enum sobre#define es que la variable solo es visible en el bloquedonde fue declaradaEjemplo:main() {enum mes {Ene=1, Feb, Mar, Apr, May, J un, J ul, Ago, Sep, Oct, Nov, Dec};// ^--tabla de enumeracion^--lista de aliasprintf("%d\n", mes=Sep); // Asigna un valor entero via el alias// esta instruccion retorna9}07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR1814/08/20141007/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR19Seleccion if (condicin) si es verdadero; En expresiones Aritmticas es verdadero si el resultadoes diferente de cero y falso cuando es 0 if (condicin) { Si es verdadero;} else { //este bloque solo si es necesario Si es falso;}07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR20Seleccion multiple Intruccion switchswitch (condicion){ case exprecion constate}Ejemplo:switch (i/10){ case 0: { printf ("Numero menor a 10"); // Abreak;}case 1: { printf ("Numero menor a 20"); // Bbreak;}case 2: { printf ("Numero menor a 30"); // Cbreak;}default: { printf ("Numero mayor o igual a 40"); // Dbreak;}}14/08/20141107/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR21Repeticion while (condicion) {// repite el bucle si la condicion es verdadero}; do{ // repite el bucle si la condicion es verdadera} while (condicion); for (inicio; condicion; incremento){ //repite el bucle mientras se cumple la condicion}Puertos de E/SDDRx - Este registro determina la direccion (input/output)de los pins en port[x]A '0' bit en DDR pone al pin del puerto como entrada (input)A '1' bit en DDR pone al pin del puerto como salida (output)PORTx - Este registro contienen el estado para salidade los pines en port[x]A '0' bit pone al pin del puerto como salida=0 (LOW ~0V)A '1' bit pone al pin del puerto como salida=1 (HIGH ~5V)PINx - Este registro contiene el estado de entrada de los pines en port[x]A '0' bit indica que el pin del puerto es = 0 (LOW ~0V)A '1' bit indica que el pin del puerto es = 1 (HIGH ~5V)La X puede ser reemplazada por A,B,C,D,E,F, o G dependiendo del puertodesignado.07/22/10 22 Ing. Germn Pereira Muoz ProgramacionC para AVR14/08/201412Instrucciones AVR-GCCEn el Lenguaje C de AVR-GCC, los puertos pueden ser atendidos usando doscomandos inb() lectura de byte outb() salida de byteEjemplo:outb(DDRB, 0xFE); conf. el bit menos significativodel PORTB como entradaa = inb(PINB); Lectura del estado de entrada de los pines del PORTBinb() y outb() pueden ser usados cuando se intenta leer o escribirvarios bits en un registro a la vez. cbi() pone en cero un bit sbi() pone en uno un bitEjemplo:sbi(DDRD, 7); // colocaPD7 como salidasbi(DDRD, 0); // colocaPD0 como salidacbi(DDRD, 4); // colocaPD4 como entrada07/22/10 23 Ing. Germn Pereira Muoz ProgramacionC para AVR07/22/10 Ing. Germn Pereira Muoz ProgramacionC para AVR24Puertos PORT E/S y manipulacion de bitPORTB =0xFF;GICR |= (1