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

Переход С Cvavr На Avr Studio 6


squad_leader

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

Всем доброго времени суток! У меня такой вопрос возник, сравнивал ли кто нибудь размер hex-файла полученного в Atmel Studio 6 c другими компиляторами ???

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

  • 10 месяцев спустя...

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

  • Ответов 50
  • Создана
  • Последний ответ

Топ авторов темы

Здравствуйте! Подскажите, пожалуйста, как в Atmel Studio прописать инициализацию EEPROM, сохранение какой-то величины от АЦП в EEPROM при определенном условии, допустим, при нажатии кнопки и выполнение действия при совпадении сохраненной величины с данными от АЦП?

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

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

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

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

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

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

С чем конкретно помочь?

как в Atmel Studio прописать инициализацию EEPROM
Не нужно, оно инициализируется автоматически.
сохранение какой-то величины от АЦП в EEPROM
Не знаете, как записать переменную в EEPROM?
при определенном условии
или как в Си написать условие?

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

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

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

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

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

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

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

Хорошо, попробую по порядку: с инициализацией разобрались... Как записать переменную в EEPROM?

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

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

Отлично, общая задача ясна. Напишите приблизительную программу, заменив незнакомые операции процедурами с ясными названиями, но, можно, без кода. Например, для записи в EEPROM - процедура void eeprom_write_int(unsigned int addr, int data);

Далее смотрим даташит на интересующий контроллер. Например, ATmega8, в оглавлении ищем что-то связанное с памятью, в данном случае это раздел AVR ATmega8 Memories. В нем ищем подраздел, связанный с EEPROM (EEPROM Data Memory), читаем его. Там идет описание регистров, общий алгоритм записи

1. Wait until EEWE becomes zero.

2. Wait until SPMEN in SPMCR becomes zero.

3. Write new EEPROM address to EEAR (optional).

4. Write new EEPROM data to EEDR (optional).

5. Write a logical one to the EEMWE bit while writing a zero to EEWE in EECR.

6. Within four clock cycles after setting EEMWE, write a logical one to EEWE.

И кусок кода, реализующий этот алгоритм

EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEWE
rjmp EEPROM_write
; Set up address (r18:r17) in address register
out EEARH, r18
out EEARL, r17
; Write data (r16) to data register
out EEDR,r16
; Write logical one to EEMWE
sbi EECR,EEMWE
; Start eeprom write by setting EEWE
sbi EECR,EEWE
ret

Или, если кто зачем-то начал изучение контроллеров с Си

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

Переименовываем процедуру по выбранному шаблону, то есть на void eeprom_write_int(unsigned int addr, int data), или какое там имя понравилось. Если же покопаться в стандартных заголовочных файлах Студии, можно найти файл с подозрительным именем "eeprom.h", в котором есть не менее подозрительная процедура void eeprom_write_word(uint16_t *__p, uint16_t __value); Уже по типу аргументов можно догадаться, что первый - указатель на переменную, а второй - число для записи.

С АЦП чуть сложнее, готового куска кода я в даташите с ходу не нашел, поэтому придется все-таки почитать описание и сделать как там сказано.

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

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

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

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

Спасибо за помощь. Но, описанная Вами, процедура никак не хочет работать. Я не могу вызвать эту функцию (извините, если путаю термины, - я еще не волшебник...:). Она очень часто встречается на просторах интернета и в мучебниках именно в таком виде, в каком Вы мне ее представили, и ни слова о контексте, в котором она способна выполнять полезные функции... я так понимаю, что работает она как прерывание, ведь, в том же Atmega8 имеется вектор прерывания под номером 16: EE_RDY EEPROM Ready, но как его применить?... А вот на родную atmel библиотеку eeprom.h я давно поглядывал и вчера, после написания своего предыдущего сообщения смог таки заставить работать EEPROM при помощи "подозрительной процедуры" eeprom_write_byte (uint8_t*__p,uint8_t__value). К стати, очень даже удобно: места в листинге занимает мало и работает в связке с if() оператором.

Ну а с АЦП я уже имел опыт, правда, так себе, - опыт: быдлокодил помаленьку :), теперь хочу сам вникнуть... Еще раз спасибо за участие.

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

