Top Banner

of 78

Curso AVR Con Code Vision v8.0

Jul 07, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

INSTITUTO TECNOLGICO DE MORELIA

CURSO BSICO-INTERMEDIO DE PROGRAMACIN EN C DE LOS MICROCONTROLADORES ATMELPOR DAVID INFANTE SNCHEZ

[email protected] [email protected] Web site: www.comunidadatmel.com

Revisin 8.0 Septiembre del 2008

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

INFORMACIN IMPORTANTEESTAS NOTAS FUERON CREADAS POR DAVID INFANTE SNCHEZ, PROFESOR DEL INSTITUTO TECNOLGICO DE MORELIA. SE PROHIBE SU MODIFICACIN O SU VENTA, FUE REALIZADO CON FINES DIDCTICOS. SI SE UTILIZA INFORMACIN DE ESTE CURSO EN TRABAJOS DE TESIS, ARTCULOS, ETC. DEBE MOSTRAR LOS CRDITOS DEL AUTOR Y ESTO DEBER SER REFERENCIADO AS: Infante S. David. Notas del curso programacin en C de los microcontroladores ATMEL. Instituto Tecnolgico de Morelia. Versin 8.10

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

Acerca del autorProfesor del Departamento de Ingeniera Electrnica del Instituto desde 1998 a la fecha, experiencia docente en materias de electrnica digital I y II, analgica I y III, Instrumentacin I y II, microprocesadores I y II, electrnica industrial, fsica de semiconductores. Ing. Electrnico por el ITM, Maestra en Ciencias en Ingeniera Electrnica por el ITEM y Dr. En Ciencias en Ingeniera. He sido: Asesor en ms de 70 temas de titulacin de licenciatura y 1 de Maestra. Sinodal en ms de 70 exmenes de titulacin de licenciatura y 6 de maestra. 17 Artculos publicados en congresos y simposios nacionales de electrnica y computacin. 18 Ponencias en congresos y simposios nacionales de electrnica. Participacin como asesor con proyectos en 19 eventos de creatividad en sus distintas fases. Asistencia en calidad de participante en 15 cursos de robtica, instrumentacin, redes de PLCs, Paneles de Operador, termografa y microcontroladores COP, HC08, MSP430, AVR. Imparticin de 12 cursos de microcontroladores PIC, HC08, AVR, DSPs de Texas Instruments, procesamiento de seales y de PLCs en eventos nacionales 7 veces jurado en eventos acadmicos de electrnica Como estudiante particip en los concursos de Ciencias Bsicas durante 3 aos en sus distintas etapas. Obtencin de una de las 10 becas nacionales para telecomunicaciones en CINVESTAV Guadalajara

Experiencia profesional 5 aos de experiencia profesional en el desarrollo de proyectos de automatizacin para empresas embotelladoras y de la transformacin, basados en la integracin y programacin de PLCs, redes industriales, paneles de operador, instrumentacin y control de procesos. Amplia experiencia en programacin de PLCs de Siemens en lenguaje escalera, FBDs, y Grafcet. Programacin de paneles de operador para diseo de interfaces hombre-mquina (HMI), experiencia en el campo de la termografa para anlisis de fallas en sistemas elctricos, mecnicos y estructurales basados en el anlisis de las imgenes trmicas, conocimiento de robots PUMA y saturno y programacin de mquinas de control numrico. Participacin en el diseo de cajeros automticos para bancos nacionales. Diseo electrnico de sistemas empotrados con microcontroladores

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

MotivacinEl motivo de este curso es para dar a conocer las nuevas tecnologas en microcontroladores, ya que es lamentable que en las universidades e institutos de educacin superior de Mxico y en Latinoamrica en general, se estn haciendo proyectos y programas demasiados sencillos en las materias de microcontroladores y peor an que estn usando los microcontroladores PIC, ya que universidades europeas y de EUA no los usen desde hace aos por su pobre desempeo, adems de que son microcontroladores que no tiene ninguna aplicacin industrial o comercial, sino slo para efectos didcticos. Desde que cursaba la carrera de ingeniera electrnica a la fecha he usado los siguientes microprocesadores, microcontroladores y DSPs: 6802, HC11 y HC08 de Motorola PICs de Microchip MSP30 de Texas Instruments COP de National Semiconductors AVR y ATMEGA de Atmel 8051 de INTEL DSPs de Texas Instruments y Motorola

