Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение 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.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Вопросы по С/С++ (СИ)

Сообщение HardWareMan »

А оно точно от суток считается? Кстати, в процентах это будет вот так:
Изображение
Последний раз редактировалось HardWareMan Ср янв 08, 2025 14:27:30, всего редактировалось 2 раза.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

HardWareMan писал(а):А оно точно от суток считается?
с чего ты это взял?
сутки, как и минуты, тут ни при чем.
если ppm - это одна миллионная, то это одна миллионная к любому периоду времени.
и если не лень, можешь посчитать сколько будет одна миллионная за год.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

прошу прощения за свою серость, но как правильно записать число от -128 до +127 в 10 ячейку ds3231 :oops:

Код: Выделить всё

#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);
}
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Wire.write(Aging_off);
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение 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);
}
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Вопросы по С/С++ (СИ)

Сообщение Adrift »

Serzh2000, вы когда в свою decToBcd() передаете -12, то надеетесь получить двоично-десятичное число со знаком? Где он там хранится? )
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение 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 миллионам, и ошибочный результат почти ровно вдвое некорректен :)
Последний раз редактировалось WiseLord Ср янв 08, 2025 14:25:16, всего редактировалось 1 раз.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

да, :idea: его хранить надо 7 бите

Добавлено after 6 minutes 37 seconds:
и как это сделать?
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Вопросы по С/С++ (СИ)

Сообщение Adrift »

[uquote="Serzh2000",url="/forum/viewtopic.php?p=4669271#p4669271"]и как это сделать?[/uquote]
Никак. А раз никак и при этом вам нужно в байт поместить число которое может быть со знаком, значит оно не двоично-десятичное.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение Serzh2000 »

Значение в этом регистре закодировано в формате двоичного целого числа со знаком с дополнением до 2, где бит 7 представляет бит знака числа.
https://microsin.net/adminstuff/hardwar ... e-rtc.html
во всем интернете нет ни одного живого примера как записать число от -128 до +127 в 10 ячейку ds3231 :facepalm:

Добавлено after 29 minutes 41 second:
Регистр старения кристалла хранит 8-битовый код в формате «дополнение до двух» предназначенный для компенсации точности хода часов.
Результирующая частота = частота резонатора + значение регистра * 0.1ppm, где значение регистра может быть, как положительным, так и отрицательным.
то есть мне нужно конвертировать обычные десятичные значения в 8-битовый код в формате «дополнение до двух"?
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение OKF »

Преобразование в BCD и обратно лишнее.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение 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);// читаем
и все просто получается и корректировать можно в меню часов будет, а не прошивать если цифра не та.
всем кто помогал спасибо.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

если тебе не нужен будильник, совсем необязательно использовать формат bcd. регистру будильника пофигу, в каком формате записано в него число.
на счет "НУ ЕГО НАФИК!!!".
ну, прочитал ты из будильника tik_correc, все равно это число нужно записать в регистр старения. так что, твоя затея с регистром будильника - совершенно лишняя работа.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение 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);
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Где же таких берут то? У меня дочка в 7 классе проходит как числа хранятся в памяти.

Я же написал сразу как делать..
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Ну хочется человеку ограничить себя диапазоном числел 0..99 вместо -128..127 - кто мы такие, чтобы это запретить :)

Кстати, а зачем вообще счётчик недель нужен? Вычислить номер недели вполне можно и по дате и применять коррекцию, когда N % 4 == 0.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

Serzh2000 писал(а):на четвертой неделе прибавим (или убавим ) секунды и все
интересно, а куда ты спрячешь минус в формат BCD, когда у тебя tik_correc должен быть отрицательный и нужно будет убавить?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Вопросы по С/С++ (СИ)

Сообщение 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 только считает недели :facepalm:
Кстати, а зачем вообще счётчик недель нужен? Вычислить номер недели вполне можно и по дате и применять коррекцию, когда N % 4 == 0.
интересно надо подумать.
регистр 10h (Aging offset), записывая в который число от -128 до 127, можно влиять на используемую в DS3231
а с этим делом у меня не получается вот почему:

Если число неотрицательное, то в старший разряд записывается ноль, далее записывается само число.
например число 12 = 7 бит 0 число положительное 0001100 остальные не инвертированы

Если число отрицательное, то все биты модуля числа инвертируются
например число -12 = 7 бит 1 означает минус 1110011 остальные инвертированы

да записать отрицательное число не проблема Wire.write(11110011 );
но работать с такими числами (в формате двоичного целого числа со знаком с дополнением до 2, где бит 7 представляет бит знака числа.) неудобно.
а преобразовать из Десятичных в Двоичное NEG (n) и обратно я не соображу как (в институтах не учился, да и в школе тройки ) :oops:
https://studfile.net/preview/5398032/page:4/
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

В чём неудобство? Наоборот же, никаких не нужно преобразований - складывай-вычитай-умножай-не-хочу. Положительное записать - Wire.write(12), отрицательное - Wire.write(-12).
Ответить

Вернуться в «Разные вопросы по МК»