2Кб SRAM

Тема в разделе "Arduino & Shields", создана пользователем Mik, 8 апр 2012.

  1. Mik

    Mik Нуб

    У меня графический индикатор MT-12864A, т.е. разрешение индикатора 128x64 точек, следовательно ровно 1 Кбайт хранения полной картинки (128х64) в памяти.
    Вставил для проверки готовый двумерный массив-логотип с сайта производителя (большой такой массив), заработало, потом ещё нарисовал свой и добавил (т.е. ещё 1 Кб и ещё есть несколько переменных для хранения пинов и несколько временных переменных) - перестало работать, либо работало но искажались рисунки... Случайно посмотрел характеристики МК ATmega328p, меня шокировало... Почему так мало SRAM? 21 век же, должно быть несколько Мб! 2 Мб вполне бы хватило на анимацию и крупных шрифтов. Теперь собственно вопрос как увеличить SRAM-память за счет Flash-памяти или каким-то другим способом? Мне нужно примерно 6 Кб. ArduinoMega не предлагайте, мне там большое кол-во выводов ни к чему.

    Заранее спасибо!
     
  2. Корней

    Корней Гик

    Можно задействовать 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));
    Иначе генерируйте изображение по частям.
     
  3. Mik

    Mik Нуб

    сделал все массивы-логотипы как константы, не работает всё по-прежнему (( Да и вообще бред какой-то, удалил все логотипы оставил только один логотип на 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]) работает без проблем... Тщательно всё проверил, похоже косяк в компиляторе или в худшем в МК.
     
  4. Mik

    Mik Нуб

    пробовал WriteDataL(0xFF&logo[p][c]) все равно не помогает. Logo[8][128] объявлен как const byte
     
  5. Корней

    Корней Гик

    128 последний индекс или 127?
    Массив Logo у вас какого типа?
    Для помещения данных во flash требуется модификатор PROGMEM.
    Для чтения данных из flash требуется использовать вызов
    pgm_read_byte_near с адресом требуемого байта в качестве аргумента.
    Модифицировать flash на борту МК во время работы программы может только код из области загрузчика.
    Коду ардуиновского скетча это не доступно.
     
  6. Mik

    Mik Нуб

    последний индекс 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.
     

    Вложения:

    • TestMassiv.zip
      Размер файла:
      1,7 КБ
      Просмотров:
      294
  7. Mik

    Mik Нуб

    чего-то не нашёл такой топик... Эта часть ((sample<<(1+dividerPow))&0xff) чего делает? Компилятор ругается, что не объявлены эти переменные.
     
  8. Корней

    Корней Гик

    pgm_read_byte_near считывает из flash один байт по указанному адресу.
     
  9. Корней

    Корней Гик

    Они вам и не нужны. Я выдернул кусок кода с pgm_read_byte_near из рабочего скетча.
     
  10. Mik

    Mik Нуб

    Спасибо большое! Заработало. Все картинки отображаются. Только одна проблема: закомментировал все массивы логотипы (без комментирования такое же поведение) оставил только один двум. массив 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 нет такой функции. Как исправить?
     
  11. Mik

    Mik Нуб

    без использования циклов и генерации, по сути должно работать.
     
  12. Корней

    Корней Гик

    Прошивка не прошилась корректно.
    Возможно дело в 0xFF. Тут уже была тема, что скетч с текстом с большим количеством !!! не прошивался.