Содержание
Урок 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 Работа с внешней памятью

  • файлы библиотеки не подключены

  • Файлы подключены…
    Функция инициализации возвращает 1… Хотя должна 0…

  • Определитесь какой проект, Вы собираете, а то похоже варнинги относятся не к этому проекту

  • подскажите пожалуйста а где собственно находится файлы sdcard.h sdcard.c? Я немогу найти не в интернете не в вашем проекте.

  • это библиотечные файлы codevision

  • А нельзя вместо микросхемы согласования CD4050, просто использовать делитель напряжения из резисторов?

  • можно

  • Я не понял, собрал на «железе» диск находит пишет»ОК» но ничего не читает. Не понятно как SD диска убрать файловую систему. Раздел диска в Windows с SD не удаляется. Прошу прощения если мой вопрос показался идиотским.

  • пишите на sd карту какой нить программой типо winhex

  • А нельзя для особо непонятливых объяснить как создавать новый проект под SD карту. Что я не разодрался.

  • в свойствах проекта есть вкладка libraries там все и настраивается

  • А можно узнать, какую флешку вы использовали в этом уроке? Имеется в виду название фирмы-производителя Trancend или Mixer. Я использовал 2 разные micro SD flash, и контроллер отказывался их видеть выдавая на экран «Fail»….

  • transcend

  • А можно узнать, вот эти значения написаны ведь для Mega 8
    TCCR1A=0x00;
    TCCR1B=0x0D;
    TCNT1H=0x00;
    TCNT1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x4E;
    Вы бы могли написать значения этих параметров для меги 16-й

  • сгенерируйте визардом, режим СТС, величина OCR такая же

  • А в какой вкладке генерировать? А то я с визардом не работал ещё, не ориентируюсь в нём

  • посмотрите 5 урок

  • Здравствуйте,
    Перенес на мегу16, в настройках проекта исправил, на #include заменил, частота установлена правильно.

    if((disk_initialize(0))==0)
    {
    PORTD.5=1; // светодиод горит

    }
    else
    {

    while(1) // Зацикливаемся и
    {
    PORTD.5=1; // мигаем светодиодом
    delay_ms(500);
    PORTD.5=0;
    delay_ms(500);
    }
    }

    /WP настроен на PORTB.2

    Если его подтягивать к +, светодиод мигает, а если к -, то не горит. Хотя этого вообще не должно быть в любом случае.
    Несколько раз проверял подключение флешки, все правильно.
    В чем может быть проблема?

  • проблем может быть масса, использование или не использование wp настраивается в свойствах проекта

  • Thx for Good topic ! my problem here is that I can’t get all done in real hardware lcd keep printinf nonsense things.
    I want to ask that How did u save that «11.mmc» in real SD card ? u just drag and drop it to real sd card ?
    btw it’s all great when working with isis.

  • You need hex editor like HxD or WinHex, which can open sd as disk. But remember window will write sd card is not formatted, it normal because at first sector contain information about FAT.

  • Возможно вопрос не по теме, ну вроде как тут о памяти говорят. В eeprom контроллера переменные типа float можно записывать?

  • можно

  • Уважаемый Админ.Подскажите пожалуйста как включить FAT в свойствах проекта.Перерыл все вкладки , но так и не нашёл.Спасибо.

  • там же где и остальные библиотеки подключаются. возможно версия cavr старая

  • Я так понимаю, что эта библиотека доступна только для некоторых микроконтроллеров. Например для ATmega8535 ее нет в списке библиотек. Непонятно чем это обусловлено?!

  • чем обусловлено вполне понятно, у этого микроконтроллера мало оперативной памяти. тем не менее прикорячить фат можно. читать порциями

  • Здравствуйте!

    А если я хочу записывать данные с порта АЦП на SD-карту, то как будет в данном случае выглядеть код, описывающий именно запись на карту?

  • читайте про disk_write

  • Здравствуйте. Заполнил массив Buff 6-ю символами. Написал по аналоги с disk_read (судя по комментам так и надо делать) disk_write(0,Buff,0,1). Выполнил ссимулировал в протеусе и ничего. Файл пуст. Что не так? Файлы исходников из урока.

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

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

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