Biblioteca AVR para robots que utilizan el bus I2C y el reloj real PCF8583. Biblioteca AVR para trabajar con un bus I2C y con un reloj real PCF8583 Biblioteca alternativa para trabajar con una pantalla i2c

pantalla LCD- Invitado frecuente de proyectos Arduino. Sin embargo, en circuitos plegables podemos tener un problema de falta de puertos Arduino por la necesidad de conectar una pantalla, que tiene muchos contactos. La salida a esta situación puede ser I2C/CII Un adaptador que conecta una pantalla Arduino 1602 prácticamente estándar a placas Uno, Nano o Mega con 4 pines adicionales. Este artículo muestra cómo puede conectar una pantalla LCD con una interfaz I2C, cómo puede acceder a bibliotecas, escribir un breve ejemplo y ver aplicaciones típicas.

Pantalla de cristal líquido LCD 1602 Es la primera opción para mostrar filas de símbolos en varios proyectos. Es económico, con varias modificaciones con diferentes colores de retroiluminación, puede crear fácilmente bibliotecas listas para usar para el boceto de Arduino. Pero el mayor inconveniente de esta pantalla es el hecho de que tiene 16 elementos digitales, de los cuales hay al menos 6. Esta pantalla LCD sin i2c es un problema grave para las placas Arduino Uno o Nano. Si no hay contactos, tendrá que comprar una placa Arduino Mega o proteger los contactos, incluso para conectar la pantalla a través de i2c.

Breve descripción de los pines LCD 1602

Echemos un vistazo más de cerca a la tecnología LCD1602:

La piel de la vid tiene su propio significado:

  1. Tierra GND;
  2. Kharchuvannya 5;
  3. Configuración del contraste del monitor;
  4. Equipo, datos;
  5. Grabación y lectura de datos;
  6. Permitir;

7-14. Líneas de datos;

  1. Más soporte;
  2. Menos iluminación.

Especificaciones de la pantalla:

  • Tipo de visualización simbólica: posibilidad de introducir símbolos;
  • Luz de fondo LED;
  • Controlador HD44780;
  • Tensión viva 5V;
  • Formato de 16x2 caracteres;
  • Rango de temperatura de funcionamiento: -20°С a +70°С, rango de temperatura de almacenamiento: -30°С a +80°С;
  • Déjame mirar alrededor de 180 grados.

Diagrama de conexión de LCD a placa Arduino sin i2C

El esquema estándar para conectar un monitor directamente a un microcontrolador Arduino sin I2C se ve así.

Debido a la gran cantidad de contactos que se encuentran conectados, es posible que no haya suficiente espacio para recibir los elementos requeridos. El interruptor I2C cambia el número de dardos a 4 y el número de pines ocupados a 2.

Dónde comprar pantallas LCD y escudos para Arduino

La pantalla LCD 1602 (y la versión 2004) es muy popular, por lo que puede encontrarla fácilmente tanto en tiendas locales en línea como en mercados extranjeros. Echemos un vistazo a las opciones disponibles:

Módulo LCD1602+I2C con pantalla azul, combinado con Arduino Una pantalla LCD1602 simple (retroiluminación verde) más barata que 80 rublos Gran pantalla LCD2004 con I2C HD44780 para Arduino (retroiluminación azul y verde)
Display 1602 con adaptador IIC y luces azules Otra versión del LCD1602 con un módulo I2C soldado Módulo adaptador Port IIC/I2C/TWI/SPI para pantalla 1602, apto para Arduino
¡Pantalla con interruptores RGB! LCD 16×2 + teclado +Buzzer Shield para Arduino Escudo para Arduino con botones y pantalla LCD1602 LCD 1602 Display LCD para impresora 3D (Smart Controller for RAMPS 1.4, Text LCD 20×4), módulo lector de tarjetas SD y MicroSD

Descripción del protocolo I2C

Primero, hablemos brevemente sobre cómo conectar la pantalla al Arduino mediante un adaptador i2c.Hablemos brevemente sobre el protocolo i2C en sí.

I2C/CII(Circuito Inter-Integrado) es un protocolo que fue creado originalmente para conectar circuitos integrados en medio de un dispositivo electrónico. El diseño pertenece a la empresa Philips. El protocolo i2c se basa en un bus vicorístico de 8 bits, que es necesario para conectar bloques en la electrónica que controla, y un sistema de direccionamiento, que se puede conectar a lo largo de los mismos cables con un conector y dependencias. Simplemente suministramos datos a uno u otro dispositivo, agregando el identificador del elemento requerido a los paquetes de datos.

El circuito I2C más simple puede acomodar un dispositivo cableado (generalmente un microcontrolador Arduino) y muchos dispositivos (por ejemplo, una pantalla LCD). Cada dispositivo tiene una dirección en el rango de 7 a 127. No es necesario que dos dispositivos con la misma dirección estén en el mismo circuito.

La placa Arduino admite i2c a nivel de hardware. Puede utilizar pines A4 y A5 para conectar dispositivos que utilizan este protocolo.

En el robot I2C puedes ver una serie de ventajas:

  • El trabajo requiere al menos 2 líneas: SDA (línea de datos) y SCL (línea de sincronización).
  • Conexión de una gran cantidad de dispositivos cableados.
  • Cambiando la hora de los disturbios.
  • Para controlar todo el conjunto de dispositivos sólo se requiere un microcontrolador.
  • Cualquier número de microcircuitos conectados a un bus están rodeados únicamente por una capacidad límite.
  • Un alto nivel de almacenamiento de datos a través de un filtro especial suprime las salpicaduras generadas en los circuitos.
  • Un procedimiento simple para diagnosticar fallas que ocurren y solucionar fallas.
  • El bus ya está integrado en el propio Arduino, por lo que no es necesario ampliar aún más la interfaz del bus.

