Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 16.11.2015, 13:59  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,398
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
Вопрос После определенного количества используемых переменных - на дисплее "крякозяблики"

Добрый день,
делаю себе мультимедиа устройство для автомобиля. для вывода информации на LCD дисплей использую свою функцию WriteConst1(x,y,z). по сравнению с LCD_OUT это занимает меньше памяти в проце. Вот ее вид:
Код:
void WriteConst1(char row, char col, char ind){
  char text_cons[13];
  strConstCpy(text_cons,mes_txt1[ind]);
  Lcd_Out(row, col, text_cons);
}
Она использует эту функцию:
Код:
void strConstCpy(char *dest, const char *source) {
while(*source)
*dest++ = *source++ ;
*dest = 0 ;
}
Перед етим - обявлено:
Код:
const char *Mes_txt1[] = {"OPEL kadett ", //0
                          "   Radio    ", //1
                          "Volume      ", //2
                          "Subwoofer   ", //3
                          "Bass        ", //4
                          "Treble      ", //5
                          "Tuning      ", //6
                          "Frequency   ", //7
                          "Line in     ", //8
                          "Parameters  ", //9
                          "Brightness  ", //10
                          "Spkr_ball.  "}; //12 symbols, mode, status
Всего таких объявлений - три массива строк, 12 по 12 символов, 3 по 2 и 16 по 6.

Кроме того, в программе объявлено 18 bit-овых переменных и 46 char-ов.

Все работает, но настал момент, что при добавлении хотя бы одной переменной, дисплей вместо заданых строк отображает "крякозяблики". логически пологаю, что израсходовал какой-то лимит памяти, но компилятор показывает знятость DATA 46%, ROM 66.3%.

Хотелось бы разобраться, какой лимит я превысил и есть ли более правильный способ вывода строк на дисплей.

расскажите. пожалуйста, "на пальцах" или ткните носом в сцылку, кто знает, в чем проблемка.

Проц PIC16F877A, компилятор MikroC, средство проверки Proteus
Реклама:
-vitalik- вне форума  
Непрочитано 16.11.2015, 14:17  
andron007
Прописка
 
Регистрация: 19.02.2008
Адрес: г. Иркутск
Сообщений: 275
Сказал спасибо: 213
Сказали Спасибо 166 раз(а) в 78 сообщении(ях)
andron007 на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

А если в пошаговом режиме в протеусе, отследить от куда он берет "крякозяблики". (файл .cof нужен для этого)
andron007 вне форума  
Непрочитано 16.11.2015, 14:22  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Сообщение от -vitalik- Посмотреть сообщение
void WriteConst1(char row, char col, char ind){
char text_cons[13];
strConstCpy(text_cons,mes_txt1[ind]);
Lcd_Out(row, col, text_cons);
}
А что мешает сразу написать Lcd_Out(row, col, (char *) text1[ind]);
Boba_spb вне форума  
Непрочитано 16.11.2015, 14:23  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Скорее всего вылетает за пределы массива.
strConstCpy(text_cons,mes_txt1[ind]); вызывает сомнения. Лучше вручную копировать:
while(Len--) *text1++ = *text2++;
Easyrider83 вне форума  
Непрочитано 16.11.2015, 14:26  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Lcd_Out на прерываниях работает ? Если на прерываниях и пользует указатель на строку. То, если возврат из Lcd_out до завершения, то в этой строке черт лысый будет так как она она расположена в стеке.

Последний раз редактировалось Boba_spb; 16.11.2015 в 14:29.
Boba_spb вне форума  
Непрочитано 16.11.2015, 15:21  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Сообщение от -vitalik- Посмотреть сообщение
при добавлении хотя бы одной переменной, дисплей вместо заданых строк отображает "крякозяблики"
Нельзя так вульгарно писать для ПИКов с их страницами и банками. И никто вам толком ничего не поможет. Кроме вылета за пределы массива может быть вылет за пределы секций. Смотрите листинг и распределение памяти в первом случае и во втором.
И второе применять char лучше только к строкам. А так char неопределён по стандарту, он может быть и знаковым, и беззнаковым. Там тоже чудес наловить можно.
STM32F0 вне форума  
Непрочитано 16.11.2015, 18:56  
vavan1983
Почётный гражданин KAZUS.RU
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Сообщение от Boba_spb Посмотреть сообщение
Lcd_Out на прерываниях работает ?
нет не использует не одного прерывания
vavan1983 вне форума  
Сказали "Спасибо" vavan1983
rusyvochka (16.12.2015)
Непрочитано 16.11.2015, 19:28  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,416
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

ну вот пожалуйста - высокий уровень языка и минимальный уровень понимания
__________________
кагмаподэ магмаподэ
индюк вне форума  
Непрочитано 16.11.2015, 19:41  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Вот только не надо токовать, что на АСМе было бы по другому. Тема избитая ещё со времён когда красноглазили на АСМе под PIC16F84 и даже раньше. Именно по этой причине куча знающего народа и свалила с ПИКов.
STM32F0 вне форума  
Непрочитано 16.11.2015, 20:12  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,398
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию Re: После определенного количества используемых переменных - на дисплее "крякозяблики"

Boba_spb, это не помогло. lcd_out использует delay
Easyrider83, этим вроде занимается
Код:
while(*source)
*dest++ = *source++ ;
беда только с индикацией. остальной код работает, как задумано
STM32F0, я думал, микроС сам разбирается со страницами
индюк, расскажите, где подучится. не все рождаются умными
-vitalik- вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 09:09.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot