You are on page 1of 23

Capitulo 2 Entradas y salidas

2.0 Introducción general Los microcontroladores disponen de un oscilador que genera los pulsos que sincronizan todas las operaciones internas. El oscilador puede ser del tipo RC, aunque generalmente se prefiere que esté controlado por un cristal de cuarzo (XTL) debido a su gran estabilidad de frecuencia. La velocidad de ejecución de las instrucciones del programa está en relación directa con la frecuencia del oscilador del microcontrolador. Igual que en una microcomputadora, la CPU es el “cerebro” del microcontrolador. Esta unidad trae las instrucciones del programa, una a una, desde la memoria donde están almacenadas, las interpreta (decodifica) y hace que se ejecuten. En la CPU se incluyen los circuitos de la ALU para realizar operaciones aritméticas y lógicas elementales con los datos binarios. La CPU de un microcontrolador dispone de diferentes registros, algunos de propósito general y otros de propósito específico. Entre estos últimos están el registro de instrucción, el registro de estado, el contador de programa, el registro de direcciones de datos y el puntero de pila. El registro de instrucción almacena la instrucción que está siendo ejecutada por la CPU. Este registro de instrucción es invisible para el programador. El registro de estado (status) agrupa los bits indicadores de las características del resultado de las operaciones aritméticas y lógicas realizadas en la ALU. Entre estos indicadores están el signo del resultado (si es positivo o negativo), si el resultado es cero, si hay acarreo o préstamo, el tipo de paridad (par o impar) del resultado, etc. El contador de programa (PC: program counter) es el registro de la CPU donde se almacena direcciones de instrucciones. Cada vez que la CPU busca una instrucción en la memoria, el PC se incrementa, apuntando así a la dirección de la instrucción que será ejecutada a continuación de la que se está ejecutando en el momento. Las instrucciones de transferencia de control modifican el valor del PC. El puntero de pila (SP: stack pointer) es el registro que almacena direcciones de datos en la pila. La memoria del microcontrolador, es el lugar donde las instrucciones son almacenadas del programa y los datos que manipula. En un microcontrolador siempre hay dos tipos de memoria: la memoria RAM (Random Access Memory) y la memoria ROM (Read Only Memory). La memoria RAM es una memoria de lectura escritura, que además es volátil, es decir, pierde la información almacenada cuando falla la energía que alimenta la memoria. La memora ROM es una memoria de

sólo lectura y no es volátil. Las diferentes tecnologías para realizar las memorias de sólo lectura son: ROM, EPROM, EEPROM, OTP, FLASH. Tanto la memoria RAM como las memorias ROM son de acceso aleatorio, pero la costumbre ha dejado el nombre de RAM para las memorias de lectura y escritura. El término “acceso aleatorio” se refiere a que el tiempo necesario para localizar un dato no depende del lugar de la memoria donde este almacenado. En las memorias de acceso secuencial, en cambio, cuando más alejado esté un dato de la posición a la que se ha accedido por última vez, más se tarda en localizarlo. La memoria ROM se emplea para almacenar permanentemente el programa que debe de ejecutar el microcontrolador. En la memora RAM se almacenan temporalmente los datos con los que se trabaja el programa. Un número creciente de microcontroladores dispone de alguna memoria no volátil de tipo EEPROM para almacenar datos fijos o que sólo sean cambiados esporádicamente. La cantidad de memoria ROM disponible es normalmente muy superior a la cantidad de memoria RAM. Esto obedece a dos razones. La primera es que la mayoría de las aplicaciones requieren programas que manejan pocos datos. La segunda razón es que la memoria RAM ocupa mucho más espacio en el circuito integrado que la memoria ROM, de modo que es mucho más costosa que está. Las entradas y salidas son particularmente importantes en los microcontroladores, pues a través de ellas el microcontrolador interacciona con el exterior. Forman parte de las entradas y salidas los puertos paralelo y serie, los temporizadores y la gestión de las interrupciones. El microcontrolador puede incluir entradas y salidas analógicas asociadas a convertidores A/D y D/A, tiene particular importancia los recursos que garantizan un funcionamiento seguro del microcontrolador, como el denominado perro guardián. Un microcontrolador combina los recursos fundamentales disponibles en una microcomputadora, es decir, la unidad central de procesamiento (CPU), la memoria y los recursos de entrada salida, en un único circuito integrado. En la siguiente figura se muestra el diagrama de bloques de un microcontrolador.

