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

Есть ли рабочие настройки компилятора и линкера для Atmega2560?


Душитель Гуся

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

 Здравствуйте! 

Программировал в среде Microchip(Atmel) Stidio микроконтроллер Atmega328p. Мне понравилось программировать в этой IDE. Также изучение аппаратной части МК мне заходит больше, чем оперирование Ардуиновскими командами. 

Но вот незадача: прошивка на Atmega328p работала корректно с оптимизациями 1 и больше(0-не работал), а на Atmega2560 с разными настройками оптимизациями и линкера работает некорректно. Написал проверочный код на At2560. Ситуация не менялась. 1)Проблема в том, что по каким-то причинам из тела цикла while(1) невозможно получить доступ к глобальным переменным(в частности к массиву данных). Если массив размещался в теле цикла while(1), то к нему можно было получить доступ, но только из оператора if или очень простой функции. 2)Если попробовать получить массив данных из сложной функции с циклом то ячейки массива были равны 255(я записывал значения поменьше) и это при том, что я размещал массив в while(1). Долго извращался с настройками компилятора и линкера, так и ничего путного не получилось.

Пробовал программировать в IAR AVR  и CodeVision AVR МК At2560. У меня даже светодиод зажечь не получилось. Немного поковырялся в настройках-ничего. Слишком много времени нужно на изучение всех параметров Компиля и Линка. Забил.

Пробовал Eclipse с плагином AVR и компилем AVR GCC 12.1. Вроде чутка заработало, но мне удавалось зайти в эту среду только 1 раз после установки. Второй раз я не смог зайти после закрытия проги. Работоспособность 12.1 компиля не удалось оценить. Да и собирался проект в Eclipse через раз.

Товарищи, если у кого-нибудь есть пример рабочих настроек для данного девайса, не проходите мимо. Для любых вышеперечисленных IDE или IDE, которое у вас. Или укажите на работоспособный тулчейн(с параметрами). Желательно с подробным гайдом по настройке. Ассемблер впадлу учить.

 

Ниже приведён проверочный код из Microchip Studio.

Есть участки: //------1(глобальные переменные) и //------2(тело цикла while(1)).  Участки размещения массива str1.

И ниже два проверочных участка:

1) Отправка символов на символьный дисплей. Эта часть выводит значения ячеек массива посимвольно(функция для выведения числа целиком не работает). 

2) Светодиодный тест. Значения ячейки массива выводится морганием светодиода с задержкой 1 сек. Пауза между переключением ячеек 3 сек.

Массив в глобальных переменных: на дисплее 255 и светодиод неустанно моргает с паузой в 1 сек.

Массив в теле цикла while(1): работает на обоих участках. Если вывод массива на дисплей занести в цикл, то реальные значения ячеек не отобразятся.

Что можно с этим сделать: поменять настройки в этой среде(у меня не получилось), подключить другой компиль в эту среду(это сложно, желательно подробный гайд), выбрать другой IDE, программировать на Ардуино?

Снимок экрана (862).png

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

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

Надо для опытов отложить в сторонку все оболочки. У Вас один и тот же исходник с помощью gcc из командной строки для 328 компилируется, а для 2560 выдаёт ошибки, так?

С уважением, Владимир

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

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

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

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

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

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

10 часов назад, Душитель Гуся сказал:

И ниже два проверочных участка:

что за дебильная тяга выкладывать код  в виде картинок? Воспользоваться кнопкой вставка кода "<>"  релмгия не позволяет?

это поток сознательного бессознательного , а не проверочный код...
что Вы ожидание от этих команд:
1) в главном цикле:
sendcharlcd(str[4]/100+0x30);
sendcharlcd(str[4]%100/10+0x30);
sendcharlcd(str[4]%10+0x30);
2)  в цикле for:
extern unsigned char str1[];
sendcharlcd(str[n]);

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

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

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

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

3 часа назад, IMXO сказал:

что за дебильная тяга выкладывать код  в виде картинок? Воспользоваться кнопкой вставка кода "<>"  релмгия не позволяет?

это поток сознательного бессознательного , а не проверочный код...
что Вы ожидание от этих команд:
1) в главном цикле:
sendcharlcd(str[4]/100+0x30);
sendcharlcd(str[4]%100/10+0x30);
sendcharlcd(str[4]%10+0x30);
2)  в цикле for:
extern unsigned char str1[];
sendcharlcd(str[n]);

В этом форуме 2-ой раз.

