Страница 383 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 11:31:25
Starichok51
WiseLord писал(а):То есть изменение на единицу значения коррекции даёт изменение количества импульсов в минуту на 0.1.
ты не прав.
0.1ppm не имеет отношения к минуте.
ppm - это число миллионных долей.
0.1ppm - это одна десятимиллионная часть.
в сутках 3600 * 24 = 86400 секунд.
делим на 10 миллионов и получаем 86400 / 10000000 = 0,00864 секунды в сутки.
итого, 2 сек за 28 дней => 2/28 = 0.0714 сек за сутки => 0.0714/0.00864 = 8.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 12:14:00
HardWareMan
А оно точно от суток считается? Кстати, в процентах это будет вот так:

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 12:53:49
Starichok51
HardWareMan писал(а):А оно точно от суток считается?
с чего ты это взял?
сутки, как и минуты, тут ни при чем.
если ppm - это одна миллионная, то это одна миллионная к любому периоду времени.
и если не лень, можешь посчитать сколько будет одна миллионная за год.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 13:36:34
Serzh2000
прошу прощения за свою серость, но как правильно записать число от -128 до +127 в 10 ячейку ds3231
Код: Выделить всё
#include <Wire.h>// Подключаем библиотеку I2C
#define DS3231_I2C_ADDRESS 0x68
// конвертируем обычные десятичные значения в двоично-десятичный код:
byte decToBcd(byte val){
return( (val/10*16) + (val%10) );
}
// конвертируем двоично-десятичный код в обычные десятичные значения:
byte bcdToDec(byte val){
return( (val/16*10) + (val%16) );
}
int8_t Aging_off = -12; //наше число
//------------------------------------------------ void SETUP----------------------------------------------------------------------------------------------
void setup(){
Serial.begin (9600);
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x10);
Wire.write(decToBcd(Aging_off));
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x10);
Wire.endTransmission();
Wire.requestFrom(0x68,1);//Запрашиваем данные
Aging_off = bcdToDec(Wire.read() & 0xff);// читаем байты –
Serial.println(Aging_off,DEC);
Serial.println("****");
Serial.println(" ");
delay(1000);
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 14:01:19
VladislavS
Wire.write(Aging_off);
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 14:10:17
Serzh2000
ели не конвертировать Wire.write(decToBcd(Aging_off)); то...
у меня с конвертацией не так... но что?
Код: Выделить всё
#include <Wire.h>// Подключаем библиотеку I2C
#define DS3231_I2C_ADDRESS 0x68
// конвертируем обычные десятичные значения в двоично-десятичный код:
int8_t decToBcd(int8_t val){
return( (val/10*16) + (val%10) );
}
// конвертируем двоично-десятичный код в обычные десятичные значения:
int8_t bcdToDec(int8_t val){
return( (val/16*10) + (val%16) );
}
int8_t Aging_off = -12; //наше число
//------------------------------------------------ void SETUP----------------------------------------------------------------------------------------------
void setup(){
Serial.begin (9600);
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x10);
Wire.write(decToBcd(Aging_off));
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x10);
Wire.endTransmission();
Wire.requestFrom(0x68,1);//Запрашиваем данные
Aging_off = bcdToDec(Wire.read() & 0xff);// читаем байты –
Serial.println(Aging_off,DEC);
Serial.println("****");
Serial.println(" ");
delay(1000);
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 14:16:29
Adrift
Serzh2000, вы когда в свою decToBcd() передаете -12, то надеетесь получить двоично-десятичное число со знаком? Где он там хранится? )
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 14:19:38
WiseLord
[uquote="Starichok51",url="/forum/viewtopic.php?p=4669182#p4669182"]
WiseLord писал(а):То есть изменение на единицу значения коррекции даёт изменение количества импульсов в минуту на 0.1.
ты не прав.
0.1ppm не имеет отношения к минуте.
ppm - это число миллионных долей.
0.1ppm - это одна десятимиллионная часть.
в сутках 3600 * 24 = 86400 секунд.
делим на 10 миллионов и получаем 86400 / 10000000 = 0,00864 секунды в сутки.
итого, 2 сек за 28 дней => 2/28 = 0.0714 сек за сутки => 0.0714/0.00864 = 8.[/uquote]
Понятно. Я думал, что это что-то типа аббревиатуры для pulses per minute
P.S. Забавно, что 32768*60 почти равно 2 миллионам, и ошибочный результат почти ровно вдвое некорректен

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 14:30:38
Serzh2000
да,

