Tutorial de ensamblador AVR 10 (8 / 10 paso)

Paso 8: Codificación de la esclava

Antes de entrar en la subrutina de TWI, que en el caso de la esclava es un manejador de interrupción, primero establecemos el resto del código a utilizar. En primer lugar tenemos que añadir la interrupción (definida en la tabla 12-6 en la página 65):

org 0 x 0000
JMP Reset
org 0x0020
JMP timer_overflow_int
org 0x0030
JMP tw_int

Esto dice que si las interrupciones globales están habilitadas fijando pedacito en SREG a 1 y si, en el TWCR, el TWIE bit es un 1 y la bandera de interrupción de TWI está se ejecutará esta línea en lugar de 0x0030.

Otra vez tenemos claro el TWI y los bits del Timer/Counter0 en el PRR registro reducción de poder como lo hicimos con el maestro. No es necesario establecer la tasa de bits en el esclavo desde el maestro controla la frecuencia SCL y el esclavo responde simplemente a él.

temp de LDS, PRR
0b01011111 temp, Andi
STS PRR, temp de ldi temp, 0b10100001
STS TWAR, temp

Arriba, inicializamos (según la página 223) cargamos la dirección del esclavo en el TW dirección registro TWAR. El final es un 1 que significa que el esclavo responda a General de la llama. No estamos utilizando llamadas general aquí pero nosotros podemos querer utilizarlos más tarde cuando tenemos más de un esclavo.

LDI temp, (1--TWEA) | (1 - TWEN) | (1 - TWIE)
STS TWCR, temp

A continuación nos permiten reconocerla poco (para que la transmisión será respuesta tirando hacia abajo de la línea SDA después de recibir los datos), permitiendo el TWI y la interrumpe de TWI (TWIE). Permitir interrupciones de TWI significa que nuestro handler de interrupción en .org 0x0030 se llamará siempre TWINT se establece en 1 de hardware (es decir, la bandera está en).

CBI DDR, 4
SBI PORTC, 4
CBI DDRC, 5
SBI PORTC, 5

Las líneas de arriba ponen nuestros pines SDA y SCL en modo de entrada con pullups interno.

Finalmente llegamos a nuestro manejador de interrupción esclavo TWI:

tw_int:
Presione temp

Siempre es buena práctica para almacenar sus registros de temperatura al entrar en una interrupción. No sabes cuando una interrupción se llamará y si utiliza "temp" en la interrupción volverá al código principal con basura en él. Así pulse aquí y pop en el final.

rcall display_off

En la parte inferior, verá lo que tengo para la subrutina display_off. Lo básicamente sólo se apaga la pantalla de 4 dígitos hasta que los nuevos números de la pantalla se carga este controlador.

LDS temp, TWSR
temp de IPC, 0x60
Brne ERROR

Tabla 22-4 da los códigos de estado de un esclavo en el modo receptor. Aquí solo estamos comprobando para ver que era nuestra dirección y un poco de la escritura que vino de la línea y provocó esta interrupción.

LDI temp, (1--TWINT) | (1--TWEA) | (1 - TWEN)
STS TWCR, temp
rcall tw_wait
LDS temp, TWSR
temp de la CPI, 0 x 80
Brne ERROR

Arriba tenemos claro la bandera de interrupción de TWI (1--TWINT), los otros son sólo para mantener en cuando cargamos temp en TWCR. Si no tuviéramos (1--TWEA) y (1 - TWEN) entonces se establecería a cero en el registro TWCR en la línea siguiente. Entonces esperamos hasta que el TWI termina y vuelve a ser disponible. A continuación, comprobamos el registro del estado que se ha recibido el byte de datos, almacenados en TWDR y un reconocimiento ha sido enviado de regreso.

LDS playercashH, TWDR

Esto carga el byte de datos que tenemos de la línea en el registro de playercashH.

LDI temp, (1--TWINT) | (1--TWEA) | (1 - TWEN)
STS TWCR, temp
rcall tw_wait
LDS temp, TWSR
temp de la CPI, 0 x 80
Brne ERROR

Exactamente igual al anterior, recibir un byte de datos, reconocerlo y comprobar el estado.

LDS playercashL, TWDR

Esta vez almacenamos los bytes de datos en playercashL. Esto contendrá nuestro rodillo de dados total.

LDI temp, (1--TWINT) | (1--TWEA) | (1 - TWEN)
STS TWCR, temp
rcall tw_wait
LDS temp, TWSR
temp de la CPI, 0xA0
Brne ERROR
rjmp tw_return

Encienda el TWI, haz el siguiente byte de datos, compruebe el estado para asegurarse de que es la señal de parada y finalmente ir a nuestra etiqueta de limpieza y de salida.

ERROR:
LDI playercashH,high(1111)
LDI playercashL,low(1111)
tw_return:

Nuestro handler ERROR no hace más que cargar todos los 1 en la pantalla para mostrarnos que algo salió mal y luego regresar de la interrupción.

Ahora que ya tenemos nuestra pantalla "playercash" registros cargados, que llamamos a la rutina de "loadcash" que convierte a los dígitos decimales y los muestra.

LDI temp, (1--TWINT) | (1--TWEA) | (1 - TWEN) | (1 - TWIE)
STS TWCR, temp
rcall loadcash
temp del pop
Sei
Reti

Lo anterior permite volver a la TWIE que ejecutará una vez más el manejador de interrupción en 0x0030 cuando se produce una interrupción de TWI. Entonces pop nuestra temperatura detrás de la pila, vuelva a activar interrupciones globales y volver a donde nos llamamos. Lo que sigue es nuestra subrutina de tw_wait que es idéntica a la utilizada en el Master código:

tw_wait:
LDS temp, TWCR
temp de SBR, TWINT
rjmp tw_wait
RET

Finalmente, aquí está nuestra rutina de display_off que es auto explicativo:

display_off:
CBI PortC, 0
CBI PortC, 1
CBI PortC, 2
CBI PortC, 3
RET

En el siguiente paso, doy el código y el video de la operación.

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