1)Знаю, что эта запись-как попытка отобразить значение несуществующей ячейки массива. Ты просто представь. Компилятор это не выдал за ошибку. Без этих строчек результат тот же.

2) Вставка __attribute__((aligned(4)))  и extern это попытка вручную прописать массив в глобальные переменные и обратиться к ним.  Что с этими вставками, что без них-результат один.

#include "main.h"
//extern char str1[4];
//char* str1 = (char*) malloc(sizeof(char) * 4);
unsigned char str1[]={2,4,7,2}; __attribute__((aligned(4))) //------------1*
char ggg []="5146845";

int main()
{
	I2C_Init();//инициализируем TWI
	LCD_ini();  //инициализируем дисплей
	clearlcd();//очистим дисплей
        DDRB=0b11111111;
    while (1) 
    {
        //----------------2*
		setpos(0,0);
		//extern unsigned char str1[];
		sendcharlcd(str1[0]/100+0x30);
		sendcharlcd(str1[0]%100/10+0x30);
		sendcharlcd(str1[0]%10+0x30);
		setpos(4,0);
		sendcharlcd(str1[1]/100+0x30);
		sendcharlcd(str1[1]%100/10+0x30);
		sendcharlcd(str1[1]%10+0x30);
		setpos(8,0);
		sendcharlcd(str1[2]/100+0x30);
		sendcharlcd(str1[2]%100/10+0x30);
		sendcharlcd(str1[2]%10+0x30);
		setpos(12,0);
		sendcharlcd(str1[3]/100+0x30);
		sendcharlcd(str1[3]%100/10+0x30);
		sendcharlcd(str1[3]%10+0x30);
		setpos(16,0);
		sendcharlcd(str1[4]/100+0x30);
		sendcharlcd(str1[4]%100/10+0x30);
		sendcharlcd(str1[4]%10+0x30);
		for (unsigned int n=0;n<4;n++)
		{
			extern unsigned char str1[];
			for (unsigned char a=0; a< str1[n]; a++)
			{
				PORTB |= (1<<7);
				_delay_ms(1000);
				PORTB &= ~(1<<7);
				_delay_ms(1000);
				//sendcharlcd(str1[n]);
			}
			_delay_ms(3000);
		}	
    }
	//return 0;
}

Это код не в виде картинки. Пардон

4 часа назад, ДядяВован сказал:

Надо для опытов отложить в сторонку все оболочки. У Вас один и тот же исходник с помощью gcc из командной строки для 328 компилируется, а для 2560 выдаёт ошибки, так?

Нет. Один и тот же исходник на 328 работает, а на 2560 нет. И тот и другой вариант собирается без ошибок

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

39 минут назад, Душитель Гуся сказал:

Один и тот же исходник на 328 работает, а на 2560 нет.

очень сомневаюсь, что он работает на 328...
еще раз... что делают эти команды:
setpos(16,0);
sendcharlcd(str1[4]/100+0x30);
sendcharlcd(str1[4]%100/10+0x30);
sendcharlcd(str1[4]%10+0x30);
 

39 минут назад, Душитель Гуся сказал:

Вставка extern это попытка вручную прописать массив в глобальные переменные и обратиться к ним.

Зачем , прочитайте что такое локальные переменные их область их видимости...
командой:
extern unsigned char str1[];
Вы тупо создали в пределах цикла for локальную переменною с именем str1 , extern всего лишь означает, что описание этой переменной находится в другом месте.
Что должна делать эта команда:
//sendcharlcd(str1[n]);
 

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

Тот же код. Ни ошибок, ни предупреждений.1072533042_(864).png.43f1108bfa93d02264f3477d34d36afc.png2037917145_(865).png.d18e05e3ec777df977d4deb0d98145a7.png

4 минуты назад, IMXO сказал:

очень сомневаюсь, что он работает на 328...
еще раз... что делают эти команды:
setpos(16,0);
sendcharlcd(str1[4]/100+0x30);
sendcharlcd(str1[4]%100/10+0x30);
sendcharlcd(str1[4]%10+0x30);

4 ячейке массива-это намеренно оставленная ошибка. Назначение этих строк: разбить 3-х разрядное число по разрядам и отправить каждое число разряда на lcdtwi диспей в виде символа Char. 

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

16 минут назад, Душитель Гуся сказал:

Ни ошибок, ни предупреждений.