его хранить надо 7 бите
Добавлено after 6 minutes 37 seconds:
и как это сделать?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 14:39:33
Adrift
[uquote="Serzh2000",url="/forum/viewtopic.php?p=4669271#p4669271"]и как это сделать?[/uquote]
Никак. А раз никак и при этом вам нужно в байт поместить число которое может быть со знаком, значит оно не двоично-десятичное.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 15:27:04
Serzh2000
Значение в этом регистре закодировано в формате двоичного целого числа со знаком с дополнением до 2, где бит 7 представляет бит знака числа.
https://microsin.net/adminstuff/hardwar ... e-rtc.html
во всем интернете нет ни одного живого примера как записать число от -128 до +127 в 10 ячейку ds3231
Добавлено after 29 minutes 41 second:
Регистр старения кристалла хранит 8-битовый код в формате «дополнение до двух» предназначенный для компенсации точности хода часов.
Результирующая частота = частота резонатора + значение регистра * 0.1ppm, где значение регистра может быть, как положительным, так и отрицательным.
то есть мне нужно конвертировать обычные десятичные значения в 8-битовый код в формате «дополнение до двух"?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 17:26:27
OKF
Преобразование в BCD и обратно лишнее.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 18:35:50
Serzh2000
регистр 10h (Aging offset), записывая в который число от -128 до 127, можно влиять на используемую в DS3231
НУ ЕГО НАФИК!!!
В DS3231 есть будильник у меня он не используется...
вот и буду сажем писать в регистр который отвечает за минуты
Код: Выделить всё
Wire.beginTransmission(0x68);
Wire.write(0x08);
Wire.write(decToBcd(tik_correc));
Wire.endTransmission();
он от внешнего питания не зависит
при пропадании и последующей подачи внешнего питания в
Код: Выделить всё
void setup(){
Serial.begin (9600);
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x08);
Wire.endTransmission();
Wire.requestFrom(0x68,1);//Запрашиваем данные
tik_correc = bcdToDec(Wire.read() & 0x7f);// читаем
и все просто получается и корректировать можно в меню часов будет, а не прошивать если цифра не та.
всем кто помогал спасибо.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 19:16:34
Starichok51
если тебе не нужен будильник, совсем необязательно использовать формат bcd. регистру будильника пофигу, в каком формате записано в него число.
на счет "НУ ЕГО НАФИК!!!".
ну, прочитал ты из будильника tik_correc, все равно это число нужно записать в регистр старения. так что, твоя затея с регистром будильника - совершенно лишняя работа.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 20:07:05
Serzh2000
да нет не надо записывать число в регистр старения. я вообще больше в регистр 10h (Aging offset) не полезу
делаем так:
Код: Выделить всё
//если время 00 : 00 : 30 : понедельник
if (hour == 0 && minute == 0 && second == 30 && Wday == 1) {
if (millis() - timing > 10000) { // 10 seconds пауза
if (tik_correc >= 3) { //четвертая неделя или нет
//корректируем секунды прибавляя или отнимая число TIME_CORRECT (от - 5 сек. до +5 сек.)
NowSecond = second + TIME_CORRECT;
setRTCTime(); tik_correc = 0; set_tik_correc();
} //обнуляем неделю и записываем в ds 3231 новые секунды и счетчик недель.
else {
tik_correc++; // прибавляем счетчик недель
set_tik_correc(); //и запись в ds 3231
}
timing = millis();
}
}
на четвертой неделе прибавим (или убавим ) секунды и все
Добавлено after 2 minutes 14 seconds:
совсем необязательно использовать формат bcd. регистру будильника пофигу,
это для себя, чтобы понятнее было в мониторе пота смотреть Serial.println(tik_correc);
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср янв 08, 2025 21:40:28
VladislavS
Где же таких берут то? У меня дочка в 7 классе проходит как числа хранятся в памяти.
Я же написал сразу
как делать..
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт янв 09, 2025 01:24:51
WiseLord
Ну хочется человеку ограничить себя диапазоном числел 0..99 вместо -128..127 - кто мы такие, чтобы это запретить
Кстати, а зачем вообще счётчик недель нужен? Вычислить номер недели вполне можно и по дате и применять коррекцию, когда N % 4 == 0.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт янв 09, 2025 09:41:14
Starichok51
Serzh2000 писал(а):на четвертой неделе прибавим (или убавим ) секунды и все
интересно, а куда ты спрячешь минус в формат BCD, когда у тебя tik_correc должен быть отрицательный и нужно будет убавить?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт янв 09, 2025 16:55:49
Serzh2000
Код: Выделить всё
//======== Режим корректировки секунд,один раз в каждую четвертую неделю (от - 5 сек. до 5 сек.)
case 16: {
setups[10] = PressingButton(setups[10], 0, 10);// кнопки диопазон 0-10
switch (setups[10]) {
case 0: TIME_CORRECT = 5; var = 5; break;
case 1: TIME_CORRECT = 4; var = 4; break;
case 2: TIME_CORRECT = 3; var = 3; break;
case 3: TIME_CORRECT = 2; var = 2; break;
case 4: TIME_CORRECT = 1; var = 1; break;
case 5: TIME_CORRECT = 0; var = 0; break;
case 6: TIME_CORRECT = -1; var = 1; break;
case 7: TIME_CORRECT = -2; var = 2; break;
case 8: TIME_CORRECT = -3; var = 3; break;
case 9: TIME_CORRECT = -4; var = 4; break;
case 10: TIME_CORRECT = -5; var = 5; break;
}
if (setups[10] <= 5) {
DigitOut(14, 11, PROBEL, var , 0, led_color); //вывод на экран положитетельной коррекции
}
else {
DigitOut(14, 11, 15, var, 0, led_color);//вывод на экран отрицательной коррекции
}
break;
}
в программе TIME_CORRECT принимает отрицательное число и храниться еероре
Код: Выделить всё
//корректируем секунды прибавляя или отнимая число TIME_CORRECT (от - 5 сек. до +5 сек.)
NowSecond = second + TIME_CORRECT;
а tik_correc только считает недели
Кстати, а зачем вообще счётчик недель нужен? Вычислить номер недели вполне можно и по дате и применять коррекцию, когда N % 4 == 0.
интересно надо подумать.
регистр 10h (Aging offset), записывая в который число от -128 до 127, можно влиять на используемую в DS3231
а с этим делом у меня не получается вот почему:
Если число неотрицательное, то в старший разряд записывается ноль, далее записывается само число.
например число 12 = 7 бит 0 число положительное 0001100 остальные
не инвертированы
Если число отрицательное, то все биты модуля числа инвертируются
например число -12 = 7 бит 1 означает минус 1110011 остальные
инвертированы
да записать отрицательное число не проблема Wire.write(11110011 );
но работать с такими числами (в формате двоичного целого числа со знаком с дополнением до 2, где бит 7 представляет бит знака числа.) неудобно.
а преобразовать из Десятичных в Двоичное NEG (n) и обратно я не соображу как (в институтах не учился, да и в школе тройки )
https://studfile.net/preview/5398032/page:4/
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт янв 09, 2025 18:46:40
WiseLord
В чём неудобство? Наоборот же, никаких не нужно преобразований - складывай-вычитай-умножай-не-хочу. Положительное записать - Wire.write(12), отрицательное - Wire.write(-12).