У меня графический индикатор MT-12864A, т.е. разрешение индикатора 128x64 точек, следовательно ровно 1 Кбайт хранения полной картинки (128х64) в памяти. Вставил для проверки готовый двумерный массив-логотип с сайта производителя (большой такой массив), заработало, потом ещё нарисовал свой и добавил (т.е. ещё 1 Кб и ещё есть несколько переменных для хранения пинов и несколько временных переменных) - перестало работать, либо работало но искажались рисунки... Случайно посмотрел характеристики МК ATmega328p, меня шокировало... Почему так мало SRAM? 21 век же, должно быть несколько Мб! 2 Мб вполне бы хватило на анимацию и крупных шрифтов. Теперь собственно вопрос как увеличить SRAM-память за счет Flash-памяти или каким-то другим способом? Мне нужно примерно 6 Кб. ArduinoMega не предлагайте, мне там большое кол-во выводов ни к чему. Заранее спасибо!
Можно задействовать flash, если не требуется генерировать изображения "на лету". Пример из соседнего топика: Код (Text): #define N_WAVE 256 const prog_int8_t FullSinewave[N_WAVE] PROGMEM= { 0, 3, 6, 9, 12, 15, 18, 21, ... Код (Text): return pgm_read_byte_near(FullSinewave + ((sample<<(1+dividerPow))&0xff)); Иначе генерируйте изображение по частям.
сделал все массивы-логотипы как константы, не работает всё по-прежнему (( Да и вообще бред какой-то, удалил все логотипы оставил только один логотип на 1Кб (тот, что с сайта производителя) и заполнил нижнюю строку от Logo[7][0] до Logo[7][128] числом 0xFF, по сути строка должна заполниться черной сплошной, а она в дырках. Без использования массива заполнял через for(p=7; p<8; p++) с использованием той же функции WriteDataL(0xFF) и WriteDataR(0xFF) вместо WriteDataL(logo[p][c]), WriteDataR(logo[p][c]) работает без проблем... Тщательно всё проверил, похоже косяк в компиляторе или в худшем в МК.
128 последний индекс или 127? Массив Logo у вас какого типа? Для помещения данных во flash требуется модификатор PROGMEM. Для чтения данных из flash требуется использовать вызов pgm_read_byte_near с адресом требуемого байта в качестве аргумента. Модифицировать flash на борту МК во время работы программы может только код из области загрузчика. Коду ардуиновского скетча это не доступно.
последний индекс 127. объявил массив теперь так: const prog_int8_t Logo1[8][128] PROGMEM=... вызов функции: OutputLogo(pgm_read_byte_near(Logo1)); вобщем вставить весь код здесь не получается (очень большой). Прикрепил как zip-архив. Посмотрите пожалуйста, ошибку выдаёт: error: invalid conversion from 'uint8_t' to 'const prog_int8_t (*)[128]'. Заменил на uint8_t, все равно та же самая ошибка, затем убрал const тоже самое =/ Программа должна выводить числа считанные с МК в Serial Monitor.
чего-то не нашёл такой топик... Эта часть ((sample<<(1+dividerPow))&0xff) чего делает? Компилятор ругается, что не объявлены эти переменные.
Спасибо большое! Заработало. Все картинки отображаются. Только одна проблема: закомментировал все массивы логотипы (без комментирования такое же поведение) оставил только один двум. массив const prog_int8_t Black[8][128] PROGMEM = ... там где все числа равны 0xFF, мне после компиляции и прошивки выдаёт следующее сообщение: avrdude: verification error, first mismatch at byte 0x0380 0xff != 0x00 avrdude: verification error; content mismatch и экран полностью чёрным не заливается. Через Serial Monitor так же выдает не все по 255. Пробовал pgm_read_byte_near и pgm_read_byte, а pgm_read_byte_far нет такой функции. Как исправить?
Прошивка не прошилась корректно. Возможно дело в 0xFF. Тут уже была тема, что скетч с текстом с большим количеством !!! не прошивался.