19.2: Circuito de Salida
- Page ID
- 82215
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)La figura\(\PageIndex{1}\) presenta una simplificación adicional que se centra únicamente en la porción de salida.
En primer lugar, las líneas de control PUD (Pull Up Disable), SLEEP y CLK (Clock) son comunes a todos los bits y puertos. Podemos ignorarlos para nuestros fines. La sección más baja se elimina porque está involucrada con la funcionalidad de entrada. Lo mismo ocurre con la sección superior que rodea al MOSFET. Finalmente, se han eliminado una serie de dos puertas, un inversor y un multiplexor agrupados alrededor de la sección media. Estos sirven a una función particular (y quizás algo esotérica), a saber, la capacidad de alternar rápidamente un poco. Nuevamente, esta sección no es necesaria para el funcionamiento típico.
Al simplificar nos quedamos con un circuito que se centra alrededor de dos flip-flops D y unos búferes de tres estados. Las principales señales de interés son WDx y WRX que alimentan los flip-flops DDxN y PortXn. DDxN es el bit de Dirección de Datos. Determina si el pin físico está configurado para salida (escritura) o entrada (lectura). PortXN presenta los datos que se deben escribir. Tenga en cuenta que la “x” se refiere a la letra de puerto, como en el Puerto B, mientras que la “n” se refiere al número de bit dentro de ese puerto. Así, el pin físico para el bit número dos en el Puerto B se denotaría aquí como PB2 (o alternativamente, PORTB.2). La colección de los ocho bits de DDxN se conoce como el Registro de Dirección de Datos, o DDR. El Registro de Dirección de Datos para el Puerto B se denominaría DDRB. Cada puerto tendrá estos registros mapeados en la memoria. Es decir, para el Puerto B habrá una DDRB para control de dirección y una PORTB para escribir datos (también hay un PINB para leer, más sobre eso más adelante). De igual manera habrá una DDRC y PORTC (y PINC) para el Puerto C, y así sucesivamente para tantos puertos como tenga el controlador (B, C y D para el ATMega 328P).
Para entender cómo funciona el circuito, recuerde que la salida Q de un flip-flop D simplemente hace eco del nivel lógico presente en la entrada D cuando la señal de control pasa de baja a alta (es decir, disparador de borde positivo). Tenga en cuenta que la salida de PortXN alimenta un búfer de tres estados que a su vez alimenta el pin físico. Para escribir datos en el pin, primero se coloca una lógica alta en el bus de datos. La señal WDx es pulsada que transfiere la lógica alta a Q de DDxN. Este alto nivel permite que el búfer de tres estados esté conectado a Pxn. El bit de puerto ahora está configurado para la salida y permanecerá en este modo hasta que se vuelva a afirmar WDx. Los datos deseados (bit alto o bajo) ahora se colocan en el bus de datos. La señal WRX es pulsada que transfiere el nivel lógico a Q de PortXn. Esto alimenta el triestado mencionado anteriormente que transfiere el bit de datos a la salida. Este nivel se mantendrá hasta que se vuelva a afirmar WRX. Si WDx y WRX nunca se vuelven a afirmar, el nivel del pin de salida nunca cambiará. Para escribir nuevos datos en el pin de salida, el bit de datos deseado se coloca en el bus y se pulsa WRX. No es necesario volver a cargar DDxN y volver a afirmar WDx cada vez.
Por ejemplo, supongamos que deseamos flashear un LED varias veces. Podríamos hacer esto conectando un LED al pin y luego alternando el pin de alto a bajo repetidamente. Primero, escribiríamos un alto a DDxN para establecer el modo de salida (escritura). Entonces le escribiríamos un alto a PortXN, encendiendo el LED. Después de una breve espera escribiríamos un bajo a PortXN, apagando el LED. Después de una breve espera adicional escribiríamos otro alto en PortXN (volviendo a encender el LED) y continuaríamos el proceso de la misma manera para tantos flashes como necesitemos.
Los dos buffers finales de tres estados asociados con las señales RDx y RRx nos permiten leer los estados actuales de los bits de dirección y puerto.