Con el conocimiento de estos microcontroladores puedo aportar mi experiencia en el uso de estos dispositivos y que resumiendo puedo sealar que Motorola es un fabricante con dispositivos buenos y de amplio uso industrial como PLCs que basan su CPU en sus microcontroladores. Son usados en ambientes de mucho ruido como el automotriz y el industrial, sin embargo a ltimas fechas ha realizado muchos cambios en el core, en las herramientas de programacin, haciendo ms difcil conseguirlos y elevndose su costo. Los COP son muy poco usados en el ambiente industrial, y resultan caros, adems de que no cuentan con novedades en su diseo, los 8051 de Intel estn en plena desaparicin y los que hay son nicamente para reemplazo. Los microcontroladores MSP de Texas Instrumentes son econmicos, son potentes y tiene herramientas gratuitas, sin embargo son dispositivos para uso porttil por lo que su voltaje es de 3.3 V y son de montaje superficial lo que dificulta el diseo de prototipos. Los microcontroladores PIC son los peores microcontroladores que existen, son muy lentos que trabajan a baja velocidad, tiene un set de instrucciones muy pequeo que obliga a programas muy extensos y lentos, tiene nicamente un work register cuando un procesador RISC debe tener al menos 16 registros, de todos los microcontroladores que existen en el mercado son los peores en el desempeo, algunas empresas comenzaron a hacer sus equipos con estos procesadores y despus al detectrseles fallas como bloqueos o reinicializacin por ruido sacaron del mercado sus productos. En pases desarrollados no se usan ya que no tienen aplicacin industrial o comercial, nicamente en escuelas de pases

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

de latinoamrica. Estos procesadores nicamente los us por un ao y los dej de usar hace una dcada por ser procesadores obsoletos y de mal desempeo. Los Microcontroladores AVR de Atmel tiene 4 veces ms instrucciones que los PICs, tiene 32 registros de trabajo, el pic slo 1, el ADC es ms potente, el TIMER es mucho ms complejo que el del PIC, y son ms econmicos. Los AVR de Atmel se usan en telfonos celulares, en receptores satelitales, en robtica, etc. Son microcontroladores muy rpidos y de alto desempeo y son de bajo costo, existen muchos proyectos, tutoriales y herramientas gratuitas en la red. A manera de conclusin dira que en orden de desempeo y calidad colocara los procesadores as: AVR de Atmel, MSP de Texas Instruments, los 08 de Motorola el 8051 de Intel, COP de Nacional Semiconductor. Un procesador AVR o MSP puede tener un desempeo de entre 10 y 50 veces al de un PIC con el mismo cristal externo, o en otras palabras un PIC es entre 10 y 50 veces ms lento que un AVR o que un MSP.

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

CAPTULO I. PROGRAMACIN EN C1.1 Tipos de VariablesEn esta parte nicamente se ver como se manejan las instrucciones de C, quizs al terminar este captulo algunas instrucciones no las entienda del todo bien, sin embargo cuando programemos el microcontrolador usaremos estas instrucciones y las ir comprendiendo de una mejor manera. En un programa en C puede colocar comentarios usando // unsigned char x; // x es una variable O puede utilizar /* */ para poner varias lneas como comentarios

/* Aqu estamos usando estos smbolos para ilustrar como podemos poner comentarios en varas lneas */ Tipos de datos Nuestras variables pueden ser del siguiente tipo: Tipo Bit Char Unsigned char signed char Int short int Unsigned int signed int long int Unsigned long int signed long int Float Double Tamao en bits 1 8 8 8 16 16 16 16 32 32 32 32 32 Rango 0o1 -128 a 127 0 a 255 -128 a 127 -32768 a 32767 -32768 a 32767 0 a 65535 -32768 a 32767 -2147483648 a 2147483647 0 a 4294967295 -2147483648 a 2147483647 1.75 e -38 a 3.402 e 38 1.75 e -38 a 3.402 e 38

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

1.2 Declaracin de las variablesLas declaraciones de las variables se hacen de la siguiente forma: Con signo o sin signo tipo nombre; //Comentarios Ejemplos unsigned char x,y,temperatura; //Con esto estoy indicando que son 3 variables sin signo y //que son tipo char por lo que el rango que pueden manejar son desde 0 a 255 unsigned int var1; // Es una variable entera sin signo que llamamos var1 Tambin se pueden inicializar las variables dentro de la declaracin: signed char z=20,x=10,m; la //inicializo a ningn valor //z inicia con un valor de 20 decimal, x con 10, m no

Importante. Si no se inicializan las variables dentro del programa o en la declaracin de las variables stas son inicializadas a cero. El manejo de nmeros los puede hacer en decimal, binario, hexadecimal u octal. Variable o constante Decimal Hexadecimal Binario Octal Ejemplos: x=20; x=0x14; x=0b00010100; x=024; // x es 20 decimal //x es 14 hexadecimal que convertido a decimal es 20 decimal //x se manejado en binario que es equivalente a 20 decimal //x se maneja en octal que es 20 decimal Formato Nmero 0x nmero hexadecimal 0b nmero binario 0 nmero octal

1.3 Ubicacin de variables y constantesLas variables deben ser ubicadas en RAM. Solamente se hace declarndolas como unsigned o signed luego el tipo y finalmente el nombre de las variables; unsigned long variable3; signed char x,y,z; De la manera anterior las variables se guardarn en RAM

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

