Во-первых, должна быть включена генерация отладочной информации при компиляции в студии (обычно так и есть, проверьте). Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). В-третьих, начиная с версии avr-gcc 4.xx, протеуса не понимает многое из того, что компилятор натворил, и просмотр переменных, как и отладка вообще, становится чертовски загадочным процессом...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
странно, почему файлы Flowcode - Proteus нормально обрабатывает Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). - ПОМОГЛО!
Привет !!! Подскажите почему не симулируется ватчдог в Протеусе - подскажите какие настройки надо установить може FUSE? #define F_CPU 8000000 #include <avr/io.h>
Компания «Компэл» и Analog Devices приглашают всех желающих 27/04/2021 принять участие в вебинаре, посвященном решениям Analog Devices для гальванической изоляции. В программе вебинара: технологии гальванической изоляции iCoupler, цифровые изоляторы, технология isoPower, гальванически изолированные интерфейсы (RS-485, CAN, USB, I2C, LVDS) и другое. Вебинар будет интересен разработчикам промышленной автоматики и медицинской техники.
Широкий ассортимент винтовых клеммников Degson включает в себя различные вариации с шагом выводов от 2,54 до 15 мм, с числом ярусов от одного до трёх и углами подключения проводника 45°, 90°, 180°. К тому же Degson предлагает довольно большой выбор клеммных винтовых колодок кастомизированных цветов.
Столкнулся с одной непонятной проблемой. Нужно хранить массив строк в памяти программ и выводить его на дисплей. Для этого подключена библиотека pgmspace.h Для хранения массива строк, вначале, использовал объявление двумерного массива в виде
выведет самый первый элемент. Но такое размещение массива строк в памяти не экономично, так как величина массива определяется по самому большой текстовой строке. Я перерыл кучу справочников и "обучалок". Есть другой способ с экономией памяти. Вначале создаются сами строки
И вот тут полная лажа. Код компилируется без ошибок и предупреждений, но на дисплей выводится мусор. Да! При этом явно экономится память программ, вопросов нет. Пытался смотреть в симуляторе, но не понял до конца. В первом случае я вижу в памяти программ весь массив, во втором только значение txt[0]. Но я с симулятором сильно не дружу, могу и наврать.
Подскажите, где во втором способе создания массива ошибка, или ошибка в функции вывода? Я пробовал убрать определитель PROGMEM из строчки
Тогда моя функция работает, но резко вырастает объем потребляемой памяти данных.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
если у вас современная студия, не майтесь этой ерундой PROGMEM, используйте префикс __flash const и работайте с указателями на строки, как с обычными указателями на строки в ОЗУ, без всяких функций pgm_read_XXX
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Студия версии 7.0.1188. Буду разбираться. Спасибо за совет!
PS. А не работает почему-то __flash const/ AVR GCC версия 4.9.2 Он явно не знает определение __flash.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
... если только какую библиотеку надо подключать... Но пока не знает и букварик по avr-gcc пока мало что прояснил для меня
Код:
const __flash char txt1[] = "Text1";
Или не так пишу? Если верно, то как к ней обращаться? &txt? Разобрался. Неверно был массив определен с данным идентификатором Надо так?
Код:
const __flash char* txt[] ={txt1,txt2,txt3}
Во всяком случае сейчас так работает, но опять начало отжирать память данных. А это признак того, что массив строк всеже пишется не туда
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Но данная функция выводит мусор, вместо значений в строковых переменных s1, s2, s3 , при вызове функции, к примеру
Код:
lcd_putsf(array[0]);
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
то же да не то же. чтобы считать байт из flash теперь надо просто написать flash_array[i] вместо pgm_read_byte(&flash_array[i]) - разница есть? а если использовать указатель const __flash char *ptr, то можно работать с указателем, как с любым иным - указывать он будет на байты во flash и извлекать оттуда без иных усилий.
serg_svd писал(а):
а как тогда адаптировать функцию, чтобы она работала с const __flash?
Добавлено after 1 hour 20 minutes 43 seconds: oleg110592, вы дали советы об AVR, отставшие от реальности лет на 5, пожалуй. сегодня они уже не актуальны.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
отставшие от реальности лет на 5, пожалуй. сегодня они уже не актуальны.
речь была о
Цитата:
Студия версии 7.0.1188
см выше Note: These toolchains are included when downloading Atmel Studio 7: https://www.microchip.com/mplab/avr-sup ... -compilers документация актуальная на данный момент к этому toolchain (AVR 8-bit Toolchain v3.62 9/28/2018) предоставлена самим производителем. И этому toolchain реально 2.2 года. XC8 компилятор тоже самая свежая, рекомендуемая производителем, актуальная версия 2.10 8/14/2019 - тоже никак не 5 лет.
Да без разницы, какая там версия и какая официальная документация! Факт неопровержим: компилятор давно поддерживает то, о чем мало кто знает, и в "официальной документации" об этом нет ни слова. По-моему, со времён WinAvr эту документацию никто не правил.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Спасибо! У меня компилятор ругался до этого на конфликт типов переменных. Я понять не мог. Ну, естесственно, сам дурак . Забыл про хидер, где эта функция объявляется. Но вылезла другая проблема. Получил кучу предупреждений, опять же, о несоответствии типов. Дело в том, что в коде я использовал как макрос PSTR();, который несложно обойти и заменить на строковую переменную. Но как быть с библиотечными функциями типа strlen_P(const char *s);? Чем их заменить то?
oleg110592 писал(а):
В XC8 compiler (поддерживает и PIC и AVR), начиная с версии 2.05 достаточно просто const для размещения в program memory. Но надо установить Mplab-x.
У меня установлен. Я уже несколько прошивок написал под МК PIC. Несложных конечно, в целях обучения и развития мышления. После Студии адаптироваться сложно. Все другое, обращение к регистрам по-другому... Насчет const да, в Mplab-x сразу помещает в память программ. Но писать код для атмела в Mplab-x я не пробовал даже.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
const __flash нормально (без багрепортов) заработала начиная с avr gcc 6
я пользуюсь начиная с avr-gcc 4.9.2 багрепорты не читал, проблем не замечал
serg_svd писал(а):
Чем их заменить то?
да ничем их заменять не надо! const char *s и const __flash char * оба указывают на байт во flash. не помню точно, но кажется даже варнинга не будет...
Код:
cont __flash char str[] = 'Hello';
printf_P(PSTR("Length of \"%S\" = %d"), str, strlen_P(str));
Добавлено after 15 minutes 30 seconds: а еще есть __memx
Код:
const __flash char str1[] = "String from FLASH"; const char str2[] = "String from RAM";
lcd_puts(str1); // выводим строку из flash lcd_puts(str2); // выводим строку из ram
// найдите отличия в способе вывода строк из разных "памятей":)
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: Ivanoff-iv и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения