Не могу понять как записать регистры, с частотой 8192 Гц
Wire.beginTransmission(0x68); // начинаем обмен с DS3231 с i2c адресом 0x68
Wire.write(0x0E);
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0x01);
Wire.write(0x01);
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0x00);
Wire.endTransmission(); // завершение передачи
постоянно на выходе идет 1Гц
b707
11.Май.2023 20:02:42
2
Вы разницу между битами и байтами понимаете? Вам надо установить два бита в ОДНОМ БАЙТЕ, нафига же вы шлете 8 байт?
Нужно заранее сформировать байт с нужными битами и потом послать ОДИН байт
Wire.beginTransmission(0x68); // начинаем обмен с DS3231 с i2c адресом 0x68
Wire.write(0x0E); // выбор регистра CONTROL
Wire.write(0b00011000); // регистр записи (бит 7 — EOSC)
Wire.endTransmission(); // завершение передачи
так тоже результата нет
3d_killer:
так тоже результата нет
А что есть? 1 Гц? Или ничего? Вы можете как-то повнятнее изъясняться?
1Гц идет постоянно, поменять не могу почему-то
Ну, тогда давайте полный код и схему. ЕМНИП он там с 1ГЦ с завода идёт, так что, может Вы вообще ничего не меняете.
Кстати, как Вы его (1 ГЦ) меряете? Какого номинала резистор?
стандартное подключение, резисторы по 4,7кОм, замеряю осликом
#include <microDS3231.h>
MicroDS3231 rtc;
#define F_CPU 8000000UL
//----------------------БИБЛИОТЕКИ--------------------------
#include <avr/wdt.h> //Библиотека сторожевого таймера
#include <Wire.h>
//***************
void scan()
{
//Сканер
byte error, address;
int nDevices;
Serial1.println("Scanning...");
nDevices = 0;
for(address = 0; address < 127; address++ ){
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0){
Serial1.print("I2C device found at address 0x");
if (address<16)
Serial1.print("0");
Serial1.print(address,HEX);
Serial1.println(" !");
nDevices++;
}
else if (error==4) {
Serial1.print("Unknow error at address 0x");
if (address<16)
Serial1.print("0");
Serial1.println(address,HEX);
}
}
if (nDevices == 0)
Serial1.println("No I2C devices found\n");
else
Serial1.println("done\n");
}
void setup() {
//Запуск внешнего прерывания
Serial1.begin(38400);
wdt_enable(WDTO_2S);
Wire.begin();
Wire.beginTransmission(0x68); // начинаем обмен с DS3231 с i2c адресом 0x68
Wire.write(0x0E); // выбор регистра CONTROL
Wire.write(0b00011000); // регистр записи (бит 7 — EOSC)
Wire.endTransmission(); // завершение передачи
}
//Основной метод
void loop()
{
delay(1000);
wdt_reset();
}
Так Вы и не меняете. Читайте даташит дальше, ещё 2 бита есть.
Только эти по таблице и относятся к этому выходу Rate Select (RS2 и RS1) я читал документацию, но так и не смог его запустить на другой частоте
3d_killer:
замеряю осликом
С какого резистора? Выход-то - открытый коллектор, Вы не забыли?
Да, всё верно, чего-то я протупил ))
Я попробовал, у меня получилось.
У меня через б-ку (самогонную), но по регистрам разберётесь.
В основной программе я написал так:
DS3231Init();
ds3231_ControlRegister.clear(CtrlBits::INTCN);
ds3231_ControlRegister.set(CtrlBits::RS1 | CtrlBits::RS2);
Как видите, Ваши два бита, плюс обнулил бит INTCN, но Вы это тоже делаете.
А функция DS3231Init
у меня выглядит так:
//
// Запускаем осциллятор, сбрасываем флаг остановки осциллятора
// и выключаем генерацию меандра на ноге 32kHz
//
void DS3231Init(void) {
ds3231_ControlRegister.clear(CtrlBits::EOSC);
ds3231_ControlStatusRegister.clear(CtrlBits::OSF | CtrlBits::BB32kHz | CtrlBits::EN32kHz);
ds3231_alarmsClear();
}
На алармы можно забить, я думаю, а вот вся остальное попробуйте сделать точно как у меня.
(на всякий случай: ControlRegister. - 0x0E, а ControlStatusRegister - 0x0F)
для 32 кГц, там же первая лапка используется
Да, точно, переклинило.
Тем не менее, попробуйте точно повторить мои команды. Работает же у меня. Должно и у Вас.