Nedoliky:

  • La polarización básica en la línea es 400 pF.
  • Es importante programar el controlador I2C, ya que hay varios dispositivos diferentes en el bus.
  • Con una gran cantidad de dispositivos, resulta difícil localizar la falla, ya que en uno de ellos se instala levemente un factor de bajo nivel.

Módulo i2c para LCD 1602 Arduino

La mejor y más sencilla forma de instalar una pantalla i2c en Arduino es comprar una pantalla ya preparada con un protocolo integrado. Pero estas pantallas no soportan el hedor, no son baratas. Y el eje de diferentes pantallas estándar ya ha producido una gran fuerza. Por lo tanto, la opción más accesible y popular hoy en día es comprar y reemplazar un módulo I2C adyacente, un adaptador que se ve así:

En un lado del módulo hay pines i2c: tierra, vida y 2 para transferencia de datos. De otro adaptador utilizaremos las rosas de la vida exterior. Y, por supuesto, hay una parte inferior desnuda en la placa, además de la cual el módulo está soldado a los componentes estándar de la pantalla.


Para conectarse al pago Arduino, utilice el cierre de sesión de i2c. Si es necesario, conectamos una fuente de alimentación externa para iluminación. Con la ayuda de una resistencia de ajuste incorporada, podemos ajustar la configuración de contraste J

En el mercado se pueden encontrar módulos LCD 1602 con adaptadores soldados, su instalación se simplifica al máximo. Si compró el mismo adaptador, deberá soldarlo al módulo de antemano.

Conexión de la pantalla RK a Arduino a través de I2C

Para conectarse, necesita la propia placa Arduino, una pantalla, una placa de pruebas, conectores y un potenciómetro.

Si está utilizando un adaptador i2c especial, primero deberá soldarlo al módulo de pantalla. Es importante tener piedad allí, puedes involucrarte en tal plan.


Se conecta un monitor RCD con soporte i2c antes de pagar los cuatro dardos adicionales: dos dardos para datos, dos dardos para toda la vida.

  • La conexión GND está conectada a GND en la placa.
  • VCC está a 5V.
  • SCL está conectado al pin A5.
  • SDA está conectado al pin A.

¡Eso es todo! Largas redes de viajes, en las que es fácil perderse. En este caso, podemos simplemente confiar toda la complejidad de la implementación del protocolo i2C a las bibliotecas.

Bibliotecas para robots con pantalla LCD i2c

Para comunicarse entre Arduino y LCD 1602 a través del bus I2C, necesitará al menos dos bibliotecas:

  • La biblioteca Wire.h para trabajar con I2C ya está incluida en el programa IDE estándar de Arduino.
  • La biblioteca LiquidCrystal_I2C.h, que incluye una amplia variedad de comandos para controlar un monitor a través del bus I2C, le permite crear un boceto más simple y corto. Es necesario instalar la biblioteca además. Después de conectar la pantalla, debe instalar la biblioteca LiquidCrystal_I2C.h

Después de conectar todas las bibliotecas necesarias al boceto, creamos un objeto y podemos personalizar sus funciones. Para las pruebas, es importante utilizar un boceto estándar en la culata.

#incluir #incluir // Conexiones de biblioteca //#include // Conectando una biblioteca alternativa LiquidCrystal_I2C lcd(0x27,16,2); // Especifique la dirección I2C (el valor más amplio) y especifique los parámetros de la pantalla (para LCD 1602 - 2 filas de 16 caracteres cada una //LiquidCrystal_PCF8574 lcd(0x27); // Opción para la biblioteca PCF8574 void setup() ( lcd. init ( ); // Inicializa la pantalla lcd.backlight(); // Conecta la retroiluminación lcd.setCursor(0,0); // Coloca el cursor en el encabezado de la primera fila lcd.print("Hello"); // Escribe texto en la primera fila lcd .setCursor(0,1); // Coloca el cursor en el encabezado de otra fila lcd.print("ArduinoMaster"); // Escribe texto en otra fila ) void loop() ( )

Descripción de las funciones y métodos de la biblioteca LiquidCrystal_I2C:

  • home() y clear(): la primera función le permite rotar el cursor hacia la parte superior de la pantalla, al mismo tiempo que muestra todo lo que estaba antes en el monitor.
  • write(ch): le permite escribir un solo carácter ch en la pantalla.
  • cursor() y noCursor(): muestran/ocultan el cursor en la pantalla.
  • Blink() y noBlink(): el cursor parpadea/no parpadea (si su visualización estaba habilitada previamente).
  • display() y noDisplay(): le permite conectar/encender la pantalla.
  • scrollDisplayLeft() y scrollDisplayRight(): desplaza la pantalla en un signo de zurdo/derecho.
  • autoscroll() y noAutoscroll(): le permiten activar/desactivar el modo de desplazamiento automático. Para qué modo de piel, se graba un nuevo símbolo en el mismo lugar que estaba escrito anteriormente en la pantalla.
  • leftToRight() y rightToLeft() – Instalación del texto mostrado directamente – de izquierda a derecha o de derecha a izquierda.
  • createChar(ch, bitmap): crea un carácter con el código ch (0 – 7), utilizando una matriz de mapas de bits para crear puntos en blanco y negro.

Biblioteca alternativa para robots con pantalla i2c

En algunos casos, cuando la biblioteca asignada con dispositivos equipados con controladores PCF8574 está dañada, pueden ocurrir errores. Una alternativa a esta opción es la biblioteca LiquidCrystal_PCF8574.h. Ella está expandiendo LiquidCrystal_I2C, lo que no es la causa de problemas para los victorianos.

Problemas al conectar la pantalla lcd i2c

Si después de hacer clic en un boceto no ve el mensaje deseado en la pantalla, intente hacer clic en estas acciones.

En primer lugar, puedes aumentar o cambiar el contraste del monitor. A menudo, los personajes simplemente no son visibles a través de los modos de contraste e iluminación.

Si esto no ayuda, verifique que los contactos estén conectados correctamente y que la fuente de alimentación viva esté conectada. Si has utilizado un adaptador i2c compatible, comprueba nuevamente el punto de soldadura de los contactos.

Otra razón común por la que falta texto en la pantalla pueden ser direcciones i2c incorrectas. Intente recordar en los bocetos la dirección del dispositivo con 0x27 0x20 o 0x3F. Diferentes distribuidores pueden tener diferentes direcciones de pago. Si esto no ayuda, puede ejecutar el boceto del escáner i2c, que analiza todas las conexiones del dispositivo y determina sus direcciones mediante un método de fuerza bruta. Bosquejo a tope de un escáner i2c.

Si la pantalla aún no funciona, intente soldar el adaptador y conectar la pantalla LCD como de costumbre.

Visnovok

En este artículo, analizamos la fuente de alimentación principal para la pantalla LCD en proyectos Arduino plegables, si necesitamos ahorrar dinero extra en la placa. Un adaptador i2c simple y económico le permite conectar una pantalla LCD 1602 usando solo 2 pines analógicos. En más situaciones, puedes ser aún más importante. Tarifa por disponibilidad: la necesidad de utilizar un módulo adicional: un convertidor y una biblioteca. En nuestra opinión, el precio de la flexibilidad no es nada alto, y te recomendamos aprovechar esta flexibilidad en los proyectos.

Recibí un envío de China que contenía un microcircuito Atmel EEPROM. Me gustaría conectarme a Arduino. Pero él no quiere destruir la biblioteca ya preparada, sino empezar a construirla él mismo. Este artículo es breve y tedioso y se puede dividir en tres partes:

  • Teoría de la interfaz I2C.
  • EEPROM, descripciones de mis microcircuitos (AT24C256) y conexiones.
  • Escribir una biblioteca antes de trabajar de memoria.

Parte del primero, I2C y la biblioteca “Wire”.

Protocolo de intercambio de datos secuencial. CII(también títulos I2C- Circuitos Interintegrados, conexión entre microcircuitos). Fue desarrollado por Philips Semiconductors a principios de la década de 1980 como un bus interno simple de 8 bits para el sistema electrónico que lo controla. Entonces, ¿cómo es que el derecho a vikoristannya yogo cuesta centavos? Atmel pharma se llama yogo TWI, Ale cuyo sentido está cambiando.

¿Cómo funciona esto?

Para la transmisión se utilizan dos líneas de transmisión bidireccionales. S.D.A.(Datos serie) bus de datos serie SCL(Reloj serie) Temporización del bus. Los dos buses son arrastrados por resistencias al bus de vida positiva. La transmisión/recepción de señales opera en la línea 0, única se instala solo, detrás del marco de resistencias pull-up.

Le gustaría un dispositivo con cable ( Maestro), que inicia la transferencia de datos y genera señales de sincronización y control del dispositivo ( Esclavo), que transmiten datos al líder. La máscara del dispositivo se asigna a una dirección única, tras lo cual el dispositivo se dirige a una nueva. Ha quedado claro que el Líder es nuestro microcontrolador y el Líder es nuestra memoria. El dispositivo de alambre comienza a presionar el neumático. SCL a cero con pureza de canto, y el neumático S.D.A. presione o suelte varios compases de la canción, transmitiendo Single o Nulik. La transmisión de datos comienza con la señal START, luego se transmiten 8 bits de datos y se envía el bit 9. El dispositivo esclavo acusa recibo del byte presionando el bus. S.D.A. a menos . La transmisión finaliza con la señal STOP. .

Biblioteca "Cable".

Para facilitar el intercambio de datos con dispositivos a través del bus I2C, se ha escrito una biblioteca estándar para Arduino Cable yak También incluido en el kit IDE. Tiene las siguientes funciones principales:

Wire.begin(Dirección)Hace clic una vez para inicializar y conectarse al bus como dispositivo maestro o maestro. La Dirección sin tareas está conectada como dispositivo Maestro.

Wire.beginTransmission(dirección) inicia la transmisión a dispositivos I2C con la dirección especificada.

Wire.endTransmission() se refiere a la transferencia de datos al led. La función rota valores de bytes:

  • 0 - éxito.
  • 1 dato es demasiado largo para llenar el búfer de transmisión.
  • 2: se recibió NACK a la hora de transmisión de la dirección.
  • 3 - NACK recibido por hora de transmisión de datos.
  • 4 - otros beneficios.

Cable.write() Los datos de grabación del dispositivo enviados al dispositivo se envían al dispositivo cableado o se colocan en bytes para su transmisión desde el maestro al dispositivo. En realidad escribe datos en el búfer. Tamaño del búfer 32 bytes a (menos 2 bytes a la dirección, en realidad 30 bytes), y la función transfiere el búfer Wire.endTransmission().

  • Cable.escritura(valor)- valor: valor de transferencia, un byte.
  • Cable.escribir (cadena)-cadena: orden de transmisión, secuencia de bytes.
  • Wire.write(datos, longitud)-Datos: conjunto de datos a transmitir, bytes. longitud: número de bytes a transferir.

Cable.read() Lee un byte, que es el número de transmisiones desde el dispositivo controlado al maestro, o cualquier número de transmisiones desde el dispositivo cableado al dispositivo cableado. Lo que significa que el byte se gira: el byte recibido.

Estas son las funciones principales de una biblioteca, y veremos otras a lo largo del camino))

Parte de un amigo, EEPROM.

EEPROM Eléctricamente programable y borrable memoria de sólo lectura) - borra eléctricamente el PZP (EEPROM), que se reprograma, uno de los tipos de memoria no volátil (como PROM y EPROM). Una memoria de este tipo puede ser borrada y olvidada por datos hasta un millón de veces.

