Tutorial de ensamblador AVR 10 (4 / 10 paso)

Paso 4: Resumen de comunicaciones de TWI

En este tutorial nos gustaría establecer comunicación entre nuestro rodillo de dados y la exhibición de 4 dígitos para que el resultado del lanzamiento de dados aparece en la pantalla. Podríamos muy fácilmente a utilizar el "rodillo de su propio" método de comunicación que hicimos antes con el "analizador de registro" y el rodillo de dados, sin embargo, en el futuro tutoriales iremos añadiendo más componentes y nos gustaría a todos ellos para poder comunicarse uno con el otro. Por lo que es mucho mejor si utilizamos un protocolo que utiliza solo dos cables y aún puede comunicarse con varios controladores de esclavo. Eso es exactamente lo que hace el TWI integrado en el Microcontrolador AVR. Así que ahora vamos a aprender cómo usarlo.

Tienes que recurrir a capítulo 22, página 206, en la hoja de datos de ATmega328P donde discute el TWI. Sería una buena idea leerlo y obtener una visión general de cómo funciona. Estaremos utilizando el método fácil de empezar a mirar el ejemplo de código que dan en la página 216 y modificarlo para nuestros propósitos. En este momento nos estamos comunicando sólo entre dos microcontroladores y por lo que este código es bonito mucho todo lo que necesita. Más adelante tendremos que ampliar en él pero cubriremos ese material extra cuando realmente la necesitamos.

Aquí está el fragmento de código que dan en la hoja de datos:

LDI r16, (1--TWINT) | (1 - TWS) | (1 - TWEN)
a TWCR, r16
wait1:
en r16, TWCR
SBR r16, TWINT
rjmp wait1
en r16, TWSR
Andi r16, 0xF8
CPI r16, Inicio
Brne ERROR
LDI r16, SLA_W
a TWDR, r16
LDI r16, (1--TWINT) | (1 - TWEN)
a TWCR, r16
wait2:
en r16, TWCR
SBR r16, TWINT
rjmp wait2:
en r16, TWSR
Andi r16, 0xF8
r16 de IPC, MT_SLA_ACK
Brne ERROR
LDI r16, datos
a TWDR, r16
LDI r16, (1--TWINT) | (1 - TWEN)
wait3:
en r16, TWCR
SBR r16, TWINT
rjmp wait3
en r16, TWSR
Andi r16, 0xF8
r16 de IPC, MT_DATA_ACK
Brne ERROR
LDI r16, (1--TWINT) | (1 - TWEN) | (1 - TWSTO)
a TWCR, r16

Tenga en cuenta que en el código anterior declaraciones como

(1 - TWINT) | (1 - TWEN)

en realidad se supone que han "<" en ellos en vez del "-" firma pero por alguna razón el editor estúpido que Instructables ha escogido para darnos los gustos que hacer suposiciones sobre lo que estamos escribiendo y borra todo después de un "<" al intentar publicarlo. Esto es porque supone que cuando se escribe "código" es html y todo después de un "<" es un enlace o una instrucción de no mostrarse. También añade la
salto de línea, símbolos al azar de nuevo en veces que me sale todo correcto, y la próxima vez que inicie sesión, veo que el código se ha convertido en toda una línea de tiempo con"
"de donde los saltos de línea deben ser! Argh. Desafortunadamente, si trato de escribir nuestro código en otro tipo, como "quote" o "lista" o "texto normal" harán supuestos sobre el espacio y formato y no me permiten tener las líneas de código en diferentes líneas sin doble espacio entre ellos y sangría. Que arruinan la apariencia del código y hacen difícil para que usted pueda leer correctamente. Así que uso el formato de "código" para html y trabajar alrededor de las partes del problema. Lo que realmente necesitan es un tipo similar al látex uno llamado "verbatim" donde sólo imprimirá textualmente lo que escribe y no tratar de dick con él. Anwyay, probablemente están empezando a ver algunas de las razones de por qué me gusta editores de línea de comandos (como vi) y la línea de comandos de codificación mejor que IDE y basados en HTML/Java. Además, una molestia más es que si escribes cosas en otro editor y luego copiar/pegar en esta parte que quita todo el formato y pega como una línea larga que luego tienes que ir a través y formatear! Este editor es tedioso y molesto. Escribir estos tutoriales ha sido un ejercicio de paciencia y tolerancia, quiero decir, y por el tiempo que estamos acabados si he no ha conducido a alcoholismo y receta medicamentos, estoy seguro de que voy a ser calificado por una vida como monje benedictino o budista.

¡ UF! Muy bien! Pongámonos a trabajar.

Si examina el fragmento de código anterior, que verá que se separó en varios bloques por wait1, wait2 y wait3 etiquetados como bucles. Estamos esperando la bandera TWINT a establecerse para indicar que el TWI ha terminado lo último dijimos que haga dentro de cada uno de ellos. Entre estas esperar bloques es el código para iniciar la comunicación, para transmitir la dirección de esclavo de que microcontrolador queremos hablar con, para transmitir los datos a ese esclavo, y finalmente para detener la transmisión. Esto resulta en un único byte de datos que se transmiten.

Antes de continuar con el fragmento de código de transmisión, debe tomar su copia de la m328Pdef.inc incluyen el archivo e ir a la sección que trata con TWI. Usted verá las definiciones de los registros asociados con el TWI y los nombres de los distintos bits en estos registros. En el fragmento de código anterior, como de costumbre, utilizamos los nombres de los bits y la operación de cambio izquierdo más que el número de bits que el código es más fácil de leer. Aunque no le importa el ensamblador. Como he mencionado varias veces en el pasado, si querías escribir

LDI r16, 0b10010100

a 0xbc, r16

En lugar de

LDI r16, (1--TWINT) | (1 - TWEN)

a TWCR, r16

funcionaría perfectamente, de hecho, el ensamblador Ve el primero de ellos, pero tienes que ser lluvia hombre entender el código de seis meses a partir de ahora y no tendría amigos de equipo porque todo el mundo tratando de leer el código odiarte. Sólo menciono otra vez para recordarles de la distinción entre lo que es parte de la Asamblea y cuáles son sólo etiquetas que hemos escrito nosotros mismos para ayudarnos a entender nuestro código. Eso es todo el m328Pdef.inc incluir archivo. Si usted quería ir a través del archivo de include y cambiar los nombres de todo podría hacerlo así. Se podrían llamar TWINT "beavis" y TWEN "butthead" Si quiere, pero luego tienes problemas para leer la hoja de datos. De hecho, todos que 'Amigo', el individuo (o equipo) que escribió el archivo de inclusión que, esencialmente, es sólo pasó a través de la hoja de datos y vieron todas las tablas de definición de los registros (como el que en la página 217 definir el registro TWCR) y escribió las declaraciones .equ para ellos y sus bits. Si estuvieras escribiendo código para un microcontrolador nuevo y no tienes el archivo de inclusión, que usted podría simplemente utilizar la hoja de datos y definir los bits y los registros que se utilizan en el código en la parte superior de su programa con unas declaraciones de .equ. De todos modos, deja pasar...

Hay algunas cosas en el fragmento de código anterior que no están en el archivo de inclusión. Por ejemplo Inicio, datos y ERROR. DATOS están el registro que desea enviar. El ERROR es una subrutina que desea escribir los problemas con la transmisión y lidiar con ellos. START es la condición en el registro de estado del TWI (TWSR) que se desea comparar con. Esto cambia de acuerdo a lo que está haciendo. Por ejemplo, si son el microcontrolador maestro en modo transmisor tabla 22-2 da los códigos de estado que puede elegir. Del mismo modo tablas 22-3, 22-4 y 22-5 dan los códigos de estado para los modos Master receptor, transmisor esclavo y esclavo receptor respectivamente. Así que dependiendo de que microcontrolador en la red el código está montado para que se arranque por consiguiente.

Así que lo que realmente debes hacer si quieres entender estas cosas es pasar el código fragmento línea por línea, buscando los registros en la hoja de datos y averiguar exactamente lo que está sucediendo a cada paso. Escribimos nuestra propia versión del anterior fragmento de código en nuestro rodillo de dados y nuestro código de 4 dígitos. En este tutorial nuestro rodillo de dados será el amo y el display de 4 dígitos será el esclavo. Sin embargo, en el futuro habrá más esclavos y habrá más maestros incluyendo a uno que se ejecuta el programa y se comunica con todos ellos. Vamos a ir a través de la operación detallada de la TWI como Lee cada línea de nuestro código para que sepamos exactamente lo que está sucediendo en la línea, y por qué necesitamos a las líneas de alambre y ejecuta los comandos que hacemos. Sin embargo, primero debemos ver cómo conectar los dos microcontroladores juntos y qué exactamente está pasando a través de cada una de las líneas de TWI.

Ejercicio 2: Ver las ubicaciones de memoria de registro en la hoja de datos para el registro de Control de TW (TWCR), la TW Status Register (TWSR) y el registro de datos de TW (TWDR). Entonces examinar el código de ejemplo dado anteriormente que se copia directamente en la hoja de datos. ¿Se puede encontrar un error flagrante que hace el código no funcione en el ATmega328P? ¿Usted puede averiguar los cambios necesarios para solucionarlo?

Artículos Relacionados

Tutorial de ensamblador AVR 11

Tutorial de ensamblador AVR 11

