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 re gistro 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 exter ior. Forman parte de las entradas e ntradas 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.
2.1 Características de los AVR de ATMEL. Los AVR son una familia de microcontroladores RISC de Atmel. La arquitectura de los AVR fue concebida por dos estudiantes en el Norwegian Institute of Technology, y posteriormente refinada y desarrollada en Atmel Norway, la empresa subsidiaria de Atmel, fundada por los dos arquitectos del chip. El AVR es una CPU de arquitectura Harvard. Tiene 32 registros de 8 bits. Algunas instrucciones sólo operan en un subconjunto de estos registros. La concatenación de los 32 registros, los registros de entrada/salida y la memoria de datos conforman un espacio de direcciones unificado, al cual se accede a través de operaciones de carga/almacenamiento. A diferencia de los microcontroladores PIC, el stack se ubica en este espacio de me moria unificado, y no está limitado a un tamaño fijo. El AVR fue diseñado desde un comienzo para la ejecución eficiente de código C compilado. Como este lenguaje utiliza profusamente punteros para el manejo de variables en memoria, los tres últimos pares de registros internos del procesador, son utilizados como punteros de 16 bit al espacio de memoria externa, bajo los nombres X, Y y Z. Esto es un compromiso que se hace en arquitecturas de ocho bit desde los tiempos de Intel 8008, ya que su tamaño de palabra nativo de 8 bit (256 localidades accedidas) es pobre para direccionar. Por otro lado, 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, complicaría mucho el diseño, violando la premisa original de su simplicidad. Además, algunas instrucciones tales como 'suma inmediata' ( 'add immediate' en inglés) faltan; 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, 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), y 8 pines, hasta el microcontrolador de la familia Mega AVRATmega2560 con 256KB de memoria flash, 8KB de memoria RAM, 4KB de memoria EEPROM, convertidor análogo digital de 10 bits y 16 canales, temporizadores, comparador analógico, JTAG, etc. La compatibilidad entre los distintos modelos es preservada en un grado razonable. Los microcontroladores AVR tienen un segmentado (' pipeline' en inglés) con dos etapas (cargar y ejecutar), que les permite ejecutar la mayoría de las instrucciones en un ciclo de reloj, lo que los hace relativamente rápidos entre los microcontroladores de 8-bit. 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, los PIC). Sin embargo, no es completamente ortogonal:
Los registros punteros X, 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. Las registros de I/O 0 al 31 tienen distintas características que las posiciones 32 al 63.
La instrucción CLR afecta los 'flag', mientras que la instrucción SER no lo hace, a pesar de que parecen ser instrucciones complementarias (dejar todos los bits en 1, y dejar todos los bits en 0 respectivamente). Los códigos de operación 0x95C8 y 0x9004 hacen exactamente lo mismo (LPM).
Como los PIC, tiene una comunidad de seguidores (ejemplificadas por el foro de internet AVRFreaks), principalmente debido a la existencia de herramientas de desarrollo gratuitas o de bajo costo. Estos microcontroladores están soportados por tarjetas de desarrollo de costo razonable, capaces de descargar el código al microcontrolador, y por una versión de las herramientas GNU. Esto último es posible por su uniformidad en el acceso al espacio de memoria, propiedad de la que carecen los procesadores de memoria segmentada o por bancos, como el PIC o el 8051 y sus derivados.
2.2 Componentes básicos del microcontrolador El microcontrolador AVR requiere de pocos componentes externos para comenzar a utilizarlo. Estos componentes son el circuito de reset y el circuito de reloj. Inclusive pueden llegar a ser opcionales en algunos microcontroladores.
2.2.1 Reloj. Para el funcionamiento del AVR, se requiere una fuente de pulsos de reloj, la cual se encargue de suministrar al AVR con una frecuencia de trabajo al reloj del CPU del microcontrolador. Este reloj del CPU está ligado a los módulos de los registros de propósito general, registro de estado, registros de memoria de datos entre otros. Al detener el reloj del CPU, se inhibe al núcleo para realizar operaciones o cálculos. Una fuente de reloj externa confiable, es un cristal o un oscilador. La conexión de un cristal como fuente de reloj del AVR se muestra en la siguiente figura. El microcontrolador atmega48, tiene la característica de que puede utilizar una fuente de reloj interna, pre calibrado para frecuencia de 8 MHZ, y la posibilidad de utilizar un divisor de reloj entre 8, lo que resulta en una frecuencia de trabajo de 1 MHZ.
2.2.2 Reset. El reset es una acción con la cual se
“inicia” el trabajo de los microprocesadores y
microcontroladores. Esta acción se ejecuta cuando se aplica una señal –denominada reset- a una terminal, designado también como reset. El efecto práctico de la señal es poner el contador de programa (PC) en un valor predeterminado (por ejemplo PC = 0), 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. 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.
Cuando una fuente de reset se activa, todos los puertos de entradas y salidas regresan inmediatamente a sus estados iníciales; sin requerir ningún ciclo de reloj. Una vez que todas las fuentes de reset son desactivadas, transcurre un ciclo de espera –retardo-, que amplía la duración del reset interno, permitiendo que las fuentes de poder almacene un nivel estable antes de comenzar con las operaciones regulares. Este tiempo de espera puede ser seleccionado por el usuario a través de los bits fusibles CKSEL. El circuito básico a reset y un cristal externo es el siguiente:
Las fuentes de reset del microcontrolador atmega8 son las siguientes.
Reset de energizado: cuando el voltaje es aplicado por primera vez.
Reset externo: cuando se aplica un nivel lógico al pin de reset.
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)
2.3 Puertos de entrada salida. El AVR atmega48 consiste de tres puertos de entrada salida (I/O). Cada puerto de entra salida consiste de tres registros: DDRx, PINx y PORTx.
2.3.1 Registro DDRx. El registro DDRx configura la dirección que tienen los datos en el puerto, si será una entrada o una salida. Escribir un uno a un bit de este registró, configura el pin correspondiente al bit como salida. Escribir un cero lo hace entrada.
2.3.2 Registro PINx. Lee el estado de PORTx, independientemente del estado de DDRx. Básicamente sirve para leer el estado del pin del puerto cuando este se ha configurado como entrada.
2.3.3 Registro PORTx. 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. Si el pin está configurado como entrada, escribir un uno en el bit correspondiente de este registro, habilita la resistencia de pull up . Escribir un cero, estando configurado como salida, deshabilita la resistencia de pull up.
Figura 2.2 Diagrama esquemático de un pin de entrada y salida del microcontrolador AVR
2.4 Práctica de entradas salidas. 2.4.1 Objetivo. Conocer las secciones que conforman un programa, así como los registros que se utilizan para el direccionamiento de entradas salidas.
2.4.2 Material. El material necesario para realizar esta práctica es el siguiente:
Cantidad 1 2 1 1 1 4 4 1 1 1
cantidad Cristal de cuarzo de 4 MHZ. Capacitores de 22 pf Interruptor tipo push button Resistor de 10KΩ Resistor de 1KΩ Resistores de 220Ω Diodos emisores de luz LEDs Programador de microcontroladores Microcontrolador atmega48 Fuente de alimentación de 5 volts Pinzas, protoboard, cable telefónico
2.4.3 Desarrollo. Arme el circuito de la siguiente figura.
2.4.4 Código. //_____________inicio de programa #include
//se llama a la librería de entrada salida
#define step1 8
//se define la variable step1 con el valor de 8
#define step2 4
//se define a la variable step2 con el valor de 4
#define step3 2
//se define a la variable step3 con el valor de 2
#define step4 1
//se defina a la variable step4 con el valor de 1
void config_io(void) {
//función de configuración de I/O
DDRC=0x0F;
//puerto C tres bits como entradas y cuatro como salidas de I/O
DDRD=0b11111011;
//PD2 como entrada
PORTD=_BV(PD2);
//activar resistor de pull up en PD2
} void retardo (void) { int16_t i;
//función de retardo //declaración de entero de 16 bits “i”
for (i=0; i<25000; i++); //ciclo for para 2500 ciclos } void secuencia1 (void){ PORTC=step1;
//función para secuencia 1 de I/O //se iguala al puerto C con el valor de step1
retardo();
//retardo para que el led se quede prendido
PORTC=step2;
// se iguala al puerto C con el valor de step2
retardo();
// retardo para que el led se quede prendido
PORTC=step3;
// se iguala al puerto C con el valor de step3
retardo();
// retardo para que el led se quede prendido
PORTC=step4;
// se iguala al puerto C con el valor de step4
retardo();
// retardo para que el led se quede prendido
} void secuencia2 (void){
//función para secuencia 2 de I/O
PORTC=step4;
// se iguala al puerto C con el valor de step4
retardo();
// retardo para que el led se quede prendido
PORTC=step3;
// se iguala al puerto C con el valor de step3
retardo();
// retardo para que el led se quede prendido
PORTC=step2;
// se iguala al puerto C con el valor de step2
retardo();
// retardo para que el led se quede prendido
PORTC=step1;
// se iguala al puerto C con el valor de step1
retardo();
// retardo para que el led se quede prendido
} void main(void){
//función principal
config_io();
//llamada a función config_io
while(1){
//ciclo infinito
switch(PIND){ //función de selección múltiple case(4):
//se entra cuando el puerto C es igual a 4 secuencia1();
//se va a la secuencia 1
break;
//para la secuencia
case(0):
} } }
//se entra cuando el puerto C es igual a 0 secuencia2();
//se va a la secuencia 2
break;
//para la secuencia
//termina la función switch //termina el ciclo while //termina el programa main
//___________fin de programa
2.4.4.1 Otro código /* * PRACTICA_IO.c * * Created: 02/07/2012 10:49:27 a.m. * Author: Eduardo Balderas */ #include #define PASO_1 0x01
/* DEFINE PASO_1 CON VALOR DE 0x01 */
#define PASO_2 0x02
/* DEFINE PASO_2 CON VALOR DE 0x02 */
#define PASO_3 0x04
/* DEFINE PASO_3 CON VALOR DE 0x04 */
#define PASO_4 0x08
/* DEFINE CON VALOR DE 0x08 */
int
PASOS;
/* DECLARA VARIABLE */
int main(void) { PORTD=_BV(PD2); DDRC= 0x0F;
while(1) { if ((PIND & _BV(PD2)) == _BV(PD2)) PASOS++; else PASOS--; asm("nop"); if (PASOS>4) PASOS=1; if (PASOS<=0) PASOS=4; for (int i = 0 ; i < 30000 ; i++); switch (PASOS) { case(1): PORTC=PASO_1; break; case(2): PORTC=PASO_2; break; case(3): PORTC=PASO_3;
break; case(4): PORTC=PASO_4; break; default: break; }
//TODO:: Please write your application code } }
2.5 Trabajo adicional. 2.5.1 Parpadeo de un Led.
Parpadeo de un LED Descripción. En este programa se maneja el puerto para hacer parpadear un LED, en este caso se realiza el parpadeo a través de dos métodos distintos de programación, utilizando todo el puerto o sólo un bit del mismo, se selecciona el pin deseado el cual se conecta a un LED en el cual se visualiza el parpadeo.
Diagrama Esquemático.
Materiales. 1 LED. 1 Resistores de 220 Ohms. 1 Microcontrolador ATmega48.
Introducción. El microcontrolador tiene varios puertos de los cuales se puede hacer uso, estos puertos se pueden configurar como se quiera, como entrada o como salida, 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, si se toma como ejemplo el puerto B.
DDR. Para obtener que el puerto B se comporte como entrada, como salida o ambos, es necesario indicarle esto en el DDR, este registro no activara ni desactivara ningún pin del microcontrolador, simplemente le indicara al puerto si este será e ntrada o salida.
Para indicarle al DDR si el puerto sea de entrada o salida, el 1 indica salida, y el 0 entrada, se le puede escribir como hexadecimal, decimal, o binario, por ejemplo, si se desea que todos los bits del puerto sean salidas se puede escribir como sigue:
DDRB=0xFF; DDRB=255; DDRB=0b11111111;
//como hexadecimal. //como decimal. //como binario.
Si se quiere que algunos bits funcionen como entradas: DDRB=0x8C; DDRB=140; DDRB=0b10001100;
//como hexadecimal. //como decimal. //como binario.
Se puede escribir en cualquiera de los tres tipos (binario hexadecimal y decimal), en todos los registros.
PORT. El registro PORT controla la salida del puerto, este se emplea en caso de que el DDR haya sido seleccionado como salida, un 1 en el PORT indica un nivel alto en el puerto como salida, un 0 indica que el pin esta en nivel bajo. A continuación se muestran varias configuraciones de ejemplo para el PORT:
PORTB=0xFF; PORTB=0x00; PORTB=0x03;
PIN.
//todos los pines están activos. //todos los pines están desactivados. //sólo los primeros dos bits del puerto están activos.
El PIN es un registro de lectura (es conveniente hacer notar en la imagen del registro donde dice Read/Write, todos son R), este registro presenta un 1 si a un pin del microcontrolador se le está alimentando externamente, y un cero si esta en nivel bajo de voltaje. En este caso el valor del PIN se le puede asignar a una variable la cual guardara el valor de la misma, al momento de ejecutar la instrucción por ejemplo. valor =PINB;
//el valor de PINB es asignado a la variable "valor".
Programa en C. #include #include
//librería de entradas y salidas. //librería de retardos.
int main (void){ DDRB=0xFF; while(1){ PORTB=0x01; _delay_ms(250); PORTB=0x00; _delay_ms(250); PORTB|=_BV(PB0); _delay_ms(250); PORTB&=~(_BV(PB0)); _delay_ms(250); } }
//inicio del programa principal. //declarar el puerto B como salidas. //iniciar bucle infinito. //puerto B = 00000001. //retardo 250 milisegundos. //puerto B = 00000000. //retardo de 250 milisegundos. //Bit 0 del puerto B = 1. //retardo de 250 milisegundos. //Bit 0 del puerto B = 0. //retardo de 250 milisegundos. //fin del bucle infinito. //fin del programa principal
Detalles del programa. #include Se incluye la librería microcontrolador.
#include
avr/io que contiene la información de las entradas y salidas del
Esta librería es necesaria para poder utilizar los retardos de tiempo requeridos.
int main (void){ El main es la función principal, es donde el programa inicia, siempre es necesario declarar la función main.
DDRB=0xFF; Los puertos del micro contienen tres registros los cuales son, el DDR el PORT y el PIN, en este caso se hace uso del registro DDR, éste es el que determina el uso que se le va a dar al puerto del microcontrolador, si se le asigna un uno es de salida, y un cero e s de entrada. En este caso 0xFF es la nomenclatura para indicar un valor hexadecimal, si se expresa en binario, este se escribe 0b11111111, en donde se puede ver claramente que los 8 bits del DDR están activados como salidas.
while(1){ El ciclo while, es un ciclo que ejecuta todas las instrucciones que se encuentran dentro de sus corchetes, siempre y cuando lo que este dentro del paréntesis se cumpla, en este caso el 1 es lo mismo que TRUE, por lo tanto, siempre se cumple y se ejecutaran cíclicamente las instrucciones dentro del while. Esto se hace con la intención de que el programa nunca se detenga, y siempre repita lo mismo.
PORTB=0x01; _delay_ms(250); PORTB=0x00; _delay_ms(250);
Una manera de hacer parpadear un LED es activando y desactivando la fuente, en este caso, la fuente de alimentación del mismo viene del bit 0 o el primero pin del puerto B, como se puede ver en el código, se le asigna un 0x01, se espera 250 milisegundos, se le asigna 0x00 y vuelve a esperar el mismo tiempo. Estas instrucciones manejan a los 8 bits del puerto, la tabla a continuación describe el código.
PORTB|=_BV(PB0); _delay_ms(250); PORTB&=~(_BV(PB0)); _delay_ms(250); En este caso las instrucciones de activar y desactivar el pin del puerto, son algo más complejas, ya que se separa y se activa o desactiva el bit 0 del puerto B.
Prácticamente el código hace lo mismo, pero la principal diferencia y ventaja, es que al usar este código, se manejan independiente los bits del puerto, esto es, que al aislar los bits, se puede trabajar con ellos de manera que si se cambia a uno, no afecte al otro. Esto se observa en la siguiente tabla.
2.5.2 Manejo de los puertos.
Manejo de los Puertos Descripción. 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, para lo cual se conecta un Push Button que al presionarlo hará que prenda el LED. En este ejemplo se emplean las estructuras de control como el while y el if.
Diagrama Esquemático.
Materiales. 1 1 1 1
LED. Resistor de 220 Ohms. Push Button. Resistor de 10Kohms.
1 Microcontrolador ATmega48.
Introducción. while
Como se puede ver en el diagrama de flujo, el ciclo while, ejecuta toda instrucción dentro del mismo, siempre y cuando la condición se cumpla. La nomenclatura del ciclo while e s:
while("condición") { instrucción A; instrucción B; }
Por lo tanto, siempre y cuando la condición se cumpla, las instrucciones se ejecutaran, en caso de que la condición no se cumpla, se brinca las instrucciones y el programa continua. if else
En el if/else, 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 no se cumpla es opcional escribir el "else" el cual ejecutara un proceso, en caso de que la condición haya sido falsa.
Programa en C. #include #include
//librería necesaria para las entradas y salidas. //librería para emplear los retardos de tiempo.
int main (void){ DDRB=0x00; DDRD=0xFF; while(1){ if (PINB==0x01){ PORTD=0x01; _delay_ms(1000); PORTD=0x00;
//inicio del programa principal. //declarar el puerto B como entrada. //declarar el puerto D como salida. //inicio del bucle infinito. //si el PINB es igual a 1. //prender el LED conectado al bit 0 del puerto D. //retardo de 1000 mili segundos. //apagar el LED.
} } }
//fin del ciclo de if. //fin del ciclo del bucle infinito. //fin del programa principal.
Detalles del programa. #include
Se incluye la librería avr/io que contiene la información de las entradas y salidas del microcontrolador.
#include Esta librería es necesaria para poder utilizar los retardos de tiempo.
int main (void){ El main es la función principal, es donde el programa inicia, siempre es necesario declarar la función main.
DDRB=0x00; DDRD=0xFF; Se declara el puerto B como entrada y el puerto D como salida.
while(1){ El 1 es igual a verdadero, el ciclo while nunca se termina.
if (PINB==0x01){ Al emplear el if la condición tiene que ir dentro de paréntesis, 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.
variable =14; variable ==14;
//se le asigna el valor de 14 a la variable. //se comparan variable y 14, si es verdadero arroja un 1.
Nótese que se está utilizando PINB, el cual pertenece al puerto B, el mismo que se declaro como salida en el DDR. Esta condición corresponde al Push Button conectado en el pin del puerto B.
PORTD=0x01;
Se le da al puerto la instrucción de tomar el valor 0x01, previamente el puerto D se declaro como salida.
_delay_ms(1000);
Instrucción de retardo de 1000 milisegundos, el valor dentro de los paréntesis puede ser ajustado como se requiera.
PORTD=0x00; Se desactivan todos los pines del puerto D.