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

Вопросы от начинающих по МК


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

Реклама: ООО ТД Промэлектроника, ИНН: 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

Вообще, я бы, скорее всего, добавил ещё одно поле в структуру, в которой хранилось бы общее кол-во минут. А обновлял бы это поле вместе с полями часов и минут. Тогда сравнение выливалось бы, всего-лишь, в сравнение только чисел, без всяких вызовов функций. Что улучшило бы читабельность кода и упростило бы его написание.

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

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

Чтобы сравнить время не нужно даже привлекать математику, храните время в виде BCD, тогда ЧЧ:ММ занимает ровно два байта, и прекрасно сравнивается как число размером в слово.

Что касается перехода интервала через сутки, то если считать такую ситуацию допустимой(проще считать такое состояние ошибкой, если дата не ведется и задавать такой интервал двумя интервалами, разделенными переходом через ноль) достаточно поменять начало и конец местами, провести сравнение и инвертировать результат.

Учение - изучение правил. Опыт - изучение исключений.

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

Можно и извратнуться

union{
unsigned int time;
struct{
 unsigned char ml:4;
 unsigned char mh:4;
 unsigned char hl:4;
 unsigned char hh:4;
}t;
}time;

Тогда, как и сказал Alexeyslav, обработка будет в формате BCD, хоть и чуть более прозрачно, а сравнения останутся простым сравнением целых чисел. Кстати, наверное и сам попробую применить такой подход.

Насчет сравнения, можно при одном сравнении взводить флаг, а при другом снимать. Поскольку сравнение будет строгим (== вместо > или <), такому способу безразличны переходы через ноль. Недостаток - если по какой-то причине не сработает одно из сравнений - флаг окажется инвертированным (времена включения и выключения поменяются местами).

if(time == time1 || time==time2) flag =! flag;

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Можно и извратнуться

union{
unsigned long time;
struct{
unsigned char ml:4;
unsigned char mh:4;
unsigned char hl:4;
unsigned char hh:4;
}t;
}time;

и опять же вопрос unsigned long зачем? если всего 16бит? и в коде что давал выше все тоже самое только без танцев с бубном с BCD... :unknw:
Ссылка на комментарий
Поделиться на другие сайты

Да, согласен, исправил на unsigned int. Танцы с бубном с BCD удобнее для отображения. Тут зависит от того, насколько часто нужно обновлять отображаемую информацию.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Здравствуйте. Нужна помощь в решении задачи. Пытаюсь освоить каскадное соединение сдвиговых регистров.

Хочу, чтобы получилась бегущая строка из олного светодиода. Т.е. когда старший разряд проходит с ножки Q7 первого сдв.регистра, он появляется на ножке Q0 второго сдв.регистра. Но вместо этого загораются оба. Вот так это выглядит.

383f1e537f9ae0e34fe09d8f65e2339c.png

Вот код в CVAVR

#include <mega8.h>

#include <delay.h>

// SPI functions

#include <spi.h>

#define F_CPU 8000000 //частота тактирования

unsigned char rab;

//Функция отправки данных по SPI

void send_SPI(int data)

{

SPDR=data; //отправляем данные по SPI в сдвиговый регистр

while(!(SPSR & (1<<SPIF))) //ждем окончания передачи по SPI

PORTB |= 0x01; //1 на PB0

delay_us(100);

PORTB &= ~0x01; //0 на РВ0

}

void main(void)

{

PORTB=0x00;

DDRB=0xFF;

ACSR=0x80;

SPCR=0x52;

SPSR=0x00;

TWCR=0x00;

rab = 0x01;

while (1)

{

send_SPI(rab);

delay_ms(100);

rab = rab<<1;

}

}

Укажите пожалуста как решить задачу.

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

Можно и извратнуться

union{
unsigned int time;
struct{
unsigned char ml:4;
unsigned char mh:4;
unsigned char hl:4;
unsigned char hh:4;
}t;
}time;

Тогда, как и сказал Alexeyslav, обработка будет в формате BCD, хоть и чуть более прозрачно, а сравнения останутся простым сравнением целых чисел. Кстати, наверное и сам попробую применить такой подход.

Кстати, а почему бы просто не записывать часы в старший байт, а минуты - в младший. Тогда сравнение, также, сведётся всего-лишь к сравнению int-переменной.

Хм... Интересно... :)

А ведь самое интересное, что мне это всё тоже на днях предстоит делать :) Я, также, разрабатываю таймер. Точнее термостат с режимами "от и до".

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

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

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

пост 3676

http://forum.cxem.ne...60#comment-2130980

Там нечто другое. Совсем не то :)

там именно это и сделано... минуты в младшем байте , часы в старшем.... а вы ссылку не на тот пост прикрепили... http://forum.cxem.net/index.php?showtopic=67748&st=3660#comment-2131206
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...