Las constantes deben ser guardadas en FLASH o memoria de programa, ya que stas no van a ser modificadas, para ello se inicia colocando la palabra const o flash ejemplo: const int k1=60000; Que es equivalente a: flash int k1=60000; Con lo anterior la constante K1 es inicializada a 60000 y se guarda en flash. Se puede guardar un carcter en flash para ello ponemos el carcter entre comillas simples ( ) const char x=a

1.4 ArreglosUn arreglo es un conjunto de datos que pueden ser accesado a travs de un ndice. Su declaracin se hace as: flash o const nombre del arreglo [nmero de elementos]={elemento1, elemento2,.. elemento n } Ejemplo flash char arreglo1 [3]={0x0a,0x38,0x23}; Es equivalente a la siguiente declaracin: const char arreglo1 [3]={0x0a,0x38,0x23}; flash y const son lo mismo ya que guardan los datos en flash, pero por compatibilidad con el lenguaje C usar dentro de este manual la palabra const.

1.4.1 cmo accesar el arreglo?El primer elemento es el 0, en la declaracin anterior del arreglo ste se defini de tres elementos, siendo el primer elemento el 0 y el ltimo elemento el nmero 2, vea el siguiente ejemplo: x=arreglo1[0]; x=arreglo1[2]; // x vale 0x0a ya que acces al primer elemento del arreglo // x vale 0x23 ya que acces al tercer elemento del arreglo

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

Tambin se puede hacer de la declaracin del arreglo como se muestra a continuacin donde omitimos el tamao del arreglo que es 3 ya que al compilarse el programa ver que son de tres elementos el arreglo. flash char arreglo1 []={0x0a,0x38,0x23}; //Note que no se coloc el tamao del arreglo Si no se coloca la palabra flash o const se guardar el arreglo en RAM por ejemplo int arreglo2 [4]={100,200}; Es un arreglo de 4 elementos enteros, el primero vale 100, el segundo 200 y el tercero y cuarto 0 ya que no fueron inicializados. Como fue un arreglo guardado en RAM se pueden modificar. En el caso de que se guarden en FLASH no podrn ser modificados ya que sern considerados como constantes. Tambin podemos guardar caracteres para posteriormente mandarlos a una pantalla de cristal lquido (LCD) ejemplo: flash char arreglostring []=Ejemplo de caracteres;

1.4.1.1 Arreglos multidimensionalesSe puede declarar un arreglo de dos dimensiones que se interpretara como fila y columna ejemplo: const char arreglo_multi_dim [2,3]= {1,2,3}, {,4,5,6}; // Es un arreglo de dos filas y //tres columnas

x=arreglo_multi_dim [1,1]; //x=5 ya que se est accesando el elemento de fila 1 y col 1

1.5. Asignndole direccin a una variableCuando declaramos variables el compilador decidir donde colocar las variables dentro de RAM, pero tambin podemos nosotros decirle en qu direccin colocarla usando @direccin por ejemplo: unsigned char x=10 @0x80; // x vale 10 y est guardada en la direccin 0x80 Importante. Yo no recomiendo que el programador le indique al compilador donde colocar las variables, sino que se le deje a ste la decisin de su ubicacin, ya que el compilador colocar la variable en una ubicacin que sea la ms rpida para su acceso, e inclusive la puede colocar en alguno los 32 registros de trabajo para hacer ms rpido su manejo.

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

1.6 Declaracin de bitsPodemos guardar bits de manera individual y esto se hace usando la palabra bit nombre del bit y su valor ejemplo bit var1=1; bit var2=0; bit var3=1; //La variable Var1 es de un bit y se guarda en un registro del AVR y vale 1

Se guardan de manera individual esos bits en los registros R2 al R14 del procesador del AVR. Recuerde que el microcontrolador AVR tiene 32 registros desde R0 hasta R31.

1.7 Conjunto de instrucciones en CEn los siguientes subtemas se vern los distintos operadores aritmticos, lgicos, de relacin, etc. que podemos usar en el compilador, como trabajamos en lenguaje C el diseo de programas se hace de una manera muy rpida, algo que no podemos lograr con el lenguaje ensamblador. En la actualidad en el mbito industrial se usa el trmino de RAD que es Rapid Application Development que traducido es Desarrollo Rpido de Aplicaciones, este concepto indica que para poder ser competitivos se deben desarrollar proyectos de una manera muy rpida, es por ello que ya no utilizan el lenguaje ensamblador en las empresas para desarrollar los programas. En la industria automotriz y en el rea de robtica los departamentos que elaboran los programas en los microcontroladores usan solamente el lenguaje C ya que ste permite elaborar programas complejos muy rpidamente, y adems existe la portabilidad del cdigo, ya que una vez que se ha escrito el programa en C puede de una manera relativamente fcil cambiar de un microprocesador a otro. El lenguaje C reconoce instrucciones como if, for, while, etc; pero el lenguaje C no tiene instrucciones para el manejo de puertos, de timers, del ADC, de interrupciones, etc. Entonces para poder manejar los perifricos del microcontrolador se usan libreras donde estn declarados esos registros y su ubicacin, aunque esto lo veremos despus. 1.7.1 Operadores aritmticos: Smbolo + * / % Operacin Suma Resta Multiplicacin Divisin Divisin Mdulo, y el resultado es el residuoAutor: David Infante Snchez www.comunidadatmel.com

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Var1=Var2/12; Var1=Var2%12;