Me enviaron un módulo EEPROM listo para usar con un microcircuito AT24C256 de Atmel con un volumen de 32 kbytes. Para conocer esta maravilla, tenemos la oportunidad de estudiar ficha de datos muy aburrido e inglés. Para que pueda ver el resultado ya preparado de mi tormento.

Características:

  • Bajo voltaje y vida estándar. VCC = 1,7 V a 5,5 V.
  • Suma de frecuencia de sincronización de 400 kHz (1,7 V) y 1 MHz (2,5 V, 2,7 V, 5,0 V).
  • Vitalidad: 1.000.000 de ciclos de grabación.
  • Organizaciones internas: 32768 páginas x 8 bits.

visnovki:

  • W.P.- Proteger el registro. Si realiza conexiones a GND, puede registrar datos en el rompecabezas.
  • A0…A2- Por favor pregunte la dirección del anexo.
  • vcc- Alimentación adicional.
  • Tierra- Comida menos.
Direcciones de memoria:

Las tres patas están establecidas por A0...A2. Si la pata se presiona a Gnd, entonces el valor del bit es 0, si está hasta Vcc, entonces 1. El microcircuito es vicorístico dirección de ocho bits, el bit restante indica la elección de operación. Si el valor del bit es alto, entonces se inicia la operación de lectura, si el valor es bajo (cero), entonces se inicia la operación de escritura.

Si se presionan los tres pines en GND y queremos escribirlos en la memoria, las direcciones del dispositivo se verán como 10100000 (la biblioteca "Wire" usa direcciones de 7 bits, convirtiendo todo a la derecha de un bit 0101000 0 0x50).

Grabación de homenajes al acertijo:

Para grabar desde el principio volvemos a la memoria. con bit Grabaciones en la dirección. Luego se agregan dos direcciones de 8 bits (por lo que tenemos la dirección 0x8000), luego un byte de datos y una señal de PARADA. Después de esto, la EEPROM ingresa antes del ciclo de escritura sincronizado internamente tWR (Write Cycle Time 5 ms) en la memoria no volátil. Todas las señales de entrada
encendido durante un ciclo de grabación cada hora, y EEPROM no es correcta hasta que se complete la grabación.

Profundizamos más y descubrimos en la hoja de datos que la memoria de los microcircuitos está organizada como 512 lado a lado 64 byte. Entonces podremos escribir hasta 64 bytes de información por comando. Para lo cual transmitimos los 64 bytes de información y solo entonces la señal de STOP.

Leyendo los homenajes:

Al leer estos datos, quedarás feliz. La memoria admite tres opciones de lectura:

  • Lea la dirección exacta;
  • Lea la dirección de Vipadkov;
  • Lectura consistente;

La memoria recuerda la dirección restante del registro y no cambia la vida, por lo que podemos leer el byte restante sin insertar la dirección.

Necesitamos leer la dirección desde el principio. enviar un comando para escribir y páselo a la dirección que desea leer ( No olvides que las direcciones se componen de dos partes de 8 bits.). Luego envíe un comando para leer y eliminar el byte leído, finalizando todo con el comando STOP.

La lectura posterior se puede completar desde la dirección de flujo o desde la dirección de salida y continuará hasta que el microcontrolador no haya encontrado la señal de PARADA. Cuando se cambia la dirección, la memoria se borrará y el direccionamiento desaparecerá.

Pues ha llegado el momento de intentar anotar:
#incluir // Incluir la biblioteca #define EEPROM_ADDRESS 0x53 // Establecer la dirección de memoria palabra dirección = 0; // Las direcciones Cudi se registran en bytes data_send = 170; // Configuración de anulación de datos() ( Wire.begin(); // Inicializa I2C Serial.begin(9600); Serial.print("Escribir byte en la memoria EEPROM..."); Serial.println (data_send); Wire. beginTransmission(EEPROM_ADDRESS);// Comienza la transmisión Wire.write(address >> 8);Wire.write(address & 0xFF);// Envía dos bytes de dirección Wire.write(data_send); endTransmission(); // Finaliza la transmisión verificamos el estado de la transmisión.if (status == 0)Serial.println ("Ok"); // delay(10); ), Wire.beginTransmission(EEPROM_ADDRESS); // Para leer los datos, abra la dirección correcta. (estado == 0)Serial.println("OK"); // dejar de transmitir Wire.requestFrom(EEPROM_ADDRESS, (byte)1); // envía un comando para leer un byte de datos byte data = 0; if (Wire.available ()) // comprueba qué datos se van a leer (data = Wire.read(); // lee datos) Serial.println (data, DEC); ) bucle vacío() ( )

Wire.requestFrom(dirección, cantidad) — El maestro utiliza Vikory para escribir bytes del dispositivo cerámico. Estos bytes se pueden eliminar utilizando los métodos disponibles() y read(). El tamaño del búfer es el mismo de 32 bytes.

  • dirección: agregaré una dirección de 7 bits desde la cual se recibirán los bytes;
  • cantidad: número de bytes a recuperar;

Cable.disponible()— Rota el número de bytes disponibles para extracción usando read().

Bueno, aquí tienes un ejemplo de la entrada en la memoria de la fila “Hola Palabra”:

#incluir #define EEPROM_ADDRESS 0x53 dirección de palabra = 0; char data_send = "Hola Palabra"; void setup() ( Wire.begin(); // Serial.begin(9600); Serial.print("Escribir byte en la memoria EEPROM..."); Serial.println (data_send); Wire.beginTransmission(EEPROM_ADDRESS); Wire.write(dirección >> 8); Wire.write(dirección y 0xFF); Wire.write(data_send); delay(10); Serial.println("Leer byte de la memoria EEPROM..."); Wire.endTransmission (); if (status == 0)Serial.println ("Ok"); // dejar de transmitir Wire.requestFrom(EEPROM_ADDRESS, (byte)10); byte de datos = 0; i<10 ;i++) { if (Wire.available()) { data = Wire.read(); } Serial.write (data); } } void loop() { }