Где можно использовать прерывание EE_RDY честно говоря не представляю, запись длится всего пару тактов, там на вызове прерывания больше потеряется. Процедуру из даташита надо вызывать точно так же, как и из eeprom.h, насколько я понимаю, они почти один к одному написаны, только первая на Си, а вторая - на ассемблере, с сишным заголовком, для оптимизации. Хотя не факт, может тоже быть на Си. В коде вызывается именно как процедура:

unsigned int adc_res=ADC;
EEPROM_write(0,x);

либо, для библиотечной,

unsigned int adc_res=ADC;
EEMEM ee_x;
eeprom_write_word(&ee_x,adc_res);

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

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

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

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

Спасибо, я пока на библиотечных функциях попрактикуюсь. К стати, очень интересно описано здесь http://www.embedds.c...mory-in-avrgcc/ в первом пункте как раз про прерывание говорится...

Никогда бы не подумал, что СИ настолько размазан, одно и то же действие вызывается множеством различных функций...

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

запись длится всего пару тактов
Отсыпьте и мне кулек ваших МК, в которых запись в ЕЕПРОМ длится всего пару тактов. Заранее благодарен!
вторым вариантом никогда не пользовался ... поэтому в его правильности не уверен
Вообще одно из достоинств Си в том, что уже создано огромное количество кода. И не пользоваться уже готовыми, проверенными и написанными профессионалами, зачастую с опытом на порядки больше, библиотеками просто глупо.

Для vlasimir : В приведенной вами ссылке, всего лишь два подхода. Первый "Acessing EEPROM", это пример реализации доступа к памяти посредством самостоятельного манипулирования регистрами. Второй, все что идет в статье дальше, это работа с библиотечными функциями.

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

Отсыпьте и мне кулек ваших МК, в которых запись в ЕЕПРОМ длится всего пару тактов. Заранее благодарен!

Ок согласен, перепутал с чтением

Типовое значение длительности этого цикла составляет 3.4 мс для моделей ATmega48x/88x/168x, ATmegal64x/324x/644x, ATmega640x/1280x/1281x/2560x/2561x и 8.5 мс — для остальных моделей.
Вообще одно из достоинств Си в том, что уже создано огромное количество кода. И не пользоваться уже готовыми, проверенными и написанными профессионалами, зачастую с опытом на порядки больше, библиотеками просто глупо.

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

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

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

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

Честно говоря, фраза "задача была записывать и читать по определенному адресу, а не по тому, который понравился компилятору" просто ставит в тупик. Компилятор изо всех сил старается делать то о чем его просят, а этими словами, по-моему, вы его просто оскорбили.

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

Для vlasimir : В приведенной вами ссылке, всего лишь два подхода. Первый "Acessing EEPROM", это пример реализации доступа к памяти посредством самостоятельного манипулирования регистрами. Второй, все что идет в статье дальше, это работа с библиотечными функциями.

Мне, в принципе, это и нужно было. Плюс ко всему, ясный и понятный пример мне, как новичку, более полезен, в отличие от даташитов, наводящих уныние. И ваше чванливое "всего лишь" абсолютно не к месту... Но, если Вы также доходчиво, как на страничке по моей ссылке, изложите остальные, не упомянутые, подходы,- готов выслушать Вас с превеликим удовольствием. :thank_you2:

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

Никогда бы не подумал, что СИ настолько размазан, одно и то же действие вызывается множеством различных функций...
Это же ваши слова про множество однообразных функций?! И мой ответ - в статье всего лишь два подхода, делать все самому с нуля или воспользоваться готовой библиотекой. Ни какого другого скрытого смысла в моих словах небыло. Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

Честно говоря, фраза "задача была записывать и читать по определенному адресу, а не по тому, который понравился компилятору" просто ставит в тупик. Компилятор изо всех сил старается делать то о чем его просят, а этими словами, по-моему, вы его просто оскорбили.

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

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

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

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

Обратите внимание на продукцию фирмы IAR. Там вы сможете расположить переменную по нужному вам адресу хоть во flash, хоть в eeprom. Чистота языка Си gcc в данном случае это большой минус, Хотя с eeprom вроде как нет никаких проблем и в gcc, пишите и читайте откуда хотите, ведь работа ведется через указатели.