1 Características de los AVR de ATMEL. lo que los hace relativamente rápidos entre los microcontroladores de 8-bit. algunas instrucciones tales como 'suma inmediata' ('add immediate' en inglés) faltan. Los AVR son una familia de microcontroladores RISC de Atmel. La concatenación de los 32 registros. El AVR fue diseñado desde un comienzo para la ejecución eficiente de código C compilado. son utilizados como punteros de 16 bit al espacio de memoria externa.2. La arquitectura de los AVR fue concebida por dos estudiantes en el Norwegian Institute of Technology. convertidor análogo digital de 10 bits y 16 canales. complicaría mucho el diseño. y no está limitado a un tamaño fijo. Esto es un compromiso que se hace en arquitecturas de ocho bit desde los tiempos de Intel 8008. Tiene 32 registros de 8 bits. al cual se accede a través de operaciones de carga/almacenamiento. Por otro lado. los tres últimos pares de registros internos del procesador. temporizadores. no es completamente ortogonal:    Los registros punteros X. bajo los nombres X. 4KB de memoria EEPROM. Las registros de I/O 0 al 31 tienen distintas características que las posiciones 32 al 63. Los microcontroladores AVR tienen un segmentado ('pipeline' en inglés) con dos etapas (cargar y ejecutar). Y y Z tienen capacidades de direccionamiento diferentes entre sí (ver más arriba por qué) Los registros 0 al 15 tienen diferentes capacidades de direccionamiento que los registros 16 al 31. La compatibilidad entre los distintos modelos es preservada en un grado razonable. comparador analógico. ya que su tamaño de palabra nativo de 8 bit (256 localidades accedidas) es pobre para direccionar. ya que la instrucción 'resta inmediata' ('subtract immediate' en inglés) con el complemento a dos puede ser utilizada como alternativa. El set de instrucciones AVR está implementado físicamente y disponible en el mercado en diferentes dispositivos. Y y Z. violando la premisa original de su simplicidad. hacer que todo el banco superior de 16 registros de 8 bit tenga un comportamiento alterno como un banco de 8 registros de 16 bit. la empresa subsidiaria de Atmel. Sin embargo. que les permite ejecutar la mayoría de las instrucciones en un ciclo de reloj. El AVR es una CPU de arquitectura Harvard. Además. que comparten el mismo núcleo AVR pero tienen distintos periféricos y cantidades de RAM y ROM: desde el microcontrolador de la familia Tiny AVR ATtiny11 con 1KB de memoria flash y sin RAM (sólo los 32 registros). hasta el microcontrolador de la familia Mega AVRATmega2560 con 256KB de memoria flash. los PIC). Algunas instrucciones sólo operan en un subconjunto de estos registros. El set de instrucciones de los AVR es más regular que la de la mayoría de los microcontroladores de 8-bit (por ejemplo. etc. los registros de entrada/salida y la memoria de datos conforman un espacio de direcciones unificado. fundada por los dos arquitectos del chip. . JTAG. el stack se ubica en este espacio de memoria unificado. 8KB de memoria RAM. Como este lenguaje utiliza profusamente punteros para el manejo de variables en memoria. y 8 pines. A diferencia de los microcontroladores PIC. y posteriormente refinada y desarrollada en Atmel Norway.

Estos componentes son el circuito de reset y el circuito de reloj. la cual se encargue de suministrar al AVR con una frecuencia de trabajo al reloj del CPU del microcontrolador.  La instrucción CLR afecta los 'flag'. Esto último es posible por su uniformidad en el acceso al espacio de memoria. . registro de estado. Los códigos de operación 0x95C8 y 0x9004 hacen exactamente lo mismo (LPM). Para el funcionamiento del AVR. lo que resulta en una frecuencia de trabajo de 1 MHZ. Este reloj del CPU está ligado a los módulos de los registros de propósito general. se requiere una fuente de pulsos de reloj. El microcontrolador atmega48. se inhibe al núcleo para realizar operaciones o cálculos. El reset es una acción con la cual se “inicia” el trabajo de los microprocesadores y microcontroladores. Inclusive pueden llegar a ser opcionales en algunos microcontroladores. Al detener el reloj del CPU. designado también como reset.2. pre calibrado para frecuencia de 8 MHZ. y por una versión de las herramientas GNU. 2.2.1 Reloj.2 Reset. mientras que la instrucción SER no lo hace. a pesar de que parecen ser instrucciones complementarias (dejar todos los bits en 1. es un cristal o un oscilador. haciendo así que el microprocesador o microcontrolador comience a ejecutar las instrucciones que están a partir de esa posición de memoria apuntada por el AVR. La conexión de un cristal como fuente de reloj del AVR se muestra en la siguiente figura. y dejar todos los bits en 0 respectivamente). como el PIC o el 8051 y sus derivados. Estos microcontroladores están soportados por tarjetas de desarrollo de costo razonable. principalmente debido a la existencia de herramientas de desarrollo gratuitas o de bajo costo. El circuito de reset es aquel que permite regresar todos los registros de entradas y salidas a sus valores iníciales y empezar a ejecutar el programa en el vector del reset. tiene la característica de que puede utilizar una fuente de reloj interna. Como los PIC. Una fuente de reloj externa confiable. 2. Esta acción se ejecuta cuando se aplica una señal –denominada reset. y la posibilidad de utilizar un divisor de reloj entre 8. tiene una comunidad de seguidores (ejemplificadas por el foro de internet AVRFreaks). capaces de descargar el código al microcontrolador.a una terminal. El efecto práctico de la señal es poner el contador de programa (PC) en un valor predeterminado (por ejemplo PC = 0). propiedad de la que carecen los procesadores de memoria segmentada o por bancos.2 Componentes básicos del microcontrolador El microcontrolador AVR requiere de pocos componentes externos para comenzar a utilizarlo. 2. registros de memoria de datos entre otros.

todos los puertos de entradas y salidas regresan inmediatamente a sus estados iníciales.  Reset externo: cuando se aplica un nivel lógico al pin de reset. El circuito básico a reset y un cristal externo es el siguiente: Las fuentes de reset del microcontrolador atmega8 son las siguientes. Este tiempo de espera puede ser seleccionado por el usuario a través de los bits fusibles CKSEL.Cuando una fuente de reset se activa. sin requerir ningún ciclo de reloj. Una vez que todas las fuentes de reset son desactivadas. permitiendo que las fuentes de poder almacene un nivel estable antes de comenzar con las operaciones regulares.  Reset de energizado: cuando el voltaje es aplicado por primera vez.  Reset de watchdog: cuando expira el contador del watchdog (si es que este está habilitado)  Reset de Brown-out: reset de protección ante caídas de tensión (si es que está habilitado) . que amplía la duración del reset interno. transcurre un ciclo de espera –retardo-.

2.3. Figura 2.3. Básicamente sirve para leer el estado del pin del puerto cuando este se ha configurado como entrada.3 Puertos de entrada salida.2.2 Diagrama esquemático de un pin de entrada y salida del microcontrolador AVR. Escribir un cero.3 Registro PORTx. Si el pin está configurado como entrada. Escribir un uno a un bit de este registró. configura el pin correspondiente al bit como salida. si será una entrada o una salida. . estando configurado como salida. independientemente del estado de DDRx. 2. El AVR atmega48 consiste de tres puertos de entrada salida (I/O). Cada puerto de entra salida consiste de tres registros: DDRx. escribir un uno en el bit correspondiente de este registro.3. Si el pin está configurado como salida escribir un uno o un cero en el bit correspondiente de este registro ocasiona que la salida en este pin sea uno o cero. habilita la resistencia de pull up. Escribir un cero lo hace entrada.2 Registro PINx.1 Registro DDRx. PINx y PORTx. Lee el estado de PORTx. deshabilita la resistencia de pull up. El registro DDRx configura la dirección que tienen los datos en el puerto. 2.

I. lo correcto es poner una resistencia de pull-up. C y D que deben ser configurados para decirle cómo va a funcionar los pines del puerto si como entrada o como salida. Si ha manejado otros microcontroladores habrá notado que únicamente tienen asociados un sólo registro al puerto de entrada/salida.3 Conexión de resistencias de Pull-up Importante. si el interruptor no se presiona leerá el pin un 1 lógico por la resistencia conectada a 5V. porque de quedarse flotadas el C. Se puede configurar de manera independiente cada pin de un puerto como salida o como entrada. A través de los puertos de entrada y salida es como el procesador se comunica con el mundo exterior. consume mayor corriente y el estado del pin oscilará. un 0 es para indicar que el pin es de entrada y un 1 de salida.3. pero este microcontrolador permite al diseñador ahorrar hardware ya que tiene resistencias de pull-up internas que pueden ser habilitadas. si quiere escribir al puerto B deberá hacerlo .4 Entradas salidas del atmega48. Por ejemplo con el registro DDRB se especifica la dirección del pin correspondiente. Cuando son configurados como entradas las terminales de un circuito integrado deben colocarse resistencias de pull-up para evitar que queden flotadas (sin conectarse). pero en este microcontrolador tiene asociados dos registros al puerto de entrada/salida. Importante. si se presiona el interruptor leerá un 0 lógico.2. Por ejemplo si se quiere que los primeros cuatro pines del puerto A sean entrada y los 4 más significativos sean de salida se programa así: DDRB=0xf0. Este microcontrolador en particular tiene tres puertos el B. Figura 2.

4.4.así PORTB=dato. Limitantes Físicas de los pines: máximo pueden dar 40mA por pin. es decir que sumando la corriente de los pines y la que consume el microcontrolador no deben exceder más de 200mA. variable=PINC o variable=PIND para leer el valor del puerto de entrada. . pero si desea leer el estado de los pines de ese puerto deberá hacer dato=PINB. y deberá usar variable=PINB. protoboard.4 Práctica de entradas salidas. 2 Capacitores de 22 pf 1 Interruptor tipo push button 1 Resistor de 10KΩ 1 Resistor de 1KΩ 4 Resistores de 220Ω 4 Diodos emisores de luz LEDs 1 Programador de microcontroladores 1 Microcontrolador atmega48 1 Fuente de alimentación de 5 volts Pinzas. Importante. pero el Circuito Integrado máximo debe manejar 200mA.1 Objetivo.2 Material. 2. PORTC o PORTD para escribir al puerto. es decir deberá usar PORTB. es otra ventaja que tenemos con este tipo de arquitectura.3 Desarrollo.4. Conocer las secciones que conforman un programa. 2. Arme el circuito de la siguiente figura. así como los registros que se utilizan para el direccionamiento de entradas salidas. El material necesario para realizar esta práctica es el siguiente: Cantidad cantidad 1 Cristal de cuarzo de 4 MHZ. pero en elcaso de ATMEL se tienen dos dando la ventaja de que de esa forma el acceso a puertos es más rápido cuando se va usar como entrada un determinado pin y posteriormente se va usar como salida. Cualquier otro microcontrolador de otros fabricante sólo tienen un sólo registro para leer o escribir al puerto. 2. cable telefónico 2.

4. //_____________inicio de programa #include <avr/io.h> //se llama a la librería de entrada salida #define step1 8 #define step2 4 #define step3 2 #define step4 1 //se define la variable step1 con el valor de 8 //se define a la variable step2 con el valor de 4 //se define a la variable step3 con el valor de 2 //se defina a la variable step4 con el valor de 1 void config_io(void) { //función de configuración de I/O .2.4 Código.

PORTC=step2.DDRC=0x0F. //ciclo for para 2500 ciclos } void secuencia1 (void){ PORTC=step1. PORTC=step2. DDRD=0b11111011. retardo(). retardo(). } void secuencia2 (void){ PORTC=step4. retardo(). //puerto C tres bits como entradas y cuatro como salidas de I/O //PD2 como entrada //activar resistor de pull up en PD2 //función de retardo //declaración de entero de 16 bits “i” for (i=0. PORTC=step4. retardo(). retardo(). PORTC=step3. } void retardo (void) { int16_t i. PORTC=step3. i++). retardo(). PORTC=step1. i<25000. retardo(). PORTD=_BV(PD2). //función para secuencia 2 de I/O // se iguala al puerto C con el valor de step4 // retardo para que el led se quede prendido // se iguala al puerto C con el valor de step3 // retardo para que el led se quede prendido // se iguala al puerto C con el valor de step2 // retardo para que el led se quede prendido // se iguala al puerto C con el valor de step1 //función para secuencia 1 de I/O //se iguala al puerto C con el valor de step1 //retardo para que el led se quede prendido // se iguala al puerto C con el valor de step2 // retardo para que el led se quede prendido // se iguala al puerto C con el valor de step3 // retardo para que el led se quede prendido // se iguala al puerto C con el valor de step4 // retardo para que el led se quede prendido .

retardo().1 Otro código /* * PRACTICA_IO. break.4. case(0): //se va a la secuencia 1 //para la secuencia //se entra cuando el puerto C es igual a 0 secuencia2(). } } } //___________fin de programa //se va a la secuencia 2 //para la secuencia //termina la función switch //termina el ciclo while //termina el programa main 2. break.m.c * * Created: 02/07/2012 10:49:27 a. } void main(void){ config_io(). while(1){ // retardo para que el led se quede prendido //función principal //llamada a función config_io //ciclo infinito switch(PIND){ //función de selección múltiple case(4): //se entra cuando el puerto C es igual a 4 secuencia1().4.h> #define PASO_1 0x01 /* DEFINE PASO_1 CON VALOR DE 0x01 */ . * Author: Eduardo Balderas */ #include <avr/io.

for (int i = 0 . i++). . if (PASOS>4) PASOS=1.#define PASO_2 0x02 #define PASO_3 0x04 #define PASO_4 0x08 int PASOS. break. else PASOS--. while(1) { if ((PIND & _BV(PD2)) == _BV(PD2)) PASOS++. DDRC= 0x0F. asm("nop"). i < 30000 . /* DEFINE PASO_2 CON VALOR DE 0x02 */ /* DEFINE PASO_3 CON VALOR DE 0x04 */ /* DEFINE CON VALOR DE 0x08 */ /* DECLARA VARIABLE */ int main(void) { PORTD=_BV(PD2). if (PASOS<=0) PASOS=4. switch (PASOS) { case(1): PORTC=PASO_1.

Diagrama Esquemático. break. se selecciona el pin deseado el cual se conecta a un LED en el cual se visualiza el parpadeo. en este caso se realiza el parpadeo a través de dos métodos distintos de programación. } //TODO:: Please write your application code } } 2.5 Trabajo adicional. default: break. En este programa se maneja el puerto para hacer parpadear un LED. break. Parpadeo de un LED Descripción. break.1 Parpadeo de un Led. 2. case(4): PORTC=PASO_4.5.case(2): PORTC=PASO_2. . utilizando todo el puerto o sólo un bit del mismo. case(3): PORTC=PASO_3.

1 Resistores de 220 Ohms. 1 Microcontrolador ATmega48. Introducción. es necesario indicarle esto en el DDR. El microcontrolador tiene varios puertos de los cuales se puede hacer uso. 1 LED. si se toma como ejemplo el puerto B. como salida o ambos. . Para obtener que el puerto B se comporte como entrada. para poder hacer esto es necesario escribir en los registros del puerto para darle las instrucciones necesarias. Existen tres principales formas de controlar los puertos. como entrada o como salida. estos puertos se pueden configurar como se quiera. simplemente le indicara al puerto si este será entrada o salida.Materiales. este registro no activara ni desactivara ningún pin del microcontrolador. DDR.

A continuación se muestran varias configuraciones de ejemplo para el PORT: PORTB=0xFF. este se emplea en caso de que el DDR haya sido seleccionado como salida. //como decimal. PIN. DDRB=0b11111111. en todos los registros. por ejemplo. Se puede escribir en cualquiera de los tres tipos (binario hexadecimal y decimal). . un 0 indica que el pin esta en nivel bajo. //todos los pines están desactivados. //como hexadecimal. //como decimal. //como hexadecimal. //como binario. un 1 en el PORT indica un nivel alto en el puerto como salida. //sólo los primeros dos bits del puerto están activos. DDRB=255. o binario. PORTB=0x00. //como binario. DDRB=0b10001100. y el 0 entrada. //todos los pines están activos. DDRB=140. PORTB=0x03. PORT.Para indicarle al DDR si el puerto sea de entrada o salida. se le puede escribir como hexadecimal. el 1 indica salida. El registro PORT controla la salida del puerto. Si se quiere que algunos bits funcionen como entradas: DDRB=0x8C. decimal. si se desea que todos los bits del puerto sean salidas se puede escribir como sigue: DDRB=0xFF.

