Назад

МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ



ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
Кафедра  “Електронні обчислювальні машини”





Пояснювальна записка


до курсового проекту

по курсу “СРЧ”



На тему :

 "Портативний пристрій для тестування знань."

із спецчастиною:

„Розробка портативного пристрою тестування

знань на основі мікроконтролеру та інтерфейсу USB”





Розробив ____________________Коваль О.В.

гр ВТ- 00М

Керівник проекту  _____________Достлев Ю.С.


Консультант проекту __________Зінченко Ю.Є.


Завідуючий кафедрою ________Святний В.А.






Донецьк – 2004 р.

 

 

 

 

 

 

 

 


РЕФЕРАТ

стор. – 60,  рис. – 30,  табл. – 6  



Об’єктом курсової роботи є розробка портативного пристрою тестування знань на основі мікроконтролеру та інтерфейсу USB.

Пристрій уявляє собою програмно – апаратний комплекс, що виконує команди, розміщені на зовнішньому носії інформації та має апаратні можливості до виведення текстової а також звукової інформації. Введення інформації відбувається через клавіатуру.

Завантаження нових тестових програм можливе як через USB інтерфейс, так і через змінну карту пам’яті MMC.

Метою курсового проекту є розробка портативного пристрою тестування знань на основі мікроконтролеру та інтерфейсу USB,  що забезпечує можливість дистанційного тестування знань при проведенні лекційних та практичних занять.

У курсовому проекті розроблено портативний пристрій тестування знань, відзначними характеристиками якого є мобільність, легкість самостійного тестування користувача в автономному режимі, велика гнучкість в побудові тестів, можливість оперативного перепрофілювання пристрою, якщо він не використовується для тестування.

Пристрій може застосовуватись у школі, інститутах, на підприємствах з метою перевірки засвоєння викладеної інформації. Наприклад, на підприємстві – для перевірки знань техніки безпеки і т.д.  





MEGA, ТЕСТУВАННЯ, МІКРОКОНТРОЛЕР, UNIVERSAL SERIAL BUS, MULTIMEDIA CARD, MP3 ДЕКОДЕР, МІКРОПРОГРАМА, AVR STUDIO, IAR EMBEDDED WORKBENCH, EAGLE,  ЛІЧИЛЬНИК,  РЕГІСТР, АДРЕСАЦІЯ, КЕРУВАННЯ, LCD ДІСПЛЕЙ.











АНОТАЦІЯ


Об’єктом курсової роботи є розробка портативного пристрою тестування знань на основі мікроконтролеру та інтерфейсу USB.

Пристрій уявляє собою програмно – апаратний комплекс, що виконує команди, розміщені на зовнішньому носії інформації та має апаратні можливості до виведення текстової а також звукової інформації. Введення інформації відбувається через клавіатуру.

Завантаження нових тестових програм можливе як через USB інтерфейс, так і через змінну карту пам’яті MMC.

Метою курсового проекту є розробка портативного пристрою тестування знань на основі мікроконтролеру та інтерфейсу USB,  що забезпечує можливість дистанційного тестування знань при проведенні лекційних та практичних занять.

У курсовому проекті розроблено портативний пристрій тестування знань, відзначними характеристиками якого є мобільність, легкість самостійного тестування користувача в автономному режимі, велика гнучкість в побудові тестів, можливість оперативного перепрофілювання пристрою, якщо він не використовується для тестування.

Пристрій може застосовуватись у школі, інститутах, на підприємствах з метою перевірки засвоєння викладеної інформації. Наприклад, на підприємстві – для перевірки знань техніки безпеки і т.д.  




ЗМІСТ



АНОТАЦІЯ.........................................................................5

ЗМIСТ............................................................................6

ВСТУП............................................................................7

1. РОЗРОБКА СТРУКТУРНОЇ СХЕМИ ПРИСТРОЮ...........................................8

2. РОЗРОБКА ПРИНЦИПОВОЇ СХЕМИ ПРИСТРОЮ..........................................11

3. РОЗРОБКА АЛГОРИТМІВ КЕРУВАННЯ МОДУЛЯМИ  ПРИСТРОЮ.............................24

4. РОЗРОБКА ТА ВІДЛАДКА МІКРОПРОГРАМ............................................40

5. АНАЛІЗ РЕЗУЛЬТАТІВ...........................................................48

ВИСНОВОК........................................................................48

СПИСОК ДЖЕРЕЛ, ЩО ВИКОРИСТОВУВАЛИСЯ.............................................49
ДОДАТКИ.

  Додаток 1 – Лістинг мікропрограми.............................................50

  Додаток 2 – Перелiк елементiв принципової схеми...............................60





ВСТУП

Сучасні методики навчання складаються з трьох частин – викладення матеріалу, практичних занять та тестування  засвоєння викладеної інформації.

Людина вчиться майже все своє життя. Навчання супроводжує її з школи, під час навчання у інституті, під час праці на роботі.

Але ще більше значення має перевірка засвоєння викладеної інформації. Воно починається зі школи, і закінчується тільки по виході на пенсію.

У школі та інституті воно використовується для перевірки засвоєння учбової інформації, на підприємстві – для перевірки знань техніки безпеки і т.д.  

Отже зручна, швидка і достовірна можливість перевірки, що не потребує великих затрат – це проблема, розв’язання якої має дійсно велике значення як для навчальних закладів, так і для підприємств, отже і для економіки держави.

У наш час відомо безліч систем, що надають можливості тестування. Розроблено безліч підходів і способів тестування -  від вибору вірної відповіді зі списку, або натиснення вірної клавіши, до аналізу уведеного фрагмента програми, наступної її компіляції й порівняння отриманого результату її роботи із заданим.

З точки зору фізичної реалізації такі пристрої являються немобільними, вони підключені до кабельної мережі на протязі усього тесту, потребують великих затрат на розгортання та експлуатацію.

Аналіз цих систем c точки зору практичного застосування показав їх загальні недоліки - відсутність мобільності, складність самостійного тестування користувача в автономному режимі, відсутність гнучкості в побудові тестів, відсутність можливості оперативного перепрофілювання пристрою, якщо він не використовується для тестування.

У даній роботі пропонується універсальний мобільний мультімедійний пристрій, призначений для тестування знань у різних сферах народного господарства, що не має зазначених недоліків. Він комбінує можливість кабельного з’єднання з автономним функціонуванням. Нові тестові програми можуть завантажуватися як через USB інтерфейс так і шляхом зміни носія з програмою тестування.



1. РОЗРОБКА СТРУКТУРНОЇ СХЕМИ ПРИСТРОЮ


Згідно з технічним завданням пристрій, що розроблюється повинен бути придатний до дистанційного тестування знань при проведенні лекційних та практичних занять.  Для виконання отриманої задачі та зведення до мінімуму недоліків аналогічних систем (відсутність мобільності, складність самостійного тестування користувача в автономному режимі, можливість заважання пристроїв один одному, відсутність гнучкості в побудові тестів, відсутність можливості оперативного перепрофілювання пристрою, якщо він не використовується для тестування) було прийняте рішення про надання пристрою наступної функціональності.



Таким чином невеликі розміри пристрою придають йому  мобільність. Розмір екрану компенсується можливістю виводу аудіоінформації. Гнучкість тестування забезпечується інтерпретацією командної мови, яка застосовується у тестовій програмі, що знаходиться на змінному носії.

Тестова програма має можливість роботи з внутрішніми (службовими) та зовнішніми ресурсами пристрою (системи), а саме: з екраном, клавіатурою, змінним носієм інформації, таймерами, керувати переходом до енергозберігаючого режиму та виводити звук.


Структурна схема портативного пристрою для тестування знань наведена  на рисунку 1.1 а також у графічній частині на листі 1.


Пристрій складається з пристрою керування – мікроконтролеру (далі CPU, на структурній схемі позначка CPU), пристрою декодування MP3 потоку (далі XY, на структурній схемі позначка X/Y), пристрою відображення інформації (далі LCD, на структурній схемі позначка HG), пристрою інтерфейсу з шиною USB (далі IO, на структурній схемі позначка IO), пристрою зберігання інформації (далі MMC, на структурній схемі позначка PROM), клавіатури (далі КВ, на структурній схемі позначка SB) та стереофонічних телефонів (далі ТФ, на структурній схемі позначка BF).


Розглянемо принцип функціонування пристрою.


CPU виконує керуючу роль у пристрої. Він керує XY, LCD, IO, MMC, посилаючи їм команди, та одержуючи інформаційні сигнали, тобто керує взаємодією пристроїв згідно з програмою. Команди для виконання CPU отримує зі своєї внутрішньої пам’яті та з MMC. ЦПУ може зчитувати інформацію з внутрішньої пам’яті, а також зчитувати та записувати інформацію (дані та команди) з та до MMC.

ММС являє собою пристрій зберігання інформації. Він зберігає програму (що виконує, наприклад, тестування), аудіо та текстову інформацію необхідну для програми, що знаходиться на ММС, а також результати тестування, записані програмою, що знаходиться на ММС.

