Обсуждаем контроллеры компании Atmel.
Ответить

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

Сб янв 18, 2020 19:02:57

привет, - почему elf со Студио пустой в Proteus. Хочется watch window лицезреть и что происходит с переменными.

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

Вс янв 19, 2020 14:17:47

Во-первых, должна быть включена генерация отладочной информации при компиляции в студии (обычно так и есть, проверьте).
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками).
В-третьих, начиная с версии avr-gcc 4.xx, протеуса не понимает многое из того, что компилятор натворил, и просмотр переменных, как и отладка вообще, становится чертовски загадочным процессом...

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

Вс янв 19, 2020 17:19:15

странно, почему файлы Flowcode - Proteus нормально обрабатывает
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). - ПОМОГЛО!

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

Вт янв 21, 2020 20:10:16

Привет !!!
Подскажите почему не симулируется ватчдог в Протеусе - подскажите какие настройки надо установить може FUSE?
#define F_CPU 8000000
#include <avr/io.h>

int main(void)
{
DDRB |= (1<<3); //на выход
PORTB &=~(1<<3); // ноль
DDRD &=0xF8; // на вход
PORTD |=0x07; // подтягивающие
while(1)
{
if (~PIND&(1<<0)) // отключение ватчдога
{
WDTCR |=(1<<4) | (1<<3);
WDTCR &=~(1<<3);
}
if (~PIND&(1<<1)) // подключение ватчдога
{
WDTCR |= (1<<4) | (1<<3) | (1<<2) | (1<<1) | (1<<0);
PORTB |= (1<<3);
}
if (~PIND&(1<<2)) // сброс ватчдога
{
asm ("wdr");
}
}
}

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

Ср янв 22, 2020 20:00:10

всё получилось
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRB |= (1<<1); //на выход
PORTB &=~(1<<1); // ноль
DDRD &=0xF8; // на вход
PORTD |=0x07; // подтягивающие
while(1)
{
if (~PIND&(1<<0)) // отключение ватчдога
{
//_delay_ms(300);
WDTCR |=(1<<4) | (1<<3);
WDTCR &=~(1<<3);
}
if (~PIND&(1<<1)) // подключение ватчдога
{
//_delay_ms(300);
WDTCR |= (1<<4) | (1<<3);
WDTCR |= (1<<3) | (1<<2) | (1<<1) | (1<<0);
PORTB |= (1<<1);
}
if (~PIND&(1<<2)) // сброс ватчдога
{
//_delay_ms(300);
asm ("wdr");
}
}

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

Пт янв 24, 2020 13:22:39

Столкнулся с одной непонятной проблемой. Нужно хранить массив строк в памяти программ и выводить его на дисплей. Для этого подключена библиотека pgmspace.h
Для хранения массива строк, вначале, использовал объявление двумерного массива в виде
Код:
const char txt[3][9] PROGMEM = {"Text1","Text12","Text123"};

Тут размер массива выбирается по самому длинному тексту + символ конца строки.
Функция вывода этого текста выглядит так
Код:
void lcd_putsf(const char *string) {
   while (pgm_read_byte(string))
   {
      lcd_write(pgm_read_byte(string++));
   }
}

а ее вызов, соответственно
Код:
lcd_putsf(txt[0]);

выведет самый первый элемент.
Но такое размещение массива строк в памяти не экономично, так как величина массива определяется по самому большой текстовой строке. Я перерыл кучу справочников и "обучалок". Есть другой способ с экономией памяти.
Вначале создаются сами строки
Код:
const char txt1[] PROGMEM = "Text1";
const char txt2[] PROGMEM = "Text12";
const char txt3[] PROGMEM = "Text123";

Затем создается сам массив
Код:
const char* const txt[] PROGMEM = {txt1,txt2,txt3};

И вот тут полная лажа. Код компилируется без ошибок и предупреждений, но на дисплей выводится мусор. Да! При этом явно экономится память программ, вопросов нет. Пытался смотреть в симуляторе, но не понял до конца. В первом случае я вижу в памяти программ весь массив, во втором только значение txt[0]. Но я с симулятором сильно не дружу, могу и наврать.

Подскажите, где во втором способе создания массива ошибка, или ошибка в функции вывода?
Я пробовал убрать определитель PROGMEM из строчки
Код:
const char* const txt[] PROGMEM = {txt1,txt2,txt3};

приведя ее к виду
Код:
const char* const txt[] = {txt1,txt2,txt3};

Тогда моя функция работает, но резко вырастает объем потребляемой памяти данных.

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

Пт янв 24, 2020 14:52:01

если у вас современная студия, не майтесь этой ерундой PROGMEM, используйте префикс __flash const и работайте с указателями на строки, как с обычными указателями на строки в ОЗУ, без всяких функций pgm_read_XXX :)

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

Пт янв 24, 2020 15:15:26

Студия версии 7.0.1188. Буду разбираться. Спасибо за совет!

PS. А не работает почему-то __flash const/
AVR GCC версия 4.9.2
Он явно не знает определение __flash.

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

Пт янв 24, 2020 16:37:58

должен знать!

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

Пт янв 24, 2020 16:55:28

должен знать!

... если только какую библиотеку надо подключать... Но пока не знает и букварик по avr-gcc пока мало что прояснил для меня
Код:
const __flash char txt1[] = "Text1";

Или не так пишу?
Если верно, то как к ней обращаться?
&txt?

Разобрался. Неверно был массив определен с данным идентификатором
Надо так?
Код:
const __flash char* txt[] ={txt1,txt2,txt3}

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

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

Пт янв 24, 2020 18:42:11

const __flash char * txt[] - это массив указателей во flash, а сами txt1, txt2 где? они ведь тоже во flash должны быть
Код:
const __flash char s1[] = "test1";
const __flash char s2[] = "test2";
const __flash char s3[] = "test3";

