Во-первых, должна быть включена генерация отладочной информации при компиляции в студии (обычно так и есть, проверьте). Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). В-третьих, начиная с версии 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
// найдите отличия в способе вывода строк из разных "памятей":)
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе удивительно, но при взгляде на многих сверху ничего не меняется...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения