Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

sdhcПрежде чем продолжить опыты, по воспроизведению 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_piout

Так как Sd-ки питаются от напряжения 3.3В, то либо нужно питать всю схему от этого напряжения, либо использовать согласующую микросхему CD4050, как это рекомендуется в мануале.

sdbuffer

Соберем схемку в протеусе. В качестве модели заюзаем MMC Card Multimedia. В качестве образа можно взять абсолютно любой файл написать ему расширение «.mmc». Если всунуть карту в слот и запустить симуляцию, высветится «ok», если вынуть, то высветится «fail».

mmc_proteus

Теперь перейдем к более сложным вещам. Во первых, потребуется наличие годного Hex редактора, например WinHex. В нем нужно создать файл. Введем следующие значения в шестнадцатеричной 32,30,31,33 или 2013 в двоичной.
winhex

Сохраним и подсунем вместо существующего образа. Теперь нужно их прочитать, при помощи микроконтроллера.

#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, считанное с карты памяти
mmc_proteus2
Проверено, работает. Спасибо Евгению.
mmc_real1
Прошивка и схема в протеусе.

70 комментариев: Урок 23.1 Работа с внешней памятью

  • А как прочитать 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
    Можете подсказать как понять в чем проблема?
    Спасибо

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика