Paso 5: Cableado el TWI
Vamos a implementar el TWI como una subrutina de interrupción en el esclavo (la exhibición de 4 dígitos) y como una subrutina normal en el master (el rodillo de dados). Esta manera cada vez que es un rollo de los dados (es decir, al pulsar el botón), el rodillo de dados comunicará el resultado a la pantalla que se visualizará el resultado en los dos últimos dígitos de la pantalla.
Así, por ejemplo, un rollo de sixes doble resultaría en la transmisión del número 12 a la pantalla y esto se puede analizar por la rutina que escribió anteriormente en este tutorial y muestra como un 1 y un 2 en los últimos dos displays de 7 segmentos. Tenga en cuenta que ni siquiera necesita el registro "agudo" que nos causó tantos problemas en el binario a código decimal conversión. Como probablemente han averiguado por ahora, el uso eventual de la pantalla de 4 dígitos no es simplemente para mostrar los rodillos de los dados. Hacemos por ahora porque es una forma sencilla de obtener el código de comunicaciones va sin agregar demasiada cosas nuevas a la vez.
Así que vamos a empezar por analizar cómo funciona la TWI. Se empieza con nuestro rodillo de dados y añadir un par de líneas de código para que las cosas vas. En el display y en el rodillo de dados tenemos que poner el SDA y los pines SCL entrada y alta. Es decir
cbi DDRC,4 <br>sbi PORTC,4<br>cbi DDRC,5<br>sbi PORTC,5
Ahora, en la sección de inicio del código vamos a añadir los siguientes
lds temp,PRR<br>andi temp,0b01011111<br>sts PRR,temp
Esto establece el bit PRTWI y los bits BRTIM0 del registro de reducción de potencia a 0. Ver la hoja de datos en la página 45. Esto hace que el módulo de TWI y el módulo del Timer/Counter0 estén despiertos. Necesitamos el Timer/Counter0 para nuestros comandos de "retraso" que usamos en otras partes del código. El TWI es que nos estamos concentrando en el momento.
Ahora queremos establecer la frecuencia SCL (línea de reloj Serial). Esto lo hacemos utilizando la fórmula dada en la página 213. Ahora, para nuestros propósitos presentes, voy a ajustar la frecuencia tan bajas como sea posible para que podemos analizar la señal un poco más fácil. Entonces puedo ajustar más alto más tarde pero para ahora permite hacer pequeños. Aquí está la fórmula:
SCL freq = CPU/[16 + 2*TWBR*Prescaler]
Si quiero que esto es posible, debo configurar TWBR y Prescalar tan alto como sea posible. El registro de la velocidad de bits de TWI, TWBR, es un registro de 8 bits y así el mayor valor que puedo hacer es 255 (que es todo 1, es decir, TWBR = 0b11111111), también el prescaler bits se definen en tabla 22-7 en la página 232. Estos son bit 0 y el bit 1 de la TWSR (interface de dos hilos Status Register). La tabla nos dice que si queremos que el prescaler más alto debo escoger la TWPS1 = 1 y TWPS0 = 1 y esto nos dará un factor divisor de 64. Por lo tanto, mi frecuencia de reloj Serial para mi línea de TWI, utilizando la fórmula anterior, será
16 MHz / (16 + 2 * 255 * 64) = 16000000Hz/32656 = 489.9 Hz o unos 490 Hz.
Así que lo haremos en nuestra parte INIT del código con las líneas:
ldi temp,255<br>sts TWBR,temp<br>ldi temp,0b00000011<br>sts TWSR,temp
Ahora cuando empezamos el TWI nuestra frecuencia de reloj SCL será por 490 ciclos por segundo (490 Hz). Ahora agregamos las siguientes líneas para poner en marcha el TWI tal como se indica en la página 217 (es decir, modo del transmisor maestro):
ldi temp, (1--TWINT)|(1--TWSTA)|(1--TWEN) <br>sts TWCR,temp
y recordar que la - signos en el anterior se suponen que son "menos" muestras pero el estúpido editor de Instructables no gusta.
Esto establece 3 de los bits en los dos cable Control Register (TWCR) y se puede leer acerca de estos bits (interruptores) en la descripción de dicho registro en las páginas 230 y 231. Esencialmente, el TWINT bit establecido en 1 borra la bandera de interrupción de dos hilos, el TWSTA bit establecido a uno define el rodillo de dados como el maestro en la línea y envía una señal de condición de inicio abajo de la línea de interfaz de dos hilos, por último, el TWEN bit set a un permite el TWI y activa la interfaz.
Eso es todo por ahora! Acaba de poner las líneas en la parte de inicio del código, montarlo y vamos a ver qué pasa.
Queremos enlazar cosas para que nuestros cables TWI ir de nuestra diceroller a nuestra pantalla. No necesitamos escribir nada para la pantalla sin embargo salvo que queremos que el SDA y los pernos de la COSUDE a ser entrada y 5V en el rodillo de dados y la pantalla. Ahora Si giramos en nuestra diceroller y nuestra pantalla y conectar un osciloscopio entre nuestra línea de SCL y GND vemos el rastro de alcance indicado en los dos primeros dibujos. Se puede ver que es 490 Hz igual que quería que fuese. [ver figuras 1 y 2]
Ahora, si usted ha leído la sección de la hoja de datos sobre el TWI notará que dicen que necesitan levantar resistencias a 5V en cada una de las líneas SDA y SCL. ¿Por qué es esto? Miramos a nuestra señal y parece una muy buena onda cuadrada de 490 Hz sin otra cosa que nuestras resistencias pullup interna en cada una de las patillas! Es exactamente el tipo de señal que queremos para comunicaciones (como discutiremos más un poco).
¿Qué sería de enderezamiento a las líneas SDA y SCL? Bueno, simplemente hacen la señal de volver a 5V más rápido. Si tuviera que tirar de él hasta 0V y luego dejar ir, surgirían a mucho más rápido con estos enderezamiento extra externo que con sólo los internos en los pines de 5V. Sin embargo, en la frecuencia de 490Hz no hace ninguna diferencia. La señal está bien sin ellos. De hecho, vamos a usar 490Hz como la frecuencia de TWI porque nuestra aplicación no es necesario ir más rápido. No creo que nadie va a atención si usted puede enviar sólo 490 bits de datos por segundo. Si teníamos una aplicación que necesita alta velocidad de transferencia de datos aumentamos nuestra velocidad de reloj y luego tengamos que añadir externo levantan resistencias.
Permítanme ahora mostrarles por qué algún día querrá poner de enderezamiento a las líneas. Vamos a aumentar nuestra frecuencia SCL. Volver a las líneas en la sección de inicio del código de rodillo de dados (el Maestro establece la velocidad de la línea no el esclavo) y cambiarlo para que nuestra frecuencia es el más alto posible esta vez en lugar de los más bajos. Esto significa que en nuestra fórmula
SCL freq = CPU/[16 + 2*TWBR*Prescaler]
queremos que el denominador para ser tan pequeño como sea posible. Permite tan sólo dejar el prescaler y set TWBR = 0. Entonces la frecuencia será 16MHz/16 que es 1MHz (nota que la CPU todavía será 16 veces mayor que el SCL).
Ahora montar, ejecutarlo y examinar la traza del osciloscopio (uso un osciloscopio DSO Nano de Seeedstudio.com que es un muy bajo costo que viene muy bien con este tipo de cosas). [Ver Fig. 3]
Ahora echar un vistazo a la nueva traza. Enseguida notaremos que en esta alta frecuencia, la línea SCL no tiene ni siquiera tiempo para levantarse a 5V antes de enviarlo a 0 otra vez! Lo que no conseguimos una buena onda cuadrada. Necesitamos una frecuencia más baja para que al menos oscilan entre 0V y 5V. Si pasamos ahora a la Página 308 vemos que la tabla 29-14 proporciona las propiedades y limitaciones de la TWI. Dice que la frecuencia de reloj SCL debe ser un máximo de 400kHz. No es de extrañar que nuestro rastro aspira tan malo. Permite así establece TWBR a 12 y apaga los bits del divisor. Esto le dará SCL freq = 16000/(16+24) = 400kHz. Luego montar, subir y echa un vistazo a la nueva traza.
No adjunto una imagen. Digamos que todavía obtenemos una huella cutre que bastante no llegar a la cima. Que podríamos agregar algunas resistencias a la línea en este momento, pero vamos a hacer la frecuencia sólo un poco más bajo que usted puede realmente ver lo que está sucediendo.
Permite establecer TWBR a 72. Esto nos dará una frecuencia de 100kHz. Echa un vistazo a la imagen de la huella. [Ver fotos 4 y 5]
Ahora puedes ver que la señal está oscilando entre 0V y 5V pero no hay vuelta para arriba a 5V muy rápidamente! De hecho, lleva tanto tiempo para volver 5V que por el momento que llegue ya es hora de volver hacia atrás a 0V. Esto es no lo que queremos si queremos transmitir.
Echa un vistazo a la figura 22-2 en la página 207. Usted verá cómo se transmiten los datos. La CPU esencialmente compara las señales en las dos líneas (SDA y SCL) y decide lo que están cómo se comparan los datos. Por esta razón el reloj de la CPU tiene que ser por lo menos 16 veces mayor frecuencia que el reloj SCL. La CPU necesita esos ciclos adicionales para distinguir lo que está sucediendo con las señales SCL y SDA y tomar decisiones en base a ellos. Hay dos tipos de regiones como se muestra en el diagrama. Se necesita las regiones donde los datos están "estable" significa que es constante en cualquier 5V o 0V para un cierto período de tiempo. También hay regiones donde la señal está cambiando, ya sea ir desde 0V hasta 5V o de 5V a 0V. Vamos a discutir cómo obtiene la información de esto en un segundo, pero mi punto es que en la señal de 100KHz que apenas nos vieron, no tienen una suficiente región "estable". Esencialmente tenemos nada pero las transiciones. Así que no funcionará. Para solucionarlo agregamos de enderezamiento a las líneas de dos. Esto hará que la señal volver a 5V más rápido y nos dé una región más estable en la parte superior. Vamos a probarlo. Coge dos resistencias. Voy a usar 4.7kOhm resistencias. Entonces los cable en las líneas como en el diagrama en la página 206. Le adjunto una foto de mi trabajo de cableado. [véase el cuadro 6]
Ahora mira el rastro! Contamos con la señal de salto hasta 5V y entonces queda plana para un rato antes de caída rápidamente volver a 0V. En otras palabras, tenemos un rastro de onda cuadrada que la CPU puede utilizar para enviar datos. [ver cuadro 7 y cuadro 8]
Así que por esta razón sugieren que agregar de enderezamiento a las líneas. De hecho, si usted quiere averiguar qué resistencia tamaño usted necesita usted podría ya sea calcular la capacitancia de la línea y utilizar la fórmula que dan en la tabla 29-14 o simplemente podría mirar el rastro de osciloscopio y cambiar resistencias hasta que obtenga una buena onda cuadrada.
De todos modos! Vamos a volver a 490 Hz ponemos nuestro TWBR a 255 y el prescaler 64 y luego puede deshacerse de las resistencias de pullup en conjunto y solo conectar un microcontrolador a otro. Los pullups internos bien para jalar la señal de 490 Hz lo suficientemente rápido como para obtener una onda cuadrada agradable como ya demostró en las fotos. Mira la proyección de imagen [imagen 9] pasada el 490 Hz onda con el enderezamiento y comparar con las dos primeras fotos que muestran la misma onda de 490 Hz sin el enderezamiento. ¿Ver alguna diferencia? Yo tampoco. Así que vamos a prescindir de las resistencias y apenas enganchar nuestro rodillo de dados directamente a nuestra pantalla de 4 dígitos.
Ahora que sabemos cómo funcionan las líneas SDA y SCL (es decir, con señales de onda cuadrada) ahora veremos cómo los datos son transmitidos los usando.