Беспорядок с потенциометром I2C
Для проекта я купил несколько двойных 8-битных I2C-потенциалов MCP4651. Просмотрев библиотеки Arduino и ничего не найдя, я подумал: «Ничего страшного»… Я уже написал библиотеки I2C для других частей, которые были гораздо более сложными! (например: 24-битный АЦП ADS1219)! так что просто загрузите таблицу данных и посмотрите карты памяти и команды! ок, на странице 49 есть кое-что, что кажется полезным! о боже, я когда-нибудь ошибался! этот паспорт выглядит как кошмар! худшая документация для любого устройства I2C, которое я когда-либо видел. Команды, которые я написал на основе этого, абсолютно ничего не сделали!
В одном из примеров Arduino я нашел примерно такой код для управления I2C-потенциалом:
#include <Wire.h>
void setup() {
Wire.begin(); // подключаемся к шине i2c (адрес для ведущего необязателен)
}
byte val = 0;
void loop() {
Wire.beginTransmission(44); // передаем на устройство №44 (0x2c)
// адрес устройства указан в даташите
Wire.write(byte(0x00)); // отправляет байт инструкции
Wire.write(val); // отправляет байт значения потенциометра
Wire.endTransmission(); // прекращаем передачу
val++; // увеличиваем значение
if (val == 64) { // если достигнут 64-я позиция (макс.)
val = 0; // начинаем заново с наименьшего значения
}
delay(500);
}
Я решил просто попробовать и посмотреть, что произойдет (изменил адрес на правильное значение), и, как ни странно, это действительно сработало! поэтому я взломал этот фрагмент кода, чтобы заставить работать первый горшок!
void setPot0(int n){
if (n>256) n=256;
if (n<0) n=0;
Wire.beginTransmission(address);
if (n<256){
Wire.write(0x00);
Wire.write(n);
} else{
Wire.write(0x01);
Wire.write(0);
}
Wire.endTransmission();
}
и каким-то образом это работает! Я до сих пор не могу найти этот шаблон ни на одной из страниц таблицы данных, но эй! это работает, так что я не буду на это жаловаться? Мне до сих пор не удалось заставить работать pot1, только pot0... если вы понимаете, как должны выглядеть команды и байты данных, пожалуйста, помогите мне. В таблицах данных TI это гораздо более понятно; вы просто используете команду для записи в нужный регистр, и они подробно описывают, что делает каждый регистр:
Изменить: вот ссылка на таблицу данных: http://ww1.microchip.com/downloads /en/DeviceDoc/22096b.pdf
@OM222O, 👍0
Обсуждение1 ответ
Лучший ответ:
Регистры перечислены в таблице 4-1. Это достаточно ясно.
Формат командного байта показан в главе 6. Этот командный байт включает в себя операцию и номер регистра, а также старшие биты для регистров, которые ожидают более 8 бит данных.
Для установки регистра необходимы два байта. Первые 4 бита — это номер регистра (0000 для Wiper 0, 0001 для Wiper 1 и 0100 для регистра TCON). Следующие два бита представляют собой операцию, показанную на рисунке 7-1. 00 для простой записи. Следующие два бита — это два старших бита данных. Далее идут младшие 8 бит данных.
Итак, чтобы записать значение 0x23 для банка 0, вы должны написать:
0x00 0x23
Чтобы записать значение 0x65 для банка 1, вы должны написать:
0x10 0x65
Чтобы записать значение 0x13D для горшка 1, вы должны написать:
0x11 0x3D
Вы можете создать более простую функцию, чтобы обернуть ее:
void writePot(uint8_t address, uint8_t pot, uint16_t val) {
Wire.beginTransmission(address);
Wire.write((pot & 3) << 4 | ((val >> 8) & 3));
Wire.write(val & 0xFF);
Wire.endTransmission();
}
- Как перевести Arduino Nano в спящий режим с низким энергопотреблением (<0,05 мА)
- MAX30100 не работает
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Библиотека I2C MIFARE RC522
- Уменьшить яркость светодиода с помощью NPN-транзистора
- Не удалось выделить SSD1306 при добавлении константы
- Сброс адреса I2c — MLX90614
- SSD1306 распознается сканером I2C, но не может его отобразить
какой у тебя вопрос? ....единственный вопрос в вашем посте - это вопрос о жалобах, @jsotola
мой вопрос в том, как мне следует отправлять команды I2C для использования горшка. как я уже упоминал, код, который я написал, работает, но не соответствует шаблонам адресов и данных I2C, которые они упомянули в своих технических характеристиках. Я не уверен, какими должны быть управляющие байты и что такое общий вызов и обычный вызов? они просто говорят, что общие коллы могут изменить несколько банков (если они есть)?, @OM222O
«Общий вызов» и «обычный вызов» на самом деле являются частью спецификации I2C и связаны с адресацией одного или нескольких устройств I2C., @jsotola
Содержит ли глава 4 таблицы данных *не* всю необходимую информацию? Включая подробности о ТРЕХ регистрах (да, всего ТРЕХ) для управления устройством?, @Majenko
«Я до сих пор не могу найти этот шаблон ни на одной из страниц таблицы данных». Даже в главе 4, таблице 4-1, где перечислены регистры? Регистр 0 — это банк 0, а регистр 1 — это банк 1. Ясно сказано., @Majenko