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

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


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

В итоге сделал так:

#define F_CPU 8000000
#include <avr/io.h>
unsigned char flag;
#define PREVSTATE 2
#define stateIR 0

char ifsame (unsigned char flag, unsigned char mask){
unsigned char a;
a=flag&mask;
if ((a==0) || (a==mask))
return 1;
return 0;
}

int main(void){
while(1){
flag=PINB;
if (ifsame(flag, ((1<<PREVSTATE) | (1<<stateIR))))
PORTB|=0b00000001;
else
PORTB|=0b00000010;
}
}

Т.е. мы передаём в функцию наш флаг и маску, которая укажет какие флаги должны быть одинаковые. Если эти флаги окажутся одинаковыми - функция вернёт 1, если разные - вернёт 0.

unsigned char flag, a, b;
#define PREVSTATE 2
#define stateIR 0

int main(void){
while(1)
{
flag=PINB;
switch (flag&((1<<PREVSTATE)|(1<<stateIR))) {
case 0:
case (1<<PREVSTATE)|(1<<stateIR):
PORTB|=0b00000001;
break;
default:
PORTB|=0b00000010;
}
}

По сути решает тот же вопрос, за что тоже большое спасибо!

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

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

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

Подскажите как на си делается массив который будет находится в памяти программы не занимая место в ОЗУ и ЕРРОМ т.е. надо чтоб программа могла обращаться к таблице и извлекать из нее информацию поочереди

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

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

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

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

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

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

очень просто - массив констант. Компилятор его непременно закинет в память программ. Только его придется инициализировать непосредственно в коде.

const <type> <name>[x] = {c0, c1... c(x-1)};

обычное дело

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

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

Что за камень? В AVR надо указывать явно. PROGMEM, flash и т.п. Просто const недостаточно.

Но зачастую лучше указывать константы через макросы, чтобы не занимать ни ОЗУ ни ПЗУ: #define ANY_CONST 2

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

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

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

Хотел использовать переменную типа bit но студия 6 не хочет объявлять такую переменную. Подскажите как это сделать?

bit kar; в kar будет тока 0 или 1 все 8 бит не надо использовать

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

В языке Си по стандарту нет битовых типов , это уже фичи самих компиляторов. Посмотрите мануал на свой компилятор, возможно там найдёте bool. Но он будет занимать далеко не 1 бит.

А так - битовые поля.

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

Вечер добрый. Поставил 6 студию, словил интересный глюк. Постараюсь объяснить по понятней. Есть папка с проектом terminal, в ней есть папка common_files. Файлы из папки common_files я добавил в проект (файлы *.h и *.c). Потом мне показалось что они не нужны и я их удалил из проекта студии (физически файлы остались в той же папке common_files). Оказалось что файлы всё таки нужны, но добавить их опять не могу, так как студия видит эту папку пустой, но по факту всё файлы там есть. Я из ситуации вышел простым копированием фалов в корень проекта, там их студия видит. Но хотелось бы разобраться в чём причина.

PS: пардон, сам натупил, видимо спать пора...

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

В AVR надо указывать явно. PROGMEM, flash и т.п. Просто const недостаточно

интересно, а куда ж тогда компилятор денет этот массив? В карман чтоли попрячет?

Насколько я помню для констант указанные вами спецификаторы нужны только для того, чтобы явно определить в какой части флеша будет храниться константа. При чем тут ОЗУ и EEPROM то?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

EEPROM это вообще отдельная область.

Сonst без модификаторов расположит число и в ОЗУ, как преинициализированную переменную (с ограничением на запись на уровне компилятора). Вероятно, это сделано чтобы избежать ручной работы с flash. Иначе зачем было вводить модификатор PROGMEM, который без const вызывает ошибку?

Собственно, можете это легко проверить.

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

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

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

ну не знаю, может и так, если говорить об одной константе. Там выгоднее ее подгрузить в озу, скорость работы вырастет. Компилятор оптимизируя прогу запросто может именно так и сделать. Сохранить константу в область программы а потом переопределить в озу с инитом из флеша. А вот когда речь идет о массиве, думаю не все настолько однозначно. Хотя конечно директива за раз снимает все сомнения и допущения

Попробую на досуге поэкспериментировать с прогмемом и без оного. Но кмк результат с большой долей вероятности будет идентичный

Тут еще один момент - если озу хватает, то смысл его экономить? Разве что наша прога будет активно юзать динамическое выделение памяти... Маловероятно

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

А вот я проверял. Доступ к flash осуществляется только специальными командами. Прямое присвоение не работает.

Не всегда можно заранее определить, хватает ОЗУ или нет. Использование буферов экрана, сектора MMC/SD-карточки или рекурсивных функций достаточно серьезно тратят ОЗУ. А когда оно заканчивается, начинается увлекательная игра "найди, из-за чего произошел срыв стека".

В этом смысле не стоит полагаться на компилятор, а писать на ассемблере явно указывать переменным и константам их место.

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

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

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

Добрый вечер. Подскажите такой момент, объявляю двумерный массив в EEPROM

unsigned char ID_BASE [MAX_SENSOR_NUMBER][8] EEMEM;

В еепроме он появляется, всё хорошо, но:

Data Memory Usage : 286 bytes 27,9 % Full

EEPROM Memory Usage : 256 bytes 50,0 % Full

Чего он оперативу ест, я его ещё даже не читаю, только объявил, а Data Memory Usage с 30 bytes стала 286 bytes.

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

ну видимо из EEPROM работать с этим делом не получится и компилятор зарезервировал сразу область выгрузки (буфер)

а вот это сколько примерно? MAX_SENSOR_NUMBER?

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Странно, а у меня все нормально

#include <avr/io.h>
#include <avr/eeprom.h>

EEMEM const unsigned char arr[255];

int main(){
 unsigned char x=PINB;
 PORTB = eeprom_read_byte( &arr[x] );

 return 0;
}

Program:	  94 bytes (1.1% Full)
(.text + .data + .bootloader)

Data:		  0 bytes (0.0% Full)
(.data + .bss + .noinit)

EEPROM:	  255 bytes (49.8% Full)
(.eeprom)

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

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

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

а вот это сколько примерно? MAX_SENSOR_NUMBER?

32 Датчика, на половину еепрома. В принципе оперативы пока хватает, но такого поворота я не ожидал. Может как то выкрутиться можно, что б оперативу не тратить понапрасну?

COKROWEHEU а вы в чём компилировали?

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

avr-gcc 4.8.1, но и в старых вроде тоже самое.

Альтернатива - ручное управление EEPROM'ом, что тоже несложно.

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

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

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

Спасибо, буду пробовать.

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

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

COKROWEHEU вы avr studio пользуетесь? Почему спрашиваю, так как выяснил что дело именно в самой студии, тулчейны разные пробовал, результат один в 4 хорошо в 6 плохо.)

