Paso 4: Atmel secreto: DDR y puertos y alfileres
Este paso de la corriente toma un descanso de la construcción y prueba. La gente a menudo pregunta (y debe preguntar) como cambiar el nivel de voltaje (es decir, estado de la lógica) en un pin de Puerto MCU para que un LED parpadee (Figura 1) y como leer una entrada digital.
A menudo con respecto a un procesador o microcontrolador (MCU), uno habla de 'Puerto' significa un grupo de cables que tampoco aporta datos de la MCU o en el MCU. Para un circuito integrado, los 'cables' se refieren a las clavijas de físicas en la IC. Los microcontroladores AVR de Atmel tienen generalmente puertos con 8 pernos desde la MCU utiliza buses de datos amplia de 1 byte. Los puertos se refieren a menudo como puertos de entrada / salida o como puertos IO solo IO; Estos son los puertos de E/S digitales. Los microcontroladores de Atmel puede tener muchos puertos IO que están etiquetados como A, B y así sucesivamente. Uno encuentra a menudo las palabras clave de Atmel de PORTA, PORTB, PORTC, PORTD. Por favor leer este párrafo y observe que un puerto físico se refiere a los pins de físicos en la IC. Atmel utiliza las palabras clave de puerto y PIN (Nota caps) en referencia a la salida y la entrada y registros. Por definición, un registro [14] es un tipo de localización de memoria (tal vez mejor llamado 'ubicación de almacenamiento') con especial relaciones/interconexión de hardware. El registro no se considera para ser parte de la memoria de programa y la variable aunque es posible leer, escribir, manipular y transferir el contenido del registro.
Ahora aquí está parte del secreto. En la jerga de Atmel, la palabra puerto (según lo utilizado por ejemplo en PORTB) se refiere a un puerto de salida digital, por el que el MCU generará una tensión en los cables de salida del MCU. La palabra Atmel PIN (como los utilizados por ejemplo en PINB) significa el MCU pone el grupo de cables físicos en un estado de alta impedancia y el MCU puede leer voltajes digitales (0 o Vcc donde Vcc = 5 para la configuración de tablero del experimentador). Quizás más importantemente, PORTB y PINB se refieren al mismo grupo de cables físicos en el MCU. Un comentario similar se aplica a PORTA y PINA excepto los pines físicos serán general difieren de las que refieren el PORTB y PINB. Así que ¿cómo uno determina si un alfiler físico en el MCU es una entrada o una salida para el MCU?
Vamos a decirlo otra vez con otras palabras. Hay una diferencia entre el puerto y PIN en ATMEL usando C y C++. La palabra puerto se refiere a un registro que proporciona salidas a los pines físicos del MCU. El registro de Puerto tiendas de 1s y 0s y el MCU traduce estos valores lógicos a voltajes de Vcc y cero, respectivamente, en los pines físicos. La palabra PIN se refiere a un registro que recibe la entrada de un grupo de pines físicos. El MCU traducirá los voltajes de Vcc y cero en las clavijas físicas lógica 1s y 0s, respectivamente, para el registro PIN. Aviso la palabra física se refiere a los cables cortos reales que sobresalen del paquete MCU. A menudo usamos la palabra 'Puerto' en referencia a la colección de 8 pines; Esto debe leerse como puerto físico y pines físicos.
OK, entonces, ¿cómo se especifica si pin físico es una entrada o una salida para el MCU? Atmel AVR utiliza el concepto de datos dirección registro DDR. Cada grupo de hilos formando un puerto físico de IO tiene tal DDR y etiquetado como DDRA, DDRB, DDR, DDRD y así sucesivamente. Un DDR es un registro de 8 bits (es decir, la ubicación de almacenamiento de memoria) similar al correspondiente registro para los puertos del IO de 8 bits. Un valor de 1 en una posición de la DDR corresponde a una salida por el pin físico correspondiente. Un valor de 0 produce una entrada en el pin físico correspondiente. Por ejemplo, DDRB corresponde a física PortB. Cuando DDRB bit #i tiene el valor de 1 y luego pin #i en PortB física será una salida para el MCU. Por otro lado, cuando DDRB bit #i tiene un valor de cero pin físico #i en PortB física será una entrada. Quizás los ejemplos más concretos sería mejores.
Ejemplo 1: Solo siete entradas digitales y salida digital
Considerar física PortB en el ATTiny2313A y considere la tabla 1. La fila superior muestra los pines físicos en el paquete de la inmersión de 20 pines como se muestra en la primera página o dos de la hoja de datos de Atmel. La segunda fila muestra el nombre de Atmel para el pin físico.
Tabla 1: Ejemplo de ATTiny2313A Pin 12 como una salida y los otros pines puerto B como entradas.
Pernos de físicos | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Nombre | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Física PortB | En | En | En | En | En | En | En | Hacia fuera |
Ahora, supongamos que hemos creado primero DDRB = 1 como se muestra en la tercera fila del cuadro 1. El registro DDRB ordinariamente se establecería antes de leer o escribir PortB. El MCU lee el registro DDRB y establece el pin físico #12 como una salida. Porque los otros bits de DDRB son cero, los restantes pines físicos 13-19, que se denominan B1-B7, son todas las entradas. En este punto, el programa puede leer o escribir el PortB desde la entrada y salida se han fijado.
Ejemplo 2: Dos de salida pines y 6 entradas
Tabla 2: Ejemplo con pin 13 y 14 como el resto de entradas y salidas.
Pernos de físicos | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Nombre | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB = 00000110 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Física PortB | En | En | En | En | En | Hacia fuera | Hacia fuera | En |
La tercera fila de la tabla 2 muestra que en primer lugar hemos puesto DDRB = 00000110 en binario. En C/C++ está escrito como DDRB = 0b110 donde '0b' significa 'binario'. Los ceros se han omitido por simplicidad para formar el '110' parte pero pueden ser incluidos en la declaración C DDRB = 0b00000110 si lo desea. El mismo valor se puede escribir en decimal como DDRB = 6. Y se puede escribir en hexadecimal como DDRB = 0 x 06 donde el '0 x' está parado para hexadecimal. El PortB física por lo tanto tiene pin13 y pin 14 salidas y todos los otros pines como entradas.
Comentario: Esos pines físicos que son salidas serán capaces de generar cualquiera de los dos Estados, es decir, cero y Vcc. Para nuestro proyecto, el Consejo del experimentador utiliza Vcc = 5 v, mientras que la cuerda en una caja de plástico utiliza Vcc como el voltaje de la batería, que puede ir desde 4,9 voltios a 3 voltios dependiendo del estado de carga de las baterías. La tensión de salida puede utilizarse entonces para controlar otros componentes. Atmel pines físicos pueden 40mA fuente o sumidero de corriente. Para verificar, se refieren a las características eléctricas de las hojas de especificaciones y datos como http://www.atmel.com/Images/doc8246.pdf. Así que puede proporcionar el pin de salida (es decir, origen) corriente diagonal cuando el pin físico tiene sobre la tensión de salida de + Vcc o puede recibir corriente (es decir, fregadero) cuando el pin físico tiene 0v.
Ejemplo 3: Escribir valores en salidas
OK, así que vamos a tomar un par de ejemplos para usar DDRB, PORTB y PINB. Primero considerar el PORTB.
Tabla 3: Ejemplo fabricación de pernos del IO puerto B salidas.
Pernos de físicos | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Nombre | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Física PortB | Hacia fuera | Hacia fuera | Hacia fuera | Hacia fuera | Hacia fuera | Hacia fuera | Hacia fuera | Hacia fuera |
PORTB = 0b0100100 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
Resultado físico del Pin | 0V | VCC | 0V | 0V | 0V | VCC | 0V | 0V |
En el ejemplo de la tabla 3, primero fijamos DDRB = 0b11111111 = 0xFF = 255 decimal que pines físicos 12-19 son todas las salidas para el MCU. A continuación Supongamos que escribimos el siguiente byte al registro de salida de B como PORTB = 0b0100100 como se muestra en la sexta fila de la tabla 3. Nota ' PORTB =' significa establecer el PortB salida de registro a un valor – es más fácil pensar de PORTB como una variable y ' PORTB =' igualan de medios para establecer esta variable a un valor, que el MCU se traduce en tensiones en el puerto físico. Cuando el PORTB tiene lógica '1', la salida debe exhibir la realización física de la '1' que es Vcc o, para el tablero de nuestro experimentador,
Lógica 1 = > Vcc = + 5volts
Usando la lógica 1, de esta manera permite un gran muchas plataformas diferentes con la misma codificación mientras el MCU sabe cómo transformar los valores de la lógica en los voltajes. Así que comparando las sexta y séptima filas de la tabla 3 muestra que los pernos físicos a la que se ha escrito una lógica 1 exhibirá una tensión de Vcc. Los otros pines tienen cero potencial de voltios. PUNTO importante: Los caracteres "PORTB =" significa en este caso escribir algo a los pines físicos en PortB (realmente esto primero escribe en el PORTB registrarse y luego los valores de la lógica son traducidos por tensión generando circuitos en el MCU). De esta manera, la MCU puede controlar circuitos externos.
Ejemplo 4: Leer valores de pines de entrada
Ahora consideremos otro caso donde montamos primero (en nuestro programa) DDRB = 0b00000000 (binario) = 0 x 00 (hexadecimal) = 0 (decimal) como en la tabla 4. Aquí todos los pines físicos 12-19 serán entradas debido a todos los ceros en DDRB.
Tabla 4: Ejemplo de pines 12-19 son todas las entradas.
Pernos de físicos | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Nombre | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Física PortB | En | En | En | En | En | En | En | En |
V aplicada al Pin | 0V | 0V | 0V | 0V | 0V | VCC | 0V | VCC |
Contenido PINB | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
Más Supongamos que algún agente externo (como yo o tú) se aplica tensiones a la MCU física fija 12-19 como se muestra en la sexta fila de la tabla 4. PUNTO importante: Usando «= PINB» significa leer los voltajes en los pines físicos correspondientes a IO PortB y convertirlos en valores de lógica. Esto se utilizaría en una instrucción de asignación de C/C++ tales como ' x = PINB'. El contenido de la variable x (es decir, PINB) puede verse en la última fila de la tabla 4 que el valor
x = 0b00000101 (binario) = 0 x 05 (hexadecimal) = 5 (decimal)
El MCU convierte Vcc sobre un pin de entrada para el valor lógico de 1 y cero de otra manera. De esta manera, la MCU puede leer los Estados de los circuitos externos.
Ejemplo 5: IO mixta y resistencias pull-up
Existe otra situación posible, mediante el cual un puerto IO tiene tanto entrada y salida y el MCU realiza una escritura al puerto. ¿Qué pasa? Para un pin que es una entrada, la escritura (usando PORTB etc.) puede activar o desactivar un resistor interno de pull-up según el bit correspondiente en la escritura sea un 1 o 0 respectivamente. Consulte Inicio 4. Lectura de un puerto (usando PINB etc.) de mezclado IO (salen unas pinzas en el puerto y el resto son de entrada) leerá la entrada cuando el pin está configurado como entrada y leerá el valor escrito anteriormente (que todavía está en el registro PORTB) si el pin físico es una salida. Consulte Inicio 4 o el manual del usuario para más detalles [0,1].
Ahora al código el Blinky uno proyecto.