Organización de la memoria:

Por tanto, no está claro qué está escrito sobre esto en los registros históricos. Prácticamente estoy intentando salir de aquí. La hoja de datos dice que la memoria de los microcircuitos está organizada como 512 lado a lado 64 byte. ¿Qué quiere decir esto? Si queremos escribir más de 64 bytes por trama, digamos detrás de la dirección 0x40 (direcciones del otro lado), cuando la dirección va más allá del otro lado Doctor en microcircuito interno, comuníquese con la dirección que figura en la página principal.. Y los bytes de las solicitudes se registrarán en la página principal y los datos que se registraron allí se eliminarán.

Para leer dichos límites, no hay límites; la hoja de datos solo dice que cuando llegue a la dirección final, será transferido automáticamente al principio (direcciones 0x00).

Por eso creo que eso es todo. Por supuesto, puede utilizar una biblioteca ya preparada para EEPROM y cree que puede escribir la suya propia. Hemos llegado a comprender los principios básicos del robot.

Descripción de la biblioteca Wire

Esta biblioteca le permite comunicarse con dispositivos I2C/TWI. En las placas Arduino con diseño R3 (diseño 1.0), SDA (línea de datos) y SCL (línea de reloj) se encuentran en los pines del pin AREF. Arduino Due tiene dos interfaces I2C/TWI: SDA1 y SCL1 están ubicadas en el pin AREF, y líneas adicionales están ubicadas en los pines 20 y 21.

La siguiente tabla muestra la desinstalación de TWI en diferentes placas Arduino.

A partir de Arduino 1.0, esta biblioteca introduce las funciones Stream, por lo que funciona muy bien con otras bibliotecas de lectura/escritura. A través de esto, enviar() y recibir() se reemplazan por leer() y escribir().

Nota

Encuentre versiones de 7 y 8 bits de la dirección I2C. 7 bits identifican el dispositivo y el octavo bit indica si el dispositivo se está escribiendo o leyendo. La biblioteca Wire contiene direcciones de 7 bits. Si tiene una descripción técnica o un ejemplo de código que está ganando direcciones de 8 bits, necesitará invertir el bit bajo (para destruir el valor en un bit hacia la derecha), reduciendo la dirección de 0 a 127. Sin embargo, las direcciones del 0 al 7 no salen victoriosos, los fragmentos están reservados, la primera dirección que se puede seleccionar es 8. Tenga en cuenta que al conectar los pines SDA/SCL, se requieren resistencias para levantarse. Informe para maravillarse con el trasero. En la placa MEGA 2560 hay resistencias que deben levantarse en los pines 20 y 21.

Descripción de métodos

Cable.comenzar()

Descripción

Inicializa la biblioteca Wire y se conecta al bus I2C como maestro o líder. Como regla general, sólo puedes llamar una vez.

Sintaxis

Cable.comienzo (dirección)

Parámetros

dirección: dirección de 7 bits asignada al dispositivo (no requerida); Si no hay tareas, la placa se conecta al bus como maestro.

El significado de lo que da la vuelta.

culata

Las bases para el dispositivo cerámico son maravillosas en las bases de los métodos onReceive() y onRequest(). Las colillas para dispositivos con cable se diferencian de las colillas en otros métodos. .

Cable.requestFrom()

Descripción

El maestro utiliza Vikory para escribir bytes desde el dispositivo cerámico. Estos bytes se pueden eliminar utilizando los métodos disponibles() y read().

Si este argumento es verdadero, entonces requestFrom(), después de encenderlo, emite una notificación de DETENER y llama al bus I2C.

Si este argumento es falso, requestFrom() emitirá una notificación REINICIAR después de la solicitud. El neumático no funciona, lo que impide que otro dispositivo maestro se meta entre las conexiones. Esto permite que un dispositivo cableado envíe varias entradas de energía hasta que controle el bus.

Sintaxis

Wire.requestFrom(dirección, cantidad)

Wire.requestFrom(dirección, cantidad, parada)

Parámetros

  • dirección: agregaré una dirección de 7 bits desde la cual se recibirán los bytes;
  • cantidad: número de bytes a recuperar;
  • detener: booleano. true fuerza una notificación DETENER después de una solicitud. false fuerza la notificación REINICIAR después de la solicitud, guardando las conexiones activas.
El significado de lo que da la vuelta.

byte: número de bytes rotados según el dispositivo especificado.

culata

Cable.beginTransmission()

Descripción

Inicia la transmisión a dispositivos I2C con la dirección especificada. Después de especificar la secuencia de bytes de transferencia usando la función write(), la transferencia se completa usando la llamada endTransmission().

Sintaxis

Wire.beginTransmission(dirección)

Parámetros

dirección: Agregaré una dirección de 7 bits porque es necesaria para transferir datos.

El significado de lo que da la vuelta.

culata

Wire.endTransmission()

Descripción

Completa la transferencia al dispositivo que se imprimió usando el método startTransmission() y transfiere los bytes que se enviaron al dispositivo usando el método write().

Para usar con la mayoría de los dispositivos I2C, a partir de Arduino 1.0.1, requestFrom() toma un argumento para un tipo de datos booleano, lo que cambia su comportamiento.

Si este argumento es verdadero, entonces requestFrom(), después de la transmisión, emite una notificación DETENER, liberando el bus I2C.

