Отключаемые счетчики электроэнергии на пульте. Все с документами пломбами, гарантией и без посредников!

Вывод «анимированных» изображений на дисплей от Nokia3310

автор: Forter

 Продолжая цикл статей по использованию дисплеев от Nokia3310, было бы интересно попробовать решить любопытную задачу получения на экране каких – то движущихся изображений. Однако, при этом возникают несколько проблем, связанных с недостатком ресурсов управляющего контроллера – как памяти программ, так и памяти данных. Поэтому, логично первую проблему постараться решить с помощью хранения «видео» во внешней памяти, а вторая задача решается выбором соответствующего типа контроллера. Сразу оговорюсь – в моем случае использовался ATMega168-20PU, имеющий на борту 16 Кбайт для хранения кодов и 1 Кбайт для данных, а в качестве внешней памяти использовалась микросхема EEPROM AT24LC64, работающая по интерфейсу I2C. 

 После такой небольшой постановки задачи, можно приступить к разработке алгоритма загрузки и хранения «видео» в микросхеме внешней памяти.

Первое, что мы должны понимать, это то, что «видео», в нашем случае, это просто сменяемые с определенной скоростью статические картинки, отсюда вывод – эти картинки надо создать, записать в EEPROM в определенной последовательности и вывести на дисплей.

Для этого:

 1. Скачиваем из Сети понравившийся анимированный файл с расширением .gif, желательно небольшого размера, далее, используя любую подходящую программу (я использовал Ulead Gif Animator) выбираем несколько последовательных кадров, не слишком отличающихся друг от друга, но таких, чтобы, при быстром просмотре, можно было составить из них подобие движущегося изображения. Сохраняем файлы – картинки в формате .jpeg, открываем их по очереди в XnView, изменяем их размер на 84х48 пикселов и конвертируем в черно – белый формат .bmp

 2. После этого каждый bmp – файл загружаем в FastLcd, выбираем разрешение 84х48, размер ячейки – 8х8 и конвертируем каждый файл – картинку в знакомый формат с расширением .bas.

 3. Далее, открываем каждый файл в блокноте (да – да, никто не говорил, что все так будет просто!), убираем ВСЕ ненужные символы до первого &H, затем удаляем все &H в файле заменой (поле «заменить на» просто оставляем пустым) и, таким же способом, удаляем оставшиеся символы запятой. Фрагмент подготовленного таким способом файла представлен ниже.

…………………………..

0000000000000080C0FCFE7E3E0C0000

00000000000000000000000000000000

00000000000000000000000000000000

0000000000000000FEFFFFFFFFFFFF00

00000000000000000000000000000000

00000000000000000000F0FCFFFFFFFF

FFFF0000000000000000000000000000

……………..

 4. Теперь в блокноте, открываем уже подготовленный первый файл и в его конец копируем содержание подготовленного второго файла, и в конец второго – подготовленный третий и т.д. до последнего (будьте внимательны!). В моем случае таких файлов было 16. На самом деле, это не так уж сложно и долго, как может показаться на первый взгляд. Сохраняем этот «объединенный» файл под удобным именем, открываем в редакторе WinHex (ищите в Сети) и, наконец, последний шаг – конвертируем наш файл в файл с расширением .bin.

 Здесь можно остановиться и проверить все ли правильно мы сделали? Для этого необходимо определить точный размер полученного файла в байтах, он должен быть кратным 504 и равным 504х(количество кадров), в моем случае – 504х16=8064. Если размер некратный – ищите ошибку…

 Осталось записать бинарный файл в микросхему памяти. Для этого подключаем программатор ICprog (у кого какой есть, но он должен поддерживать запись форматов bin), в панель устанавливаем микросхему памяти, подаем питание, запускаем оболочку ICprog, выбираем тип микросхемы, указываем на полученный bin – файл и «заливаем» его в EEPROM. Набор картинок и софт прилагаюНабор картинок

