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

Язык СИ для микроконтроллеров


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

for(i=8;i<=10;i++)printf("%i ",i/10);

Как и положено, выводит 0 0 1. Так как 8 / 10 = 0 (ост. 8) ; 9 / 10 = 0 (ост. 9) ; 10 / 10 = 1 (ост. 0). Ост. - остаток от целочисленного деления.

дошло, правильно так

(*(arr++)).SomeVal=1;
(arr++)->SomeVal=1;

Да, этот вариант правильный. Варианты someProcedure2,3 можно было бы исправить arr+i*sizeof(struct someStruct). Потому что по смыслу i - числовое значение, а не структура.

Кроме того, стоило объявить i явно, и массив делать одномерным, а не двумерным.

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

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

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

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

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

Простите, Шарик, вы балбес
Варианты someProcedure2,3 можно было бы исправить arr+i*sizeof(struct someStruct). Потому что по смыслу i - числовое значение, а не структура.

Грешно издеваться над больным. Простите я не знал. :umnik2:

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

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

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

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

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

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

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

можно было бы исправить arr+i*sizeof(struct someStruct)

Пофиг, в случае, если arr - указатель на структуру. Приращение этого указателя на единицу увеличивает адрес в указателе на sizeof.

Теперь сами догадайтесь, почему данная запись является ошибочной.

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

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

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

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

Ок, согласен, arr+i*sizeof() - глупость, оно не работает, в отличие от оригинала. Признаю, что не полностью понимаю указатели в Си.

Но все равно, с объявлением array как двумерного массива, оно вряд ли заработает.

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

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

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

Спасибо всем :)

Ещё интереснй вопрос назрел

есть код

while(1){

struct{
uint16_t SomeVar;
uint8_t SomeVar2;
} __attribute__((packed)) myStruct;

print(myStruct.SomeVar);

myStruct.SomeVar=1;
myStruct.SomeVar2=2;

}

что будет выводить print() ?

Ps. У меня сейчас нет ничего под рукой чтобы самому скомпилировать и проверить :(

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

Ps. У меня сейчас нет ничего под рукой чтобы самому скомпилировать и проверить :(

Вот это вообще зачетно :crazy: .

Вам поговорить не с кем? так вам в соц сети! :buba:

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

просто на этой машине ничего нет, кроме редактора текстового, с подсветкой ))

тем более результат может зависить от архитектуры и компилятора...

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

А что будет, если белую и пушистую кошку возрастом 2 года скинуть с 16-ого этажа ?

У меня просто сейчас кошки нет под рукой, а узнать очень хочется. Да и 16-ого этажа у меня тоже нет под рукой :(

CTIGRA, Ваши вопросы реально звучат глупо. Возьмите и проверьте что будет.

Нет на машине ничего - поставьте, в чём проблема ?

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

Но все равно, с объявлением array как двумерного массива, оно вряд ли заработает.

И опять мимо, будет работать как часики.

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

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

CTIGRA, Ваши вопросы реально звучат глупо. Возьмите и проверьте что будет.

Нет на машине ничего - поставьте, в чём проблема ?

не могу, прав нет...

тут на самом деле даже без разницы что будет-то ) важно - инициализируется ли структура в цикле при каждой итерации или будет "мусор"...

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

инициализируется ли структура в цикле при каждой итерации
В упор не вижу инициализации. Вижу только объявление перед выводом.

И для чего пример с такими извращёнными типами, как структуры ? Можно было бы привести пример с обычным интом. Или Вы - любитель изощрённости (Или извращения, не знаю как лучше) ? :)

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

пример из проекта (у меня там массив на самом деле, в структуре).

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

а так, я пока везде нули через memset() записываю при каждой итерации...

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

  • 3 недели спустя...

Есть часы, есть переменные

// переменные часов
char hour, minut;
// а тут настраиваю условия, когда откл или вкл нагрузку
char hour_on, minut_on, hour_off, minut_off;

Типа я все что надо, записал в эти переменные и в while опрашиваю их

while
{
if (hour_on == hour)
{
 if (minut_on == minut)
 {
  // Писать 1 в епром
  //  ON
 }
}

if (hour_off == hour)
{
 if (minut_off == minut)
 {
  //Писать 0 в епром
  //  OFF
 }
}
}

Эта ботва работает, но когда в епроме, к прмеру 0(OFF), типа свет пропал, и появился после того как иф должен уже был переписать на единичку, то ничего естественно не изменяется. Точно так же и 1 на 0 не перепишет. Оно и не может переписать при таком коде. Что скажете??? Как мудрить дальше? :umnik2: Ну не обвешиваться же мне батарейками, должен быть выход...

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

Ничего не понятно. Какой свет, какой еепром ? И причём тут свет и еепром ?

Поконкретнее объясните проблему, без всяких внешних факторов (свет пропал, кнопку нажали, ...).

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

Чтобы подробно объяснить, надо вывалить весь код. Прочесть программу и понять что я имею ввиду. Грубо говоря, это суточный таймер. Данные с DS1307 пишутся в переменные, а я потом сравниваю их со своими переменными.

Надо включать и выключать нагрузку в заданное время. И "ОНО" работает. Но...

К примеру,

В 20:00 нагрузка включилась, а должна отключиться завтра в 6:00 , но с пяти до семи, не было света и когда свет появляется, нагрузка остается включенной до 20:00 а потом и до 6 следующего дня. Потому что в 6:00, контроллер не работал чтобы сравнить переменные отключения с текущими часами и записать 0 в епром.

Вот так как то...

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

и когда свет появляется, нагрузка остается включенной
А почему она включается, когда появляется "свет" ? 7-00 же больше 6-00 и меньше 20-00. С какой стати ей включаться ?

Обычное условие на больше-меньше, и проблема решена.

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

Нет не решена. У меня нагрузка включается, просматривая что там в епроме. Если 1, то включено. Соответственно чтобы выключить, надо черкануть туды ноль. А его никто не записал, ибо в 6:00 контроллер был выключен. Затея с больше меньше была сразу, но тогда переход времени через 00:00 все испортил. Можно сделать так. в 20:00 вкл а в 23:59 выкл, а потом в 00:00 вкл и в 6:00 выкл, но как быть с этой минутой?? Да и память уже заканчивается 97,1% чтобы добавлять еще какую нить функцию чтобы сама вычисляла переход через 00:00

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

Совершенно не понятно для чего тут нужен еепром. Имеем два времени (от и до). Если текущее время попадает в этот диапазон - нагрузка включена, иначе - выключена.

Просто проверяем каждую секунду на попадание в диапазон и всё.

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

А как тогда через 0:00 перейти? Если после 0:00 мои условия стают ложью, а я жду их как истина.

while
{
if (hour_on <= hour)
{
 if (minut_on <= minut)
 {
  //  ON
 }
}
if (hour_off <= hour)
{
 if (minut_off <= minut)
 {
  //  OFF
 }
}
}

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

Я запутался. По этому и пришел спрашивать. Кроме этого алгоритма, у меня еще гора всякого там ветвления и таймеров, и если тут что то менять, то и по программе надо делать коррективы. Жуть. Как вообще люди пишут по 100 кб прошивки :unsure:

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
  • Похожий контент

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