Si este argumento es falso, requestFrom() emite una notificación REINICIAR después de la transmisión. El neumático no funciona, lo que impide que otro dispositivo maestro se meta entre las conexiones. Esto permite que un dispositivo cableado envíe varios engranajes mientras controla el autobús.

En teoría, este argumento es más antiguo que cierto.

Sintaxis

Wire.endTransmission()

Wire.endTransmission(detener)

Parámetros

detener: booleano. true obliga a DETENER la notificación después de la transmisión. false fuerza la notificación REINICIAR después de la transferencia, guardando la conexión activa.

El significado de lo que da la vuelta.

byte, que indica el modo de transferencia:

  • 0: éxito;
  • 1: se necesitan más datos para llenar el búfer de transmisión;
  • 2: NACK recibido a la hora de transmisión de la dirección;
  • 3: NACK recibido en el momento de la transmisión de datos;
  • 4: reshta perdona.
culata

Mire el ejemplo del método write().

Cable.write()

Descripción

Escribe datos desde el dispositivo especificado al dispositivo de entrada, o establece bytes que se transferirán desde el maestro al dispositivo especificado (entre las llamadas a startTransmission() y endTransmission()).

Sintaxis

Cable.escritura(valor)

Cable.escribir (cadena)

Wire.write(datos, longitud)

Parámetros

  • valor: valor de transmisión, un byte.
  • cadena: orden de transmisión, secuencia de bytes.
  • datos: matriz de datos de transmisión, bytes.
  • longitud: número de bytes a transferir.
El significado de lo que da la vuelta.

byte: write() rota el número de bytes escritos, aunque leer algunos de ellos no es difícil.

trasero #incluir valor de byte = 0; void setup() ( Wire.begin(); // conectar al bus i2c ) void loop() ( Wire.beginTransmission(44); // transferir al dispositivo #44 (0x2c) // dirección del dispositivo para tareas en la descripción técnica Wire. write(val); // envía el valor byte Wire.endTransmission(); // salta la transmisión val++; // aumenta el valor if(val == 64) // cuando el valor 64 (max) es alcanzado ( val = 0; // inicio en la mazorca) retraso (500);

Cable.disponible()

Descripción

Gira una cantidad de bytes que se pueden recuperar usando read(). Este método debe llamarse en el dispositivo cableado después de la llamada requestFrom(), o en el dispositivo esclavo en medio de la llamada onReceive().

Sintaxis

Cable.disponible()

Parámetros

El significado de lo que da la vuelta.

Número de bytes disponibles para lectura.

culata

Mira el trasero antes del método read().

Cable.read()

Descripción

Lee un byte que se envía desde el dispositivo enviado al host después de llamar a requestFrom() , o un byte que se envía desde el dispositivo enviado al enviado.

Sintaxis

Parámetros

El significado de lo que da la vuelta.

byte: byte de gusano de aceptaciones.

trasero #incluir valor de byte = 0; void setup() ( Wire.begin(); // conectar al bus i2c (las direcciones para el maestro no son obligatorias) Serial.begin(9600); // configurar el puerto serie para salida ) void loop() ( Wire. .requestFrom( 2, 6);// suministra 6 bytes desde el dispositivo especificado #2 while(Wire.available()) // se puede enviar menos del dispositivo solicitado (char c = Wire.read(); // aceptar el byte como carácter serial .print (c);//envuelve el símbolo) delay(500);

Cable.setClock()

Descripción

Cambia la frecuencia del reloj de comunicación en el bus I2C. Los dispositivos I2C no tienen una frecuencia de reloj mínima de funcionamiento, que suele ser de 100 kHz.

Sintaxis

Wire.setClock (frecuencia del reloj)

Parámetros

clockFrequency: valor de frecuencia (en hercios) de la señal del reloj. Los valores aceptados son 100.000 (modo estándar) y 400.000 (modo sueco). Cada procesador también admite 10.000 (modo de baja velocidad), 1.000.000 (modo plus de alta velocidad) y 3.400.000 (modo de alta velocidad). Para asegurarse de que se admita el modo requerido, consulte la documentación de un procesador específico.

El significado de lo que da la vuelta.

Cable.onReceive()

Descripción

Registra una función que se llamará cuando el dispositivo reciba una transferencia del maestro.

Sintaxis

Wire.onReceive(controlador)

Parámetros

controlador: una función que se llamará cuando el dispositivo reciba datos; Debe aceptar un parámetro int (el número de bytes leídos del maestro) y no rotar nada, luego:

anular myHandler (int numBytes)

El significado de lo que da la vuelta.

culata

#incluir void setup() ( Wire.begin(8); // conectar al bus i2c con la dirección #8 Wire.onReceive(receiveEvent); // registrar el subsensor Serial.begin(9600); // configurar el puerto serie para visualización ) void loop() (delay(100); ) // una función que saldrá inmediatamente cuando se reciban datos del maestro // esta función se registra como un procesador de datos, observe setup() void recibirEvent(int howMany) ( while (1< Wire.available()) // пройтись по всем до последнего { char c = Wire.read(); // принять байт как символ Serial.print(c); // напечатать символ } int x = Wire.read(); // принять байт как целое число Serial.println(x); // напечатать число }

Cable.onRequest()

Descripción

Registra la función que se llamará cuando el maestro solicite datos del dispositivo especificado.

Sintaxis

Wire.onRequest(controlador)

Parámetros

controlador: una función que debe ser llamada, no acepta parámetros y no rota nada, entonces:

anular miHandler()

El significado de lo que da la vuelta.

culata

Código para la placa Arduino, que funciona como dispositivo:

#incluir void setup() ( Wire.begin(8); // conectar al bus i2c con la dirección #8 Wire.onRequest(requestEvent); // registrar el procesador de solicitudes ) void loop() ( delay(100); ) // función, tan pronto como el maestro // consulta datos // esta función se registra como encuestador, consulte setup() void requestEvent() ( Wire.write("hello "); // enviar notificaciones)