Софт

 Итак, первые две задачи нами решены! 

 Теперь несколько слов об организации вывода файлов – картинок на дисплей Nokia3310. Мною был использован «родной» дисплей с «правильным» контроллером, но, поскольку, проблемы вывода на другие модификации дисплеев, похоже решены, то работа с ними также не должна представлять трудностей.

 Схема всего устройства приведена на рис.1

 Я, по – прежнему, работаю со столь понравившейся мне Interduin’ой, поэтому указал только часть схемы, работающую с дисплеем и внешней памятью. Ничего нового – все стандартно. Адресные выводы выбора микросхемы памяти соединены следующим образом: А2 и А1 подключены к общему, А0 подключен через подтягивающий резистор к напряжению питания (хотя по даташиту можно и без него).

  Часть кода, отвечающая за чтение потока байтов из EEPROM, построена несколько нестандартно и использует тот факт, что размер нашего кадра – картинки равен точно 504 байтам, а значит, зная адрес начала кадра и его номер, легко вычислить адрес конца кадра.

 Поначалу здесь-то у меня и была главная проблема, связанная с чтением байтов с больших адресов памяти. Микросхема 24LC32 читалась прекрасно и картинка не разрушалась, а при увеличении размера файла и замене 24LC32 на AT24LC64, через 8 кадров картинка начинала разрушаться, и я пришел к выводу, что чтение происходит как – то не так, как надо. Но с помощью уважаемого коллеги exersizze, был подвигнут к мысли, что надо просто – напросто привести алгоритм чтения из EEPROM в вид, хотя бы немного похожий на рекомендуемый даташитом. Что, собственно, и было проделано. Ниже приводится фрагмент работоспособного кода, отвечающего за чтение из внешней памяти и вывод на дисплей:

Portb.5 = 1

Do

Addr_eeprom_begin = 0                  ‘ начальный адрес в EEPROM

 For Screen = 1 To 16                 ‘Память 24LC64, т.е. 8 КБайт, у нас картинка

                                       ‘504 байта, Скринов – 16, т.е. в памяти

                                       ‘картинки занимают 16х504 = 8064 Байта из 8192.

 Addr_eeprom_h = High(addr_eeprom_begin)                  ‘старший байт адреса

 Addr_eeprom_l = Low(addr_eeprom_begin)                   ‘младший байт адреса

    I2cstart

    I2cwbyte &B10100010

    I2cwbyte Addr_eeprom_h

    I2cwbyte Addr_eeprom_l

    I2crepstart

    I2cwbyte &B10100011

    Portb.5 = 0

    For Byte_counter = 1 To 504      ‘ читаем подряд 504 байта, т.е. весь screen, благодаря

                                                             ‘ присутствию инструкции Ack

     I2crbyte Disp_data(byte_counter) , Ack

     Waitus 2

     Portb.5 = 1                          ‘к этому выводу подключен светодиод для контроля

                                          ‘ процесса чтения

     Next Byte_counter

     Portb.5 = 0

     I2cstop                             ‘остановили работу I2C шины

  ‘далее идет уже стандартная процедура вывода на дисплей 504, считанных из EEPROM и записанных в ОЗУ

  ‘микроконтролеера, байтов. Это говорит о том, что ОЗУ не должно быть меньше 1 Кбайта!

     Call D3310position(0 , 0)

     For H11 = 1 To 504

     Call D3310dataout(disp_data(h11))

     Next H11

       Waitms 100                  ‘Wait 1, если оставить задержку 1 сек.,

                                        ‘ то будут хороши различимы все кадры.

       Addr_eeprom_begin = Addr_eeprom_begin + 504

           ‘ адрес начала следующего кадра (Screen’а)

           ‘ больше предыдущего ровно на 504, поэтому добавляем эту

           ‘величину. При следующем цикле добавим еще 504, так что

           ‘начало последнего кадра будет 15х504=7560, добавим еще 504

           ‘последних байтов и получим опять 8064 (см. выше).

             Next Screen

         Call D3310clear

         Wait 1

Loop

……..

 Ну, и напоследок смотрим «фильм» 

 Забираем исходники проекта в Bascom, рабочий проект в Proteus с моделями для Nokia3310. Не могу, конечно, сказать, что режиссерская работа в фильме на уровне шедевров, но ведь задача – то другая решалась…

 Наверное, такой «анимации» можно найти много разных применений, начиная от вывода заставок и меню, вплоть до индикации различных сообщений об исполнении хода программы. Вам, коллеги, решать! 


Взято с: avrproject.ru


Категория: AVR
Метки:

Написать коментарий

*
= 4 + 8

Добавить изображение

Последние статьи