Tutorial de ensamblador AVR 10 (7 / 10 paso)

Paso 7: Codificación del amo

Por último tenemos suficiente comprensión de lo que está sucediendo detrás de las escenas que podemos ir a través de mi código, línea por línea, para el maestro y los microcontroladores esclavos. Tenga en cuenta que si nos fijamos en el código adjunto encontrará abundantes comentarios alrededor de todo lo que discutimos aquí.

Comencemos con algunas nuevas líneas que añadimos a nuestra sección de Reset:

 lds temp,PRR<br>andi temp,0b01011111<br>sts PRR,temp<br>ldi temp,255<br>sts TWBR,temp<br>ldi temp,(1--TWPS1)|(1--TWPS0)<br>sts TWSR,temp<br>ldi temp, (1--TWINT)|(1--TWEN)<br>sts TWCR,temp 

donde se recordará que el "-" signos deben dejarse operadores de desplazamiento.

Está bien. Ya sabemos lo que hace el código anterior ya hemos comentado antes. La primera parte simplemente apaga los bits de registro de reducción de potencia para el temporizador/contador y el TWI. La segunda parte establece la tasa de bit SCL se apaga la interrupción TW y permite el TWI.

Lo siguiente que hacemos es añadir una línea a la rutina principal que llama a la subrutina de TWI. Aquí ' tis:

 main:<br>rcall button_push<br>rcall random<br>rcall dice<br>rcall cycle<br>rcall tw_transmit<br>rcall display<br>rjmp main 

Aviso que llamamos a la subrutina tw_transmit derecha después mostramos los animación dados rodando y justo antes de mostrar el resultado de los dados del rodillo en el rodillo de dados LEDs.

Ahora tenemos a nuestra subrutina TWI Master:

 tw_transmit:<br>ldi temp, (1--TWINT)|(1--TWSTA)|(1--TWEN)<br>sts TWCR,temp 

TWEN permite el TWI, TWSTA envía una "condición de inicio" hacia abajo el alambre que es la caída del pulso durante un SCL alta ciclo que discutimos TWINT anterior y escribir = 1 para el registro de control apaga la bandera de interrupción (es decir, resultados en TWINT = 0) y comienza a transmitir un paquete de datos.

 rcall tw_wait 

Se trata de una subrutina que escribe que apenas se sienta alrededor a la espera de la interfaz de TWI completar el comando.

 lds temp,TWSR<br>andi temp,0b11111000<br>cpi temp,0x08<br>brne ERROR 

Todo ello no Compruebe el registro del estado para ver lo que hay allí. Cuando el TWI hace algo carga el estado actual de las líneas en este registro. Para que compruebe y asegúrese de que el comando que es emitido realmente hecho a la línea y fue reconocido por el esclavo. La segunda línea establece nuestros divisor bits a cero (recuerda que tenemos los set a 1 para conseguir nuestra frecuencia SCL a 490Hz). Tiene que ajustar a cero por lo que podemos comparar el registro del estado con los códigos dados en la tabla 22-2. Observe que el código de estado 0x08 significa fue enviada y se reconoció la condición de inicio. Bien, ¿qué es 0x08 en binario? Es 0b00001000. Para que ver que si nos habíamos olvidado de los primeros tres bits de la máscara, nuestra TWSR contendría 0b00001011 = 0x0b y el comparsion fallaría. Si no establece los bits del divisor como hicimos y sólo les dejó como ceros entonces no necesita a estos bits de la máscara. El superior termina con un descanso para un controlador de errores que tenemos que escribir que pasaría si no conseguimos el código de estado correcta. Ahora vamos a singularizar cual esclavo que quiere hablar:

 ldi temp,0b10100000<br>sts TWDR,temp<br>ldi temp,(1--TWINT)|(1--TWEN)<br>sts TWCR,temp 

