AVR studio в вопросах и ответах
- Сообщения: 490
- Зарегистрирован: Вс май 01, 2016 17:51:38
привет, - почему elf со Студио пустой в Proteus. Хочется watch window лицезреть и что происходит с переменными.
- Реклама
Во-первых, должна быть включена генерация отладочной информации при компиляции в студии (обычно так и есть, проверьте).
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками).
В-третьих, начиная с версии avr-gcc 4.xx, протеуса не понимает многое из того, что компилятор натворил, и просмотр переменных, как и отладка вообще, становится чертовски загадочным процессом...
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками).
В-третьих, начиная с версии avr-gcc 4.xx, протеуса не понимает многое из того, что компилятор натворил, и просмотр переменных, как и отладка вообще, становится чертовски загадочным процессом...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 490
- Зарегистрирован: Вс май 01, 2016 17:51:38
странно, почему файлы Flowcode - Proteus нормально обрабатывает
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). - ПОМОГЛО!
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). - ПОМОГЛО!
- Сообщения: 490
- Зарегистрирован: Вс май 01, 2016 17:51:38
Привет !!!
Подскажите почему не симулируется ватчдог в Протеусе - подскажите какие настройки надо установить може 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");
}
}
}
Подскажите почему не симулируется ватчдог в Протеусе - подскажите какие настройки надо установить може 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");
}
}
}
- Сообщения: 490
- Зарегистрирован: Вс май 01, 2016 17:51:38
всё получилось
#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");
}
}
#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");
}
}
- Реклама
Столкнулся с одной непонятной проблемой. Нужно хранить массив строк в памяти программ и выводить его на дисплей. Для этого подключена библиотека pgmspace.h
Для хранения массива строк, вначале, использовал объявление двумерного массива в виде
Тут размер массива выбирается по самому длинному тексту + символ конца строки.
Функция вывода этого текста выглядит так
а ее вызов, соответственно
выведет самый первый элемент.
Но такое размещение массива строк в памяти не экономично, так как величина массива определяется по самому большой текстовой строке. Я перерыл кучу справочников и "обучалок". Есть другой способ с экономией памяти.
Вначале создаются сами строки
Затем создается сам массив
И вот тут полная лажа. Код компилируется без ошибок и предупреждений, но на дисплей выводится мусор. Да! При этом явно экономится память программ, вопросов нет. Пытался смотреть в симуляторе, но не понял до конца. В первом случае я вижу в памяти программ весь массив, во втором только значение txt[0]. Но я с симулятором сильно не дружу, могу и наврать.
Подскажите, где во втором способе создания массива ошибка, или ошибка в функции вывода?
Я пробовал убрать определитель PROGMEM из строчки
приведя ее к виду
Тогда моя функция работает, но резко вырастает объем потребляемой памяти данных.
Для хранения массива строк, вначале, использовал объявление двумерного массива в виде
Код: Выделить всё
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};
Подскажите, где во втором способе создания массива ошибка, или ошибка в функции вывода?
Я пробовал убрать определитель PROGMEM из строчки
Код: Выделить всё
const char* const txt[] PROGMEM = {txt1,txt2,txt3};Код: Выделить всё
const char* const txt[] = {txt1,txt2,txt3};"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
если у вас современная студия, не майтесь этой ерундой PROGMEM, используйте префикс __flash const и работайте с указателями на строки, как с обычными указателями на строки в ОЗУ, без всяких функций pgm_read_XXX 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Студия версии 7.0.1188. Буду разбираться. Спасибо за совет!
PS. А не работает почему-то __flash const/
AVR GCC версия 4.9.2
Он явно не знает определение __flash.
PS. А не работает почему-то __flash const/
AVR GCC версия 4.9.2
Он явно не знает определение __flash.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
должен знать!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ARV",url="/forum/viewtopic.php?p=3779352#p3779352"]должен знать![/uquote]
... если только какую библиотеку надо подключать... Но пока не знает и букварик по avr-gcc пока мало что прояснил для меня
Или не так пишу?
Если верно, то как к ней обращаться?
&txt?
Разобрался. Неверно был массив определен с данным идентификатором
Надо так?
Во всяком случае сейчас так работает, но опять начало отжирать память данных. А это признак того, что массив строк всеже пишется не туда
... если только какую библиотеку надо подключать... Но пока не знает и букварик по avr-gcc пока мало что прояснил для меня
Код: Выделить всё
const __flash char txt1[] = "Text1";Если верно, то как к ней обращаться?
&txt?
Разобрался. Неверно был массив определен с данным идентификатором
Надо так?
Код: Выделить всё
const __flash char* txt[] ={txt1,txt2,txt3}"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
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.если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ARV",url="/forum/viewtopic.php?p=3779414#p3779414"]const __flash char * txt[] - это массив указателей во flash, а сами txt1, txt2 где? они ведь тоже во flash должны быть[/uquote]
Ага! Опять тоже самое выходит, что с PROGMEM. Прям кругами хожу
Беру за аналогию Ваш пример. У меня было
То есть, по факту, убираем PROGMEM, но заменяем const на const __flash
Все компилируется, но, опять же, не работает.
ARV, детский вопрос, а как тогда адаптировать функцию, чтобы она работала с const __flash?
У меня было так
Но данная функция выводит мусор, вместо значений в строковых переменных s1, s2, s3 , при вызове функции, к примеру
Код: Выделить всё
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};Все компилируется, но, опять же, не работает.
ARV, детский вопрос, а как тогда адаптировать функцию, чтобы она работала с const __flash?
У меня было так
Код: Выделить всё
void lcd_putsf(const char *string) {
while (pgm_read_byte(string))
{
lcd_write(pgm_read_byte(string++));
}
}Код: Выделить всё
lcd_putsf(array[0]);"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="serg_svd",url="/forum/viewtopic.php?p=3779538#p3779538"]вопрос, а как тогда адаптировать функцию, чтобы она работала с const __flash?[/uquote]
по мануалу похоже никак:
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
по мануалу похоже никак:
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
то же да не то же. чтобы считать байт из flash теперь надо просто написать flash_array вместо pgm_read_byte(&flash_array) - разница есть? а если использовать указатель const __flash char *ptr, то можно работать с указателем, как с любым иным - указывать он будет на байты во flash и извлекать оттуда без иных усилий.serg_svd писал(а):Опять тоже самое выходит, что с PROGMEM
элементарноserg_svd писал(а):а как тогда адаптировать функцию, чтобы она работала с const __flash?
Код: Выделить всё
void lcd_putsf(const __flash char *string) {
while (*string)
{
lcd_write(*string++);
}
}oleg110592, вы дали советы об AVR, отставшие от реальности лет на 5, пожалуй. сегодня они уже не актуальны.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="ARV",url="/forum/viewtopic.php?p=3779895#p3779895"]отставшие от реальности лет на 5, пожалуй. сегодня они уже не актуальны.[/uquote]
речь была о
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 лет.
речь была о
см вышеСтудия версии 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 эту документацию никто не правил.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
дык выше написал же - именно
https://radiokot.ru/forum/viewtopic.php ... 5#p3089505
p/s/ в xc8 похоже const нормально работает:

