Новая жизнь игрушки

Привет всем, вот решил показать, что я сделал из рабочего тетриса.


Мне он достался от одного товарища в почти нерабочем состоянии на запчасти. Разобрав его, я понял, что запчастей почти нет — плата с чипом (интересно, а он 8-ми битный и что на кристалле?)+транзистор+ЖКИ, плату с кнопками и динамик. В общем — мало. Так он бы и лежал в хламе, если бы я не стал работать с MK-AVR ATmega8515 и MMC-флешкой на 32M (а для этого пришлось изучать FAT16).

Детали
Корпус подошел к деталям более-менее, а это на мой взгляд — главное. Далее — удалось достать ЖКИ от телефона Siemens A70 (хорошие параметры, с подсветкой и удобно паять, подходит по ширине).



Далее, в ввиду недостатка памяти под видеобуфер, была добавлена мелкосхема CMOS static RAM 6264(по версии протеуса) на 8Кб из какой-то платки.
Сенсорная клавиатура строилась по принципу – брутальный ржавый болт с шайбой, от него провод с конденсатором на вход контроллера PORTB0-3, который дополнительно посажен на землю через резистор в 1Мом. Из внешних коммуникаций – только UART.Питание – аккумулятор от мобилки, печатка специально не делалась, ввиду частых «модификаций».
Также добавил пару регистров-защелок адреса и стабилизаторов питания (для MMC и LCD), пьезо пищалку и получилось —
  • сенсорная клава(обычные кнопки ненадежные и вообще…)
  • читалка *.txt файлов
  • смотрелка *.bmp файлов(только 101х64 ч/б BMP)
  • светилка-фонарилка фотонами (экран+дополнительные светодиоды сверху)
  • кубик (теперь в 3D!)

Тестировалось это в Proteuse правда без эмуляции экранчика:


Функции обмена с флешка — взяты за основу либа по FAT16, коды активации LCD – спасибо сайту РадиоКот.
Самый большой интерес, на мой взгляд, представляет функция вывода на экран изображения – сначала читаются 3 кластера размером по 512 байт, из них первые 62 байта – заголовок (он просто пропускается), а остальные 16*64=1024 байта и есть наши данные.
void open_BMP(void)
{
unsigned char i,j,L,cem,cem1,temp,cn,Adres,cv;
unsigned int K;

 //Загрузка
   read_block(name,12);
   read_block(name+2,14);
   read_block(name+4,16);
   for( K=62; K< 16*64+262;K++)
    {
        Ram_STB(12+(K>>8));//Выбрать требуемый банк
        cem=Ram_RD((0x00ff & K));
        Ram_STB(20+((K-62)>>8));
        Ram_WR(K-62,cem);
    }

  //Преобразование
  //LCD_buf_clear();
  for( L=0; L<8 ; L++ )
 {
  for( i=0; i< 13 ; i++ )   //по столбцам
    {
    for( cn=0; cn<8 ; cn++ ) //по строкам
    {
        cv=(L & 0x01)*128;
        Ram_STB(20+(L>>1));
        cem1 =  Ram_RD((cn*16)+i+cv);

         for( j=0; j< 8 ; j++ )
            {
           if(!( 0x01 & cem1 ) )//Не равно ли 1
            {
            temp = (0x80>>cn); //Создание маски для постановки точки
            Ram_STB(7-L);
            Adres=(7-j) + i*8 ; //вычисление адреса для...
            cem=Ram_RD(Adres); // чтение-модификация-запись
            cem |=  temp ;
            Ram_WR(Adres,cem);
            }
            cem1=(cem1>>1);
            }
        }
      }
  }
}


Текстовый режим еще проще — просто тупо читаем нужный кластер и берем 128 байт из него.

void open_Text(unsigned char kor)
{
unsigned char i,j,temp;

  read_block(name+(kor/2),12);//Читаем  файл 1 только через 4 и *2 (так надо!!!)

    for( i=0; i< 128 ; i++ )
    {
        Ram_STB(12+((0x02 & kor)/2)); // div2
        temp=Ram_RD(i + (kor & 0x01)*128);
        Ram_STB(14);
        Ram_WR(i,temp);
    }

    for( j=0; j<8 ; j++ )
    {
       for( i=0; i<16 ; i++ )
       {
        Ram_STB(14);
        temp = Ram_RD((j*16)+i);
        if(temp<32)
        {
         temp=32;
        }
       LCD_font(i,j,temp);
       }
    }
}

Примеры картинок:



Примеры картинок IRL:


«Life» и 3D-рендер:


На мой взгляд, данный аппарат можно моддить до предела, если поменять контроллер, например, на мега16, а именно:
Добавить функции тестера, мультиметра, осциллографа (придётся добавлять внешние делители), научить нормально, работать с разными файлами, работать со звуком (сделать типа диктофона), развить 3D-рендер (что-то по сложнее кубика и что-бы читало с флешки координаты), напихать датчиков (температуры), сделать, наконец, игру танки…

Ну, а дальше все по стандарту — это мой первый пост, прошу ногами не бить за быдлокод и т.д.
P.S.Надеюсь, заинтересовал кого-то уважать электронику в любых ее проявлениях
(даже в виде китайского ширпотреба(хотя бы ради корпусов)).
  • +2
  • 17 апреля 2011, 16:39
  • KT3012
  • 1
Файлы в топике: Console_1.0.zip

Комментарии (14)

RSS свернуть / развернуть
Классно получилось :)
Можно из него сделать простенький логический анализатор.
0
Чорд! Мне нравится! Я, кстати, на луа однажды тетрис писал. ^_^
0
А я бы оставил родные кнопки. Они посимпатичнее. И плата с матрицей готовая (хотя хз как тут, это в старых плата клавы отдельная была).
0
  • avatar
  • Vga
  • 17 апреля 2011, 22:54
Дело в том, что там резиновые кнопки стерлись — перестали замыкать, а замену делать из кнопок «стучалок» — не вариант.
0
Ну можно подходящие резинки поискать. Да и тактовые кнопки имхо вполне вариант. Недолюбливаю я сенсорные. Из них мне тока колечко на айподе понравилось.
0
А мне нравяться сенсоры — простые с конструктивной и программной стороны
+ безшумные, почти «вечные».Хотя на каждую кнопку — 1 вывод МК(интересно, можно ли их мультиплексировать ?).
0
Вечные? А статикой их не вынесет?
0
Статикой не только кнопки можно выжечь, если знать куда.Для защиты применять следует диоды защитные или разрядники ;))).
Сырцы подготовлю в пятницу
0
На счет замены МК на Mega16 — это вряд ли. Как я понял ОЗУ в дефиците, раз ставили внешнюю, а у Mega16 1кБ вкутри и внешней шины нет.
0
Прикольно. Немного непонятен механизм работы с памятью, но может это я с утра в понедельник немного туп :) Судя по размеру окна для родного экрана туда офигенно встанет дисплей от SIEMENS S65 (какой нить LS020) например. он к тому же ещё и цветной. МК заменить мегой128
0
Прикольно. Немного непонятен механизм работы с памятью, но может это я с утра в понедельник немного туп :) Судя по размеру окна для родного экрана туда офигенно встанет дисплей от SIEMENS S65 (какой нить LS020) например. он к тому же ещё и цветной. МК заменить мегой128
ЗЫ: И было б не плохо глянуть на сырцы
0
Механизм работы с памятью тупой, потому что память внешняя и к ней доступ блочный (1 регистр — адрес(0-255),2 — банк памяти). Это сделал (как я думал) для скорости.
0
0
Прикрепи, кстати, к посту.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.