const __flash char* const __flash array[3] = {s1, s2, s3};
листинг
Код:
00000014 <array>:
  14:   26 00 20 00 1a 00                                   &. ...
0000001a <s3>:
  1a:   74 65 73 74 33 00                                   test3.
00000020 <s2>:
  20:   74 65 73 74 32 00                                   test2.
00000026 <s1>:
  26:   74 65 73 74 31 00                                   test1.

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

Пт янв 24, 2020 23:24:49

const __flash char * txt[] - это массив указателей во flash, а сами txt1, txt2 где? они ведь тоже во flash должны быть
Код:
const __flash char s1[] = "test1";
const __flash char s2[] = "test2";
const __flash char s3[] = "test3";

const __flash char* const __flash array[3] = {s1, s2, s3};

Ага! Опять тоже самое выходит, что с PROGMEM. Прям кругами хожу
Беру за аналогию Ваш пример. У меня было
Код:
const char s1[] PROGMEM = "test1";
const char s2[] PROGMEM = "test2";
const char s3[] PROGMEM = "test3";

const char* const array[3] PROGMEM = {s1, s2, s3};

То есть, по факту, убираем PROGMEM, но заменяем const на const __flash

Все компилируется, но, опять же, не работает.

ARV, детский вопрос, а как тогда адаптировать функцию, чтобы она работала с const __flash?
У меня было так
Код:
void lcd_putsf(const char *string) {
   while (pgm_read_byte(string))
   {
      lcd_write(pgm_read_byte(string++));
   }
}

Но данная функция выводит мусор, вместо значений в строковых переменных s1, s2, s3 , при вызове функции, к примеру
Код:
lcd_putsf(array[0]);

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

Сб янв 25, 2020 09:54:04

вопрос, а как тогда адаптировать функцию, чтобы она работала с const __flash?

по мануалу похоже никак:
https://www.microchip.com/webdoc/avrlib ... _data.html
еще инструкция как как разместить строки и константы на flash:
http://microsin.net/programming/avr/avr ... ogmem.html

В XC8 compiler (поддерживает и PIC и AVR), начиная с версии 2.05 достаточно просто const для размещения в program memory. Но надо установить Mplab-x.
https://microchipdeveloper.com/xc8:xc8- ... ly-objects

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

Сб янв 25, 2020 19:44:23

serg_svd писал(а):Опять тоже самое выходит, что с PROGMEM
то же да не то же. чтобы считать байт из flash теперь надо просто написать flash_array[i] вместо pgm_read_byte(&flash_array[i]) - разница есть? а если использовать указатель const __flash char *ptr, то можно работать с указателем, как с любым иным - указывать он будет на байты во flash и извлекать оттуда без иных усилий.
serg_svd писал(а):а как тогда адаптировать функцию, чтобы она работала с const __flash?
элементарно
Код:
void lcd_putsf(const __flash char *string) {
   while (*string)
   {
      lcd_write(*string++);
   }
}


Добавлено after 1 hour 20 minutes 43 seconds:
oleg110592, вы дали советы об AVR, отставшие от реальности лет на 5, пожалуй. сегодня они уже не актуальны.

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

Сб янв 25, 2020 22:24:43

отставшие от реальности лет на 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 лет.

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

Сб янв 25, 2020 22:48:44

Да без разницы, какая там версия и какая официальная документация! Факт неопровержим: компилятор давно поддерживает то, о чем мало кто знает, и в "официальной документации" об этом нет ни слова. По-моему, со времён WinAvr эту документацию никто не правил.

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

Сб янв 25, 2020 23:33:04

дык выше написал же - именно
по мануалу похоже никак

и обсуждали уже - const __flash нормально (без багрепортов) заработала начиная с avr gcc 6
https://radiokot.ru/forum/viewtopic.php ... 5#p3089505
p/s/ в xc8 похоже const нормально работает:
Изображение

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

Вс янв 26, 2020 09:53:26

Код:
void lcd_putsf(const __flash char *string) {
   while (*string)
   {
      lcd_write(*string++);
   }
}

Спасибо! У меня компилятор ругался до этого на конфликт типов переменных. Я понять не мог. Ну, естесственно, сам дурак :). Забыл про хидер, где эта функция объявляется. :facepalm:
Но вылезла другая проблема. Получил кучу предупреждений, опять же, о несоответствии типов. Дело в том, что в коде я использовал как макрос PSTR();, который несложно обойти и заменить на строковую переменную. Но как быть с библиотечными функциями типа strlen_P(const char *s);? Чем их заменить то?

oleg110592 писал(а):В XC8 compiler (поддерживает и PIC и AVR), начиная с версии 2.05 достаточно просто const для размещения в program memory. Но надо установить Mplab-x.

У меня установлен. Я уже несколько прошивок написал под МК PIC. Несложных конечно, в целях обучения и развития мышления. После Студии адаптироваться сложно. Все другое, обращение к регистрам по-другому... Насчет const да, в Mplab-x сразу помещает в память программ. Но писать код для атмела в Mplab-x я не пробовал даже.

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

Вс янв 26, 2020 11:00:11

oleg110592 писал(а):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";

void lcd_puts(const char __memx *s){
  while(*s) lcd_putch(*s++);
}

// следите за руками:

lcd_puts(str1); // выводим строку из flash
lcd_puts(str2); // выводим строку из ram

// найдите отличия в способе вывода строк из разных "памятей":)

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

Вс янв 26, 2020 11:16:10

пользуюсь начиная с avr-gcc 4.9.2 багрепорты не читал, проблем не замечал

а суслик есть :))) , даже в 2017г.:
https://www.avrfreaks.net/forum/use-mem ... code-issue
Ответить