Прежде чем продолжить опыты, по воспроизведению wav мелодий при помощи микроконтроллера, придется разобраться с использованием внешней памяти.
В качестве внешнего накопителя будем использовать MMC/SD карту памяти. Для работы с картами памяти в CodeVision Avr предусмотрена специальная библиотека Чена sdcard.h. Она поддерживает работу с несколькими типами флешек MMC, SD, SD HC. Но даже у карточек одного типа, может быть разная инициализация. Узнать будет ли работать именно ваша карточка можно только опытным путем.
Создаем проект, подключаем жк дисплей на портD. Подключаем необходимые библиотеки. Их также необходимо подключить в свойствах проекта. Первая часть задачи-инициализация.
#include <mega8.h> #include <sdcard.h> #include <alcd.h> // Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { disk_timerproc(); } void main(void) { // Timer/Counter 1 initialization TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x4E; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10; lcd_init(16); // Global enable interrupts #asm("sei") if((disk_initialize(0))==0) { lcd_puts("ok"); } else { lcd_puts("fail"); } while (1) { } } |
Данный код выдает «ок» на жк дисплее, если карточка найдена и готова к работе, «fail» если есть проблемы. При желании можно расшифровать ошибки: защита от записи, карта не найдена, ошибка инициализации. Кому интересно — читайте мануал на CodeVision, там есть все примеры обработки. Также есть особенность — каждые 10мс необходимо вызывать функцию disk_timerproc();
Для подключения используется интерфейс шины spi.
Так как Sd-ки питаются от напряжения 3.3В, то либо нужно питать всю схему от этого напряжения, либо использовать согласующую микросхему CD4050, как это рекомендуется в мануале.
Соберем схемку в протеусе. В качестве модели заюзаем MMC Card Multimedia. В качестве образа можно взять абсолютно любой файл написать ему расширение «.mmc». Если всунуть карту в слот и запустить симуляцию, высветится «ok», если вынуть, то высветится «fail».
Теперь перейдем к более сложным вещам. Во первых, потребуется наличие годного Hex редактора, например WinHex. В нем нужно создать файл. Введем следующие значения в шестнадцатеричной 32,30,31,33 или 2013 в двоичной.
Сохраним и подсунем вместо существующего образа. Теперь нужно их прочитать, при помощи микроконтроллера.
#include <mega8.h> #include <delay.h> #include <sdcard.h> #include <alcd.h> #include <stdio.h> // Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { disk_timerproc(); } void main(void) { unsigned char Buff[512]; char display_buffer[64]; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7,813 kHz TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x4E; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10; lcd_init(16); // Global enable interrupts #asm("sei") if((disk_initialize(0))==0) { lcd_puts("ok"); } else { lcd_puts("fail"); } //delay_ms(1000); disk_read (0, Buff, 0, 1); sprintf(display_buffer,"%lu",Buff[0]); delay_ms(500); lcd_gotoxy(0,1); lcd_putchar(Buff[0]); lcd_putchar(Buff[1]); lcd_putchar(Buff[2]); lcd_putchar(Buff[3]); while (1) { } } |
Чтобы проект скомпилировался, нужно увеличить размер стека в настройках проекта, 650 байт достаточно. Зачем такой большой массив на 512 значений? Затем что любая информация пишется и читается блоками по 512 байт, даже если вы хотите прочитать только 1 байт все равно придется читать все 512. Тоже самое с записью. Поэтому создаем массив Buff и в него сохраняем данные disk_read (0, Buff, 0, 1); Первый аргумент (0) означает адрес устройства, про второй уже было сказано, третий (0) — с какого блока читать, четвертый (1) — сколько блоков прочитать.
Результат — число 2013, считанное с карты памяти
Проверено, работает. Спасибо Евгению.
Прошивка и схема в протеусе.
А как прочитать wav фаил с карты и воспроизвести его…помогите пожалуйста…
а как с флэшки воспроизвести вавку
наверно так 🙂 http://avr-start.ru/?p=1874
Напишите статью как работать с eeprom микроконтроллера? Спасибо.
я так понимаю файловая система отсутствует?
отсутствует
Как увеличить длину выводимой строки?
Вывод организован побайтно, сколько выведете, столько и будет
Т.е. просто в образ картоы памяти через HEX редактор добавить инфы? И она будет выведена? Хотелось бы что-то на подобии электронной книги. Типа закинул инфу на флешку и оно выводит по две строки инфы, нажал кнопку- дальше показывает. Не могли бы вы помочь разобраться в этом, чтобы получилась такая штучка?
В таком случае нужна файловая система, читайте урок 22.2 там описано.
22.3? Ещё. При запуске проекта выдаются ошибки: «can’t read file: ..\cvavr2\inc\ff.h», «can’t read file: C:\cvavreval\inc\ff.h», «can’t read file: C:\cvavreval\inc\stdio.h», «can’t read file: C:\cvavreval\inc\stdarg.h». В чём проблема? При этом не могу скомпилировать HEX файл выдаёт ошибки: «Error: H:\dsasda\lesson22_8\lesson22_8.c(4): can’t open #include file: ‘alcd.h'»
«Error: H:\dsasda\lesson22_8\lesson22_8.c(44): undefined symbol ‘lcd_init'»
«Error: H:\dsasda\lesson22_8\lesson22_8.c(51): undefined symbol ‘lcd_puts'»
«Error: H:\dsasda\lesson22_8\lesson22_8.c(62): undefined symbol ‘lcd_gotoxy'»
Поменял имя библиотеки alcd.h на lcd.h и другие ошибки(Errors occured during assemly):
«Error: H:\dsasda\lesson22_8\List\lesson22_8.asm(2025): Undefined symbol: __lcd_port»- и таких 3 ошибки в lesson22_8.asm в разных местах. В чём проблема? Как исправить это всё?
Кривой цавр. У меня было подобное
Можете дать ссылку на нормальный?
рутрекер вам в помощь
Пишет не может открыть sdcard.h. Что делать?
Не могу понять. ff.h и sdcard.h выдают ошибки. CVAVR менял. В чём проблема?
если все правильно подключено, то проблема только цавр, помойму даже последние версии глючили с фатом, причем интересно, может 10 не скомпилиться, а на 11 норм
Included Files: mega8.h, delay.h, stdio.h, stdrag.h. И в списке нет sdcard.h. Может проблема что в цавр старой версии и нет библиотек для работы с sd картами? версия 1.24.8d standart
SD со 2 версии только поддерживаются
Всё пашет. Спасибо!
Приделал кнопку в протеусе. Если при нажатии идёт на порт сигнал, то выполняется программа в скобках. Нужно второй раз вывести символы, только на блок дальше. Пробовал написать тоже самое в скобках но оно не работает, но кнопка работает- посылает сигнал на мк. Как это зациклить чтоб выполнялось пока не закончится считавание файла? И как сделать чтоб программа в скобках посылала символы на жк, как в примере?
Сделайте переменную которая увеличивается от нажатия кнопки. В зависимости от величины переменной пускай читаются разные блоки
Приделал к исходнику файловую систему, переменную, которая увеличивается по нажатию кнопки, и lcd. Но проблема в том, что считывание идёт ровно до 512 символа. Я так понимаю переменная int переполняется? Как можно будет организовать нормальное считываение без переполнения переменной? Сдвиговые регистры?
переменная int переполняется при значении 2^16=65 536, ройте в сторону того что данные читаются блоками по 512байт
Готовый проект в протеусе работает нормально. Пробую сделать компиляцию кода в CVAVR — выдает ошибку — Encrypted library error: C:\cvavreval\lib\sdcard.lib(28): #error directive: FAT File System library usage must be enabled in the project configuration. Подскажите в чем дело. Спасибо.
нужно подключить fat в свойствах проекта
Как выставить fuse bit’ы для этого проекта?
И внешний кварц приделывать нужно? Если да, то на сколько?
Здесь кварц не важен
Ага. А как выставить fuse bit’ы для этого проекта?
Стоп. Т.е. внешний кварц не нужен? Как фьюзы выставлять?
Можете кварц не ставить, есть мнение что работать будет и без него. Но чтобы потом не ловить баги, поставьте внешний на 8мгц. Фьюзы посмотрите в статье:
http://avr-start.ru/?p=1065
Привет! В моем CodeVisionAVR нет библиотек ff.h, alcd.h, sdcard.h, где их взять?
Поищите версию поновее
Здравствуйте. Объясните пожалуйста как, записать информацию на cd карту, сколько ни искал, это единственный урок где понятно и работа ведётся в cvavr на си. В кратком о моей работе, мне нужно каждые 100 микро секунд записывать инфу (цифры) на sd карту.
собственно потому что объяснять нечего, есть функция чтения, ставим указатель на нужную позицию и читаем/пишем нужное количество символов в буфер.
Можно по подробнее объяснить, а то не понял
Вы хоть пишите, что не понятно. Есть функция «прочитать» собственно и все, аргументы должны быть понятны из названия: номер тома 0, указатель куда читать, указатель откуда читать, сколько секторов прочитать. Только не забывайте что читать и писать одновременно памяти меги8 не хватит.
DRESULT disk_read (
BYTE pdrv, /* [IN] Physical drive number */
BYTE* buff, /* [OUT] Pointer to the read data buffer */
DWORD sector, /* [IN] Start sector number */
UINT count /* [IN] Number of sectros to read */
);
Спасибо, разобрался
Здравствуйте!
Не проходит инициализация карты
плюс куча варнингов
Warning: E:\avr\project\wave\wav_player\pff.c(553): local variable ‘dir’ is used before its value is set
Можете подсказать как понять в чем проблема?
Спасибо