МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
Кафедра “Електронні обчислювальні машини”
Пояснювальна записка
до курсового проекту
по курсу “СРЧ”
На тему :
"Портативний пристрій для тестування знань."
із спецчастиною:
„Розробка портативного пристрою тестування
знань на основі мікроконтролеру та інтерфейсу 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.
Пристрій складається з пристрою керування – мікроконтролеру (далі 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 являє собою складову частину системи взаємодії з користувачем.
КВ являє собою пристрій вводу інформації. За допомогою його користувач вводить інформацію до програми, що знаходиться на ММС, регулює гучність ТФ, вмикає чи вимикає пристрій, реагує на повідомлення про помилки. КВ являє собою складову частину системи взаємодії з користувачем.
Пристрої інформують ЦПУ про закінчення операцій та зміни їх стану.
Рисунок 1.1 – Структурна схема портативного пристрою для тестування знань
Для надання пристрою наступної функціональності проведемо вибір компонентів пристрою. Розглянемо технічні характеристики окремих елементів схеми.
Усі елементи пристрою можуть функціонувати при напрузі живлення 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).
При трасуванні друкованої плати використовувалися наступні характеристики трасирування:
товщина друкованих доріжок : 0,254 мм
діаметр перехідних отворів: 0,6096 мм
діаметр металізації коло перехідних отворів: 1,016 мм
тип перехідних отворів : круглі
Рисунок 2.1 – Декодер MP3 потоку VS1001k
Рисунок 2.2 – Структурна схема VS1001k
Рисунок 2.3 – Типова схема підключення VS1001k
Рисунок 2.4 – Інтерфейс USB FT245BM
Рисунок 2.5 – Структурна схема FT245BM
Рисунок 2.6 – Типова схема підключення FT245BM
Рисунок 2.7 – РКІ PC 1202-A
Рисунок 2.8 – Структурна схема ММС карти пам’яті
Рисунок 2.9 – Типова схема підключення ММС карти пам’яті
Рисунок 2.10 – Мікроконтролер ATMEGA 64L
Рисунок 2.11 – Структурна схема ATMEGA 64L
Рисунок 2.12 – Система EAGLE
Рисунок 2.13 – Принципова схема, розроблена у системі EAGLE
Рисунок 2.14 – Друкована плата, розроблена у системі EAGLE
Автором була розроблена система тестування “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 – Формати команд програми тесту: а) однорозрядна команда; б) п’ятирозрядна команда; в) семирозрядна команда з адресою та аргументом; г) семирозрядна команда з аргументом; д) дев’ятирозрядна команда
Рисунок 3.2 – Узагальнена схема алгоритму роботи програми пристрою
Рисунок 3.3 – Графічна схема алгоритму пристрою: функція main
Рисунок 3.3 – Графічна схема алгоритму пристрою: функція main (продовження)
Рисунок 3.4 – Графічна схема алгоритму пристрою: функція mmc_init
Рисунок 3.4 – Графічна схема алгоритму пристрою: функція mmc_init (продовження)
Рисунок 3.5 – Графічна схема алгоритму пристрою: функція mmc_read
Рисунок 3.6 – Формат відповіді ММС карти (R1)
Рисунок 3.7 – Типова послідовність обміну командами та відповідями контролера та ММС карти при читанні одного блоку
Рисунок 3.8 – Типова послідовність обміну командами та відповідями контролера та ММС карти при запису одного блоку
Рисунок 3.9 – Типова послідовність обміну командами та відповідями контролера та ММС карти при передачі команди у тактах шини SPI
Рисунок 3.10 – Типова послідовність обміну командами та відповідями контролера та ММС карти при передачі у тактах шини SPI, якщо ММС карта зайнята
Рисунок 3.11 – Типова послідовність обміну командами та відповідями контролера та ММС карти при читанні одного блоку у тактах шини SPI
Рисунок 3.12 – Типова послідовність обміну командами та відповідями контролера та ММС карти при запису одного блоку у тактах шини SPI
4. РОЗРОБКА ТА ВІДЛАДКА МІКРОПРОГРАМ.
Процес написання програм для мікроконтролерів AVR ATMEGA як, мабуть, і для будь-яких інших мікроконтролерів, складається з декількох етапів:
підготовка вихідного тексту програми на якій-небудь мові програмування;
компіляція програми;
налагодження й тестування програми;
остаточне програмування й підготовка до серійного виробництва.
Мікропрограма пристрою повинна бути написана на одній з мов програмування.
Зараз для мікроконтролеру ATMEGA 64L існують багато мов програмування та навіть різних засобів підтримки розробки, що використовують одну мову, але різняться за функціональністю.
На кожному з етапів необхідне застосування спеціальних програмних й апаратних засобів. Варто відзначити, що базовий набір програмного забезпечення (компілятор асемблера, ПО для програмування) поширюється фірмою Atmel безкоштовно. Однак за досить довгий період часу, що пройшов з моменту появи цих мікроконтролерів, з'явилася велика кількість програмного забезпечення сторонніх виробників. Наведемо інформацію про різні компілятори для мікроконтролерів сімейства AVR.
Вибір конкретного компілятора асемблера є, мабуть, найменш принциповим питанням, оскільки сам процес компіляції (перетворення вихідного тексту програми в машинний код) виконується досить однозначно. Власне, всі відмінності між асемблерами полягають у можливостях препроцесора, що обробляє макрокоманди, наявності текстового редактора або середовища розробки й типу підтримуваної операційної системи.
Досить вдалим вибором при розробці програмного забезпечення для мікроконтролерів сімейства AVR може послужити інтегроване середовище розробки AVR Studio 4 фірми Atmel, що містить у собі текстовий редактор з підсвічуванням синтаксису, компілятор асемблера, симулятор, відладчик й інтерфейс із апаратними емуляторами. Дана система розповсюджується фірмою Atmel. Програма розрахована на роботу під керуванням операційних систем Windows 9x, NT, 2000. До недоліків AVRStudio можна віднести деяку нестабільність роботи відладчика, а також неповну симуляцію периферійних пристроїв (зокрема, відсутня симуляція АЦП). До плюсів же відноситься, у першу чергу, підтримка їй практично всіх мікроконтролерів сімейства AVR.
Atmel безкоштовно розповсюджує асемблер фірми IAR. Даний компілятор є частиною IAR Embedded Workbench — середовища розробки, що включає в себе менеджер проектів, редактор, лінкер і менеджер бібліотек. Цей компілятор відрізняється розширеними можливостями по роботі з макросами.
Цей асемблер, будучи повністю сумісним по вхідному коді з компілятором фірми Atmel, має в порівнянні з ним кілька переваг. По-перше, він поставляється з відкритими текстами, так що користувач, якщо буде потреба, може легко додати нові можливості. По-друге, це один з декількох асемблерів для мікроконтролерів фірми AVR, що працюють під керуванням операційної системи Linux (крім того, наявність вихідних текстів дозволяє легко перенести його на будь-яку іншу Unix-систему). І нарешті, в GNU AVR Assembler значно розширені, у порівнянні з асемблером фірми Atmel, можливості по роботі з макрокомандами (зокрема, допускаються макроси усередині макросів). Програма поширюється за умовами GNU Public License (GPL).
Останнім часом усе популярніше стає використання компіляторів мов високого рівня при написанні програм для мікроконтролерних систем. Найбільше поширення при цьому одержали компілятори мови C, оскільки в цій мові найбільш просто реалізуються всі необхідні можливості по керуванню апаратними засобами мікроконтролерів.
Компілятор фірми IAR, як загальновизнано, є одним із кращих компіляторів C для мікроконтролерів сімейства AVR. Зв'язано це, у першу чергу, з наявністю в ньому багатих можливостей по оптимізації коду. Мабуть, єдиним істотним його недоліком є те, що в демонстраційній версії накладаються значні обмеження на максимальний обсяг коду. Компілятор поставляється в складі інтегрованого середовища розробки IAR Embedded Workbench (EWB), що включає в себе також компілятор асемблера, лінкер, менеджер проектів і бібліотек, а також відладчик. Він може працювати сумісно з AVR Studio.
Image Craft C Compiler є, мабуть, другим по популярності компілятором мови C для мікроконтролерів сімейства AVR. До теперішнього часу вже випущена версія 6.18 компілятора. До переваг цього компілятора можна віднести можливість підтримки мікросхем сімейства FPSLIC фірми Atmel, непоганий рівень оптимізації коду й досить низька ціна. Демо-версія компілятора не містить функціональних обмежень і лімітована тільки часом роботи (30 днів). Крім того, це, напевно, один із самих швидкорозвиваючихся компіляторів, що дозволяє сподіватися на швидке усунення існуючих недоліків.
Іншим популярним компілятором мови C для мікроконтролерів сімейства AVR є Code Vision AVR C Compiler. Компілятор підтримує мікроконтролери ATTiny22, AT90S23x3, AT90S4433 та багато інших. Демонстраційна версія компілятора, так само, як і компілятор фірми IAR, має обмеження на максимальний обсяг генеруємого коду. Компілятор поставляється разом з інтегрованим середовищем розробки, у яку крім стандартних можливостей, включена досить цікава функція - CodeWizardAVR Automatic Program Generator. Фактично це генератор стандартних блоків програми, що виконують наступні функції:
настроювання доступу до зовнішньої пам'яті;
визначення причини скидання мікроконтролера;
ініціалізацію портів уведення/виводу, зовнішніх переривань, таймерів, сторожового таймера;
ініціалізацію асинхронного порту послідовної передачі даних (UART) і буферизирований прийом і передачу даних;
настроювання аналогового компаратора й АЦП;
ініціалізацію шини I2C і підключених до неї температурного сенсора LM75 або годинника реального часу PCF8583, DS1302, DS1307;
реалізацію протоколу 1-Wire Bus й ініціалізацію температурного сенсора DS1820;
керування LCD-індикатором.
Наявність цієї можливості до деякої міри спрощує написання програм, хоча, звичайно, згенерований у такий спосіб код далеко не завжди може бути застосований без проведення змін. Наявність у середовищі розробки послідовного термінала дозволяє робити налагодження програм з використанням послідовного порту мікроконтролера.
Крім перерахованих вище існує ще кілька компіляторів мови C для мікроконтролерів сімейства AVR фірми Atmel. Однак, у силу деяких причин (підтримка тільки деяких членів сімейства AVR, низька якість компіляції й т.п.), вони не одержали широкого поширення. Нижче наведена інформація про деяких з них.
Крім C при розробці програмного забезпечення для мікроконтролерних систем застосовуються й інші мови високого рівня. Так, для мікроконтролерів сімейства AVR існують також компілятори мов Basic, Pascal й Forth.
Компілятор мови Basic, розроблений фірмою MCS Electronics. Є демо-версия з обмеженням на обсяг генеруємого коду. По вхідному коді компілятор практично повністю сумісний з компіляторами VisualBasic/QuickBasic фірми Microsoft. У синтаксис мови додано кілька нових команд для забезпечення підтримки LCD-індикаторів, I2C й 1-Wire інтерфейсів, обробки переривань й інших специфічних для мікроконтролерів можливостей
Розроблений фірмою 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.
Рисунок 4.1 – зовнішній вигляд IAR Embedded Workbench
Рисунок 4.2 – зовнішній вигляд IAR Embedded Workbench (відладка)
Рисунок 4.3 – зовнішній вигляд IAR Embedded Workbench (відладка)
Рисунок 4.4 – зовнішній вигляд AVR Studio (відладка)
Проведемо аналіз результатів роботи пристрою, а саме його часових діаграм обміну інформацєй.
На плакаті наведени часові діаграми обміну інформацєй між мікроконтролером та веденими пристроями.
Розглянемо часову діаграму передачі даних через SPI (наведена на плакаті).
Пристрій шина SPI має три інтерфейсні лінії :
лінія синхросигналу SCK,
лінія вибору пристрою XCS,
лінія вхідних даних SI
лінія вихідних даних SO.
Для передачі інформації до або з пристрою, необхідно перевести лінію XCS до низького стану, тобто вибрати пристрій. Далі активізується сигнал SCK. По кожному фронті або спаді синхроімпульсу (задається у єдиній для усіх пристроїв на шині параметрів) інформація з лінії SI записується до периферійного пристрою, одночасно відповідно по спаду або фронту синхроімпульсу по лінії SO відбувається передача інформації з перефирійного пристрою по керуючого пристрою. Параметри часових затримок наведені у таблиці, що наведена на плакаті.
На плакаті наведено рисунок, що відображує підключення до шини SPI одночасно двох пристройів – карти MMC та MP3 декодеру.
SPI являє собою фізичний інтерфейс передачі інформації. На базі цього інтерфейсу побудовані інтерфейси обміну з MP3 декодером (протоколи SCI та SDI), а також обмін інформацією з картою пам’яті ММС.
Розглянемо кожен з них.
Протокол обміну даних з MP3 декодером SDI (наведено на плакаті).
Протокол базується на протоколі фізичного рівня SPI.
Він має наступні інтерфейсні лінії:
лінія синхросигналу DCLK,
лінія стартового біту BSYNC,
лінія вхідних даних SDATA,
лінія запитання вхідних даних DREQ.
Призначення ліній DCLK та SDATA співпадає з призначенням ліній SCK та SI базового інтерфейсу.
Лінія стартового біту BSYNC, є вхідною. Ця лінія говорить пристрою, що перший біт, що надходить по лінії даних, після переднього фронту BSYNC є старшим бітом байту. Таким чином наявність цієї лінії компенсує відсутність лінії базового інтерфейсу XCS.
Лінія запитання вхідних даних DREQ активується якщо пристрій в змозі прийняти дані через інтерфейс SDI.
Протокол обміну керуючою інформацією з MP3 декодером SСI (наведено на плакаті).
Протокол базується на протоколі фізичного рівня SPI (наведений на плакаті). Його інтерфейсі лінії цілковито співпадають з лініями базового протоколу.
Після активізації пристрою, до нього через лінії SI надходить команда запису (2) або читання (3). Далі через лінії SI надходить адреса потрібного регістру. Якщо була передана команда запису, то через лінію SI надходить слово даних, а у випадку команди читання через лінію SO проводиться передача слова даних.
Протокол обміну інформацією з картою ММС базується на протоколі фізичного рівня SPI (наведений на плакаті). Його інтерфейсі лінії цілковито співпадають з лініями базового протоколу.
Типові послідовності обміну інформацій з картою ММС наведені на плакаті.
Узагальнена ГСА роботи пристрою наведена на плакаті.
Результатом роботи над курсовим проектом стала розробка портативного пристрою тестування знань на основі мікроконтролеру та інтерфейсу USB.
Прибор має унікальні властивості, що відрізняють його від існуючих пристроїв такого типу. Перевагою даного пристрою є його система тестів. Пристрій не виконує вибірку даних за постійною програмою, а зчитує програму-тест з пам’яті (зі змінного носія), що дає йому широкі можливості для виконання різноманітних тестів та тестових підходів без внесення конструктивних та програмних змін у сам прилад.
Пристрій виконано на загальнодоступній елементній базі, що робить його виробництво і застосування дешевими та економічно вигідним.
Цей пристрій може використовуватися у багатьох областях народного господарства.
MultiMediaCard Product Manual. – SanDisk, 2003 – 100с. (www.sandisk.com)
ATMEL ATMEGA64x Datasheet doc2490. – ATMEL, 2004 – 393с. (www.atmel.com)
Сайт www.zinetz.info
VS1001k - mpeg audio codec datasheet. – VLSI Solution, 2004 – 40с. (www.vlsi.fi)
VS10XX - application notes. – VLSI Solution, 2004 – 46с. (www.vlsi.fi)
FT245BM USB FIFO ( USB - Parallel ) I.C. datasheet ds245b10 – FDTI, 2004 – 22c. (www.ftdichip.com)
Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы “ATMEL”, М.: Додэка–XXI, 2004 – 560c.
Java по-украински /Мир Связи. – Киев. – 2004, N12. – c.12.
/* ***********************************************************************
**
** 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
}
}
Позначення Тип Номінал Кількість
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