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

Вывод «анимированных» изображений на дисплей от 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
Просмотров: 14366 | Комментарии: 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
авторизация
Логин:
Пароль:
Комментарии
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
Спасибо) Я принцип действия понял, а вот откуда взялась именно цифра 195 не поня...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
pchela5, ну так это в военное, а у нас в мирное время все примерно)) Наше...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - pchela5:
> Полуволна в нашей электросети по времени длится примерно 10 мс

...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
Чтобы понять откуда взялась цифра 195 надо сначала въехать в принцип работы: ког...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
А почему минимальный накал при 195? Насколько минимум можно занизить Wt?
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.