PS: Ура победил. Объявил вот так:

EEMEM const unsigned char ID_BASE [MAX_SENSOR_NUMBER][8] = {};

Добавление const и присвоение помогло.

Program Memory Usage : 1846 bytes 11,3 % Full

Data Memory Usage : 31 bytes 3,0 % Full

EEPROM Memory Usage : 256 bytes 50,0 % Full

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

Последняя которой пользовался - 4.18 вроде, потом перешел на чистый avr-gcc и самодельные makefile.

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

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

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

Тоже долго пользовался 4 студией, потом увидел нормальный редактор с подсветкой и быстрыми переходами куда нужно в Coocox и Kiel, и решил перейти на 6 студию. Друг советовал эклипс, но у меня к нему дэбагер прицепить не получилось. А вы в качестве редактора просто блокнот используете, что-то типа AkelaPad?

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Сами же понимаете, что так не может быть. Или нет "сквозняка", или схема неправильно собрана, элементы не те, битые и пр., и схема защиты не работает. Проверьте сначала работу защёлки защиты при питании от 15 В, отпаяв R19 и подавая туда медленно увеличивающееся напряжение до 1,5 В (можно с потенциометра ом на 100-500). Добейтесь, чтобы работала. Порог срабатывания измерьте. Пересчитайте в ток через резистор 0,1 Ом. Соответствует ли "правильному"? Проверьте, что у этого резистора сопротивление действительно 0,1 Ом. Запаяйте 0,1 Ом обратно. Напишите, какая лампочка. А то мало ли какая, может она не от "сквозняа", а от броска тока заряда С18 С16 мигает. Транзисторы ключей проверьте. Впаяйте вместо первичной трансформатора резистор ом 150 - 300, чтобы ток с ключей в этот "эквивалнт трансформатора" не больше 50-100 мА был. Посмотрите форму напряжения на выходе ключей, в точке соединения С16 и С18. В общем, как в анекдоте: - Молодой человек, ну делайте же уже хоть что-нибудь!
    • Ну так можно увеличить глубину ООС, тем самым понизив чувствительность и повысив линейность
    • Судя по этой картинке   в трухе передней панели под выступающие болты и шишки паек ЗК динамиков выковыряныфрезерованы выемки, иначе бы динамики так плотно не прилегали бы к ДВП.    А оно тебе надо? "Работает - не мешай"(с)/это уже аксиома, не требующая доказательств/ , пытаясь сделать лучше, чем сделано на заводе. Сanton-ят, т.е. поют, и лучше, чем есть, тебе не сделать. Ну перенесёшь ты динамики наружу, а что тебе это даст? Кроме того, что при попытке их продать(а продавать их когда-нибудь придётся, т.к. эта акустика бюджетного сегмента без потуг на высший класс Hi-Fi) , тебе придётся объяснять потенциальному покупателю причину, по которой какой-то умник заколхозил такую переделку с акустикой, ты ничего хорошего не получишь. Задуманная тобой переделка - это по сути возня ради возни. 
    • Малыш, чушь пока здесь мелешь только ты. Сидел бы лучше в своей оффтопной теме, лепил бы на своём 3D-пинтере куколок, и не лез бы в те темы, в которых ты - ноль. 
    • Там нашел. Вроде купил.  Спасибо всем
    • Вначале вместо 220 подал 15в ( неправильно выразился, извиняюсь, конденсатор С10 коротнул, чтоб микра заработала),как на картинке, посмотрел сигнал на затворах - есть, перемычку естественно отпаял, включаю 220, а лампочка страховочная загорается, Следовательно идёт сквозняк... Вот и хочу спросить у вас, Где искать подвох? Да кстати защита не срабатывала почему-то..
  • Похожий контент

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