//Si Var2=40, Var1 ser 3; //Si Var2=40, Var1=4 que es el residuo. til para convertir // nmeros a BCD

1.7.2 Operadores Para manejo de BitsSmbolo & | ^ > ~ Ejemplos: Var3=Var1&Var2; Var3=Var110)Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

datoaguardar=0; La razn de ello es que si el datoaguardar que es una variable eeprom tiene un valor inicial mayor a 10 la hacemos 0, y esto sucedera una sola vez, ya que cuando se guarde un dato el dato estar entre 0 y 9. Pero un microcontrolador nuevo tiene en la memoria eeprom puros 0xff en todas las localidades, entonces la primera vez har que ese dato de 0xff se haga 0. Importante. Si dentro de un programa utiliza una variable eeprom como una variable RAM puede suceder que dae esa localidad de memoria eeprom, ya que una eeprom tiene una vida til de 100,000 ciclos de escritura y lectura, pero si usa esa variable eeprom como una variable RAM puede suceder que en cuestin de segundos sucedan esos 100,000 ciclos de escritura y lectura porque un programa en el microcontrolador ejecuta el cdigo miles de veces en un segundo, entonces al reescribir esa variable en el programa miles de veces en un segundo se va a cabar la vida til de la localidad de memoria. En el programa vemos que la eeprom slo se escribe cuando se presiona un botn.

2.6 Configuracin del Convertidor de Analgico a Digital (ADC)Las caractersticas del ADC que tiene el microcontrolador AVR son: Tiene 6 canales con 10 bits de resolucin Capaz de obtener 15,000 muestras por segundo a la mxima resolucin Voltaje de referencia internos de 1.1V Voltaje de referencia externo de 0 a Vcc del ADC Capacidad de detener el CPU para minimizar el ruido y mejorar el resultado de la conversin

2.6.1 Funcionamiento de un ADC Un ADC convierte una seal analgica a un dato digital de manera lineal, para ello es necesario identificar tres aspectos importantes y stos son: el voltaje de referencia (Vref), el nmero de bits y si es unipolar o bipolar el ADC. 2.6.1.1 Conversin unipolar En la conversin unipolar el voltaje que se introduce a los canales del convertidor es solamente positivo, y pudiendo ser la conversin del ADC de 10 bits o de 8 bits, si es de 10 bits significa que identifica hasta 210 combinaciones que son 1024; si es de 8 bits tiene 28 combinaciones esto es 256 combinaciones. Obviamente entre ms bits sean es mejor el ADC aunque en ocasiones no es necesario una resolucin tan elevada. El voltaje de referencia es el valor con el que se comparar el voltaje de entrada analgico y con base en ello se determina la combinacin de salida. La forma de obtener la combinacin digital si est configurado el ADC en 10 bits es:Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

conversin=(Vin*1024)/Vref .....................................................................................ec(2.1) Donde Vin es el voltaje que se aplica, vref es el voltaje de referencia y conversin es el valor digital. Por ejemplo si Vref=5 y el vin que va a medir es de 2.5 dar como salida 512 segn la ecuacin 2.1; si ahora el vin es de 1 volt la conversin que dar ser de 204. En el caso de que se seleccione una conversin de 8 bits, la frmula a utilizar es: conversin=(Vin*256)/Vref ......................................................................................ec(2.2) Sustituyendo en la ec 2.2 los valores de vin=2.5 el resultado de la conversin es 128, si el vin=1el resultado de la conversin ser 51

En el circuito integrado identifiquemos las terminales asociadas al ADC

Figura 2.13 Pines del microcontrolador ATMEGA48 En la figura 2.13 vemos que en las terminales 22 y 20 dicen GND y AVCC, ests son las trminales de tierra y alimentacin del perifrico del convertidor de analgico a digital. Normalmente los microcontroladores de otros fabricantes el ADC se alimenta con el mismo voltaje del microcontrolador, pero en los de ATMEL son alimentados por separado para disminuir los efectos del ruido. Aunque en nuestro caso y para los programas que vamos a realizar el AVCC y VCC los conectaremos juntos y los GND tambin sern conectados juntos. Pero recuerde que si en su aplicacin requiere de una conversin ms exacta puede alimentar el microcontrolador y el perifrico del ADC por separado. Solamente tenga enProgramacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