Necesitaba crear un chip basado en el microcircuito que sirve como interfaz I 2 C. Microcircuito RTC, llamado "Aniversario de la hora real" PCF8583.

En el medio de los microcircuitos se encuentran: reloj de aniversario, despertador, temporizador, calendario (torcido) y 240 bytes de RAM, donde podrás registrar cualquier información que te apetezca. La RAM es algo muy valioso; cuando se la trata como memoria flash, la RAM no sufre muchos ciclos de reescritura y puede almacenar cualquier dato que haya sido ajustado con la mayor frecuencia posible.

Solo había un problema: realmente no quería escribir código y decidí buscar código ya preparado en Internet. Como sucedió más tarde, ya sabes "por tu propia cabeza". Después de asegurar la culata del robot con I 2 C, lo corrigió y encendió el microcontrolador. Chi no preguntó. Habiendo comenzado a piratear el código, buscando el motivo de la falta de éxito... ¡¡y jadeando!! En algunos casos, la grabación se realizó en todo el puerto a la vez y no en bits específicos. De esta manera, si todavía cuelgas una pantalla en el puerto, por ejemplo, no pagarás por todo. La lectura de datos en el bus también se implementó incorrectamente (sin generación de datos o simplemente sin NACK). Ale tse piv-bidi. El principal problema es otro. La mayoría de las veces, el autor del código establece el puerto en un "1" lógico y, como sabemos, el bus I 2 C está controlado por la "atracción" de los pines SDA y SCL hacia el extremo frontal. Y el "1" lógico en el bus, a su vez, forma una estructura pull-up con más resistencias de 4,7 kiloohmios. Por lo tanto, si la salida del microcontrolador se establece en "1" lógico y el dispositivo es "atraído" hacia su salida, entonces "bang-bang" resultará en un cortocircuito. Ya no pude más y decidí buscar mi bicicleta y escribir mi propia biblioteca, o mejor dicho, escribir dos bibliotecas: una para el robot con el bus I 2 C y otra para el robot con el tiempo real PCF8583. reloj. Entonces, antes de hablar, el código ortográfico es.

Para conectar la biblioteca I 2 C al proyecto, debe escribirla mediante include, como en la imagen, y también copiar la biblioteca a la carpeta con el proyecto.

Después de esto, debe abrir el archivo "i2c.h" y especificar los pines del microcontrolador que actuarán como el bus I 2 C. El bus está conectado a los pines PC0 (SCL) y PC1 (SDA). Y la configuración para ejecutar tímidamente el eje está aquí:

Eso es todo, conectamos la biblioteca I2C, ajustamos las patas y la biblioteca está lista para funcionar. Trasero de Vikoristan:

I2c_init(); //Inicializa el bus I2C i2c_start_cond(); //inicia el bus i2c_send_byte (0xA0); // Agregaré una dirección para colgar en el bus i2c_send_byte (0x10); // byte de datos que se escribe en el dispositivo i2c_send_byte (0x10); // otro byte de datos que se escribe en el dispositivo i2c_stop_cond(); // parada de autobús

Después de parar, podemos comprobar que todo está bien con el bus I 2 C. Para ello es necesario leer la línea “i2c_frame_error”. Si todo es normal, entonces será 0. Si uno de los pines del bus no "cobra vida" y el "1" lógico no está instalado en el bus, entonces la biblioteca genera un mensaje y escribe el número 1. al cambio "i2c_frame_error". Lea el artículo "i2c_frame_error" » es obligatorio después de detenerse. A continuación le demostraré al pequeño cómo funciona el control de la leche:

Ahora pasemos a conectar la biblioteca de aniversario en tiempo real PCF8583. Para lo cual es necesario hacer lo mismo. Copie el archivo “PCF8583.h” a la carpeta con el proyecto y escríbalo en el include, como en la foto:

Listo. La biblioteca de aniversario en tiempo real PCF8583 está conectada. No requerirá ningún ajuste, por lo que puede comenzar inmediatamente antes de leer los datos en los microcircuitos. Aprecio que la biblioteca PCF8583 funcione con una biblioteca I2C adicional, por lo que si desea trabajar con la PCF8583, ¡debe conectar ambas bibliotecas!

Ejemplo de biblioteca (hora y fecha de registro y lectura):

//Inicializa el bus I2C i2c_init(); // Prepare la hora y la fecha para escribir en el microcircuito PCF8583 PCF_hour=23; // 23 años PCF_min = 59; // 59 horas PCF_day=31; // día 31 PCF_mes=12; // 12.º mes – mama PCF_year=0; // Рік (0 - año no bisiesto) PCF_weekday = 6; // 6to día del año (semana) // Escribe la hora y la fecha en el microcircuito PCF8583 PCF_write_hh_mm_ss(); // Leer la hora y la fecha de los microcircuitos PCF8583 PCF_read_hh_mm_ss(); Parte del robot con RAM (escritura y lectura) // Prepare 5 bytes para escribir en el microcircuito PCF8583 PCF_data_ram_1=255; // byte 1 PCF_data_ram_2=255; // byte 2 PCF_data_ram_3=255; // byte 3 PCF_data_ram_4=255; // byte 4 PCF_data_ram_5=255; // byte 5 // Escribe 5 bytes en el microcircuito PCF8583 PCF_write_ram(); // Lee 5 bytes del microcircuito PCF8583 PCF_read_ram();

Leer microcircuitos es aún más fácil: simplemente haga clic en la funciónPCF_ leer_ S.S_ milímetros_ ss() Después de qué hora y fecha informar a las autoridades, tome únicamente su información. Para leer la RAM, use la función vicorista.PCF_ leer_ RAM() Después de lo cual los datos se recopilan hasta que se realicen los cambios.PCF_ datos_ RAM_ norte