XY являє собою апаратний пристрій декодування MP3 потоку. Він може декодувати як монофонічний так і стереофонічний звук. У даному пристрої максимальна частота дискретизації декодованого потоку – 48 КГц, а максимальна швидкість MP3 потоку – 192 кб/с. До XY з CPU надходять команди керування та данні (MP3 потік). З XY виходить декодований стереофонічний потік, що подається до зовнішнього пристрою виводу аудіоінформації (ТФ).

ТФ являє собою стандартний пристрій  виводу аудіоінформації. Він виводить інформацію, що надає програма, що знаходиться у MMC. ТФ –складова частина системи взаємодії з користувачем.

LCD екран являє собою пристрій відображення текстової інформації. Він відображує повідомлення о помилках та інформацію, що надає програма, що знаходиться у MMC. LCD являє собою складову частину системи взаємодії з користувачем.

КВ являє собою пристрій вводу інформації. За допомогою його користувач вводить інформацію до програми, що знаходиться на ММС, регулює гучність ТФ, вмикає чи вимикає пристрій, реагує на повідомлення про помилки. КВ являє собою складову частину системи взаємодії з користувачем.


Пристрої інформують ЦПУ про закінчення операцій та зміни їх стану.    



img01


Рисунок 1.1 – Структурна схема портативного пристрою для тестування знань







2. РОЗРОБКА ПРИНЦИПОВОЇ СХЕМИ ПРИСТРОЮ


Для надання пристрою наступної функціональності проведемо вибір компонентів пристрою. Розглянемо технічні характеристики окремих елементів схеми.



Усі елементи пристрою можуть функціонувати при напрузі живлення 2,7..3,6 В.



Виберемо у якості декодера MP3 мікросхему VS1001k.


VS1001K


VS1001k (рисунок 2.1) являє собою апаратний декодер MP3 потоку з можливістю виконання коду користувача (керування DSP). У схемі застосовано зовнішній кварцовий резонатор на 24 МГц, що дає можливість декодувати MP1/2/3 потік з змінним бітрейтом до 192 кб/сек.

Декодер має два інтерфейси: інтерфейс керування (SCI) та інтерфейс прийому даних для декодування (SDI).  Фізичним інтерфейсом передачі інформації є інтерфейс SPI.

До декодеру підключаються звичайні стереотелефони з опіром 30Ом.

MP3 декодер функціонує на частоті 12 - 26 МГц при напрузі від  2,7 до 3,6 В.

     Декодер має багаті можливості керування детально описані у документації.

     MP3 декодер споживає до 20 мА у звичайному режимі функціонування та       4,3 мкА у режимі сну.


Фірма виробник додає до свого виробу необхідну документацію (так звані datasheets), де описані як способи програмування, так і схеми підключення з наданням інформації про номінали елементів.

Структурна  схема пристрою зображена на рисунку 2.2.

Типова схема підключення пристрою наведена на рисунку 2.3.

На рисунку використані наступні умовні позначення : DVDD – напруга живлення для цифрової частини пристрою. AVDD – напруга живлення для аналогової частини пристрою. GND, AGND – цифрова та аналогова земля відповідно.

VS1001k обмінюється командами через SPI інтерфейс команд (SCI) – виводи SI, SO, SCLK, xCS, xRESET. VS1001k приймає дані через SPI інтерфейс даних (SDI) – виводи SDATA, DCLK, BSYNC. Сигналом DREQ мікросхема повідомляє, що вона може прийняти наступні 32 байти даних для декодування.


Виберемо у якості інтерфейсу мікросхему FT245BM.


FT245BM


FT245BM (рисунок 2.4) являє собою апаратний транслятор USB інтерфейсу до інтерфейсу послідовного порту. Мікросхема має двонаправлений восьмибітний порт, сигнали статусу буферів прийому та передачі, а також сигнал підключення пристрою до хоcту USB (pwren). Максимальна швидкість передачі даних через FT245BM – 1Мб/с.

FT245BM  є пристроєм шини USB з інтерфейсом USB 1.1.

FT245BM може живитися лише від 5 В, але може працювати з пристроєм, що живиться від 5-3,3В. У однієї з схем підключення, що запропоновано фірмою – виготовлювачем  (рисунок 2.6) живлення до FT245BM подається з шини USB. Декодер має два інтерфейси: інтерфейс роботи з пристроєм та інтерфейс USB.

     FT245BM споживає до 25 мА у звичайному режимі функціонування та 200мкА у режимі сну.


Фірма виробник додає до свого виробу необхідну документацію (так звані datasheets), де описані як способи програмування, так і схеми підключення з наданням інформації про номінали елементів.

Структурна  схема пристрою зображена на рисунку 2.5.

На рисунку 2.6 використані наступні умовні позначення : VСС – напруга живлення пристрою. GND – земля. LDO REGULATOR – стабілізатор напруги (3,3 В). DECOUPLING CAPS – фільтруючі конденсатори в ланцюгах живлення. FERRITE BEARD – феритова котушка.


Виберемо у якості інтерфейсу LCD екран PC 1202-A на базі контролеру HD44780.


LCD екран PC 1202-A на базі контролеру HD44780.