//Bit 0 del puerto B = 1. y un cero si esta en nivel bajo de voltaje. //el valor de PINB es asignado a la variable "valor". #include <util/delay. este registro presenta un 1 si a un pin del microcontrolador se le está alimentando externamente. _delay_ms(250). //iniciar bucle infinito. //puerto B = 00000000. //declarar el puerto B como salidas. //retardo 250 milisegundos. //inicio del programa principal. _delay_ms(250).h> Se incluye la librería microcontrolador.h> #include <util/delay. todos son R). En este caso el valor del PIN se le puede asignar a una variable la cual guardara el valor de la misma.El PIN es un registro de lectura (es conveniente hacer notar en la imagen del registro donde dice Read/Write. //fin del bucle infinito. #include <avr/io. //retardo de 250 milisegundos. PORTB&=~(_BV(PB0)).h> avr/io que contiene la información de las entradas y salidas del . //puerto B = 00000001. while(1){ PORTB=0x01. PORTB|=_BV(PB0). //librería de retardos. #include <avr/io. _delay_ms(250). } } //librería de entradas y salidas. //fin del programa principal Detalles del programa. //retardo de 250 milisegundos. valor =PINB.h> int main (void){ DDRB=0xFF. al momento de ejecutar la instrucción por ejemplo. Programa en C. _delay_ms(250). //Bit 0 del puerto B = 0. PORTB=0x00. //retardo de 250 milisegundos.

