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

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


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

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 пользователей онлайн

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

  • Сообщения

    • Спасибо Тут и фвч и фнч на одном операционнике реализован, странно, обычно на каждый фильтр свой операционник
    • параллельно изучать по фото платы, сервис мануал (схема) если будет, то на него и ориентировать покупку. Цена определяет качество, резонансный всегда дороже. Про нагрузку Вы не написали, что там будет?
    • Спасибо! Сегодня буду смотреть почему проседает... Хотя аккум нормальный, 11.1v, максимальный долговременный ток до 20А... Вообщем разбираюсь.
    • Ловите, как раз на широкую полосу для Палника рисовали, автора не знаю. Все, что нужно.   
    • @Андрей0З9  Это что за учитель и где, такой по трудовому обучению, задает задачи по физике 10 класса.?!  Бред полный.
    • Румынский дядька - перфекционист-фенечник. Бисера и бусин - дофига, вот и ставит куда не попадя, в данном случае бусинками выставил единую высоту ряда конденсаторов. Подобное встречалось, когда на ножки впаиваемых элементов одевались короткие кембрики одинаковой высоты, чем задавалась единая высота монтажа. Ну видимо румынскому дядьке лень было нарезать кучу одинаковой мелочёвки, зато было вналичии много бисера..., и креативно и желаемого достиг. С уважением, Сергей. 
    • О, это очень полезные регистры! в 88 только GPIOR0 сохранил свои полезные свойства. использую их как флаги событий прерываний. для GPIOR0 адрес порта ввода-вывода 0х1Е, а значит к нему применяются команды cbi, sbi, sbic, sbis   ну и   in, out. Когда происходит прерывание, процессор переходит на адрес обработки прерывания, вот там-то мы и располагаем код: sbi   GPIOR0, 0     ;установить в 1 бит 0 в регистре GPIOR0 reti                        ;вернуться из прерывания   Без использования регистра GPIOR0, а с использованием обычного регистра код выглядел бы иначе: push   R0                          ;освобождаем регистр R0 для SREG и сохраняем его in        R0, SREG               ;сохраняем SREG в R0, все флаги операций текущей программы sbr     R23, 1<<0             ;выставляем флаг признака прерывания, например бит 0 в регистре R23 out    SREG, R0               ;восстанавливаем SREG, все флаги операций текущей программы pop   R0                          ;восстанавливаем значение R0 reti                                  ;вернуться из прерывания   Нетрудно заметить......!   А, да команда: sbr     R23, 1<<0 в идеале изменяет флаги в SREG, потому и такая длинная цепочка команд. Далее, из всего сказанного выше... в АТмега8 до адреса ввода / вывода 0x1F, находятся некоторое количество регистров, которые крайне редко (...никогда...) используются, например: TWBR, TWSR, TWAR, SPCR, ....... их можно (... нужно...) использовать как GPIOR регистр. До связи.
  • Похожий контент

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