cuenta que si los va alimentar por separado el voltaje del perifrico del ADC no debe ser mayor al del microcontrolador, por ejemplo si el microcontrolador lo va alimentar con dos pilas y el voltaje es de 3 Volts, el ADC debe ser alimentado con 3 volts como mximo tambin. El vref que se encuentra en las ecuaciones 2.1 y 2.2 puede ser de tres tipos: 1. Vref=Vcc del microcontrolador, en este caso Aref no se conecta (pin 21), vea la figura 2.14 el circuito de en medio. 2. Vref=Aref (pin 21). En este caso se tiene una referencia externa y puede ser cualquier voltaje, siempre y cuando no sea superior al Vcc del microcontrolador. Este se ejemplifica en el primer diagrama de la figura 2.14. 3. Vref=1.1 Volts interno, se debe conectar un capacitor externo de 0.1uf del tipo gota de tantalo y se muestra en el tercer circuito de la figura 2.14.

Figura 2.14 conexin de las terminales del ADC segn la seleccin del Vref Todos los casos anteriores se configuran con el codevision con clicks. En las ecuaciones 2.1 y 2.2 se tiene un trmino llamado Vin que es el voltaje de entrada, es decir, el voltaje que ser convertido a una combinacin digital, segn su proporcin con Vref. Este Vin se aplica en los canales del ADC que se numeran desde ADC0 hasta ADC5 (pines del 23 al 28), entonces tenemos que esos pines tienen varias funciones ya sean como pines de entrada o salida, o como entradas del ADC. Entonces si el pin se configura como entrada del ADC ya no puede funcionar como entrada/salida digital, esto es que las funciones son excluyentes.

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

Resumen del ADC En este perifrico podemos tener: Conversin unipolar donde se aplica a la entrada analgica un valor de voltaje positivo que puede ir desde 0 hasta Vref. o Puede ser la conversin de 8 bits donde el resultado est dado por: conversin=(Vin*256)/Vref o Puede ser la conversin de 10 bits donde el resultado est dado por: conversin=(Vin*1024)/Vref El Vref puede ser el voltaje del microcontrolador, pueder ser uno externo conectado a la terminal Aref o uno interno de 1.1 Volts. El Vin es el voltaje analgico que ser convertido a un combinacin digital, y ese vin se aplica en cualquiera de los canales ADC0 hasta ADC5 El perifrcio del ADC se alimenta por separado, pero no puede ser mayor al Vcc del microcontrolador. Aunque para estos ejemplos conecatremos las terminales de GND y el Vcc lo conectaremos al Avcc. Las configuraciones descritas anteriormente se realizan con clicks en el codevision, por lo que no es necesario aprender ningn registro o bit de stos para su configuracin.

Importante. Si va a utilizar un canal para hacer la conversin tenga la precaucin de configurar ese pin como entrada. Ya que en ese canal va aplicar voltaje y no puede estar configurado el pin como salida, ya que de ser as se podra daar el pin. Por ejemplo si va utilizar el canal 0 del adc que es el pin A0 deber configurar ese pin como entrada. Importante El Avcc no puede ser mayor al Vcc, por eso conctelos juntos Importante El Aref no puede ser mayor al Vcc del microcontrolador. Importante No aplique Vin mayores a Aref o a Vcc para evitar daos en el pin del ADC. Programa 9. Haga una conversin en 8 bits sobre el canal 0 del ADC y muestre el resultado en leds que se conectarn en el Puerto B. Configure como Vref el AVcc del microcontrolador. Tabla 2.1 Canal y pin del ADC Canal Pin 0 ADC0 23 C0 1 ADC1 24 C1 2 ADC2 25 C2 3 ADC3 26 C3 4 ADC4 27 C4 5 ADC5 28 C5Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

Figura 2.15 Conexin para el programa 9 Con el codewizard se hace la configuracin del ADC a travs de simples clicks, lo nico que debemos hacer en el programa es leer el valor de la conversin del canal que estemos usando a travs de la siguiente funcin: variable=read_adc (nmero_de_canal); Por ejemplo si desear utilizar el canal 3, que es el pin 26 deber colocar : variable=read_adc(3); Recuerde tambin que el ADC puede entregar la conversin en 8 o 10 bits, si selecciona conversin en 8 bits, entonces la variable deber definirse como unsigned char variable; es decir tipo char de 8 bits, pero si se selecciona una conversin en 10 bits deber declarar la variable como unsigned int variable, ya que el valor de la conversin ocupa 10 bits. El nombre que le di a la variable donde se guardar el resultado fue variable, pero puede darle cualquier nombre. Importante. La funcin read_adc() slo puede utilizarse si dentro del codevision se habilit el ADC, ya que si lo usa en cualquiera de los otros programas que se han realizado y que no han unicializado el ADC marcar error.

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

Vea el video_p9 donde se muestra la forma de inicializar el ADC./***************************************************** This program was produced by the CodeWizardAVR V1.25.7a Evaluation Automatic Program Generator Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 15/09/2008 Author : Freeware, for evaluation and non-commercial use only Company : Comments: Chip type : ATmega48 Clock frequency : 1,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 128 *****************************************************/ #include #include unsigned char x; #define ADC_VREF_TYPE 0x60 // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 8 #pragma optsizeCLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0xFF; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

