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

Опубликовано: 05.09.2018

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

Уроки лезгинки от Аскера (NEW) - Часть 23 /назад на месте современный вариант

Прежде чем продолжить опыты, по воспроизведению wav мелодий при помощи микроконтроллера, придется разобраться с использованием внешней памяти.



В качестве внешнего накопителя будем использовать MMC/SD карту памяти. Для работы с картами памяти в CodeVision Avr предусмотрена специальная библиотека Чена sdcard.h. Она поддерживает работу с несколькими типами флешек MMC, SD, SD HC. Но даже у карточек одного типа, может быть разная инициализация. Узнать будет ли работать именно ваша карточка можно только опытным путем.


АНГЛИЙСКИЙ ЯЗЫК ДО АВТОМАТИЗМА- УРОК 23 ГРАММАТИКА УРОКИ АНГЛИЙСКОГО ЯЗЫКА

Создаем проект, подключаем жк дисплей на порт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();


УПРАЖНЕНИЯ - ГРАММАТИКА АНГЛИЙСКОГО ЯЗЫКА С НУЛЯ УРОК 23 Английский язык для начинающих Уроки

Для подключения используется интерфейс шины 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, считанное с карты памяти

Проверено, работает. Спасибо Евгению.

Прошивка и схема в протеусе.

rss