Несколько переменных по одному адресу? Это зачем? А смотрели в сторону указателей и объединений?

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

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

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

Несколько переменных по одному адресу? Это зачем?
Запись-чтение нескольких переменных в EEPROM. Удобнее, чтобы они располагались последовательно. Так-то компилятор может их расположить в удобном ему порядке, да и чтобы мне самому не заморачиваться с правильным порядком. В результате они объявлены массивом, как-то так:

unsigned int eeprom_vars[5];
#define var1 eeprom_vars[0]
#define var2 eeprom_vars[1];

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

int x=PINB; int y=PIND; PORTB=x/y;

Для того же eeprom.h можно использовать eeprom_write_word(5,х);

Ну а уж если просите компилятор оптимизировать ваше творчество, то не пеняйте на него, он на много умнее нас с вами
Что ж он тогда сам код не пишет?) Скорее, не "умнее", а "терпеливее", "внимательнее", "с большим запасом готового кода". Но при попытке реализовать что-то нестандартное или подозрительное - приходится доказывать, что знаешь что делаешь.

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

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

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

  • 1 месяц спустя...

Правила языка, вообще-то.

Во-первых, PORTA - адрес памяти, по сути, обычная переменная типа unsigned char, а не какая-то структура.

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

Впрочем, попробуйте, вдруг получится.

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

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

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

Хорошо. Porta.b1 - разница не большая. Чего пробовать - постоянно использую.

typedef struct

{

unsigned char b0 : 1,

b1 : 1,

b2 : 1,

b3 : 1,

b4 : 1,

b5 : 1,

b6 : 1,

b7 : 1;

} IOREG;

#define pina (*(volatile IOREG *) (_SFR_ADDR(PINA)))

#define pinb (*(volatile IOREG *) (_SFR_ADDR(PINB)))

#define pinc (*(volatile IOREG *) (_SFR_ADDR(PINC)))

#define pind (*(volatile IOREG *) (_SFR_ADDR(PIND)))

#define porta (*(volatile IOREG *) (_SFR_ADDR(PORTA)))

#define portb (*(volatile IOREG *) (_SFR_ADDR(PORTB)))

#define portc (*(volatile IOREG *) (_SFR_ADDR(PORTC)))

#define portd (*(volatile IOREG *) (_SFR_ADDR(PORTD)))

porta.b0=pinc.b1;

portd.b4=!portd.b4;

if (pinc.b0)

portc.b1=1;

else

portc.b2=1;

ну и так далее

на здоровье...

Насколько я понимаю CV делает тоже самое,только компилятор поправили, и он сам подставляет вместо PORTA.1 porta.b1 - а в остальном один в один

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

Учитывая, во что могут разворачиваться конструкции с битовыми полями (да, я тоже пытался реализовать синтаксис cvavr на обычном Си - вдруг cvavr это все-таки его разновидность), точнее, в какое количество ассемблерных команд, лучше не извращаться. Команды

union{
char byte;
unsigned char b0:1;
unsigned char b1:1;
...
}var;
var.b1=1;

и

var.byte |= (1<<1);

ведут себя по-разному, вторая эффективнее.

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

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

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

Видите ли. Вопрос в читабельности кода и удобстве. И в том, как компилятор его преобразует.

Есть много задач, где обьем машинного кода значения не имеет. А имеет только функциональность.

к примеру.

typedef union

{

struct

{

byte

D_GSM:1,

D_RK:1,

D_LAN:1,

D_KEYPAD:1,

D_AKBLOW:1,

D_AKBTIME:1,

D_ONTIME:1,

D_EXTBL:1;

} destrbit;

byte destrbyte;

} PERIF_DESTR;

typedef union

{

struct

{

byte

D_GSM:1,

D_RK:1,

D_LAN:1,

D_KEYPAD:1,

D_AKBLOW:1,

D_PROX2:1,

D_ONTIME:1,

D_PROX1:1;

} chrejbit;

byte chrejbyte;

} CH_REJ;

typedef union

{

struct

{

byte

P_0:1,

P_1:1,

P_2:1,

P_3:1,

P__FAN:1,

P__PWR:1,

P_ISOL:1,

unused:1;

} outportbit;

byte outportbyte;

} PORT_REJ;

typedef struct

{

CH_REJ signalsource;

byte keycode[8];

byte datetime[6];

byte torej;

}REJ_SWITCH;

typedef struct

{

word red_on220;

word red_onakb;

word green_on220;

word green_onakb;

word yellow_on220;

word yellow_onakb;

union

{

struct

{

byte yellow_start220:1,

yellow_startakb:1,

red_start220:1,

red_startakb:1,

green_start220:1,

green_startakb:1;

} ledbit;

byte ledbyte;

} start;

}LED;

typedef struct

{

IN_DESTR up,down;

PERIF_DESTR extdestr;

byte AKBLOWVALUE;

unsigned long AKBTIMERMAX,AKBTIMERCOUNT,REJTIMER;

PORT_REJ portcfg;

byte destrkeycode[8];

REJ_SWITCH rejswitch[3];

LED led;

byte sound;

} REJ_CFG;

это кусок описания структур данных. И не от балды все, и не от "безумству храбрых поем мы песню..."

Я поржу, как это (а главное сколько) будет на голом ассемблере реализовываться.

Ну предположим.

Я сейчас пишу проект для 324. У меня реализовано почти все что хотел, обьем кода - 29,2%.

Обьем занятой памяти - 35.4%

Я допускаю, что сейчас начну пристыковывать бантики, и вылезет за 32 к.

Поставлю 644.

Затем - 1284

Труд программиста зачастую стоит намного дороже затрат на апгрейд камней. Притом при правильной организации правки будут существенно проще и доступнее, чем залазить в шибкооптимизированный код, который никто кроме разработчика не переварит.

Классический пример

post-16449-0-58011800-1415134480_thumb.jpg

Это полностью работающая программа эмуляции прыгающего мяча в ascii графике.

Как пример выпендрежа - классно.

Как коммерческий или мало-мальски полезный пример - лажа.

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

Можете-ли ВЫ привести пример облегчения труда в случае использования структур вместо битовых масок, касательно данной темы разговора?

А как в вашем подходе, например, дернуть несколькими ножками одновременно?

И стоит-ли городить огород ради нескольких строчек кода в программе?!

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

Определитесь уже, что мы обсуждаем.

Я поржу, как это (а главное сколько) будет на голом ассемблере реализовываться.
Преимущества разных языков программирования?
Труд программиста зачастую стоит намного дороже затрат на апгрейд камней.
Мантру "память дешевеет, оптимизация не нужна"?
Это полностью работающая программа эмуляции прыгающего мяча в ascii графике.

Как пример выпендрежа - классно.

Возможность произвольного форматирования кода в языке Си?
Видите ли. Вопрос в читабельности кода и удобстве.
Удобство чтения исходников?
Насколько я понимаю CV делает тоже самое,только компилятор поправили, и он сам подставляет вместо PORTA.1 porta.b1 - а в остальном один в один
Отличия cvavr от Си?

.

Запись PORTA.2=1 не соответствует стандарту, поэтому в Си так писать нельзя, запись PORTA.b2 ближе, но PORTA уже объявлено как unsigned char. porta.b2 применять возможно, если не лень переопределять все порты и регистры. Это что касается самой cvavr'овской конструкции PORTA.2.

Насчет удобства, записи PORTA.2=1, PORTA|=(1<<2) и PORTA|=_BV(2) как минимум сравнимы. В ряде случаев стоит вынести всю подобную конструкцию в макрос, тогда детали написания отойдут еще дальше. В "классическом примере", очевидно, удобством чтения пожертвовали ради красивого внешнего вида. Сомневаюсь, что код сразу писали вписанным в круг.

Выбор языка определяется задачами, а не мнениями на форуме, вроде "пишите только на ассемблере" или "пишите только на Си", и даже для одного языка стоит соблюдать баланс между удобством чтания (сюда входят еще и комментарии), портируемостью, объемом кода и скоростью его работы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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