Перейти к содержанию

Дописать до двух знаков (секунды, часы)


Рекомендуемые сообщения

Собственно вопрос в заголовке, пишу планировщик там работа с часами и минутами идет, это все сохраняется в EEPROM, от туда достаю int далее конвертирую в часы и минуты и отправляю в Serial на экран, хотелось бы представление сделать с нулями, перерыл инет ничего не нашел, помогите решить хочу отображать так: 01:06   сейчас отображается 1:6

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

29 минут назад, 3d_killer сказал:

отправляю в Serial на экран

не совсем понятно что это значит, но можно попробовать отправлять сначала 0 потом 1 и получите желаемый результат.

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

попробуйте так

uint8_t Display[32];        // дисплейный буфер на 32 байта

//==============================================================================
// Преобразование из BIN в BCD
//==============================================================================
uint8_t BinToBCD(uint8_t byte)
{
  return(((byte / 10) << 4) + (byte % 10));
}

//==============================================================================
// Показать время
//==============================================================================
void ShowTime(uint8_t pos, uint16_t value)
{
  uint8_t temp;
  uint8_t *disp;
  
  disp = Display + pos;
  temp = BinToBCD(value / 60);
  *disp++ = ((temp >> 4) & 0x0F) + '0';   // старшый разряд часов
  *disp++ = (temp & 0x0F) + '0';          // младшей разряд часов
  *disp++ = ':';
  temp = BinToBCD(value % 60);
  *disp++ = ((temp >> 4) & 0x0F) + '0';   // старший разряд минут
  *disp = (temp & 0x0F) + '0';            // младший разряд минут
}

//==============================================================================
// Показать время (то же самое)
//==============================================================================
void ShowTime(unsigned char pos, unsigned int value)
{
  Display[pos]=((BinToBCD(value/60) >> 4) & 0x0F)+'0';    // старшый разряд часов
  Display[pos+1]=(BinToBCD(value/60) & 0x0F)+'0';         // младшей разряд часов без точки
  Display[pos+2]=':';
  Display[pos+3]=((BinToBCD(value%60) >> 4) & 0x0F)+'0';  // старший разряд минут
  Display[pos+4]=(BinToBCD(value%60) & 0x0F)+'0';         // младший разряд минут
}

 

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Извините, но это - какой-то бред...
Сначала по тетрадам разбивается число, всякими сдвигами и масками :

((byte / 10) << 4) + (byte % 10)

А затем делаются обратные действия :

(temp >> 4) & 0x0F
temp & 0x0F

В чём смысл сиих лишних действий ?

Не проще сделать так :

temp = value / 60;
*disp++ = (temp/10) + '0';   // старшый разряд часов
*disp++ = (temp%10) + '0';   // младшей разряд часов

temp = value % 60;
*disp++ = (temp/10) + '0';   // старшый разряд минут
*disp++ = (temp%10) + '0';   // младшей разряд минут

 

И тут, также :

(BinToBCD(value/60) >> 4)

Вы вызываете функцию, которая двигает данные влево на 4 разряда, затем сразу же двигаете возвращенное значение вправо на 4 разряда :)

 

Ссылка на комментарий
Поделиться на другие сайты

17 часов назад, Alex сказал:

Извините, но это - какой-то бред...
Сначала по тетрадам разбивается число, всякими сдвигами и масками :

Да как угодно. Согласен, код не оптимальный с точки зрения текста, но рабочий и компилятору нравиться больше :-) , проверил в одном проекте:
- IAR (size) 9 941 байт (мой) против 9 959 байт (ваш);
- IAR (speed) 11 499 байт (мой) против 11 525 байт (ваш).

Конечно, надо проверить только код ShowTime, но пока не времени. Будет время обязательно проверю и дооптимизирую (спасибо за наводку :-) ).

Показал два примера с перспективой дальнейшей оптимизации (это видно). Просто раньше это было выдернуто из разных проектов, так и тянется... Получается что и ваш код также можно ещё оптимизировать :-)

Да, чип Mega32

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Ну это-то да, просто в качестве первоисточника всегда указывались чехи. И что автор вообще грек. И что напряжение там не более 20В, что китайцы разогнали его по напряжению (и по току). А оказалось - только по току и то - незначительно. И изначально задуманный в этих пределах он, несмотря на много раз раскритикованную, но относительно простую схему выдает очень даже хорошие характеристики и по сей день.
    • Нет, не резонанс, а амплитуда колебаний уменьшается все ближе и ближе к гистерезису реле. Чтобы этого избежать сделайте генератор на реле независимым от цепей светодиодов.
    • картинка из даташита на АТмега32 сигналы - это то, что написано около стрелок. а PA6, PB0... и т.д. - это названия выводов (портов) МК. а если ты собрал и работает, то все сигналы ты подключил правильно.
    • https://rutube.ru/video/73956e720c1b321ee7434bcc71d6fb99/ ШИМ регулятора CCM5D (DC) 6-30 В 6А с дисплеем - это регулятор для 12В эл.двигателя, при чем здесь частотники. Для своих частотников поставьте сопротивление для регулировки оборотов, либо токовый задатчик (4-20 мА). Контроль оборотов можно контролировать по току двигателя. то есть амперметр где вам удобно.
    • идея использования, как регистры флагов, понятна. а GPIOR1 и GPIOR2 разве нельзя использовать, как регистры флагов? у меня, как раз, используется TWI для вывода на экран 1602 через модуль I2C. но идея понятна. а в АТмега8 можно использовать флаг Т в регистре SREG. но устанавливать его после восстановления SREG перед выходом из прерывания. или коротко, как у тебя: set reti но такое можно делать, если обработка события (прерывания) может подождать. но такая отложенная обработка прерывания бывает очень редко. поэтому у меня даже в мыслях не было, чтобы отложить обработку прерывания.
    • Плата не регулирует. Но параметры ламп регулируются. Займитесь этим, и всё получится. В своё время купил часы, так там все разряды светились. В подвале видать собирали - лихие 90 -е. И на рынке купил. Недавно сделал. Половину деталей не поставили, и номиналы не те. Часы валялись конечно, но теперь в строю.  И ещё. Мне лично не приходилось встречаться с часами на лампах. Надо посмотреть даташит режима работы  ваших ламп, а они все одинаковы.    Надо запереть немного ток. И да, проверить цепи накала. Там тоже "подлянка" бывает. У меня была. Не поставили токоограничивающие резисторы 9,1 Ом.
×
×
  • Создать...