Перейти к содержанию

Помогите пожалуйста в написании исходного текста...


Гость химик

Рекомендуемые сообщения

Немного внесу просвет на ситуацию. Почитав статьи на сайте _easyelectronics.ru/category/avr-uchebnyj-kurs могу назвать причину ИМХО - переполнение стека либо оперативки, при работе с дисплеем.

В листинге выплывают ошибки, но так как я ассемблер пока не изучал то на этом и стал.

Так что здесь нужна помощь знающих асму.

 

И еще, файл с расширением .map как я понимаю показывает размер памяти?

 

 

Я узнавал на счет ошибок. Мне сказали что нужно чтоб ты объяснил код который стоит на ошибке. Говорит что вместо char поставить попробовать int и дальше большие числа???

post-7929-1307608851_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 72
  • Создана
  • Последний ответ
Я узнавал на счет ошибок. Мне сказали что нужно чтоб ты объяснил код который стоит на ошибке. Говорит что вместо char поставить попробовать int и дальше большие числа???

Код

такой:

-если indicate=1, то регулируется громкость;

- х=значение соответствующее в данный момент десяткам децибел минус число соответствующее коду максимального числа децибел, так мы получаем визуальный уровень громкости от 0 до 80, но со знаком минус;

-далее мы убираем этот минус, умножая на -1, чтобы получить +;

- тоже делаем с у, только у отвечает за единицы децибел;

- выводим результат на дисплей.

 

Ты пишеш что char нужно исправить на int - это не поможет, так как х и у это числа от 0 до 9 со знаком, им и char много.

 

Я все же думаю что проблема в надписях типа ,,volume,, ,,front left,, и т.д. , они перегружают ОЗУ. Попробую записать их во флеш как константы, думаю так будет правильно.

Ссылка на комментарий
Поделиться на другие сайты

Код

такой:

-если indicate=1, то регулируется громкость;

- х=значение соответствующее в данный момент десяткам децибел минус число соответствующее коду максимального числа децибел, так мы получаем визуальный уровень громкости от 0 до 80, но со знаком минус;

-далее мы убираем этот минус, умножая на -1, чтобы получить +;

- тоже делаем с у, только у отвечает за единицы децибел;

- выводим результат на дисплей.

 

Ты пишеш что char нужно исправить на int - это не поможет, так как х и у это числа от 0 до 9 со знаком, им и char много.

 

Я все же думаю что проблема в надписях типа ,,volume,, ,,front left,, и т.д. , они перегружают ОЗУ. Попробую записать их во флеш как константы, думаю так будет правильно.

 

Мне кажется что они не перегружают контроллер так как на "Фото" видно снизу загрузка CPU 29% (контроллера).

 

Хорошо, я отправлю знакомому это сообщение.

post-7929-1307633933_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Есть ли разница между записями

lcd_putsf('' Text '');

и

flash unsigned char LOGO1 [] = '' Text ''; 
lcd_putsf('' LOGO1 '');

Изменено пользователем химик
Ссылка на комментарий
Поделиться на другие сайты

Есть ли разница между записями

lcd_putsf('' Text '');

и

flash unsigned char LOGO1 [] = '' Text ''; 
lcd_putsf('' LOGO1 '');

 

Если я правильно понял запись, то разница есть.

Верхняя строчка это присвоение аргументу (то что в скобках) функции (или процедуры) lcd_putsf() строковое значение "text".

Во второй записи, в первой строке строке, по видимому, определяется безразмерный текстовый массив LOGO1 [] и в него сразу записывается слово "Text"

В квадратных скобках [] может быть указатель на конкретный элемент массива (символ в строке)

Ну к примеру

 

LOGO1[] = '' Text '' // Теперь в массив записано слово
a=LOGO1[0]; //В переменную "а" будет записан символ "T". Переменная "а" должна иметь формат "char".
aaa(LOGO1[2]); //В аргумент функции "aaа" записывается символ "х".
с=LOGO1.lenght; //В переменную "с" будет записана длинна массива - четыре.

 

Выходит, что строки кода несколько различаются. Хотя в вашем исходном коде, в принципе, всё равно слово "Text" попадает в аргумент lcd_putsf()

Но меня немного смущает, что в последней строке Вашего кода в lcd_putsf() будет записано текстовая строка '' LOGO1 '', а не содержание массива LOGO1[].

Думаю вернее всё же будет выполнить запись так:

 

flash unsigned char LOGO1 [] = '' Text ''; 
lcd_putsf(LOGO1[]);

 

или с конкретным указанием на букву массива

 

flash unsigned char LOGO1 [] = '' Text ''; 
lcd_putsf(LOGO1[3]);

 