:wall:, их там и не будет...  ни линкер, ни компилятор не контролируют размер массивов. Это в любом учебнике по Си написано.
Ты объявил массив размером 4 байта и обращаться к пятому.

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

11 минут назад, IMXO сказал:

компилятор не контролируют размер массивов

Именно так! Контроль границ массива полностью на программисте.

С уважением, Владимир

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

Тот же код.uPrUWqMMl_E.thumb.jpg.4e6dad052a77b557547423e228b3a1e2.jpg

#include "main.h"
unsigned char str1[]={2,4,7,2};  //------------1*
char ggg []="5146845";

int main()
{
	I2C_Init();//инициализируем TWI
	LCD_ini();  //инициализируем дисплей
	clearlcd();//очистим дисплей
        DDRB=0b11111111;
    while (1) 
    {
        //----------------2*
		setpos(0,0);
		//extern unsigned char str1[];
		sendcharlcd(str1[0]/100+0x30);
		sendcharlcd(str1[0]%100/10+0x30);
		sendcharlcd(str1[0]%10+0x30);
		setpos(4,0);
		sendcharlcd(str1[1]/100+0x30);
		sendcharlcd(str1[1]%100/10+0x30);
		sendcharlcd(str1[1]%10+0x30);
		setpos(8,0);
		sendcharlcd(str1[2]/100+0x30);
		sendcharlcd(str1[2]%100/10+0x30);
		sendcharlcd(str1[2]%10+0x30);
		setpos(12,0);
		sendcharlcd(str1[3]/100+0x30);
		sendcharlcd(str1[3]%100/10+0x30);
		sendcharlcd(str1[3]%10+0x30);
		for (unsigned int n=0;n<4;n++)
		{
			for (unsigned char a=0; a< str1[n]; a++)
			{
				PORTB |= (1<<7);
				_delay_ms(1000);
				PORTB &= ~(1<<7);
				_delay_ms(1000);
				//sendcharlcd(str1[n]);
			}
			_delay_ms(3000);
		}	
    }
	//return 0;
}

 

jFpXnBAjaaQ.jpg

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

14 часов назад, Душитель Гуся сказал:

Ассемблер впадлу учить.

Вот это зря. Его надо не учить, а понять. И это помогло бы программированию на Си.

С уважением, Владимир

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

15 минут назад, IMXO сказал:

:wall:, их там и не будет...  ни линкер, ни компилятор не контролируют размер массивов. Это в любом учебнике по Си написано.

Понял суть описаной на этом форуме проблемы?

Перемещаем массив в основной цикл.

#include "main.h"

char ggg []="5146845";

int main()
{
	I2C_Init();//инициализируем TWI
	LCD_ini();  //инициализируем дисплей
	clearlcd();//очистим дисплей
        DDRB=0b11111111;
    while (1) 
    {
        //----------------2*
		unsigned char str1[]={2,4,7,2};  //------------1*
		setpos(0,0);
		//extern unsigned char str1[];
		sendcharlcd(str1[0]/100+0x30);
		sendcharlcd(str1[0]%100/10+0x30);
		sendcharlcd(str1[0]%10+0x30);
		setpos(4,0);
		sendcharlcd(str1[1]/100+0x30);
		sendcharlcd(str1[1]%100/10+0x30);
		sendcharlcd(str1[1]%10+0x30);
		setpos(8,0);
		sendcharlcd(str1[2]/100+0x30);
		sendcharlcd(str1[2]%100/10+0x30);
		sendcharlcd(str1[2]%10+0x30);
		setpos(12,0);
		sendcharlcd(str1[3]/100+0x30);
		sendcharlcd(str1[3]%100/10+0x30);
		sendcharlcd(str1[3]%10+0x30);
		for (unsigned int n=0;n<4;n++)
		{
			for (unsigned char a=0; a< str1[n]; a++)
			{
				PORTB |= (1<<7);
				_delay_ms(1000);
				PORTB &= ~(1<<7);
				_delay_ms(1000);
				//sendcharlcd(str1[n]);
			}
			_delay_ms(3000);
		}	
    }
	//return 0;
}

 Чудо-чудесное

QQWM2UBdBDI.jpg

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

нет инициализации массива, или не работает функция sendcharlcd()

или в функциях инициализации дисплея происходит сброс массива.

что будет если так сделать
setpos(0,0);
str1[0]=123;
sendcharlcd(str1[0]/100+0x30);
sendcharlcd(str1[0]%100/10+0x30);
sendcharlcd(str1[0]%10+0x30);

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

Тогда как его инициализировать так, чтобы он был глобальной переменной? Для дополнительной проверки возможности вызова массива из глобальных переменных я сделал светодиодный тест и пришёл к выводу, что массив не вызывается. Светодиодный тест это подтвердил. sendcharlcd() вроде работает исправно.
       

19 минут назад, ДядяВован сказал:

Вот это зря. Его надо не учить, а понять. И это помогло бы программированию на Си.

Есть ли варик выбрать IDE, или настроить компиль и линкер так, чтобы не приходилось смотреть сгенерированный ассемблерный код и всё работало так, как задумано?

17 минут назад, IMXO сказал:

нет инициализации массива, или не работает функция sendcharlcd()

или в функциях инициализации дисплея происходит сброс массива.

да отображает это число только в нулевой ячейке.

Но зачем это делать, если я подобные тесты проделывал? Если пишу массив перед int main() в whle(1) не могу его вызвать. Если в whle(1) и вызываю там же-всё ном .

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

С обычными переменными таже беда

Нет, пробовал. Не в этом дело. Да и эти функции исправно работали на 328р. Даже с массивами в глобалке.

Дело в компиле или линке

Инфы на предмет готовых и рабочих настроек на этот компиль и этот чип в инете практически нет

На 328р всё работает. 

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

2 часа назад, Душитель Гуся сказал:

Это вид извращения?

Ассемблер нет, а всё остальное да, виды извращения. :)

С уважением, Владимир

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

16 часов назад, Душитель Гуся сказал:

Это вид извращения?

Для Вас это благо. Потом... когда-нибудь, когда "аппаратная часть в Вас зайдет" основательно, Вы перейдете на Си.:) Иначе по-извращаетесь тут еще не мало, вынося мозг местным гуру Си.

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

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

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

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

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

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

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

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

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

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

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

    • Что то в жизни должно стоять 
    • В кАлонки гениус на место тда2003 нормально встает.
    • 2,4кОм уже заказал, новая сложность))) неполярные электролиты, впервые с ними сталкиваюсь, стоят они как космолет, можно конечно сделать из полярных но получится громоздко
    • Конечно нет. Более того, вышеупомянутой 140уд1 достаточно для 90% всех БП, но новые детали позволяют применять разные схемотехнические решения ранее недоступные - например, отсутствие отрицательного источника питания или цепей балансировки ибо их смещение по входам может оказаться пренебрежимо мало, а крайне малый ток полевикового входа не требует сильного согласования импедансов для выравнивания смещений, создаваемых входными токами. Но в чем тогда интерес в разработке схемы, если это будет всё тот же болгарский БП из 70х, причем на тех же самых деталях и по абсолютно такой же схеме Понятно, что особо улучшать схемотехнику линейных БП некуда. Но со старыми деталями, требующими дополнительные пару вольт питания из-за узкого диапазона синфазных сигналов или имеющих почти микроамперы входного тока приходится схемотехнически возиться как с каким-то пажылым дедушкой - там ему костыль в виде отрицательного питания, тут надо импедансы равные по входам, не то смещение будет (у 140уд1, например, даже нет выводов балансировки, т.е. смещение надо вводить отдельной  цепью по входу), а здесь надо выход повторителем усилить, ибо не может раскачать базу силового транзистора... и т.д. Повозиться из интереса можно, но не знаю какое веселье в который раз изобретать один и тот же болгарский велосипед.   Это даже скорее не БП, а гибрид из БП и  вольтамперметра для всяческих издевательств над детальками. Как пример. И вот ещё. Причем эти "много оу" не просто какие-то там буферы-измерялки, а именно в петле ООС стоят, что прибавляет головной боли схемотехнику. Я пытался повторить их "переключалку петель оос", или просто "клампу", как я ее обзываю, в микрокапе хотяб на моделях ОУ типа 741, с использованием в интеграторе TL071, но ничего не вышло, схема стабильно даёт овершуты под 5-10%, что говорит о неоптимально скорректированной под БП АЧХ. Этот рубеж пока что мне не доступен никак, вот  и вожусь со схемой шелестова на четырёх ОУ.  
    • Думаю тут мини версию усилка сделать. А то валяется коробочка одна, от заброшенного одного проекта) Турецкий фильтр тут плату добиваю неспешно, с ней совместить что ли. TDA7377 норм будет ?  
×
×
  • Создать...