Primero llenamos el registro de datos, TWDR, con la dirección del esclavo y el bit de lectura/escritura. El esclavo de 7-bit dirección que elegimos al azar (evitando los que la hoja de datos nos dijo que no use) es 0b1010000 y Virar un 0 en el final que quiere decir "Escritura" del esclavo. Si habíamos virado un 1 en el final significaría que queremos "Leer" el esclavo. Luego encendemos las líneas TWI escribiendo TWINT = 1 para el registro de control para borrar la interrupción. El TWEN = 1 existe sólo por lo que 1 y el TWI "habilitado". Esto enviará los 8 bits de datos por la línea SDA al esclavo y el esclavo traerá la línea a tierra para acusar recibo. Esperamos que la transmisión utilizando la rutina tw_wait (discutida más abajo al final) y compruebe el registro del estado para asegurarse de que todos los enviados y reconocidos exactamente como lo hicimos anteriormente con la señal de Inicio:

 rcall tw_wait<br>lds temp,TWSR<br>andi temp,0b11111000<br>cpi temp,0x18<br>brne ERROR 

Ahora queremos realmente enviar nuestros datos. Ya que enviamos a la dirección del esclavo y el bit de escritura, va estar sentado allí, babeo en anticipación, 32653 ciclos de reloj ;) listo leer los siguiente 8 bits apagado el cable SDA y enviarlos directamente a registro TWDR propio. Queremos enviar el que rollo de los dados. Así que aquí está cómo lo hacemos:

 ldi temp,0<br>sts TWDR,temp<br>ldi temp,(1--TWINT)|(1--TWEN)<br>sts TWCR,temp<br>rcall tw_wait<br>lds temp,TWSR<br>andi temp,0b11111000<br>cpi temp,0x28<br>brne ERROR 

En primer lugar cargamos 0 en el registro de datos, entonces enciende las líneas y enviarlo. Luego esperamos la transmisión completar, y finalmente comprobamos el estado para asegurarse de que fue enviado y reconocido. La razón que envía un cero es porque vamos a enviar 2 bytes. El primer byte que haz cargado en "playercashH" por el esclavo, y el segundo byte se Haz cargado en "playercashL" por el esclavo. Recuerde que finalmente queremos enviar dos bytes por lo que nos podemos llenar la pantalla de 4 dígitos. No necesitamos este tiempo para que nosotros, envíanos un cero para el primero de ellos. Pero lo pongo aquí ya que muestra cómo enviar más de un byte de datos y también vamos a usarlo esta manera la próxima vez.

 sts TWDR,dicetotal<br>ldi temp,(1--TWINT)|(1--TWEN)<br>sts TWCR,temp<br>rcall tw_wait<br>lds temp,TWSR<br>andi temp,0b11111000<br>cpi temp,0x28<br>brne ERROR 

Lo anterior debe quedar bastante sencillo de entender. Simplemente carga el registro de datos nuevo, esta vez con total sobre los dos dados y enviar a través de, comprobando el estado después de las líneas de muertos. El esclavo esta carga en playercashL. Ahora estamos acabados. Así que saltamos a nuestros comandos de salida:

 rjmp tw_return 

Aquí es nuestro handler ERROR. Supongo que esto nunca va a se ejecutan así que lo único que hace es enviar una señal de parada a la línea de salto hacia el principio y vuelva a intentarlo todo.

 ERROR:<br>ldi temp,(1--TWINT)|(1--TWSTO)|(1--TWEN)<br>sts TWCR,temp<br>rjmp tw_transmit 

Finalmente la limpieza y salida:

 tw_return:<br>ldi temp,(1--TWINT)|(1--TWSTO)|(1--TWEN)<br>sts TWCR,temp<br>ret 

Esto sólo envía una señal de parada de la línea (ya que nos hemos movido de un tirón el interruptor de parada TWSTO), gira mundial interrumpe y vuelve a "main". Para finalizar la discusión del maestro código, aquí está la rutina de tw_wait:

 tw_wait:<br>lds temp,TWCR<br>sbrs temp,TWINT<br>rjmp tw_wait<br>ret 

Ahora veamos el código del esclavo.

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