и обсуждали уже - const __flash нормально (без багрепортов) заработала начиная с avr gcc 6по мануалу похоже никак
https://radiokot.ru/forum/viewtopic.php ... 5#p3089505
p/s/ в xc8 похоже const нормально работает:
[uquote="ARV",url="/forum/viewtopic.php?p=3779895#p3779895"][/uquote]
Спасибо! У меня компилятор ругался до этого на конфликт типов переменных. Я понять не мог. Ну, естесственно, сам дурак
. Забыл про хидер, где эта функция объявляется.
Но вылезла другая проблема. Получил кучу предупреждений, опять же, о несоответствии типов. Дело в том, что в коде я использовал как макрос PSTR();, который несложно обойти и заменить на строковую переменную. Но как быть с библиотечными функциями типа strlen_P(const char *s);? Чем их заменить то?
Код: Выделить всё
void lcd_putsf(const __flash char *string) {
while (*string)
{
lcd_write(*string++);
}
}Спасибо! У меня компилятор ругался до этого на конфликт типов переменных. Я понять не мог. Ну, естесственно, сам дурак
Но вылезла другая проблема. Получил кучу предупреждений, опять же, о несоответствии типов. Дело в том, что в коде я использовал как макрос PSTR();, который несложно обойти и заменить на строковую переменную. Но как быть с библиотечными функциями типа strlen_P(const char *s);? Чем их заменить то?
У меня установлен. Я уже несколько прошивок написал под МК PIC. Несложных конечно, в целях обучения и развития мышления. После Студии адаптироваться сложно. Все другое, обращение к регистрам по-другому... Насчет const да, в Mplab-x сразу помещает в память программ. Но писать код для атмела в Mplab-x я не пробовал даже.oleg110592 писал(а):В XC8 compiler (поддерживает и PIC и AVR), начиная с версии 2.05 достаточно просто const для размещения в program memory. Но надо установить Mplab-x.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
я пользуюсь начиная с avr-gcc 4.9.2 багрепорты не читал, проблем не замечалoleg110592 писал(а):const __flash нормально (без багрепортов) заработала начиная с avr gcc 6
да ничем их заменять не надо!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));а еще есть __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
// найдите отличия в способе вывода строк из разных "памятей":)если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="ARV",url="/forum/viewtopic.php?p=3780210#p3780210"]пользуюсь начиная с avr-gcc 4.9.2 багрепорты не читал, проблем не замечал[/uquote]
а суслик есть
, даже в 2017г.:
https://www.avrfreaks.net/forum/use-mem ... code-issue
а суслик есть
https://www.avrfreaks.net/forum/use-mem ... code-issue


