AVR studio в вопросах и ответах
Re: AVR studio в вопросах и ответах
привет, - почему elf со Студио пустой в Proteus. Хочется watch window лицезреть и что происходит с переменными.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
Во-первых, должна быть включена генерация отладочной информации при компиляции в студии (обычно так и есть, проверьте).
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками).
В-третьих, начиная с версии avr-gcc 4.xx, протеуса не понимает многое из того, что компилятор натворил, и просмотр переменных, как и отладка вообще, становится чертовски загадочным процессом...
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками).
В-третьих, начиная с версии avr-gcc 4.xx, протеуса не понимает многое из того, что компилятор натворил, и просмотр переменных, как и отладка вообще, становится чертовски загадочным процессом...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: AVR studio в вопросах и ответах
странно, почему файлы Flowcode - Proteus нормально обрабатывает
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). - ПОМОГЛО!
Во-вторых, исходники должны быть в той же папке, что и проект протеуса (ну или проект протеуса сохраняйте в папку с исхрдниками). - ПОМОГЛО!
Re: AVR studio в вопросах и ответах
Привет !!!
Подскажите почему не симулируется ватчдог в Протеусе - подскажите какие настройки надо установить може 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");
}
}
}
Re: AVR studio в вопросах и ответах
всё получилось
#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");
}
}
- Реклама
Re: AVR studio в вопросах и ответах
Столкнулся с одной непонятной проблемой. Нужно хранить массив строк в памяти программ и выводить его на дисплей. Для этого подключена библиотека 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};"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
если у вас современная студия, не майтесь этой ерундой PROGMEM, используйте префикс __flash const и работайте с указателями на строки, как с обычными указателями на строки в ОЗУ, без всяких функций pgm_read_XXX 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: AVR studio в вопросах и ответах
Студия версии 7.0.1188. Буду разбираться. Спасибо за совет!
PS. А не работает почему-то __flash const/
AVR GCC версия 4.9.2
Он явно не знает определение __flash.
PS. А не работает почему-то __flash const/
AVR GCC версия 4.9.2
Он явно не знает определение __flash.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
должен знать!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: AVR studio в вопросах и ответах
[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}"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
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 в вопросах и ответах
[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]);"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: AVR studio в вопросах и ответах
[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
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
то же да не то же. чтобы считать байт из 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, пожалуй. сегодня они уже не актуальны.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: AVR studio в вопросах и ответах
[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 лет.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
Да без разницы, какая там версия и какая официальная документация! Факт неопровержим: компилятор давно поддерживает то, о чем мало кто знает, и в "официальной документации" об этом нет ни слова. По-моему, со времён WinAvr эту документацию никто не правил.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: AVR studio в вопросах и ответах
дык выше написал же - именно
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 нормально работает:
Re: AVR studio в вопросах и ответах
[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.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18636
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
я пользуюсь начиная с 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
// найдите отличия в способе вывода строк из разных "памятей":)если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: AVR studio в вопросах и ответах
[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