LCD екран (рисунок 2.7) являє собою рідкокристаловий текстовий екран на 2 рядка по 12 знакоміст у кожній (можливе використання LCD з іншою довжиною рядка та кількістю рядків.

LCD має восьмибітну шину даних, три керуючих цифрових сигналу та один аналоговий, що керує контрастністю.

Контролер має внутрішній тактовий генератор.

Фірма виробник додає до свого виробу необхідну документацію (так звані datasheets), де описані як способи програмування, так і схеми підключення з наданням інформації про номінали елементів.


Клавіатура (КВ)


Клавіатура являє собою набір з восьми кнопок, що приєднуються до мікроконтролеру.



Cтереофонічні телефони (ТФ)


Cтереофонічні телефони є стандартним пристроєм відтворення аудіоінформаціїї. Вони мають опір 30Ом.


Карта пам’яті ММС


Карта пам’яті ММС являє собою апаратний пристрій зберігання інформації. Мікросхема має SPI інтерфейс (до 20МГц, 1,2 Мб/с) і функціонує при 2,7- 3,6 В (споживає не більше 80mA). Карта пам’яті підтримує автоматичне керування споживанням.


Фірма виробник додає до свого виробу необхідну документацію (так звані datasheets), де описані як способи програмування, так і схеми підключення з наданням інформації про номінали елементів.

Структурна  схема пристрою зображена на рисунку 2.8.

Типова схема підключення пристрою наведена на рисунку 2.9.


Виберемо у якості керуючого мікроконтролеру мікросхему ATMEGA 64L. Головними перевагами для вибору саме цієї моделі мікроконтролера з мікроконтролерів сімейства MEGA були: велика кількість інтерфейсних виводів, убудований інтерфейс SPI та велика кількість флеш, EEPROM та оперативної пам’яті, що може бути задіяна у наступних версіях пристрою.


ATMEGA 64L


Мікроконтролер ATMEGA 64L має 64 виводи (рисунок 2.10). А саме: виводи живлення його аналогової (не використовується у схемі) та цифрової частин, вивід скидання, вивід дозволу програмування, п’ять восьмирозрядних та один п’ятирозрядний двонаправлені порти вводу-виводу. Кожен вивід порту може видавати до 10 мА при живленні 3В. У режимі вводу порти мають програмно-керовані підтягуючі резистори на 20 кОм.

Мікроконтролер функціонує на частоті 8МГц при напрузі від  2,7 до 5,5 В.

Хоча мікроконтролер може працювати від внутрішнього RC-генератору, у схемі застосовано зовнішній кварцовий резонатор на 8 МГц.

     Мікроконтролер може використовувати зовнішню пам’ять. Мікроконтролер має у своєму составі АЦП, два інтерфейсу TWI, два послідовних порта та JTAG (у схемі не використовуються) а також  SPI інтерфейс.

     Мікроконтролер має багаті можливості по програмуванню – до 4 способів програмування, включаючи інтерфейс SPI (саме він використовується у схемі) та JTAG.

     Мікроконтролер споживає до 8 мА у звичайному режимі функціонування та до 0.5 мкА у режимі сну.



Фірма виробник додає до свого контролеру необхідну документацію (так звані datasheets), де описані як способи програмування, так і схеми підключення з наданням інформації про номінали елементів.

Структурна  схема контролеру зображена на рисунку 2.11.


Портативний пристрій для тестування знань має додаткові рознімання для програмування, підключення живлення і т.п.


Розробка електричної схеми пристрою виконана у відповідності з довідковими даними та методиками, що рекомендовані фірмами виготовлювачами  з встановлення фільтруючих та захисних ємностей.


У процесі розробки апаратної частини проекту застосовувалася програма EAGLE (рисунок 2.12), у якій була розроблена принципова схема(рисунок 2.13), та зроблена та оттрасована друкована плата (рисунок 2.14).


При трасуванні друкованої плати використовувалися наступні характеристики трасирування:



img02


Рисунок 2.1 – Декодер MP3 потоку VS1001k


img03

Рисунок 2.2 – Структурна схема VS1001k

 

 

img04

Рисунок 2.3 – Типова схема підключення VS1001k



img05

Рисунок 2.4 – Інтерфейс USB FT245BM

 

 


img06

Рисунок 2.5 – Структурна схема FT245BM



img07

Рисунок 2.6 – Типова схема підключення FT245BM





img08


Рисунок 2.7 – РКІ PC 1202-A




img09

Рисунок 2.8 – Структурна схема ММС карти пам’яті



img10

Рисунок 2.9 – Типова схема підключення ММС карти пам’яті



img11


Рисунок 2.10 – Мікроконтролер ATMEGA 64L



img12



Рисунок 2.11 – Структурна схема ATMEGA 64L




img13

Рисунок 2.12 – Система EAGLE



img14

Рисунок 2.13 – Принципова схема, розроблена у системі EAGLE





img15


Рисунок 2.14 – Друкована плата, розроблена у системі EAGLE






3. РОЗРОБКА АЛГОРИТМІВ КЕРУВАННЯ МОДУЛЯМИ  ПРИСТРОЮ.

Автором була розроблена система тестування “Votest 1.0” (MIDLET), що зайняла третє місце на відкритому конкурсі Ericsson під патронатом державного комітету зв’язку та інформатизації України 2004 серед студентів ВНЗ України на створення програмного забезпечення для мобільних телефонів на платформі java, що дозволяє виконувати тестування знань, здійснювати голосування або проводити опитування суспільної думки по різних питаннях [8].

Тому, маючи досвід створення подібних систем, автор прийшов до висновку, що будь який пристрій, що працює за заданою програмою не може бути гнучким у використанні і тому не має таку широку сферу застосовування у порівнянні з пристроєм, що інтерпретує програму.

     Тому у пристрої, що розробляється у межах курсового проекту, було вирішено розміщувати програму тестування на змінному носії пам’яті разом з даними, що необхідні для тесту. Тобто пристрій інтерпретує програму тесту, написану на спеціальному язику програмування.

Програма тестування має 51 різні команди, вона має доступ до шести клавіш клавіатури, двох шістнадцятирозрядних таймерів (timer0 та timer1), чотирьох змінних(A,B,C,D), вона може використовувати безпосередню або пряму адресацію, програма може мати арифметичні інструкції, зчитувати або записувати інформацію з та до ММС карти пам’яті (навіть модифікувати себе, тобто є можливість обмеження кількості тестувань), посилати команди та дані до LCD дисплею та програвати звук через стереофонічні телефони, або навіть вимикати пристрій. Довжина програми обмежена лише ємністю MMC карти, що застосовується. Пристрій не має обмежень на ємність ММС карти, що використовується. У таблиці 3.1 наведено список кодів операцій команд та їх параметрів. Команди мають різну довжину. Якщо команда не має адреси або аргументу, вона однорозрядна. Якщо має адресу – п’ятирозрядна. Якщо має аргумент або адресу та аргумент – семирозрядна. А команда програвання звуку має всі дев’ять розрядів.

На рисунку 3.1 наведені формати команд.

Наведемо приклад простої програми тестування з використанням аудіоінтерфейсу (таблиця 3.2). Адреса наведена у шістнадцятирічній системі зчислення.


Розглянемо основні процедури роботи пристрою.

Узагальнена схема алгоритму роботи програми пристрою наведена на рисунку 3.2.


Графічна схема алгоритму пристрою зображена на рисунках 3.3 – 3.5 та листі 3 графічної частини.


Головна функція – main (рисунок 3.3).

При подачі живлення, CPU проводить ініціалізацію (вершина 109) своїх портів вводу-виводу, дисплею та MP3 декодеру, зокрема ініціалізує лічильник, що виробляє переривання раз у секунду. Далі він переводить периферійні пристрої і переходить сам до стану зниженого використання електроенергії – сна (вершини 110–113). Кожну секунду лічильник виробляє переривання, що вимушує контролер вийти з режиму сна. По виході з цього режиму контролер перевіряє чи натиснена клавіатурна комбінація вмикання, і якщо ні – переходить знову до режиму сна (вершина 113).

У разі якщо ця комбінація натиснута, контролер виводить периферійні пристрої з режиму сна (вершини 114–115), ініціалізує MMC карту пам’яті (вершина 116) та перевіряє, чи є дані з USB інтерфейсу. У разі наявності даних відбувається перехід до процедури обслуговування USB інтерфейсу (вершина 117).

Далі виконується встановлення довжини одного читання з ММС карти (вершина 118) та встановлюється початкова адреса команди, що буде зчитана з ММС карти та виконана (вершина 119).

Далі починається головний цикл програми: відбувається перевірка на кінець програми та перехід до режиму сна (як ініційованого програмно, так і з клавіатури) – реалізовано у вершинах 120,122, читання дев’яти байт команди за адресою виконання IP (вершини 121,123-124) та виконання команди (вказані вершини зі 125 по 130).

Після цього відбувається перевірка на натиснення клавіш регуляції гучності, та якщо вони натиснуті – її зміна (вершини 131-132).  Після цього проводиться повернення до початку головного циклу.


Команди програми тестування поділяються на команду пустої операції, команди передачі керування, команди передачі даних, арифметичні команди, команди роботи з екраном, команди роботи зі звуком,  команди роботи з ММС та спеціальні команди (наприклад перехід до режиму сна, або команда останову).

Принцип функціонування головного алгоритму та інтерпретації команд можна уяснити з ГСА пристрою. Зазначимо лише, що команда програвання звуку переводить карту у режим читання по 32 розряди (після закінчення виконання команди режим читання відновлюється до читання по 1 розряду), тому звукова інформація, що знаходиться на карті пам’яті ММС повинна бути вирівняна по границям 32 байт.


Розглянемо функції роботи з картою пам’яті ММС.

На рисунках 3.6 – 3.12 та у таблицях 3.3 – 3.6 наведені формати та послідовність обміну використаних у програмі команд хоста, відповідей карти та даних, що передаються через інтерфейс SPI.


Функція ініціалізації карти пам’яті ММС (рисунок 3.4).


При підключенні живлення карта пам’яті ММС функціонує у режимі ММС. Для переводу її у режим SPI треба подати на її вивід CS напругу низького рівня (вибір ММС вершина 18) та послати команду CMD0 (формат команди наведено у таблиці 3.3) – вершини 19-24. Карта перейде до режиму SPI, зворотній перехід можливий тільки через відключення живлення. Зазначимо, що у режимі SPI контрольна сума, що додається до кожної команди або даних не контролюється, але повинна бути у наявності. Після кожної команди ММС необхідно провести порожню передачу (для генерації 8 синхроімпульсів – вершини 30 та 42).

     Після цього карту необхідно проініціалізувати. Для цього треба послати команду CMD1 (вершини 31-36) доки карта не відповість, що вона вже знаходиться у режиму IDLE (формат відповіді наведено на рисунку 3.6).

Після закінчення роботи з ММС картою її необхідна деактивувати (вершина 41).


Розглянемо функцію читання ММС – mmc_read (рисунок 3.5).


Спочатку виконується вибір ММС (вершина 90), далі передається команда читання (вершина 91) та адреса з CRC (вершини 92-96), після цього аналізується відповідь карти (вершини за вершиною 97), та у разі помилки виводиться повідомлення (вершини 99-100). Далі проводиться читання блоку даних з ММС до масиву (вершини 102-104), та завершаючи фази обміну з ММС (вершини  105-108).



Таблиця 3.1 – Таблиця кодів операцій команд та їх параметрів


Opcode cmd
1
adr
4
arg1
2
arg2
2

Коментарі
00 nop


Пуста операція
01 jmp adr adr

Безумовний перехід
02 jmp_if A<=arg adr arg
Умовний перехід
03 jmp_if A>arg adr arg
Умовний перехід
04 jmp_if A<=B adr

Умовний перехід
05 jmp_if A>B adr

Умовний перехід
06 jmp_if_keynot_pressed adr

Умовний перехід
07 jmp_on_key0 adr

Умовний перехід
08 jmp_on_key1 adr

Умовний перехід
09 jmp_on_key2 adr

Умовний перехід
0A jmp_on_key3 adr

Умовний перехід
0B jmp_on_key4 adr

Умовний перехід
0C jmp_on_key5 adr

Умовний перехід
0D sleep


Перевод до режиму сна
0E mov A,B


Арифметичні дії
0F mov A,C



10 mov A,D



11 mov B,A



12 mov B,C



13 mov B,D



14 mov C,A



15 mov C,B



16 mov C,D



17 mov D,A



18 mov D,B



19 mov D,C



1A mov A,arg
arg
Безпосередня адресація
1B mov B,arg
arg

1C mov C,arg
arg

1D mov D,arg
arg

1E mov A,[adr] adr

Пряма адресація
1F mov B,[adr] adr


20 mov C,[adr] adr


21 mov D,[adr] adr


22 mov [adr],A adr


23 mov [adr],B adr


24 mov [adr],C adr


25 mov [adr],D adr


26 ADD  A,B


Арифметична операція
27 ADD A,C



28 ADD A,D



29 SUB A,B



2A SUB A,C



2B SUB A,D



2C mov A,Timer0


Робота з таймером
2D mov A,Timer1



2E mov Timer0,A



2F mov Timer1,A



30 senddispcmd arg
arg
Надсилання команд до дісплею
31 senddispdata arg
arg
Надсилання інформації до дісплею
32 playsound adr, length adr arg arg Надсилання звуку до стереофонічних телефонів

 

Таблиця 3.2 – Приклад простої програми тестування з використанням аудіоінтерфейсу


Адреса             Інструкція                Коментар

0          jmp 0A                ; Перехід до адреси початку програми
0A         senddispcmd 0         ; Очистка дісплею (крок 1)
11         senddispcmd 1         ; Очистка дісплею (крок 2)
18         senddispdata ‘Q’      ; Вивід на дисплей текстової інформації
1F         senddispdata ‘1’
2D         senddispdata ‘:’
34         senddispdata ‘З’
3B         senddispdata ‘в’
42         senddispdata ‘у’
49         senddispdata ‘к’
50         playsound 200h, 3C000h; Вивід 15 секунд звуку (якщо бітрейт звукового потоку за адресою 200h
дорівнює 128кб/с)
59                       jmp_on_key0  70       ; Перехід до адреси 70h, якщо натиснута клавіша N0
5E                       jmp_on_key1  100      ; Перехід до адреси 100h, якщо натиснута
                      клавіша N1
63                       jmp 59
70                       senddispcmd 0         ; Очистка дісплею (крок 1)
77                       senddispcmd 1         ; Очистка дісплею (крок 2)
7E                       senddispdata ‘В’      ; Вивід на дисплей текстової інформації
85                       senddispdata ‘е’
8C                      senddispdata ‘р’
93                       senddispdata ‘н’
9A                      senddispdata ‘о’
A1                      jmp_if_keynot_pressed  A1       ; Перехід до адреси A1h, якщо жодна клавіша не натиснута
A6                       sleep                        ; Вимикання пристрою (перевід о режиму сна)
100                      senddispcmd 0         ; Очистка дісплею (крок 1)
107                      senddispcmd 1         ; Очистка дісплею (крок 2)
10E                      senddispdata ‘Н’     ; Вивід на дисплей текстової інформації
115                      senddispdata ‘е’
11C                      senddispdata ‘в’
123                      jmp 85

 

Таблиця 3.3 – Формат ММС команди


Розряд 47 46 45             40 39            8 7         1 0
Довжина 1 1 6 32 7 1
Значення 0 1 x x x 1
Опис стартовий біт біт передачі номер команди аргумент CRC7 кінцевий біт


Таблиця 3.4 – Використані ММС команди

 

Команда Аргумент Відповідь Абревіатура Опис
CMD0

GO_IDLE_STATE Скидання ММС карти.
CMD1

SET_OP_COND Активація процесу ініціалізації карти.
CMD16 [31..0] довжина блоку даних R1 SET_BLOCKLEN Вибір довжини блоку (у байтах) для наступних команд читання та запису.
CMD17 [31..0] адреса блоку даних R1 READ_SINGLE_BLOCK Читання блоку з розміром, вибраним командою SET_BLOCKLEN.
CMD24 [31..0] адреса блоку даних R1 WRITE_BLOCK Запис блоку з розміром, вибраним командою SET_BLOCKLEN.


Таблиця 3.5 – Стартовий токен блоку даних,


Тип токену Тип транзакції Поле даних
7 6 5 4 3 2 1 0
Стартовий блок Читання одного блоку 1 1 1 1 1 1 1 0
Стартовий блок Читання багатьох блоків 1 1 1 1 1 1 1 0
Стартовий блок Запис одного блоку 1 1 1 1 1 1 1 0
Стартовий блок Запис багатьох блоків 1 1 1 1 1 1 0 0
Зупинка транзакцій Запис багатьох блоків 1 1 1 1 1 1 0 1

 

Таблиця 3.6 – Часові параметри обміну інформацією з ММС



Мін Макс Одиниці
NCS 0 8 періодів CLK
NCR 1 8 8 періодів CLK
NCX 0 8 8 періодів CLK
NRC 1 8 періодів CLK
NAC 1 1 8 періодів CLK
NWR 1 8 періодів CLK
NEC 0 8 періодів CLK
NDS 0 8 періодів CLK
NBR 1 1 8 періодів CLK

Код операції
Код операції Адреса
Код операції Адреса Аргумент
7         0
7         0 39      8
7         0 39      8 55       40
а)
б)
в)