Esta es una lista de los importantes, dónde y qué se guarda:

// hora y fecha PCF_hora = 0; // hora, aniversario (de 0 a 23, protección contra renovación antes de la hora de escritura y lectura) PCF_min=0; // hora, hvilini (de 0 a 59, protección contra renovación antes de la hora de escritura y lectura) PCF_sec=0; // hora, segundos (solo la lectura y la escritura se restablecen a 00) PCF_day=0; // día (del 1 al 31, protegido de renovación bajo la hora de escritura y lectura) PCF_weekday=0 // día del año (0-lunes; 6 semanas, protegido de renovación bajo la hora de escritura y lectura) PCF_mes =0; // Mes (del 1 al 12, protección contra renovación al escribir y leer) PCF_year=0; // r_k (0-leap; 1,2,3-non-leap, protección contra renovación al escribir y leer) // RAM PCF_data_ram_1; //Dani (RAM PCF8583), byte 1 PCF_data_ram_2; //Dani (RAM PCF8583), byte 2 PCF_data_ram_3; //Dani (RAM PCF8583), byte 3 PCF_data_ram_4; //Dani (RAM PCF8583), byte 4 PCF_data_ram_5; // Datos (OSP PCF8583), byte 5

Ahora hablemos de la protección contra el repavimentación. Es posible que nos hayamos olvidado de conectar el microcircuito. Los datos de los microcircuitos son legibles y ... se lee el byte 11111111, o el número 255. Todo el asunto es que en la base del bus I 2 C hay 2 resistencias que se levantan, el eje de esos y vemos los “unos” lógicos como micro. No están conectados. Para protegerme contra este tipo de fallas, de la biblioteca PCF8583 he obtenido una protección contra re-reemplazo, que puedes seguir para que el aniversario no te muestre 62 años de 81 años... La detección de re-reemplazo se puede hacer leyendo el flujo de cambios PCF_over. Si hay 0, significa que no hubo indultos. Si hay 1 o más, entonces se renuevan los beneficios. Debe leer el cambio "PCF_overflow" después de leer la función de fecha y horaPCF_ leer_ S.S_ milímetros_ ss()

Para más detalles, el proyecto AVR Studio 6 para ATmega32 está disponible. Puedes recompilarlo para cualquier AVR. El proyecto también incluye un display para control visual. Al alimentar, el microcontrolador establece 23 años, 59 días, 31 días, Semana. Y durante una semana son 00 años, 00 días, 1 día, lunes.

Ahora entendamos por qué estaba hablando del calendario "torcido" de estos microcircuitos. A la derecha está el hecho de que el microcircuito no puede guardar el calendario actual, solo guarda el símbolo del año bisiesto. En resumen, aparentemente:
0 – año bisiesto
1 – no es un año bisiesto
2 – no es un año bisiesto
3 – no es un año bisiesto

Y así después del ciclo 0-1-2-3-0-1-2-3-0...

Para crear un calendario normal, es necesario implementar el diseño del software y guardar el destino, por ejemplo, la misma RAM es PCF8583, pero no es fácil. Y es una pena que la memoria detrás del circuito defectuoso, desafortunadamente, no pueda ser reescrita por nadie...

También me gustaría añadir un breve informe en vídeo. Puedes decir que eres nuevo en el programa, incluso si ya lo has programado durante 3 años (poco a poco), no puedes juzgar el código con dureza, ya que es adicional y respetuoso, escrito, correcto. ¡Lejos de ser cohibidos con todos!

Lista de elementos de radio

Cita Tipo Denominación Cantidad NotaComercioMi cuaderno
MK AVR de 8 bits

ATmega32

1 Antes del bloc de notas
Aniversario de la hora real (RTC)

PCF8583

1 Antes del bloc de notas
pantalla LCDWH16021

¿Por qué otra biblioteca I2C?

La biblioteca I2C estándar para Arduino es la biblioteca Wire. Si bien esta biblioteca es suficiente la mayor parte del tiempo, hay situaciones en las que no se puede utilizar:

  • Pines I2C A4/A5 (o SDA/SCL) – para otros fines,
  • El código se ejecutará tanto en el procesador ATmega con 16 MHz como en el procesador ATtiny con 1 MHz,
  • y falta de memoria (flash y RAM).

Características

  • compatible con todos los MCU AVR de 8 bits
  • puede hacer uso de casi cualquier pin
  • Se admite el estiramiento del reloj (por esclavos)
  • tiempo de espera en el estiramiento del reloj
  • tiempo de espera en el sondeo ACK para dispositivos ocupados (¡nuevo!)
  • Se pueden utilizar resistencias pullup internas de MCU (¡nuevas!)
  • muy liviano (250 bytes de flash y 0 bytes de RAM, excepto la pila de llamadas)
  • muy rápido (modo estándar y rápido en UNO, 33 kHz con reloj de CPU de 1 MHz)
  • Interfaz compatible con la biblioteca Wire opcional
  • sin arbitraje en el autobús (es decir, excepto un maestro permitido en el autobús)
  • solo admite el modo maestro
  • licencia GPL

Usando la biblioteca

Interfaz alternativa

Mientras tanto, estoy ejecutando un corredor de correo como SoftI2CMaster, que emula la biblioteca Wire (solo modo maestro). Hay otro archivo de encabezado C++ llamado SoftWire. Inmediatamente después de esta declaración de inclusión, debe crear una instancia de Wire.

Esta sección hace sacrificios de varias maneras al original, en particular de alguna manera pequeña, pero hay necesidades que necesitarás para decodificar el original. La siguiente tabla enumera los requisitos de memoria.

Memoria Flash WireSoftI2CMaster SoftWire RAM
1956 252 712 208 0 64
¿Te merecías la estatua? ¡Compartir con amigos!