// State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x00; TCCR2A=0x00; TCCR2B=0x00; TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x00; PCICR=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

// Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x00; // Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; // ADC initialization // ADC Clock frequency: 500,000 kHz // ADC Voltage Reference: AVCC pin // ADC Auto Trigger Source: None // Only the 8 most significant bits of // the AD conversion result are used // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On // ADC4: On, ADC5: On DIDR0=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x81; while (1) { x=read_adc(0); //Se hace la conversin sobre el canal 0 del ADC PORTB=x; //Se despliega en el puerto B el valor digital // Place your code here }; }

El programa 9 hace una conversin sobre el canal 0, pero el resultado que da, no es en voltaje sino en un cdigo binario. Si Vin=0 volts la conversin da 0b0000,0000; si vin=2.5 volts la conversin da 0b1000,0000 (128 decimal); si es 5 Volts=0b1111,1111 (255 decimal). Es decir nos convierte a una proporcin binaria que luego debemos interpretar, pero ese resultado lo podemos convertir a voltaje a travs de una regla de 3. Si Vin=5 da como resultado 0xff, es decir 255, Pero deseamos que muestre un cdigo nuevo que sea 50 (que sera 5.0 Volts). Entonces se resuleve as: Cdigo nuevo=Conversin*50/conversin mxima Note, si Vin=5 Volts, la conversin dar 0b1111,1111 que es 255, que sustituyendo en la ec 1.3 da: Cdigo nuevo=255*50/255=50 que podemos interpretar como 5.0 Volts. Si vin=2.5 Volts, la conversin dar 0b1000,0000 que es 128 Cdigo nuevo=128*50/255 =25 que podemos interpretar como 2.5 Volts. Entonces la ecuacin 1.3 queda: cdigo nuevo=conversin del ADC * cdigo que deseamos.....................................ec(2.3) conversin_Mxima.Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

Ejemplo suponga que conectamos un sensor de temperatura que da 5 volts cuando hay 100C, entonces ahora deseamos mostrar el resultado en grados centgrados, no en voltaje, as que sustituyendo en la ecuacin 1.3 queda: Cdigo nuevo=Conversin del ADC*100/Conversin Mxima (255 para 8 bits) Si conversin=255, el cdigo nuevo=100C Si la conversin del ADC=128, el cdigo nuevo ser 128*100/255=50, el cdigo nuevo=50C. Pero ese cdigo nuevo debemos separarlo en digitos para poderlo desplegar en el display de 7 segmentos o en una LCD. Esto se realiza en el programa 10.

Programa 10. Haga una conversin de 8 bits en el canal 1 y muestre el resultado del volatje en dos displays que se conectarn al Puerto B. El Vref=Vcc=5 volts. El pin Co controlar el display de unidades y el C1 el de decenas. Se usar el canal 2 del ADC2 por donde se aplicar un voltaje variable de entre 0 y 5 volts, el cual ser desplegado en los dos displays desde 0.0 hasta 5.0 Usando la ecuacin 2.3 tenemos que la conversin mxima =255, el cdigo que deseamos con esa conversin mxima=50 para mostrar 5.0 Volts. cdigo nuevo= conversin del ADC * cdigo que deseamos Conversin Mxima Debemos hacer lo siguiente en el programa: Leer la conversin del canal x=read_adc(1); codigonuevo=x*50/255; Importante. x es tipo char, se multiplica por 50 pero ese resultado temporal ocupa ms de 8 bits. Para evitar esto se hace el casting, es decir, se le dice al compilador el resultado de x*50/255 da como resultado un char, ya que no sobrepasa a 255, pero lo obliga a que en las operaciones intermedias (sobre todo en la multiplicacin) se guarde el resultado en algn lugar ya que ocupa ms de 8 bits. El casting se hace codigonuevo=(char)x*50/255

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

EL USO DEL CASTING Ejemplo 1. Suponga que tiene x=y+w+z; y todas son tipo char, en ese caso no existe problema ya que si y+w+z da como resultado un nmero menor a 255 se podr guardar en x. Ejemplo 2. x es tipo int; y,w y z son tipo char. Y se escribe x=y+w+z; Pero se sabe que y+w+z van a dar mas de 255, y que caben en x ya que esta es tipo int. Pero lo de la derecha y+w+z est declarado como char, entonces cuando la suma d ms de 255 dnde quedan esas operaciones? Entonces aqu si va existir un problema porque x=int y y+w+z son tipo char cuya suma da mas de 8 bits y que cabe en x, pero en las sumas parciales las variables son char y estas no pueden guardar mas de 8 bits, entonces hay que hacer un casting, obligando al compilador a decirle todas son tipo char, pero el resultado es tipo int para que lo guarde temporalmente en algn lugar para despus asignarlo a x. x=(int) y+w+z; //Esto ya da un resultado correcto x=y+w+z //Dara un resultado errneo ya que y+w+z da mas de 8 bits y estas variables no pueden manejar ms de 8 bits Importante. Podemos evitar hacer clculos de las operaciones intermedias para ver si hacemos o no el casting, y esto dejarlo al compilador. Esta opcin se selecciona en el codevision en project-configure-C Compiler y finalmente dando click en promote char to int como se muestra en la figura 2.15. Con la seleccin de la casilla promote char to int le estamos indicando al compilador que cuando ocupe hacer que la variable la haga ms grande lo haga l mismo para evitarnos problemas de casting.

