ATTiny USI I2C introducción - una interfaz de comunicación de gran alcance, rápido y conveniente para sus proyectos ATTiny! (7 / 8 paso)

Paso 7: Implementación de código abierto I2C ATTiny USI - USI I2C esclavo

a diferencia del código, el código de USI I2C Slave (usi_i2c_slave.c/h) es implementado casi en su totalidad con las interrupciones de la USI.  Como se mencionó anteriormente, el módulo USI tiene dos interrupciones, uno generado tras la detección de una condición START y el otro basado en el desbordamiento del contador de 4 bits.  El contador es crucial para el código auxiliar funcionar correctamente y no se explicó muy bien en tutoriales y código de leo.  En la imagen de diagrama de flujo he tomado nota de los números para cada estado de la lógica.  Estos números (8, 1 y 0) son valores indicando cuantas garrapatas el contador deben contar antes de hacer la transición al siguiente estado de la cuenta contador.  Como el contador se registra utilizando relojes SCL, estos valores indican cuántos SCL impulsos de reloj deben ocurrir antes del siguiente estado.  En general, algo que espera 8 pulsos de reloj esperando en transmisión y recepción de un byte de datos mientras que algo que esperas 1 pulso de reloj está a la espera en la transmisión y recepción de un ACK/NACK.  Algunas cosas esperan 0 relojes, lo que significa que instantáneamente continuar al siguiente estado o son una parte ampliada del estado anterior (en el caso de escribir o leer?).

Así, como usuario final, usted probablemente está más interesado en cómo la biblioteca de su propio código de interfaz!  Esto es fácil, y aquí está el porqué.  He eliminado con los buffers de recepción/transmisión que fueron utilizados en otras implementaciones de USI I2C (principalmente los basados en la aplicación-nota de AVR312) y en cambio implementar el registro del Banco protocolo descrito al principio de este tutorial.  El Banco se almacena como una matriz de punteros, no valores de datos, por lo que debe fijar variables locales en el código de direcciones de memoria en el I2C registrar Banco estableciendo los punteros a las variables.  Esto significa que el código de la línea principal no tener encuesta I2C buffers o manejar salidas de datos, los valores se actualizan instantáneamente siempre que llegan.  También permite que las variables de programa ser consultados en cualquier momento por la interfaz I2C sin afectar el código de la línea principal (que no sea el retraso debido a la interrupción).  Es un sistema bastante ordenado.  Tomemos nuevamente un ejemplo breve.

Por ejemplo, supongamos que tenemos un generador PWM de software muy básico que es conducir un LED.  Queremos ser capaces de cambiar el valor PWM (un valor de 16 bits, sólo por el hecho de aprender sobre punteros) sin hacer el bucle principal complicado.  Con la magia de esclavo I2C asincrónica, podemos hacer eso!

#include "usi_i2c_slave.h"

Definir una referencia a la matriz de puntero I2C esclavo registro Banco
extern char * USI_Slave_register_buffer [];

int main()
{
Crear valor PWM de 16 bits
unsigned int pwm_val = 0;

Asignar el byte bajo del valor de pwm a I2C dirección interna 0 x 00
Asignar el byte alto del valor de pwm a I2C dirección interna 0 x 01
USI_Slave_register_buffer [0] = (unsigned char *) & pwm_val;
USI_Slave_register_buffer [1] = (unsigned char *)(&pwm_val) + 1;

Inicializar a I2C esclavo con dirección del dispositivo esclavo 0 x 40
USI_I2C_Init(0x40);

Configurar pin A0 como salida para LED (asumiremos que cualquier chip estamos en tiene pin A0 disponibles)
DDRA | = 0 X 01;

while(1)
{
PORTA | = 0 X 01; Encender LED
para (unsigned int i = 0; i < pwm_val; i ++)
{
PORTA & = ~ (0 x 01); Apagar el LED
}
}
}

Y ahí lo tienen!  El bucle principal no hace referencia a I2C en todo, pero al enviar un valor PWM a la ubicación de 16 bits en I2C dirección interna 0 x 0 x 00/01, podemos controlar totalmente el PWM del LED!  Para que mayor estabilidad (para asegurarse de que sólo los valores del puntero que está utilizando están disponibles y para evitar que los punteros) le sugiero que cambie el #define USI_SLAVE_REGISTER_COUNT que el número de registro de punteros que necesita, ni más, ni menos.  Cuando se intenta un acceso (lectura o escritura) en un índice de registro fuera de la gama 0 x 00 a USI_SLAVE_REGISTER_COUNT - 1, nada está escrito y se devuelve cero.

Artículos Relacionados

Cómo hacer una ballesta de madera extremadamente de gran alcance!

Cómo hacer una ballesta de madera extremadamente de gran alcance!

Helloen este video le estoy mostrando cómo hacer una ballesta muy potente compuestoDisfruta!: )
Shield Arduino Solar - una fuente solar DIY para sus proyectos, sin esperar a PCB