Код операції –– Аргумент
Код операції Адреса Аргумент
7         0 39      8 55       40
7         0 39      8 71       40
г)
д)


Рисунок 3.1 – Формати команд програми тесту:  а) однорозрядна команда;  б) п’ятирозрядна команда; в) семирозрядна команда з адресою та аргументом; г) семирозрядна команда з аргументом; д) дев’ятирозрядна команда


img16


Рисунок 3.2 – Узагальнена схема алгоритму роботи програми пристрою


img17

Рисунок 3.3 – Графічна схема алгоритму пристрою: функція main


img18

Рисунок 3.3 – Графічна схема алгоритму пристрою: функція main (продовження)


img19

Рисунок 3.4 – Графічна схема алгоритму пристрою: функція mmc_init

img20


Рисунок 3.4 – Графічна схема алгоритму пристрою: функція mmc_init (продовження)

img21

Рисунок 3.5 – Графічна схема алгоритму пристрою: функція mmc_read



img22

Рисунок 3.6 – Формат відповіді ММС карти (R1)


img23


Рисунок 3.7 – Типова послідовність обміну командами та відповідями контролера та ММС карти при читанні одного блоку


img24

Рисунок 3.8 – Типова послідовність обміну командами та відповідями контролера та ММС карти при запису одного блоку




img25

Рисунок 3.9 – Типова послідовність обміну командами та відповідями контролера та ММС карти при передачі команди у тактах шини SPI


img26

Рисунок 3.10 – Типова послідовність обміну командами та відповідями контролера та ММС карти при передачі у тактах шини SPI, якщо ММС карта зайнята


img27

Рисунок 3.11 – Типова послідовність обміну командами та відповідями контролера та ММС карти при читанні одного блоку у тактах шини SPI


img28

Рисунок 3.12 – Типова послідовність обміну командами та відповідями контролера та ММС карти при запису одного блоку у тактах шини SPI






4. РОЗРОБКА ТА ВІДЛАДКА МІКРОПРОГРАМ.


 Процес написання програм для мікроконтролерів AVR ATMEGA як, мабуть, і для будь-яких інших мікроконтролерів, складається з декількох етапів:

  1. підготовка вихідного тексту програми на якій-небудь мові програмування;

  2. компіляція програми;

  3. налагодження й тестування програми;

  4. остаточне програмування й підготовка до серійного виробництва.

Мікропрограма пристрою повинна бути написана на одній з мов програмування.

Зараз для мікроконтролеру ATMEGA 64L існують багато мов програмування та навіть  різних засобів підтримки розробки, що використовують одну мову, але різняться за функціональністю.

    На кожному з етапів необхідне застосування спеціальних програмних й апаратних засобів. Варто відзначити, що базовий набір програмного забезпечення (компілятор асемблера, ПО для програмування) поширюється фірмою Atmel безкоштовно. Однак за досить довгий період часу, що пройшов з моменту появи цих мікроконтролерів, з'явилася велика кількість програмного забезпечення сторонніх виробників. Наведемо інформацію про різні компілятори для мікроконтролерів сімейства AVR.

Компілятори асемблера

    Вибір конкретного компілятора асемблера є, мабуть, найменш принциповим питанням, оскільки сам процес компіляції (перетворення вихідного тексту програми в машинний код) виконується досить однозначно. Власне, всі відмінності між асемблерами полягають у можливостях препроцесора, що обробляє макрокоманди, наявності текстового редактора або середовища розробки й типу підтримуваної операційної системи.

AVR Studio 4

    Досить вдалим вибором при розробці програмного забезпечення для мікроконтролерів сімейства AVR може послужити інтегроване середовище розробки AVR Studio 4 фірми Atmel, що містить у собі текстовий редактор з підсвічуванням синтаксису, компілятор асемблера, симулятор, відладчик й інтерфейс із апаратними емуляторами. Дана система розповсюджується фірмою Atmel. Програма розрахована на роботу під керуванням операційних систем Windows 9x, NT, 2000. До недоліків AVRStudio можна віднести деяку нестабільність роботи відладчика, а також неповну симуляцію периферійних пристроїв (зокрема, відсутня симуляція АЦП). До плюсів же відноситься, у першу чергу, підтримка їй практично всіх мікроконтролерів сімейства AVR.

IAR AVR Assembler

Atmel безкоштовно розповсюджує асемблер фірми IAR. Даний компілятор є частиною IAR Embedded Workbench — середовища розробки, що включає в себе менеджер проектів, редактор, лінкер і менеджер бібліотек. Цей компілятор відрізняється розширеними можливостями по роботі з макросами.