Bienvenido a Tutorial 11!En este breve tutorial, finalmente vamos a construir la primera parte de nuestro proyecto final.Lo primero que debes hacer es ir al último paso de este tutorial y ver el video. Luego vienen aquí. [pausa mientras haces eso...]
Tutorial de ensamblador AVR 1

Tutorial de ensamblador AVR 1

He decidido escribir una serie de tutoriales sobre cómo escribir programas del lenguaje ensamblador para el Atmega328p que es el microcontrolador utilizado en el Arduino. Si la gente sigue interesada voy a seguir poner a uno una semana o así hasta qu
Tutorial de ensamblador AVR 6

Tutorial de ensamblador AVR 6

Bienvenido a Tutorial 6!Tutorial de hoy será corto donde desarrollamos un método sencillo para comunicar datos entre uno atmega328p y otro con dos puertos conectan. Luego tomar los dados rodillo del Tutorial 4 y el analizador de registro de 5 Tutoria
Tutorial de ensamblador AVR 8

Tutorial de ensamblador AVR 8

Bienvenido a Tutorial 8!En este breve tutorial vamos a tomar un poco de diversión de introducir nuevos aspectos de la programación de lenguaje ensamblador para mostrar cómo mover nuestros componentes prototipos a un separado "" del circuito impr
Tutorial de ensamblador AVR 9

Tutorial de ensamblador AVR 9

Bienvenido a Tutorial 9.Hoy nos muestra cómo controlar un display de 7 segmentos y un display de 4 dígitos utilizando nuestro código de lenguaje ensamblador ATmega328P y AVR. En el curso de hacer esto que tendremos que hacer desvíos cómo utilizar la
Tutorial de ensamblador AVR 7

Tutorial de ensamblador AVR 7

Bienvenido a Tutorial 7!Hoy vamos a ver primero cómo limpiar un teclado y luego se muestra cómo utilizar los puertos de entrada analógicos para comunicarse con el teclado.Esto lo haremos utilizando como entrada de interrupciones y un solo cable. Se a
Tutorial de ensamblador AVR 5

Tutorial de ensamblador AVR 5

Hoy vamos a tomar un vistazo a los distintos lugares de la memoria en el microcontrolador Atmega328p y ver si podemos comprender mejor cómo se almacenan las cosas, donde se almacenan y cómo funcionan los punteros y tablas de búsqueda.El tutorial se s
Tutorial de ensamblador AVR 4

Tutorial de ensamblador AVR 4

Bienvenido a tutorial número 4!En este tutorial vamos construir un circuito que simulará el balanceo de dos dados. Entonces vamos primero a escribir un programa de fuerza bruta que hace el trabajo. A continuación simplificamos ese programa de varias
Tutorial de ensamblador AVR 2

Tutorial de ensamblador AVR 2

Este tutorial es una continuación de "AVR Assembler Tutorial 1"Si no has ido por 1 Tutorial debe parar ahora y hacer que uno primero.En este tutorial vamos a continuar nuestro estudio de programación del lenguaje ensamblador de la atmega328p en
Tutorial de ensamblador AVR 3

Tutorial de ensamblador AVR 3

Bienvenido a tutorial número 3!Antes de empezar quiero hacer un punto filosófico. No tenga miedo de experimentar con los circuitos y el código que estamos construyendo en estos tutoriales. Cambiar los cables alrededor de añadir nuevos componentes, sa
Un enfoque avanzado de programación de Arduino y AVR

Un enfoque avanzado de programación de Arduino y AVR

Este instructable es obligada lectura para todo aquel que esté familiarizado con núcleo AVR virutas y Arduino.Bien, para ser más específicos, al leer el instructivo, usted será capaz de:1) saber la diferencia correcta entre el AVR y Arduino.2) progra
Placa de desarrollo para microcontrolador Attiny84

Placa de desarrollo para microcontrolador Attiny84

Se trata de una placa de desarrollo para microcontrolador Attiny84. Tha Attiny84 chip tiene 11 pines direccionables con el IDE de Arduino, 8k de memoria flash para el almacenamiento de programa y 512 bytes de RAM disponible para las variables de pila
La tortura de Raven, aguda

La tortura de Raven, aguda

este es un pequeño dispositivo que diseñé para el sencillo propósito de ser discretamente molesta. Espera una cantidad predeterminada de tiempo, y luego empieza a emitir pitidos agudos. Yo he programado mina para tomar ventaja de una propiedad intere
Cariño, encogi lo Arduino: pasar de Arduino a ATtiny y escribir el código en C de AVR puro

Cariño, encogi lo Arduino: pasar de Arduino a ATtiny y escribir el código en C de AVR puro

Arduino es una plataforma de software y de gran dura - pero con todas sus características también está un poco hinchado y a menudo necesita sólo una pequeña parte de todas las funciones. A veces el proyecto requiere dispositivos más pequeños y más ba