рекомендую учитывать что первая буква массива имеет адрес LOGO1[0]

Изменено пользователем ryan
Ссылка на комментарий
Поделиться на другие сайты

Если я правильно понял запись, то разница есть.

Верхняя строчка это присвоение аргументу (то что в скобках) функции (или процедуры) lcd_putsf() строковое значение "text".

Во второй записи, в первой строке строке, по видимому, определяется безразмерный текстовый массив LOGO1 [] и в него сразу записывается слово "Text"

В квадратных скобках [] может быть указатель на конкретный элемент массива (символ в строке)

Ну к примеру

 

LOGO1[] = '' Text '' // Теперь в массив записано слово
a=LOGO1[0]; //В переменную "а" будет записан символ "T". Переменная "а" должна иметь формат "char".
aaa(LOGO1[2]); //В аргумент функции "aaа" записывается символ "х".
с=LOGO1.lenght; //В переменную "с" будет записана длинна массива - четыре.

 

Выходит, что строки кода несколько различаются. Хотя в вашем исходном коде, в принципе, всё равно слово "Text" попадает в аргумент lcd_putsf()

Но меня немного смущает, что в последней строке Вашего кода в lcd_putsf() будет записано текстовая строка '' LOGO1 '', а не содержание массива LOGO1[].

Думаю вернее всё же будет выполнить запись так:

 

flash unsigned char LOGO1 [] = '' Text ''; 
lcd_putsf(LOGO1[]);

 

или с конкретным указанием на букву массива

 

flash unsigned char LOGO1 [] = '' Text ''; 
lcd_putsf(LOGO1[3]);

 

рекомендую учитывать что первая буква массива имеет адрес LOGO1[0]

 

Значит и в первом и во втором случае строка находится во FLASH памяти?

 

Кчему я все это - я думал что в первом случае строка помещается в SRAM а не в FLASH.

 

Но кажется проблема зависания в другом - у меня четыре буфера для вывода информации на дисплей. И по моему они не умещаются в оперативку.

Ссылка на комментарий
Поделиться на другие сайты

Значит и в первом и во втором случае строка находится во FLASH памяти?

 

К чему я все это - я думал что в первом случае строка помещается в SRAM а не в FLASH.

 

Но кажется проблема зависания в другом - у меня четыре буфера для вывода информации на дисплей. И по моему они не умещаются в оперативку.

 

Всё верно. Именно так и есть. Безразмерный массив создаётся во флеш-памяти и пихается в него строка "Text". Именно это и значит строчка

flash unsigned char LOGO1 [] = '' Text '';

 

А потом из безразмерного массива вы запихиваете данные в lcd_putsf()

lcd_putsf(LOGO1[]);

 

Вопрос в том, как и где у вас была объявлена функция lcd_putsf(), которая, по видимому, отвечает за вывод текста на дисплей.

Простите, а четыре буфера... не много? Мне всегда одного за глаза хватало. Может тут собака зарыта? Хотите вместе разберём что к чему и в чём может быть проблема?

Изменено пользователем ryan
Ссылка на комментарий
Поделиться на другие сайты

Простите, а четыре буфера... не много? Мне всегда одного за глаза хватало. Может тут собака зарыта? Хотите вместе разберём что к чему и в чём может быть проблема?

Конечно если вам не тяжело.

 

Насчет четырех буферов, от одного уже избавился осталось три.

Ссылка на комментарий
Поделиться на другие сайты

Хотите вместе разберём что к чему и в чём может быть проблема?

Если у вас хорошо с асемблером, то подскажите пожалуйста что за куча вонингов в файле с расширением .lst( в архиве для удобства изменено расширение файла)? Что то не то с регистрами общего назначения?

HSlst.zip

Изменено пользователем химик
Ссылка на комментарий
Поделиться на другие сайты

Если у вас хорошо с асемблером, то подскажите пожалуйста что за куча вонингов в файле с расширением .lst( в архиве для удобства изменено расширение файла)? Что то не то с регистрами общего назначения?

 

Спасибо за доверие, Сергей, но вот тут я пас...

Могу предположить, что Вы уже объявили где-то регистры и пытаетесь их объявить еще раз со строчки 1026 до строчки 1034. Вот он и ругается. Думаю, что можно не обращать внимание... :smile:

С ассемблером у меня значительно хуже обстоят дела. Вряд ли я смогу быстро подняться до такого уровня чтения ассемблера. :smile:

Изменено пользователем ryan
Ссылка на комментарий
Поделиться на другие сайты

На скриншоте обведено красным, в нижней строке Hardvare Stack Size:802 byte :smile:

Не это ли моя проблема?

 

Размер стека странный, но точно ответить не могу. :smile:

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...