DDRB=0xFF. éste es el que determina el uso que se le va a dar al puerto del microcontrolador. En este caso 0xFF es la nomenclatura para indicar un valor hexadecimal. se le asigna un 0x01. en este caso se hace uso del registro DDR. Los puertos del micro contienen tres registros los cuales son. Una manera de hacer parpadear un LED es activando y desactivando la fuente. siempre se cumple y se ejecutaran cíclicamente las instrucciones dentro del while. y siempre repita lo mismo. . se le asigna 0x00 y vuelve a esperar el mismo tiempo. Esto se hace con la intención de que el programa nunca se detenga. es donde el programa inicia. como se puede ver en el código. Estas instrucciones manejan a los 8 bits del puerto. en este caso el 1 es lo mismo que TRUE. se espera 250 milisegundos. y un cero es de entrada. siempre es necesario declarar la función main. PORTB=0x00. en este caso. el DDR el PORT y el PIN. la tabla a continuación describe el código. por lo tanto. while(1){ El ciclo while. es un ciclo que ejecuta todas las instrucciones que se encuentran dentro de sus corchetes. la fuente de alimentación del mismo viene del bit 0 o el primero pin del puerto B. _delay_ms(250). int main (void){ El main es la función principal. siempre y cuando lo que este dentro del paréntesis se cumpla. _delay_ms(250). si se le asigna un uno es de salida. PORTB=0x01.Esta librería es necesaria para poder utilizar los retardos de tiempo requeridos. si se expresa en binario. en donde se puede ver claramente que los 8 bits del DDR están activados como salidas. este se escribe 0b11111111.

PORTB&=~(_BV(PB0)). Esto se observa en la siguiente tabla. Manejo de los Puertos Descripción. se manejan independiente los bits del puerto. _delay_ms(250). En este ejemplo se emplean las estructuras de control como el while y el if. se puede trabajar con ellos de manera que si se cambia a uno. es que al usar este código.2 Manejo de los puertos. .5. ya que se separa y se activa o desactiva el bit 0 del puerto B. esto es. pero la principal diferencia y ventaja. para lo cual se conecta un Push Button que al presionarlo hará que prenda el LED. Prácticamente el código hace lo mismo.PORTB|=_BV(PB0). son algo más complejas. no afecte al otro. que al aislar los bits. En este programa se presenta un uso práctico de los registros de los puertos. se enciende un LED conectado a un pin del microcontrolador. En este caso las instrucciones de activar y desactivar el pin del puerto. 2. _delay_ms(250).

Resistor de 220 Ohms. 1 Microcontrolador ATmega48.Diagrama Esquemático. Materiales. Push Button. 1 1 1 1 LED. Resistor de 10Kohms. Introducción. while .

siempre y cuando la condición se cumpla. las instrucciones se ejecutaran. el ciclo while. if else . instrucción B. } Por lo tanto. en caso de que la condición no se cumpla. La nomenclatura del ciclo while es: while("condición") { instrucción A. ejecuta toda instrucción dentro del mismo. siempre y cuando la condición se cumpla. se brinca las instrucciones y el programa continua.Como se puede ver en el diagrama de flujo.

//librería necesaria para las entradas y salidas. //fin del ciclo de if. //inicio del programa principal. while(1){ if (PINB==0x01){ PORTD=0x01. también hay una condición y si esta se cumple ejecuta el proceso o las instrucciones indicadas dentro de los corchetes. en caso de que la condición haya sido falsa. _delay_ms(1000). //apagar el LED. DDRD=0xFF. en caso de que no se cumpla es opcional escribir el "else" el cual ejecutara un proceso. //fin del programa principal. //prender el LED conectado al bit 0 del puerto D.h> int main (void){ DDRB=0x00. //si el PINB es igual a 1. //retardo de 1000 mili segundos. Programa en C. //librería para emplear los retardos de tiempo.h> #include <util/delay. //fin del ciclo del bucle infinito. //inicio del bucle infinito. } } } . PORTD=0x00.En el if/else. //declarar el puerto D como salida. #include <avr/io. //declarar el puerto B como entrada.

y en este caso como se puede ver se usa doble símbolo de igual para diferenciarlo de cuando se le asigna un valor a una variable. Se le da al puerto la instrucción de tomar el valor 0x01. Nótese que se está utilizando PINB. el cual pertenece al puerto B. . #include <avr/io. PORTD=0x01. variable ==14. el ciclo while nunca se termina. el mismo que se declaro como salida en el DDR.Detalles del programa. si es verdadero arroja un 1. Esta condición corresponde al Push Button conectado en el pin del puerto B. DDRD=0xFF.h> Se incluye la librería avr/io que contiene la información de las entradas y salidas del microcontrolador.h> Esta librería es necesaria para poder utilizar los retardos de tiempo. siempre es necesario declarar la función main. previamente el puerto D se declaro como salida. #include <util/delay. if (PINB==0x01){ Al emplear el if la condición tiene que ir dentro de paréntesis. //se comparan variable y 14. int main (void){ El main es la función principal. es donde el programa inicia. Se declara el puerto B como entrada y el puerto D como salida. while(1){ El 1 es igual a verdadero. variable =14. DDRB=0x00. //se le asigna el valor de 14 a la variable.

_delay_ms(1000). . PORTD=0x00. Se desactivan todos los pines del puerto D. Instrucción de retardo de 1000 milisegundos. el valor dentro de los paréntesis puede ser ajustado como se requiera.