Гость supercontick Опубликовано 9 Июня, 2011 в 08:40 Жалоба Поделиться Опубликовано 9 Июня, 2011 в 08:40 Немного внесу просвет на ситуацию. Почитав статьи на сайте _easyelectronics.ru/category/avr-uchebnyj-kurs могу назвать причину ИМХО - переполнение стека либо оперативки, при работе с дисплеем.В листинге выплывают ошибки, но так как я ассемблер пока не изучал то на этом и стал. Так что здесь нужна помощь знающих асму. И еще, файл с расширением .map как я понимаю показывает размер памяти? Я узнавал на счет ошибок. Мне сказали что нужно чтоб ты объяснил код который стоит на ошибке. Говорит что вместо char поставить попробовать int и дальше большие числа??? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 9 Июня, 2011 в 14:54 Жалоба Поделиться Опубликовано 9 Июня, 2011 в 14:54 Я узнавал на счет ошибок. Мне сказали что нужно чтоб ты объяснил код который стоит на ошибке. Говорит что вместо char поставить попробовать int и дальше большие числа??? Код такой: -если indicate=1, то регулируется громкость; - х=значение соответствующее в данный момент десяткам децибел минус число соответствующее коду максимального числа децибел, так мы получаем визуальный уровень громкости от 0 до 80, но со знаком минус; -далее мы убираем этот минус, умножая на -1, чтобы получить +; - тоже делаем с у, только у отвечает за единицы децибел; - выводим результат на дисплей. Ты пишеш что char нужно исправить на int - это не поможет, так как х и у это числа от 0 до 9 со знаком, им и char много. Я все же думаю что проблема в надписях типа ,,volume,, ,,front left,, и т.д. , они перегружают ОЗУ. Попробую записать их во флеш как константы, думаю так будет правильно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость supercontick Опубликовано 9 Июня, 2011 в 15:38 Жалоба Поделиться Опубликовано 9 Июня, 2011 в 15:38 Кодтакой: -если indicate=1, то регулируется громкость; - х=значение соответствующее в данный момент десяткам децибел минус число соответствующее коду максимального числа децибел, так мы получаем визуальный уровень громкости от 0 до 80, но со знаком минус; -далее мы убираем этот минус, умножая на -1, чтобы получить +; - тоже делаем с у, только у отвечает за единицы децибел; - выводим результат на дисплей. Ты пишеш что char нужно исправить на int - это не поможет, так как х и у это числа от 0 до 9 со знаком, им и char много. Я все же думаю что проблема в надписях типа ,,volume,, ,,front left,, и т.д. , они перегружают ОЗУ. Попробую записать их во флеш как константы, думаю так будет правильно. Мне кажется что они не перегружают контроллер так как на "Фото" видно снизу загрузка CPU 29% (контроллера). Хорошо, я отправлю знакомому это сообщение. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 28 Июня, 2011 в 05:46 Жалоба Поделиться Опубликовано 28 Июня, 2011 в 05:46 (изменено) Есть ли разница между записями lcd_putsf('' Text ''); и flash unsigned char LOGO1 [] = '' Text ''; lcd_putsf('' LOGO1 ''); Изменено 28 Июня, 2011 в 07:47 пользователем химик Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость ryan Опубликовано 29 Июня, 2011 в 12:31 Жалоба Поделиться Опубликовано 29 Июня, 2011 в 12:31 (изменено) Есть ли разница между записями 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] Изменено 29 Июня, 2011 в 15:43 пользователем ryan Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 29 Июня, 2011 в 16:46 Жалоба Поделиться Опубликовано 29 Июня, 2011 в 16:46 Если я правильно понял запись, то разница есть.Верхняя строчка это присвоение аргументу (то что в скобках) функции (или процедуры) 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. Но кажется проблема зависания в другом - у меня четыре буфера для вывода информации на дисплей. И по моему они не умещаются в оперативку. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость ryan Опубликовано 1 Июля, 2011 в 02:49 Жалоба Поделиться Опубликовано 1 Июля, 2011 в 02:49 (изменено) Значит и в первом и во втором случае строка находится во FLASH памяти? К чему я все это - я думал что в первом случае строка помещается в SRAM а не в FLASH. Но кажется проблема зависания в другом - у меня четыре буфера для вывода информации на дисплей. И по моему они не умещаются в оперативку. Всё верно. Именно так и есть. Безразмерный массив создаётся во флеш-памяти и пихается в него строка "Text". Именно это и значит строчка flash unsigned char LOGO1 [] = '' Text ''; А потом из безразмерного массива вы запихиваете данные в lcd_putsf() lcd_putsf(LOGO1[]); Вопрос в том, как и где у вас была объявлена функция lcd_putsf(), которая, по видимому, отвечает за вывод текста на дисплей. Простите, а четыре буфера... не много? Мне всегда одного за глаза хватало. Может тут собака зарыта? Хотите вместе разберём что к чему и в чём может быть проблема? Изменено 1 Июля, 2011 в 02:56 пользователем ryan Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 1 Июля, 2011 в 16:52 Жалоба Поделиться Опубликовано 1 Июля, 2011 в 16:52 Простите, а четыре буфера... не много? Мне всегда одного за глаза хватало. Может тут собака зарыта? Хотите вместе разберём что к чему и в чём может быть проблема? Конечно если вам не тяжело. Насчет четырех буферов, от одного уже избавился осталось три. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 3 Июля, 2011 в 18:20 Жалоба Поделиться Опубликовано 3 Июля, 2011 в 18:20 (изменено) Хотите вместе разберём что к чему и в чём может быть проблема? Если у вас хорошо с асемблером, то подскажите пожалуйста что за куча вонингов в файле с расширением .lst( в архиве для удобства изменено расширение файла)? Что то не то с регистрами общего назначения? HSlst.zip Изменено 3 Июля, 2011 в 18:31 пользователем химик Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость ryan Опубликовано 5 Июля, 2011 в 04:15 Жалоба Поделиться Опубликовано 5 Июля, 2011 в 04:15 (изменено) Если у вас хорошо с асемблером, то подскажите пожалуйста что за куча вонингов в файле с расширением .lst( в архиве для удобства изменено расширение файла)? Что то не то с регистрами общего назначения? Спасибо за доверие, Сергей, но вот тут я пас... Могу предположить, что Вы уже объявили где-то регистры и пытаетесь их объявить еще раз со строчки 1026 до строчки 1034. Вот он и ругается. Думаю, что можно не обращать внимание... :smile: С ассемблером у меня значительно хуже обстоят дела. Вряд ли я смогу быстро подняться до такого уровня чтения ассемблера. :smile: Изменено 5 Июля, 2011 в 04:45 пользователем ryan Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 8 Июля, 2011 в 19:19 Жалоба Поделиться Опубликовано 8 Июля, 2011 в 19:19 На скриншоте обведено красным, в нижней строке Hardvare Stack Size:802 byte :smile: Не это ли моя проблема? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость ryan Опубликовано 10 Июля, 2011 в 11:43 Жалоба Поделиться Опубликовано 10 Июля, 2011 в 11:43 На скриншоте обведено красным, в нижней строке Hardvare Stack Size:802 byte :smile: Не это ли моя проблема? Размер стека странный, но точно ответить не могу. :smile: Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти