Главная » Статьи » Проекты

Вывод «анимированных» изображений на дисплей от 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. Не могу, конечно, сказать, что режиссерская работа в фильме на уровне шедевров, но ведь задача – то другая решалась…
 Наверное, такой «анимации» можно найти много разных применений, начиная от вывода заставок и меню, вплоть до индикации различных сообщений об исполнении хода программы. Вам, коллеги, решать! 



Категория: Проекты | Добавлено: 11.07.2012
Просмотров: 14855 | Комментарии: 2 | Теги: NOKIA3310 | Рейтинг: 5.0/4
Всего комментариев: 2
+1   Спам
2 pchela5   (12.07.2012 00:21)
Очень сильное колдунство!!! Отличная работа! А по ссылке - вообще отвал башки.

1 exersizze   (11.07.2012 22:31)
Еще добавлю что с помощью анимации можно сделать аболденный пользовательский интерфейс.
Как пример подобного исполнения могу привести проект автономного программатора http://www.youtube.com/watch?v=tg67HWwBRlY&feature=player_embedded

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Минитерминал v.2.0
26.04.2017 - Basykad:
sakatgg всё таки если можно скинте свой проект может пригодиться ещё для чего. С...
Минитерминал v.2.0
25.04.2017 - sakatgg:
Basykad, Подключал и к роутеру, также и к Доктору фьюзов - обрезает, ничего не у...
Направлятор
25.04.2017 - rom-i:
https://yadi.sk/a/1BpvBS-c3HL7UN Набросал как все произходит. В полном тупике.
Направлятор
25.04.2017 - rom-i:
Понятно, что работает. У меня только поиск.
Направлятор
25.04.2017 - Mikkels:
https://drive.google.com/open?id=0B8Fj99uLQPSvVDctSW9sMVB1d00
Направлятор
24.04.2017 - rom-i:
https://yadi.sk/i/19l7ehaz3HJjmf Так выставлены фьюзы. Может чего не так?
Минитерминал v.2.0
24.04.2017 - Basykad:
sakatgg можно файлы прошивки и схемы сбросить на майл Olegkad-rzn@mail.ru не мог...
Обработка большого количества кнопок на одном прерывании
24.04.2017 - qewin:
Mожно ли исходя из схемы на прямую подцепить кнопку на ножку (PD2)? Будет обраба...
Направлятор
23.04.2017 - rom-i:
jtag mega103 отключены. Кварц 11.0592. Пробовал в программе компилить сдвигая ча...