AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18861
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

oleg110592 писал(а):и указать путь к toolchain
не всегда помогает. я столкнулся с тем, что в последних версиях avr-gcc то ли папки как-то поменяли, то ли их содержимое стало другим, но просто указание СТАРОЙ студии пути к НОВОМУ тулчейну может привести к тому, что некоторые утилиты (типа avr-size или make) не смогут вызываться. не утверждаю, что так происходит всегда, но у меня так было...

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

да avr-size AVR Studio не включает в свой makefile, при использовании внешнего toolchain. Но компилируется нормально. В новых GCC исключили опцию -C для avr-size. Используют avr-objdump.exe - опций много, он поинтереснее выдает информацию (GCC AVR 8.1):
Изображение
или так:
avr-objdump -s -j .note.gnu.avr.deviceinfo avr.elf
Contents of section .note.gnu.avr.deviceinfo:

Код: Выделить всё

 0000 04000000 2b000000 01000000 41565200  ....+.......AVR.
 0010 00000000 00400000 60000000 00040000  .....@..`.......
 0020 00000000 00020000 08000000 01000000  ................
 0030 0061746d 65676131 36000000           .atmega16...
http://ccrma.stanford.edu/planetccrma/m ... ump.1.html
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

ARV писал(а):как avr-gcc распределяет память при инициализации строковых "переменных"
Ну посмотрел. Это же опять про массив указателей на кучку отдельных строк, и то, и другое в PROGMEM. Я же предложил банальный массив строк. И то, и другое средство позволяют получить доступ к строке по ее номеру - собственно, ради этого все и затевалось. Только массив указателей на отдельные строки позволяет делать сами строки различной произвольной длины, а массив строк должен набираться из строк одинаковой длины, поскольку адресация в него ведется банальным умножением первого индекса (номера строки) на длину одной строки (это я подглядел в дизасме). Да, время выполнения этого действия больше, чем достать указатель из таблицы, но кого это волнует? А про то, что менять строки на экране проще, поскольку новая строка точно перекрывает старую, я уже написал.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Доброго времени суток. Как в Atmel Studio 7 задать частоту контроллера в опциях проекта, чтобы не задавать ее вручную в хидерах. В AVR Studio 4 это было легко и интуитивно, тут же просто черт ногу сломит :dont_know:
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 2
Зарегистрирован: Ср янв 10, 2018 13:21:20

Сообщение limbura »

[uquote="vksam",url="/forum/viewtopic.php?p=2827302#p2827302"]Всем привет!
Тут в смежной ветке уже как-то обсуждался вопрос касательно Atmel Studio и Proteus... но все меняется.
Так вот Atmel Studio 7 и Proteus 8. Код под Atmega 8.
В качестве файла-прошивки в Proteus выбран elf-файл.
Проблема в следующем.... при дебаге кода в Proteus все строки кода маркированы набором ----- и пройти по коду не получается.
Оптимизация кода в студии отключена.
В чем проблема?[/uquote]

Уважаемые товарищи!

Тема наверху очень актуальна, а решения тут так и не было. У меня Atmel Studio 7, скачанная пару дней назад в официального сайта.

И попавшийся первым под руку протеус - версия 7.10 SP0

При попытке скормить протеусу elf - вижу почти во всем коде прочерки вместо адресов, ничего трассировать по этой ерунде невозможно.

Оптимизацию в студии выключил, debud level установил в -g3 (максимум), отдельно прописал формат командой -gdwarf-2.

Не помогает! Есть ли пути решения кроме как использовать старую версию студии?

Может быть можно как-то заставить ее сгенерировать coff? Вроде протеус его больше любит. А то я с elf уже намучался чтобы он вообще хоть какой-то код показал в окне исходника - нужно было закинуть все файлы в одну папку.
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

А прочитать предыдущую страничку не ку? Вот вполне авторитетное заявление на эту тему, в конце сообщения.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Родился
Сообщения: 2
Зарегистрирован: Ср янв 10, 2018 13:21:20

Сообщение limbura »

[uquote="afz",url="/forum/viewtopic.php?p=3422293#p3422293"]Вот вполне авторитетное заявление на эту тему, в конце сообщения.[/uquote]
Сами понимаете, все страницы не прочитаешь, а поиском всего не найдешь :) Вчера часов 6 гуглил, читал форумы и проверял разные варианты.

Значит дело таки в новых версиях компилятора... Ну, я подозревал что так и есть. Как странно, почему разработчики компилятора и разработчики Proteusa до сих пор никак не решили эту проблему? Хотя бы с одной стороны. Ведь самый новый Proteus все равно некорректно работает.

Вчера много и безрезультатно игрался с компилятором и линкером, запуская его вручную. Сегодня может быть разберусь как редактировать makefile и что в нем где указано и смогу, например, заставить новый компилятор выдать COFF файл вместо ELF, в компиляторе это предусмотрено и описано в документации, но я пока не разобрался.

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

Хочется найти какое-то решение получше, чем устанавливать две версии AVR (Atmel) Studio...
gis
Родился
Сообщения: 16
Зарегистрирован: Пт ноя 07, 2014 20:34:56

Сообщение gis »

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

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
char n;
ISR (INT0_vect)
{
n=1;	
PORTB|=0x01;//поднимаем первую ножку, чтобы убедиться, что прерывание произошло
}
int main(void)
{
DDRB=0xFF;
PORTB=0x00;		
DDRD=0x00;
PORTD=0xFF;
EICRA |= (1<<ISC01)|(0<<ISC00);// прерывание по заднему фронту
EIMSK |= (1<<INT0);
asm ("sei");			
 while(1)
{
if (n)
{
PORTB|=0x02;//вторая из основного цикла 
n=0;		
}
}
}
В итоге прерывание происходит, а код внутри условия if не выполняется. Пробывал разные вариации, ничего не получатся.
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

volatile char n;
Никакая контра не уйдёт от нас
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Опять оффтопик развели...

Ладно, у меня вопрос по теме. Подновил тулчейн к Студии 4.19, у меня стоял 3.3.0.710, поставил 3.3.1.1020 (последний из 3.3, который отдается из атмеловского архива Микрочипа). Появилось несколько новых камней, в частности, Меги 8a, 168pa, еще какие-то. Только вот .h-файлы для них с ошибками. Я обнаружил разночтения имён векторов. Например, у Меги 168PA вектор прописан USART__RX_vect (два подчеркивания между USART и RX вместо одного, как, допустим, у Меги 168P). Заглянул в Студию 6.2, так там USART_RX_vect (одно подчеркивание), из чего я сделал вывод, что в 3.3.1.1020 ошибка, а не нововведение. То же двойное подчеркивание присутствует в остальных USART'овских векторах, а также в векторе SPI. Ничего такого в студии 6.2 нет, подчеркивания везде одиночные.

Вот теперь пребываю в раздумьях. Что делать? Откатиться на 3.3.0.710 ? Вручную исправить найденные косяки? Залить в каталог AVR соответствующие .h из 6.2 или из отдаваемого из архива отдельного сборника хидеров 6.2.0.334 (тулчейн 3.4.4) ?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18861
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Нет, к такому решительному шагу я еще не готов. То есть, конечно, когда будет время, я попробую подключить его, как предложил наш коллега oleg110592 на предыдущей странице, а пока я оставил 3.3.1, только заменил в нем содержимое каталога "AVR Toolchain\avr\include\avr\" укачанным из атмеловского архива Toolchain Archive Header Files [AVR8-bitToolchain(3.4.4)6.2.0.334]. Там в том зипе, кстати, не все файлы - кое что пришлось оставить из родного для 3.3.1. Вроде-бы все работает, мои старые проекты исправно компилируются и работают, ну и Мега8А стала доступна - иных неудобств от 3.3.0 я пока не испытывал...

Не знаете, нет ли в таком решении каких-либо скрытых граблей?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск

Сообщение a.garkin »

День Добрый! Подскажите что делаю не так. Суть в том чтобы после нажатия кнопки порт был активен хотя бы минуту. С таймером худо бедно разобрался с чужой помощью код набросали. Работает, ровно 6 секунд, дальше порт отключается.

Код: Выделить всё

volatile int16_t seconds;
// Set prescale to 256 and start the timer
TCCR1B |= (1 << WGM12) | (1 << CS12);
// set compare for 1 second interrupts
OCR1A = 0x7A11;
// setup for compare interrupts
TIMSK1 |= (1<<OCIE1A);
//TIMSK1 |= (1<<ICIE1);
// start the interrupts
sei();

while (1)
    {
	    switch(get_key())
	    {
		    // Processing reaction of the button 1
		    case KEY1:
		    ALARM_OUT_EN;
		    seconds = 60;
		    break;
	    }

	    // Processing timer expired
	    if (seconds == 0)
	    {
		    seconds = -1;
		    ALARM_OUT_STOP;
	    }

    }
}


ISR(TIMER1_OVF_vect)
{
	if (seconds > 0)
	seconds--;
}
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

По приведенному куску программы сложно дать детальный совет. Какой МК ? Мега 48/.../328, да? Какая частота?

Первым делом следует проверить, действительно ли прерывания идут с частотой 1 сек? Прямо в программе прерывания инвертируем текущее состояние бита порта и смотрим на светодиод туда подключенный. Далее, считаем количество включений светодиода за минуту, должно быть 30.

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

WDT, часом, не запущен?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

Подскажите пожалуйста,в режиме пошаговой отладки,на команде asm(sleep); выполнение программы останавливается, как и должно. А вот как теперь продолжить отладку?
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Поставить брекпоинт на следующую за SLEEP команду, если ждется тайймерное прерывание, то просто сделать Run и подождать, может быть долго. Иначе взвести нужные биты в регистрах периферии, чтобы имитировать прерывание и сделать несколько шагов (step).
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

У меня пробуждение по внешнему прерыванию, попробую в регисте битик поменять,спасибо!
Контактная информация:
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

Подскажите еще один момент, если я объявляю переменную не как обычно unsigned char x; ,а просто напишу x; какого типа станет данная переменная?
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Никакого. Будет ошибка.
Никакая контра не уйдёт от нас
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

prinv писал(а):Никакого. Будет ошибка.
Это не так. Будет не ошибка, а предупреждение. Тип по умолчанию будет int. Компилятор GCC.
СпойлерИзображение
Screen.png
(22.5 КБ) 248 скачиваний
Ответить

Вернуться в «AVR»