Figura 2.15 Habilitacin de cambio detamao de variables para evitar el casting

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

Con lo anterior le estamos indicando al compilador si la operacin intermedia ocupa el char un espacio de un int que lo genere para evitar errores y as ya nos olvidamos del casting. Con las dos instrucciones anteriores ya tenemos representado en voltaje la conversin, pero debemos separarlo en dos digitos, esto es calcularle la cantidad de decenas y las unidades. Continuando con la explicacin del programa, si ya se calcul el cdigo nuevo, ahora debemos obtener los dos digitos a desplegar ya que el 50 no se puede desplegar en un display, debemos obtener los dos digitos, as que: decenas=codigonuevo/10; unidades=codigonuevo%10; Recuerde que % es la operacin mdulo y que da como resultado el residuo. Suponga que el cdigonuevo=48, es decir 4.8 Volts Entonces decenas=48/10=4 Y unidades=48%10=8 (que es el residuo) Y las decenas y unidades los mandamos desplegar en dos displays de 7 segmentos. Importante. En cada proyecto nuevo que hagamos debemos seleccionar la casilla de promote char to int. Configuracin: PORTB de salidas para conectar los displays. C0 y C1 salidas que sern usados para manejar los dos transistores: el que controla el display de unidades, y el que controla el display de decenas. El pin C2 como entrada que es tambin el canal 2 del ADC (ADC2). Vea el video_p10 donde se muestra la inicializacin del microcontrolador junto con el ADC.

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

