DS3231 INT/SQW

ser82g
Offline
Зарегистрирован: 16.04.2016

Здравствуйте, подскажите, как выставлять регистры BIT3, BIT4 адреса 0EН, для изменения частоты на выходе SQW.

Заранее благодарен.

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Посмотрите вот тут. Это для DS1307 ,но принцип такой-же.

В сетапе прописываем  строки:

Wire.beginTransmission(0x68);
Wire.write(0x7);// move pointer to SQW address (для 3231 кажись 0Eh)
Wire.write(0x10);//sends 0x10 (hex) 00010000 (binary) для 1 Гц ,(для 3231 -01000000)
Wire.endTransmission();

И на выходе имеем генерацию с частотой 1Гц ( в данном примере). И выбирать частоту генерации для 3231  нужно при помощи 3 и 4 го бита, а не 0 и 1 как у 1307.

Для 1Гц- 01000000

для 1024 кГц- 01001000

для 4096 кГц  01010000

для 8192 кГц 01011000

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Например, когда мне нужно было освежать показания часов точно при переходе на новую минуту, я сделал так.

1. SQW присоединил к пину, на который можно посадить attachInterrupt

2. В библиотеку DS3231 добавил такой метод

void DS3231::EnableMinuteInterrupt(void) {
	setA2Time(1, 1, 1, 0x70, 0, 0, 0);
	turnOnAlarm(2);
	byte cb = readControlByte(1);
	cb &= (~2);
	writeControlByte(cb, 1);
	writeControlByte(readControlByte(0) | 4, 0);
}

3. А в коде написал:

	Clock.turnOffAlarm(2);    //  Выключить будильник, если он там есть
	Clock.EnableMinuteInterrupt();   //   Установить прерывание раз в минуту
	pinMode(PIN_SQW, INPUT);   //   Пин на чтение
	attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING); // Установить обработчик прерываний

Функция - обработчик прерывания выглядит так:

void everyMinuteAlarm(void) {
	const byte oldSReg = SREG;
	sei();
	RefreshClockScreen();
	Clock.clearAlarmSignal(2);
	SREG = oldSReg;
}

 

ser82g
Offline
Зарегистрирован: 16.04.2016

Штирлиц - Большое спасибо, все получилось