GNU/Linux AVR Assembler

    Цей асемблер, будучи повністю сумісним по вхідному коді з компілятором фірми Atmel, має в порівнянні з ним кілька переваг. По-перше, він поставляється з відкритими текстами, так що користувач, якщо буде потреба, може легко додати нові можливості. По-друге, це один з декількох асемблерів для мікроконтролерів фірми AVR, що працюють під керуванням операційної системи Linux (крім того, наявність вихідних текстів дозволяє легко перенести його на будь-яку іншу Unix-систему). І нарешті, в GNU AVR Assembler значно розширені, у порівнянні з асемблером фірми Atmel, можливості по роботі з макрокомандами (зокрема, допускаються макроси усередині макросів). Програма поширюється за умовами GNU Public License (GPL).

Компілятори мови C

    Останнім часом усе популярніше стає використання компіляторів мов високого рівня при написанні програм для мікроконтролерних систем. Найбільше поширення при цьому одержали компілятори мови C, оскільки в цій мові найбільш просто реалізуються всі необхідні можливості по керуванню апаратними засобами мікроконтролерів.

IAR C Compiler

    Компілятор фірми IAR, як загальновизнано, є одним із кращих компіляторів C для мікроконтролерів сімейства AVR. Зв'язано це, у першу чергу, з наявністю в ньому багатих можливостей по оптимізації коду. Мабуть, єдиним істотним його недоліком є те, що в демонстраційній версії накладаються значні обмеження на максимальний обсяг коду. Компілятор поставляється в складі інтегрованого середовища розробки IAR Embedded Workbench (EWB), що включає в себе також компілятор асемблера, лінкер, менеджер проектів і бібліотек, а також відладчик. Він може працювати сумісно з AVR Studio.

Image Craft C Compiler

    Image Craft C Compiler є, мабуть, другим по популярності компілятором мови C для мікроконтролерів сімейства AVR. До теперішнього часу вже випущена версія 6.18 компілятора. До переваг цього компілятора можна віднести можливість підтримки мікросхем сімейства FPSLIC фірми Atmel, непоганий рівень оптимізації коду й досить низька ціна. Демо-версія компілятора не містить функціональних обмежень і лімітована тільки часом роботи (30 днів). Крім того, це, напевно, один із самих швидкорозвиваючихся компіляторів, що дозволяє сподіватися на швидке усунення існуючих недоліків.

CodeVisionAVRCCompiler

Іншим популярним компілятором мови C для мікроконтролерів сімейства AVR є Code Vision AVR C Compiler. Компілятор підтримує мікроконтролери ATTiny22, AT90S23x3, AT90S4433 та багато інших. Демонстраційна версія компілятора, так само, як і компілятор фірми IAR, має обмеження на максимальний обсяг генеруємого коду. Компілятор поставляється разом з інтегрованим середовищем розробки, у яку крім стандартних можливостей, включена досить цікава функція - CodeWizardAVR Automatic Program Generator. Фактично це генератор стандартних блоків програми, що виконують наступні функції:

  1. настроювання доступу до зовнішньої пам'яті;

  2. визначення причини скидання мікроконтролера;

  3. ініціалізацію портів уведення/виводу, зовнішніх переривань, таймерів, сторожового таймера;

  4. ініціалізацію асинхронного порту послідовної передачі даних (UART) і буферизирований прийом і передачу даних;

  5. настроювання аналогового компаратора й АЦП;

  6. ініціалізацію шини I2C і підключених до неї температурного сенсора LM75 або годинника реального часу PCF8583, DS1302, DS1307;

  7. реалізацію протоколу 1-Wire Bus й ініціалізацію температурного сенсора DS1820;

  8. керування LCD-індикатором.

    Наявність цієї можливості до деякої міри спрощує написання програм, хоча, звичайно, згенерований у такий спосіб код далеко не завжди може бути застосований без проведення змін. Наявність у середовищі розробки послідовного термінала дозволяє робити налагодження програм з використанням послідовного порту мікроконтролера.

Інші компілятори мови C

    Крім перерахованих вище існує ще кілька компіляторів мови C для мікроконтролерів сімейства AVR фірми Atmel. Однак, у силу деяких причин (підтримка тільки деяких членів сімейства AVR, низька якість компіляції й т.п.), вони не одержали широкого поширення. Нижче наведена інформація про деяких з них.


Компілятори Basic

    Крім C при розробці програмного забезпечення для мікроконтролерних систем застосовуються й інші мови високого рівня. Так, для мікроконтролерів сімейства AVR існують також компілятори мов Basic, Pascal й Forth.

    BASCOM-AVR

Компілятор мови Basic, розроблений фірмою MCS Electronics. Є демо-версия з обмеженням на обсяг генеруємого коду. По вхідному коді компілятор практично повністю сумісний з компіляторами VisualBasic/QuickBasic фірми Microsoft. У синтаксис мови додано кілька нових команд для забезпечення підтримки LCD-індикаторів, I2C й 1-Wire інтерфейсів, обробки переривань й інших специфічних для мікроконтролерів можливостей

   ABC Basic Compiler

Розроблений фірмою Investments Technologies PTY, дозволяє писати й налагоджувати програми мовою Basic в інтегрованому середовищі розробки. Існують версії компілятора як під Windows, так і під DOS.


Для програмування був вибраний язик C (а саме його модифікація EC). У якості засобів підтримки розробки вибрані IAR Embedded Workbench та AVR Studio 4.


Отже алгоритм, наведений у пункті 3, реалізовано на язику програмування EС (вдосконалений С++ для мікроконтролерів) за допомогою EC компілятору IAR Embedded Workbench 3.20C/W32 (3.20.3.5) та AVR Studio 4.


Язик EC, що є модифікацією С++ для мікроконтролерів (теоретично може навіть працювати з класами) є язиком високого рівня, що не потребує багатих затрат пам’яті, програми, що на ньому написані не мають значного падіння швидкодійності при порівнянні з асемблером. Отже язик EC є найбільш оптимальним для написання програми (прошивки мікроконтролеру).


Результуюча програма, згідно з компілятором займає 6 949 байт коду ( а також 88 байт по стандартним адресам, наприклад переходи векторів переривань) та    447 байт пам’яті даних ( 23 байт по стандартним адресам).


На рисунках 4.1 – 4.3 наведений зовнішній вигляд IAR Embedded Workbench.

На рисунку 4.4  наведено зовнішній вигляд AVR Studio.



img29


Рисунок 4.1 – зовнішній вигляд IAR Embedded Workbench



img30


Рисунок 4.2 – зовнішній вигляд IAR Embedded Workbench (відладка)



img31


Рисунок 4.3 – зовнішній вигляд IAR Embedded Workbench (відладка)


img32


Рисунок 4.4 – зовнішній вигляд AVR Studio (відладка)

 

 

 

 

 

5. АНАЛІЗ РЕЗУЛТАТІВ.

Проведемо аналіз результатів роботи пристрою, а саме його часових діаграм обміну інформацєй.


На плакаті наведени  часові діаграми обміну інформацєй між мікроконтролером та веденими пристроями.


Розглянемо часову діаграму передачі даних через SPI (наведена на плакаті).

Пристрій шина SPI має три інтерфейсні лінії :


Для передачі інформації до або з пристрою, необхідно перевести лінію XCS до низького стану, тобто вибрати пристрій. Далі активізується сигнал SCK. По кожному фронті або спаді синхроімпульсу (задається у єдиній для усіх пристроїв на шині параметрів) інформація з лінії SI записується до периферійного пристрою, одночасно відповідно по спаду або фронту  синхроімпульсу по лінії SO відбувається передача інформації з перефирійного пристрою по керуючого пристрою. Параметри часових затримок наведені у таблиці, що наведена на плакаті.


На плакаті наведено рисунок, що відображує підключення до шини SPI одночасно двох пристройів – карти MMC та MP3 декодеру.


SPI являє собою фізичний інтерфейс передачі інформації. На базі цього інтерфейсу побудовані інтерфейси обміну з MP3 декодером (протоколи SCI та SDI), а також обмін інформацією з картою пам’яті ММС.


Розглянемо кожен з них.


Протокол обміну даних з MP3 декодером SDI (наведено на плакаті).

Протокол базується на протоколі фізичного рівня SPI.

Він має наступні інтерфейсні лінії:


Призначення ліній DCLK та SDATA співпадає з призначенням ліній SCK та SI базового інтерфейсу.

Лінія стартового біту BSYNC, є вхідною. Ця лінія говорить пристрою,  що перший біт, що надходить по лінії даних, після переднього фронту BSYNC є старшим бітом байту. Таким чином наявність цієї лінії компенсує відсутність лінії базового інтерфейсу XCS.

Лінія запитання вхідних даних DREQ активується якщо пристрій в змозі прийняти дані через інтерфейс SDI.


Протокол обміну керуючою інформацією з MP3 декодером SСI (наведено на плакаті).

Протокол базується на протоколі фізичного рівня SPI (наведений на плакаті). Його інтерфейсі лінії цілковито співпадають з лініями базового протоколу.

Після активізації пристрою, до нього через лінії SI надходить команда запису (2) або читання (3). Далі через лінії SI надходить адреса потрібного регістру. Якщо була передана команда запису, то через лінію SI надходить слово даних, а у випадку команди читання через лінію SO проводиться передача слова даних.