Shield Arduino Solar - una fuente solar DIY para sus proyectos, sin esperar a PCB

este instructable es una versión básica de Bley Joel ("es 9:00 en sábado, la muchedumbre regular baraja en") Protector Solary deberían funcionar para la mayoría arduinos.  Lo he probado con Arduino Pro de SparkFun y el nuevo Leonardo.Yo y los ot
PC controlado por Bluetooth Robot (con una interfaz gráfica de usuario!)

PC controlado por Bluetooth Robot (con una interfaz gráfica de usuario!)

En este Instructable le mostrará cómo construir un robot que se controla vía Bluetooth con un teclado, tiene una interfaz gráfica de usuario construida con el proceso que muestra la entrada del teclado y realmente convierte la opción todo en una gran
Cubecube: Una interfaz Tangible de CAD.

Cubecube: Una interfaz Tangible de CAD.

Cubecube - un proyecto de hardware open source - es una interfaz táctil y tangible para CAD (diseño asistido por ordenador). Diseño de código abierto plataformas siguen apareciendo, hay una oportunidad para explorar nuevas posibilidades en lo que cre
TapTunes - una interfaz Tap a iTunes

TapTunes - una interfaz Tap a iTunes

como parte de mi proyecto de término de interacción persona-ordenador, yo montada encima de un pequeño programa que permitiría a los usuarios controlar iTunes pulsando varios patrones en un sensor piezoeléctrico.  La Fundación de este proyecto fue el
Casa calefacción VSCP y una interfaz web

Casa calefacción VSCP y una interfaz web

Mis padres están jubilados y viven en el sur de Francia. Cálido en verano pero también puede ser frío durante el invierno.Que utilizan para viajar por varias semanas durante el invierno para visitar amigos y familiares, y como calientan la casa con m
DIDI: Una interfaz usable MIDI para aplicaciones de DJ

DIDI: Una interfaz usable MIDI para aplicaciones de DJ

FondoDIDI fue mi proyecto final de carrera para mi Licenciatura en música tecnología y electrónica aplicada en la Universidad de York. Mi reto era crear una pieza de tecnología portátil de música. Haber tenido experiencia con DJ ' s en el pasado, pen
Introducción: Una noche de intercambios de aprendizaje

Introducción: Una noche de intercambios de aprendizaje

Este es un taller de aprendizaje creativo inspirado y adaptado de clase semana 4 "compañeros" actividad de MIT MediaLab aprendizaje creativo de aprendizaje (LCL) masivo abierto en línea curso (MOOC).Más información aquí: http://discuss-learn.med
Interfaz de comunicación 1-wire

Interfaz de comunicación 1-wire

¿Qué es la tecnología 1-Wire?La base de la tecnología 1-Wire es un protocolo serial usando una referencia de línea y tierra única de datos para la comunicación. Master 1-Wire inicia y controla la comunicación con uno o más dispositivos 1-Wire esclavo
Utilizando powertool baterías como una fuente de alimentación genérica para otros proyectos

Utilizando powertool baterías como una fuente de alimentación genérica para otros proyectos

En este proyecto, voy a mostrar cómo aprovechar Ryobi baterías de powerpack para otros usos.¿Por qué hacer esto? Powertool batteires vienen con protección integrada de calidad, buena calidad cargadores, piezas son fácilmente disponible (es decir, más
Soporte de pintura conveniente para una escalera

Soporte de pintura conveniente para una escalera

Aquí es una manera muy barata, muy conveniente, para pintar en la parte superior de una escalera sin tener que sostener un cepillo y un bote de pintura. Puede instalarse en una escalera en 2 minutos y utiliza una taza de cerveza desechables extraíble
Pegar una rayita falsa para sus pelucas

Pegar una rayita falsa para sus pelucas

Hola chicos y Bienvenidos a mi tutorial paso a paso sobre cómo pegar una rayita de pelucas :D* Esta alteración de la peluca es para Sakura de Gate 7 (por abrazadera).¡ Disfrute!Paso 1: referencias! Como de costumbre: conseguir algunas buenas referenc
Cómo hacer una batería de gran alcance del agua

Cómo hacer una batería de gran alcance del agua

en este Instructable voy a explicar cómo hacer una batería de gran alcance que funciona con agua de la lluvia!Esta batería es ambientalmente amigable porque puede funcionar en el agua de lluvia. Todavía necesita los metales. Agua destilada no va a fu
Cómo hacer una pistola de nerf baratas y de gran alcance

Cómo hacer una pistola de nerf baratas y de gran alcance

este es mi primer instructivo, por lo que traté de hacerlo simple.El propósito de este instructivo es hacer una pistola de dardos Nerf barata que lleva 25 cartuchos y dispara más rápido que una pistola de Nerf promedio.La idea principal es hacer un s