El siguiente listado es el programa que gener el codewizard y lo que est en azul es lo que deber agregar al programa que usted haga./***************************************************** This program was produced by the CodeWizardAVR V2.03.6 Evaluation Automatic Program Generator Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 05/10/2008 Author : Freeware, for evaluation and non-commercial use only Company : Comments: Chip type : ATmega48 Clock frequency : 1,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include #include unsigned char var,codigonuevo,unidades,decenas; const char tabla7segmentos [10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f}; void despliega(void); //Se va a utilizar una funcin que se llama despliega sin parmetros #define ADC_VREF_TYPE 0x60 #define tru PINC.0 #define trd PINC.1

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com

// Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 8 #pragma optsizeCLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0xFF; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out // State6=T State5=T State4=T State3=T State2=T State1=0 State0=0 PORTC=0x00; DDRC=0x03; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

// Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x00; TCCR2A=0x00; TCCR2B=0x00; TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x00; PCICR=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x00; // Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; // ADC initialization // ADC Clock frequency: 500,000 kHz // ADC Voltage Reference: AVCC pin // ADC Auto Trigger Source: None // Only the 8 most significant bits of // the AD conversion result are used // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On // ADC4: On, ADC5: On DIDR0=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x81; while (1) { var=read_adc(2); //Se lee el valor del Canal 2 del ADC (PIN C2) codigonuevo=50*255/var; //Convierte el valor del ADC a un cdigo nuevo en voltaje decenas=codigonuevo/10; //Calcula las decenas unidades=codigonuevo%10; //Calcula las unidades Programacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

despliega();

//Manda desplegar los dos digitos

// Place your code here }; } void despliega(void) { PORTB=tabla7segmentos [unidades]; tru=1; //Prende display de unidades delay_ms(4); //Deja prendido display de unidades 4mS tru=0; //Apaga display de unidades PORTB=tabla7segmentos[decenas]; trd=1; //Prende display de decenas delay_ms(4); //Deja prendido display de decenas 4mS trd=0; //Apaga display de decenas }

Explicacin del programa: Se inicializ el valor de la tabla que nos dibuja los nmeros en los 7 segmentos del display y declaramos una funcin que nombr despliega y que utilizar en el programa y que no enva, ni recibe parmetros. unsigned char var,codigonuevo,unidades,decenas; const char tabla7segmentos [10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f}; void despliega(void); //Se va a utilizar una funcin que se llama despliega sin parmetros Despus se agreg las siguientes igualdades #define tru PINC.0 #define trd PINC.1 El tru es transistor de unidades y el trd es el transistor de decenas, es ms fcil escribir el programa haciendo por ejemplo tru=1; con ello estamos haciendo que el PINC.0=1; ya que es una igualdad, pero tru resulta ms fcil recordar y sabiendo que es donde est conectado el transistor del displya de unidades Recuerde que la funcin para leer el valor de conversin del ADC es read_adc(canal); que es la primera lnea y dicho valor de la conversin se guarda en una variable llamada var que es de 8 bits, ya que la conversin que escojimos a la hora de inicializar el ADC fue de 8 bits. Si el voltaje que se le aplica al canal 2 es de 2.5 Volts, el valor de la conversin ser de 127, pero nosotros queremos representarlo en voltaje, as que con la frmula de 50*255/var y sustituyendo var=127 nos dar como resultado 25, que ahora si podemos representar como 2.5 Volts. Pero el 25 hay que convertirlo a dos digitos para desplegarlos en el display, por lo que 25/10=2, y 25%10=5 (recuerde que % es la funcim mdulo hace la divisin pero elProgramacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

resultado es el residuo) y esos valores se guardan en decenas y unidades para desplegarlos en la funcin despliega(); Todo lo anterior es el siguiente cdigo agregado al programa: var=read_adc(2); //Se lee el valor del Canal 2 del ADC (PIN C2) codigonuevo=50*255/var; //Convierte el valor del ADC a un cdigo nuevo en voltaje decenas=codigonuevo/10; //Calcula las decenas unidades=codigonuevo%10; //Calcula las unidades Posteriormente se manda llamar una funcin para desplegar los dos digitos del voltaje: despliega(); //Manda desplegar los dos digitos

La funcin de despliega manda imprimir en el puerto B el digito correspondiente de unidades, despus activa el transistor de unidades, lo deja prendido 4mS y lo apaga y despus manda imprimir el digito de decenas lo prende y apaga, pero lo hace tan rpido que aparenta que estn los dos digitos al mismo tiempo. void despliega(void) { PORTB=tabla7segmentos [unidades]; tru=1; //Prende display de unidades delay_ms(4); //Deja prendido display de unidades 4mS tru=0; //Apaga display de unidades PORTB=tabla7segmentos[decenas]; trd=1; //Prende display de decenas delay_ms(4); //Deja prendido display de decenas 4mS trd=0; //Apaga display de decenas }

Importante. La funcin read_adc(canal) funciona nicamente si a la hora de inicializar el microcontrolador con el codewizard inicializa el ADC, as que si utiliza esta funcin en los programas anteriores no funcionar e inclusive marcar erros porque no est inicializado el perifrico del ADC.

2.7 Manejo de las pantallas de LCDLas pantallas de cristal lquido LCD alfanumricas sin importar el fabricante se basan en un circuito integrado de Hitachi que es el HD44780, esto significa que cualquier pantalla que se utilice funciona de la misma manera, por lo que la programacin de la pantalla esProgramacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

idntica sin importar la marca de la LCD. La nica diferencia es en la velocidad, ya que algunas responden ms rpidamente a los comandos que se le mandan. El asistente que tiene el codevision solicita que se le indique de cuntos caracteres es cada lnea de la LCD. As mismo se indica en el mismo asistente cmo conectar la LCD y a que pines. Las pantallas se pueden conectar en un bus de datos de 8 bits o de 4, el asistente lo coloca en un bus de 4 bits para ahorrar pines. El asistente del codevision genera todo el cdigo necesario para inicializar la LCD y el programador slo debe preocuparse por manejar las siguientes funciones: Los comandos que acepta la LCD son: lcd_clear(); Se utiliza para borrar todos los carcteres en la LCD lcd_gotoxy(unsigned char x,unsigned char y); Coloca el cursor en la columna x y fila y, puede ser o una variable x y y o una constante. Cuando se posiciona el cursor en algn punto determinado y se manda escribir una letra el cursor se mueve haca la derecha un lugar. lcd_putchar(char c); Coloca un carcter en la posicin donde haya quedado el cursor, de acuerdo a la funcin anterior. _lcd_write_data(); _lcd_write_byte(direccion,dato); Lo primero que debe hacerse es ubicar la posicin del cursor, es decirle en cul fila y en cual columna. Por ejemplo las LCDs de 2x16 son 2 filas por 16 caracteres. Entonces su se desea escribir en la segunda fi _lcd_ready();

Hasta este punto ya sabe como manejar puertos, desplegar datos en displays de 7 segmentos y LCds, guardar datos en eeprom y adems sabe utilizar el ADC. Con este conocimientoProgramacin en C de los microcontroladores ATMEL e-mail: [email protected] Autor: David Infante Snchez www.comunidadatmel.com

que ha adquirido est en la posibilidad de hacer controles, sistemas de adquisicin y monitoreo de datos y su procesamiento. Con esta parte se concluye la programacin bsica-intermedia del microcontrolador. En el siguiente capitulo veremos tems avanzados del microcontrolador como interrupciones, protocolos de comunicacin seriales y timers.

Programacin en C de los microcontroladores ATMEL e-mail: [email protected]

Autor: David Infante Snchez www.comunidadatmel.com