Протокол обміну інформацією з картою ММС базується на протоколі фізичного рівня SPI (наведений на плакаті). Його інтерфейсі лінії цілковито співпадають з лініями базового протоколу.


Типові послідовності обміну інформацій з картою ММС наведені на плакаті.


Узагальнена ГСА роботи пристрою наведена на плакаті.




ВИСНОВОК

     Результатом роботи над курсовим проектом стала розробка портативного пристрою тестування знань на основі мікроконтролеру та інтерфейсу USB.

Прибор має унікальні властивості, що відрізняють його від існуючих пристроїв такого типу. Перевагою даного пристрою є його система тестів. Пристрій не виконує вибірку даних за постійною програмою, а зчитує програму-тест з пам’яті (зі змінного носія), що дає йому широкі можливості для виконання різноманітних тестів та тестових підходів без внесення конструктивних та програмних змін у сам прилад.

Пристрій виконано на загальнодоступній елементній базі, що робить його виробництво і застосування дешевими та економічно вигідним.

Цей пристрій може використовуватися у багатьох областях народного господарства.

 

 

 

СПИСОК ДЖЕРЕЛ, ЩО ВИКОРИСТОВУВАЛИСЯ

  1. MultiMediaCard Product Manual. – SanDisk, 2003 – 100с.  (www.sandisk.com)

  2. ATMEL ATMEGA64x Datasheet doc2490. – ATMEL, 2004 – 393с. (www.atmel.com)

  3. Сайт www.zinetz.info

  4. VS1001k - mpeg audio codec datasheet. – VLSI Solution, 2004 – 40с. (www.vlsi.fi)

  5. VS10XX - application notes. – VLSI Solution, 2004 – 46с. (www.vlsi.fi)

  6. FT245BM USB FIFO ( USB - Parallel ) I.C. datasheet ds245b10 – FDTI, 2004 – 22c. (www.ftdichip.com)

  7. Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы “ATMEL”, М.: Додэка–XXI, 2004 – 560c.

  8. Java по-украински  /Мир Связи. – Киев. – 2004, N12. – c.12.




Додаток 1. – Лістинг мікропрограми.


/* ***********************************************************************

**

**  Copyright (C) 2004  Alexandr Koval <Alex.usu@gmail.com>.

**

**

**  USB multifunctional portable multimedia device

**

**

**************************************************************************/

/*EC for IAR Embedded Workbench

**************************************************************************/

// CPU is running with a 8.0 MHz clock


#include <iom64.h> //internal register addresses for ATmega64.

#include <inavr.h> //Intrinsics for iccAVR

//Global variables1

 unsigned int worktimer;     // how much time device works

 unsigned int timer0;        // emulator's timer0

 unsigned int timer1;        // emulator's timer1

 unsigned char mmc_error;    // general mmc error flag

 unsigned char mmcdata[32] ; // Data read from mmc

 unsigned long i;            // temp

 unsigned long  mmc_lng;     // current length for mmc rw operations


// -====================System low-level routines===================-

// delay in mks

delaymks(unsigned long m)

{

unsigned long i,k;

k=(m<<3)/11;            //  8 MHz

for (i=0;i<k;i++) {asm ("nop");} // 11 cycles per one interation

}


// IRQ handler for timer 1

#pragma vector=TIMER1_COMPA_vect

__interrupt void irqHandler(void)

{

worktimer++;

timer0++;

timer1++;

};                      

void lcd_cmd(unsigned char cmd);

void lcd_data(unsigned char data);

// print error message if MMC error appears

void mmc_error_print (void)

{

char i;

lcd_cmd (1);       // clr

lcd_cmd (2);       // home

lcd_cmd (0xC);     // disp on

lcd_data ('M');

lcd_data ('M');

lcd_data ('C');

lcd_data ('E');

lcd_data ('R');

lcd_data ('R');

lcd_data ('@');

for (i=0;i<8;i++)

 if ((SPDR&(0x80>>i))) lcd_data ('1'); else lcd_data ('0');

while (!PORTA);    // wait any key to continue

while (PORTA);     // wait any key to continue

mmc_error=0;

}


// Init hw at powerup

void powerup_init (void)

{

   worktimer=0;

   timer0=0;

   timer1=0;

   //Keyboard init

   DDRA=0;         // Set input direction for keyboard

   PORTA=0xFF;    // Resistors ON

   DDRB=0xFB;      // Set sound and data directions;Reset VS1001k

   PORTB=0xB0;     // Set initial settings for sound and data and SPI

   //PORTC and DDRC no need to change default settings

   DDRD=0xC0;      // Set USB directions

   PORTD=0x80;     // Set initial settings for USB

   DDRE=0x0C;      // Set SDI and LCD directions

   PORTE=0x00;     // Set initial settings for SDI and LCD

   DDRF=0xFF;      // Set output direction for LCD data bus

   PORTF=0x00;     // Set initial settings for LCD

   //PORTG and DDRG no need to change default settings

   //Set SPI

   SPCR=0x50;      // SPI enable;no int from SPI;MSB;Master;rise edge;speed = clk/2

   SPSR=0x01;      // speed = clk/2

   PORTB^=0x20;    // VS1001k reset=0;

   for (i=0;i<11000;i++)  

     {SPDR=0x00; while (!(SPSR&0x80)); } // set SPIF bit in SPSR; end reset VS1001k

   TCCR1A=0x00;    // output pin disabled;CTC mode

   TCCR1B=0X0d;    // DIVISOR 1024;CTC mode

   OCR1A=0x2000;   // max counter value, so at 8mhz interrupt appears one per second

   TIMSK=0x10;     //enable timer1 interrupt

   SREG = 0x80;    // enable global interrupt    

   lcd_cmd (0x34); //8bit;1str;5x10

   delaymks (5000);

   lcd_cmd (0x01); // CLR

   lcd_cmd (0x02); // home

   lcd_cmd (0x06); // mode cur shr

   lcd_cmd (0x08); // displ off


}    

// Init mmc card

void mmc_init (void)

{

   mmc_error=0;   // General MMC error flag

   // send CMD0

   PORTB^=0x80; // select MMC

   while (!(SPSR&0x80));  // wait while MMC tranfer finish

   SPDR=0x40; //CMD0

   while (!(SPSR&0x80));

   SPDR=0; //     ; arg [24..31]

   while (!(SPSR&0x80));

   SPDR=0; //     ; arg [16..23]

   while (!(SPSR&0x80));

   SPDR=0; //     ;arg [8..15]

   while (!(SPSR&0x80));

   SPDR=0; //     ;arg [0..7]

   while (!(SPSR&0x80));

   SPDR=0x95; // CRC

   while (!(SPSR&0x80));

   SPDR=0xFF; // pause

   while (!(SPSR&0x80));

   SPDR=0xFF; // get info

   while (!(SPSR&0x80));

   //SPDR=R1 response

   if (SPDR&0xFE)

     {mmc_error=1; // general mmc error flag

      mmc_error_print();

     }

   PORTB^=0x80; // deselect MMC

   SPDR=0x00; // any 8 clk

   while (!(SPSR&0x80));

   // end CMD0

   do

   {

    //send CMD1

    PORTB^=0x80; // select MMC

    while (!(SPSR&0x80));

    SPDR=0x41; //CMD1

    while (!(SPSR&0x80));

    SPDR=0; //     ; arg [24..31]

    while (!(SPSR&0x80));

    SPDR=0; //     ; arg [16..23]

    while (!(SPSR&0x80));

    SPDR=0; //     ;arg [8..15]

    while (!(SPSR&0x80));

    SPDR=0; //     ;arg [0..7]

    while (!(SPSR&0x80));

    SPDR=0x95; // CRC

    while (!(SPSR&0x80));

    SPDR=0xFF; // pause

    while (!(SPSR&0x80));

    SPDR=0xFF; //

   while (!(SPSR&0x80));

    if (SPDR&0xFE)

     {mmc_error=1; // general mmc error flag

      mmc_error_print();

     }

   }

   while (SPDR&1);

   PORTB^=0x80; // deselect MMC

   SPDR=0x00; // any 8 clk

   while (!(SPSR&0x80));

   // end CMD1

}

// -====================MMC interface ===================-

// set lenght mmc read/write

mmc_set_rw_lenght (unsigned long lng)

{   mmc_lng=lng;

   PORTB^=0x80; // select MMC

   while (!(SPSR&0x80));

   SPDR=0x50; //CMD16

   while (!(SPSR&0x80));

   SPDR=(lng>>24)&0xFF; //     ; arg [24..31]

   while (!(SPSR&0x80));

   SPDR=(lng>>16)&0xFF; //     ; arg [16..23]

   while (!(SPSR&0x80));

   SPDR=(lng>>8)&0xFF; //     ;arg [8..15]

   while (!(SPSR&0x80));

   SPDR=lng&0xFF; //     ;arg [0..7]

   while (!(SPSR&0x80));

   SPDR=0x95; // CRC

   while (!(SPSR&0x80));

   SPDR=0xFF; // pause

   while (!(SPSR&0x80));

   SPDR=0xFF; // get info

   while (!(SPSR&0x80));

   //SPDR=R1 response

   if (SPDR&0xFE)

     {mmc_error=1; // general mmc error flag

      mmc_error_print();

     }


   PORTB^=0x80; // deselect MMC

   SPDR=0x00; // any 8 clk

   while (!(SPSR&0x80));

   // end CMD16

}

