Давно вынашивал в планах опробовать работу с SD карточкой, так как записывать
большие данные на такой носитель гораздо эффективней и удобней, чем на
внешнюю EEPROM. Для работы с внешними дисками в Bascom-AVR существует библиотека AVR-DOS, которая позволяет организовать работу с файлами на
флэшке, с присущей Bascom'у простотой. Эту библиотеку то мне и хотелось
попробовать запустить, и наконец руки дотянулись до паяльника.
Так как библиотека AVR-DOS любит когда у микроконтроллера много памяти,
чтобы не приперло в ненужный момент, взял микроконтроллер с запасом -
ATMega64. Благо у меня их куча, за что спасибо товарищу
SypH3r с
http://army.xclan.ru/ Для работы карточки памяти необходимо напряжение 3,3 вольта, максимально
допустимый порог 3,6 вольт - иначе сгорит. Поэтому для подключения к
микроконтроллеру использована буферная микросхема 74LCV244. Можно
конечно и обойтись без буфера - запитать всю схему целиком пониженным
напряжением. Но хотелось проверить работу этой микросхемы в деле, а
во-вторых возможность подключать плату к пяти вольтовым устройствам еще
пригодится.
схема подключения получилась следующая:
Из внешнего повесил на PortB.7 светодиод, иначе без индикации будет
скучно. Плата получилась как образец минимализма - кроме разъема для
подключения карточки памяти и разъема программатора на плате ничего не
предусмотрено.
Плата разведена на одностороннем текстолите, с использованием трех перемычек. Если надумаете повторить плату не забудьте о них. На разъеме еще предусмотрены контакты, которые замыкаются когда карта
вставлена в разъем, эти контакты тоже использованы - сигнал заводится на
PortD.7 (на схеме это не показано)
Микроконтроллер планируется тактировать от внутреннего RC, поэтому кварца на плате тоже нет, я сразу поставил частоту 8 МГц. При программировании фьюз у ATMega64 нужно помнить что в них есть режим совместимости с ATMega103, его необходимо отключить.
тестовый код работы с картой памяти:
$regfile = "m64def.dat"
$crystal = 8000000
$baud = 1200
$hwstack = 128
$swstack = 128
$framesize = 128
Config Portb.7 = Output 'подключаем светодиод
Led Alias Portb.7
'подключение библиотеки AVR-DOS
$include "Config_MMC.bas"
$include "Config_AVR-DOS.BAS"
Dim B As Byte
B = Initfilesystem(1) 'инициализация флэшки
If B <> 0 Then 'если инициализация не прошла
Led = 1 'зажигаем светодиод
Stop 'и останавливаем программу
End If
'если инициализация флэшки прошла успешно продолжаем программу
'объявление переменных
Dim P As Byte 'переменная которую будем записывать на флэшку
Dim File As String * 10 'имя создаваемого файла
Dim Size As Long 'здесь будет хранится размер флэшки
Dim Size_str As String * 50
Dim Free As Long 'размер свободной памяти
Size = Disksize() 'узнаем объем флэшки в байтах
Free = Diskfree() 'узнаем сколько байт свободно
Size_str = "Свободно " + Str(free) + " из " + Str(size) + " байт" 'готовим строку
File = "log.txt" 'имя и расширение файла который будем создавать на флэшке
Open File For Output As #1 'открываем файл Log.txt и записываем в него данные
Print #1 , "AVRproject.ru" 'напишем вот такой текст
Print #1 , "Запись данных на SD карту с помощью Bascom-AVR!!!"
Print #1 , Size_str 'выведем информацию о размере флэшки
Print #1 , 'пустая строка
Close #1
'основной цикл програмы
Do
Led = 1 'на время записи зажгем светодиод
Open File For Append As #1 'открываем наш файл для записи
Print #1 , P 'записываем переменную
Close #1 'закрываем файл
Incr P 'изменим переменную
Waitms 100
Led = 0 'гасим светодиод
Wait 1
Loop 'повторяем цикл
End
Результат работы программы ниже, на флэшке создается текстовый файл с именем LOG.TXT и в него
записывается все то что мы отправляем командой Print
Исходник хорошо прокомментирован, поэтому все максимально доступно для
понимания, а остальные команды поддерживающие AVR-DOS описаны в хэлпе к
Bascom'у.
Печатная плата (Dip Trace)
Исходники с библиотекой AVR-DOS