// MMC read

mmc_read (unsigned long adr)

{

   PORTB^=0x80; // select MMC

   while (!(SPSR&0x80));

   SPDR=0x51; //CMD17

   while (!(SPSR&0x80));

   SPDR=(adr>>24)&0xFF; //     ; arg [24..31]

   while (!(SPSR&0x80));

   SPDR=(adr>>16)&0xFF; //     ; arg [16..23]

   while (!(SPSR&0x80));

   SPDR=(adr>>8)&0xFF; //     ;arg [8..15]

   while (!(SPSR&0x80));

   SPDR=adr&0xFF; //     ;arg [0..7]

   while (!(SPSR&0x80));

   SPDR=0x95; // CRC

   while (!(SPSR&0x80));

   SPDR=0xFF; // pause

   while (!(SPSR&0x80));

   SPDR=0xFF; // get info

   while (!(SPSR&0x80));

   //SPDR=R1 response

   if (SPDR&0xFE)

     {mmc_error=1; // general mmc error flag

      mmc_error_print();

     }


   SPDR=0xFF; // pause

   while (!(SPSR&0x80));  

   for (i=0;i<mmc_lng;i++)

   {SPDR=0xFF; // get info

    while (!(SPSR&0x80));

    mmcdata[i]=SPDR;

   }

   SPDR=0xFF; // get CRC    

   while (!(SPSR&0x80));

   SPDR=0xFF; // get CRC

   PORTB^=0x80; // deselect MMC

   while (!(SPSR&0x80));

   SPDR=0x00; // any 8 clk

   while (!(SPSR&0x80));

   // end CMD17

}

// MMC write

mmc_write (unsigned long adr)

{

   PORTB^=0x80; // select MMC

   while (!(SPSR&0x80));

   SPDR=0x58; //CMD24

   while (!(SPSR&0x80));

   SPDR=(adr>>24)&0xFF; //     ; arg [24..31]

   while (!(SPSR&0x80));

   SPDR=(adr>>16)&0xFF; //     ; arg [16..23]

   while (!(SPSR&0x80));

   SPDR=(adr>>8)&0xFF; //     ;arg [8..15]

   while (!(SPSR&0x80));

   SPDR=adr&0xFF; //     ;arg [0..7]

   while (!(SPSR&0x80));

   SPDR=0x95; // CRC

   while (!(SPSR&0x80));

   SPDR=0xFF; // pause

   while (!(SPSR&0x80));

   SPDR=0xFF; // get info

   while (!(SPSR&0x80));

   //SPDR=R1 response

   if (SPDR&0xFE)

     {mmc_error=1; // general mmc error flag

      mmc_error_print();

     }

   SPDR=0xFF; // pause

   while (!(SPSR&0x80));

   SPDR=0xFE; // start data token    

   while (!(SPSR&0x80));

   for (i=0;i<mmc_lng;i++)

   {SPDR=mmcdata[i];

    while (!(SPSR&0x80));

   }

   SPDR=0xFF; // CRC

   while (!(SPSR&0x80));

   SPDR=0xFF; // CRC

   while (!(SPSR&0x80));

   SPDR=0xFF; // get info

   while (!(SPSR&0x80));      

   if ((SPDR&0x1F)!=5)

     {mmc_error=1; // general mmc error flag

      mmc_error_print();

     }

   SPDR=0x00; // any 8 clk

   while (!(SPSR&0x80));

   while (!(PORTB&4))    // wait until mmc busy status disappeared

   {SPDR=0xFF; // get info

    while (!(SPSR&0x80));

   };

   PORTB^=0x80; // deselect MMC

   // end CMD24

}



// -==================VS1001K interface ===================-

//  -===================SCI interface=====================-

sci_write (unsigned char adr,unsigned short Data)

{

 PORTB&=0xEF; // select SCI

 while (!(SPSR&0x80));

 SPDR=0x02; //Write

 while (!(SPSR&0x80));

 SPDR=adr; //Adr

 while (!(SPSR&0x80));

 SPDR=Data>>8;//DataHi

 while (!(SPSR&0x80));

 SPDR=Data&0xff;//DataLo

 while (!(SPSR&0x80));

 PORTB|=0x10; // deselect SCI

};

unsigned short sci_read (unsigned char adr)

{

 unsigned short tmp;

 PORTB&=0xEF; // select SCI

 while (!(SPSR&0x80));

 SPDR=0x03; //Read

 while (!(SPSR&0x80));

 SPDR=adr; //Adr

 while (!(SPSR&0x80));

 SPDR=0; // any value

 while (!(SPSR&0x80));

 tmp=SPDR;//DataHi

 tmp=tmp<<8;

 SPDR=0; // any value

 while (!(SPSR&0x80));

 tmp|=SPDR;//DataHi

 PORTB|=0x10; // deselect SCI

 return tmp;  

};

//  -===================SDI interface=====================-

sdi_32write (void)

{char i;

for ( i=0;i<32;i++)

{

  while (!(SPSR&0x80));

  PORTB|=0x40;   // BSYNC=1

  SPDR=mmcdata[i];

  PORTB^=0x40;   // BSYNC=0

}

while (!(SPSR&0x80));

}

// -====================LCD interface======================-

//send lcd command

void lcd_cmd(unsigned char cmd)  

{

 PORTF=cmd;

 PORTE&=0xF7; // RS=0

 delaymks (1);

 PORTE|=0x4;  // strobe

 delaymks (1);

 PORTE^=0x4;  // strobe

 delaymks (40);

}

//send lcd data

void lcd_data(unsigned char data)

{

 PORTF=data;

 PORTE|=8; // RS=1

 delaymks (1);

 PORTE|=0x4;  // strobe

 delaymks (1);

 PORTE^=0x4;  // strobe

 delaymks (40);

}


//  -===================USB support=====================-

// send string

usb_send (unsigned char *str,char mmc)

{  

 unsigned char i=0;

 DDRC=0xFF; // Set output direction for USB databus

 while ((str[i]!=0)&&(mmc==0)||((i!=32)&&(mmc==1)))

 {    

  while (PORTD&0x20); // wait until send buffer flushes;

  PORTC=str[i];

  PORTD^=0x40;  // set usb info (usbwr=1)

  PORTD^=0x40;  // set usb info (usbwr=0)

  i++;

 }

 DDRC=0; // Set input direction for USB databus

};  

// general USB support

usb_support()

{    unsigned int i;

    unsigned long adr;

    char exit=0;

while (!exit)

{

 PORTD^=0x80; // get usb info (usbrd=0)

 PORTD^=0x80; // get usb info (usbrd=1)

 if (PORTC=='V')

  {

    usb_send ("USB multifunctional portable multimedia device\n Hardware v. 1.0\nFirmware v. 1.1\nOK\n>",0);

  }              

 if (PORTC=='Q')

  {

    usb_send ("Exit\nOK\n",0);

    exit=1;

  }              

 if (PORTC=='W')

  {

    mmc_set_rw_lenght (32);

    usb_send ("Work with 32 bytes slices\nSend 4-bytes address to write to\n",0);

    for (i=0;i<4;i++)

    {

     while (PORTG&1);

     PORTD^=0x80; // get usb info (usbrd=0)

     PORTD^=0x80; // get usb info (usbrd=1)

     adr<<=8;

     adr|=PORTC;

    }

    usb_send ("Send data (32 bytes) to write to\n",0);      

    for (i=0;i<32;i++)

    {

     while (PORTG&1);

     PORTD^=0x80; // get usb info (usbrd=0)

     PORTD^=0x80; // get usb info (usbrd=1)

     mmcdata[i]=PORTC;

    }

    usb_send ("Writing...\n",0);      

    mmc_write (adr);

    if (mmc_error==1)      {usb_send ("Error!\n>",0); mmc_error_print();}

    else     usb_send ("OK\n>",0);

    mmc_set_rw_lenght (1);

  }              

 if (PORTC=='R')

  {

    mmc_set_rw_lenght (32);

    usb_send ("Work with 32 bytes slices\nSend 4-bytes address to read to (in Intel notation)\n",0);

    for (i=0;i<4;i++)

    {                

     while (PORTG&1);

     PORTD^=0x80; // get usb info (usbrd=0)

     PORTD^=0x80; // get usb info (usbrd=1)

     adr<<=8;

     adr|=PORTC;

    }

    usb_send ("Reading...\n",0);      

    mmc_read (adr);

    if (mmc_error==1)      {usb_send ("Error!\n>",0);mmc_error_print();continue;}

    usb_send ("Receive data (32 bytes) to read to\n",0);      

    usb_send (mmcdata,1);

    usb_send (">",0);

    mmc_set_rw_lenght (1);    

  }              

}

}

//Global variables2    

char poweroffflag;      // if 1 then device go to idle state

unsigned int temppofftimer; // seconds of pressing poweroff keyboard combination

union {            // emulator's command structure

unsigned char data[9]; // 9 max lenght

struct

 {            // Off Len AllLen

  unsigned char cmd;   // 0    1   1      opcode

  unsigned long adr;   // 1    4   5      address

  unsigned short arg;  // 5    2   7      argument1

  unsigned short arg2; // 8    2   9      argument2

 } a;

} cmd;

unsigned long IP;       // instruction pointer

unsigned short A,B,C,D; // emulator program's variables

//=================================================================Main

int main(void)

{

//-------------------------INIT

powerup_init ();    


while (1){              // infinite loop

poweroffflag=0;        // if 1 then device go to idle state

MCUCR&=0xE3;           // SLEEP mode: IDLE

MCUCR|=0x20;           // SLEEP mode enable

sci_write (0,0x10) ;   // power down for VS1001k

lcd_cmd (0x08);        // displ off


while (PORTA!=0xC0)    // wait power_on kb combination

 {asm ("SLEEP");}

sci_write (0,0x0);     // power on for VS1001k

lcd_cmd (0xC);         // disp on

mmc_init();            // init MMC card

if ((PORTG&1)==0) usb_support();   // Is USB link active ?

mmc_set_rw_lenght (1); // 1 byte

IP=0;                  // Start address

while (!poweroffflag)  // main loop

{

//power off keyb combination

 if  (PORTA==0xC0) temppofftimer=worktimer;

 while (PORTA==0xC0){ if  ((temppofftimer+5)<worktimer)  {poweroffflag=1;continue;}}

// get current command

 for (i=0; i<9;i++)

 {

  mmc_read (IP+i);

  cmd.data[i]=mmcdata[0];

 }  

//CASE

 switch (cmd.a.cmd) {

  case 0 : IP+=1;break; // nop

//jmp

  case 1 : IP+=5;IP=cmd.a.adr;break;

  case 2 : IP+=7;if (A<=cmd.a.arg) IP=cmd.a.adr;break;

  case 3 : IP+=7;if (A>cmd.a.arg) IP=cmd.a.adr;break;

  case 4 : IP+=5;if (A<=B) IP=cmd.a.adr;break;

  case 5 : IP+=5;if (A>B) IP=cmd.a.adr;break;

  case 6 : IP+=5;if ((PORTA&0x3F)==0) IP=cmd.a.adr;break;  // no key

  case 7 : IP+=5;if (PORTA&0x01) IP=cmd.a.adr;break;       // key0

  case 8 : IP+=5;if (PORTA&0x02) IP=cmd.a.adr;break;       // key1

  case 9 : IP+=5;if (PORTA&0x04) IP=cmd.a.adr;break;       // key2

  case 0xA : IP+=5;if (PORTA&0x08) IP=cmd.a.adr;break;     // key3

  case 0xB : IP+=5;if (PORTA&0x10) IP=cmd.a.adr;break;     // key4

  case 0xC : IP+=5;if (PORTA&0x20) IP=cmd.a.adr;break;     // key5

//sleep

  case 0xD : IP+=1;poweroffflag=1;break;           // end program and go to sleep

//variables

  case 0xE : IP+=1;A=B;break;

  case 0xF : IP+=1;A=C;break;

  case 0x10 : IP+=1;A=D;break;

  case 0x11 : IP+=1;B=A;break;

  case 0x12 : IP+=1;B=C;break;

  case 0x13 : IP+=1;B=D;break;

  case 0x14 : IP+=1;C=A;break;

  case 0x15 : IP+=1;C=B;break;

  case 0x16 : IP+=1;C=D;break;

  case 0x17 : IP+=1;D=A;break;  

  case 0x18 : IP+=1;D=B;break;  

  case 0x19 : IP+=1;D=C;break;  

// immediate

  case 0x1A : IP+=7;A=cmd.a.arg;break;  

  case 0x1B : IP+=7;B=cmd.a.arg;break;  

  case 0x1C : IP+=7;C=cmd.a.arg;break;

  case 0x1D : IP+=7;D=cmd.a.arg;break;  

// direct

  case 0x1E : IP+=5;mmc_read(cmd.a.adr+1);A=mmcdata[0]; mmc_read(cmd.a.adr); A=A<<8;A|=mmcdata[0];break;      

  case 0x1F : IP+=5;mmc_read(cmd.a.adr+1);B=mmcdata[0]; mmc_read(cmd.a.adr); B=B<<8;B|=mmcdata[0];break;        

  case 0x20 : IP+=5;mmc_read(cmd.a.adr+1);C=mmcdata[0]; mmc_read(cmd.a.adr); C=C<<8;C|=mmcdata[0];break;      

  case 0x21 : IP+=5;mmc_read(cmd.a.adr+1);D=mmcdata[0]; mmc_read(cmd.a.adr); D=D<<8;D|=mmcdata[0];break;      


  case 0x22 : IP+=5;mmcdata[0]=((A>>8)&0xFF); mmc_write(cmd.a.adr+1);mmcdata[0]=(A&0xFF); mmc_write(cmd.a.adr);break;      

  case 0x23 : IP+=5;mmcdata[0]=((B>>8)&0xFF); mmc_write(cmd.a.adr+1);mmcdata[0]=(B&0xFF); mmc_write(cmd.a.adr);break;      

  case 0x24 : IP+=5;mmcdata[0]=((C>>8)&0xFF); mmc_write(cmd.a.adr+1);mmcdata[0]=(C&0xFF); mmc_write(cmd.a.adr);break;      

  case 0x25 : IP+=5;mmcdata[0]=((D>>8)&0xFF); mmc_write(cmd.a.adr+1);mmcdata[0]=(D&0xFF); mmc_write(cmd.a.adr);break;              

// math  

  case 0x26 : IP+=1;A+=B;break;

  case 0x27 : IP+=1;A+=C;break;

  case 0x28 : IP+=1;A+=D;break;


  case 0x29 : IP+=1;A-=B;break;

  case 0x2A : IP+=1;A-=C;break;

  case 0x2B : IP+=1;A-=D;break;

//timer

  case 0x2C : IP+=1;A=timer0;break;

  case 0x2D : IP+=1;A=timer1;break;

  case 0x2E : IP+=1;timer0=A;break;

  case 0x2F : IP+=1;timer1=A;break;  

//disp

  case 0x30 : IP+=7;lcd_cmd(cmd.a.arg&0xFF);break;    

  case 0x31 : IP+=7;lcd_data(cmd.a.arg&0xFF);break;        

// MP3                        

  case 0x32 : IP+=9;                

    sci_write (0,sci_read(0)|4); // start soft reset

    delaymks (300);// delay >> 300mks

    for (i=0;i<32;i++) mmcdata[i]=0;

    sdi_32write();  // send 32 zeros to MP3 decoder


    mmc_set_rw_lenght (32); // 32 byte

    for (i=0;i<(cmd.a.arg|(cmd.a.arg2*0x10000));i+=32)

    {

     mmc_read(cmd.a.adr+i);

     while ((PORTE&0x80)==0); // wait intil DREQ=1;

     sdi_32write();           // send 32 byte to MP3 decoder

     if (PORTA==0x40) sci_write (11,sci_read(11)+0x0101);      // vol--

     if (PORTA==0x80) sci_write (11,sci_read(11)-0x0101);      // vol++

    }

    mmc_set_rw_lenght (1); // 1 byte        

    for (i=0;i<32;i++) mmcdata[i]=0;

    for (i=0;i<64;i++) sdi_32write();           // send 2048 zeros to MP3 decoder

    break;        

  default:break;

 }    

//end CASE  

if (PORTA==0x40) sci_write (11,sci_read(11)+0x0101);           // vol--

if (PORTA==0x80) sci_write (11,sci_read(11)-0x0101);           // vol++

}  // end main loop


}

}


Додаток 2. – Перелік елементів принципової схеми.


Позначення        Тип               Номінал           Кількість


C1,C6,C8,С13,C16,C18  К10-47в       0,1 мкФ           5

С2, С5, С7        C-EUC0805         10 мкФ            3

C3, C4, C14, C15  КМ5в              27 пФ             4

С11, С12, С17     КМ5в              33 пФ             3

С9, С10           ELNA_CAP_63       100 мкФ           2

С19               К10-17в           0,01 мкФ          1


DD1               ATMEGA64L                           1

DD2               VS1001k                             1

DD3               FT245BM                             1


G1                HC49U-V           8.000 МГц         1

G2                HC49U-V           24,576 МГц        1

G3                HC49U-V           6,000 МГц         1


L1,L2,L3          L4532M            100 мкГн          3



R1, R2, R4, R5    Р1-12  – 0,125Вт  10 кОм            4

R3                Р1-12  – 0,125Вт  1МОм              1

R6                Р1-12  – 0,125Вт  470 Ом            1

R7, R8            Р1-12  – 0,125Вт  27 Ом             2

R9                Р1-12  – 0,125Вт  1.5 кОм           1


S1...S8           SKHHLQ                              8



X1                2POL-PCB                            1

X2                SH-1                                1

X3                MTA14-156                           1

X4                MTA06-100                           1

X5                JACKSW                              1

X6                USB-787780                          1