Флэшка своими руками

Привет всем. Для создания своей флэшки с блэк джеком и шлюхами я взял модуль памяти M25P32 (документация), контроллер ATMega168 (документация) и конвертер USB<->UART (SerialPort) (документация).

И так. Зачем все это нужно?

Предположим, что мы хотим сделать устройство в котором можно хранить информацию, и при этом считывать ее и записывать могли бы только мы. Или сделать устройство которое автономно бы делало какие либо измерения, а потом забрав его можно было бы узнать чего он там наизмерял. В общем применение этой схемы довольно обширна.

Схема

Без имени-2

Это документация на используемые схемы. Там же и есть способы их подключения.

FT232RL_V202 m25p32 atmega168

 

 

 

 

 

 

По сути же схема выглядит так

 

Протоколы

Здесь мы используем 2 основных протокола. Это UART и SPI оба они реализованы в контроллере, остается только привести их в удобный для себя вид.

Терминал

 

Основные ошибки с UARTом:

  • Забыть линию TXD настроить выходом ( например DDRD |= (1<<PD1) )
  • Скорость передачи лучше брать из стандартного ряда а значения для UBBR из мануала

Для проверки я использовал вот эту прогу (Terminal)

Не забывать при SPI:

  • Задать все порты (входы выходы)
  • Давать задержку между передачей и принятием данных

Программа

Для своего удобства разделил программу на несколько блоков

Вообще-то этот проект сделан чтобы автоматически прибавлять числа и записывать в память, но от изначальной задачи он отличается совсем немного.

Все изменения будут заключены в одном единственном блоке.

Пусть у нас будет 3 комманды:

  1. Запись данных
  2. Считывание данных
  3. Стирание

Изменения будут только в блоке прерывания:

ISR(USART_RX_vect){
 if(command==0xFF){
  command = UDR0;
 }else{
  switch(command){
   case 0x01://Запись данных

   break;
   case 0x02://Чтение данных

   break;
   case 0x03://Стирание данных

   break;
  }
 }
}

Проект

SoftWare

Наверное отдельно рассмотрю как делать ПО для такого типа приложений в другой статье. Но в общем и целом эта программа должна подключаться к одному из COM портов и передавать определенные пакеты данных.

HardWare

Это плата на которой это все тестилось.

2013-02-13 11.40.52

 

Питание так же от USB.

Заключение

Самое лучшее применение этой идеи, я думаю в дистанционных приборах, которые остаются где-либо и записывают что-то. Потом, с помощью специальной программы данные считываются и обрабатываются.

 

SPI на других ногах

Как работать с встроенным в AVR SPI`ем будет описано в другой статье. Иногда возникает необходимость синхронного общения по этому протоколу с двумя устройствами (в моем случае это внешний АЦП и внешняя память).

atmega88_p2

И так, для всего этого берем любой контроллер AVR (я взял ATmega168) и определяемся где мы хотим разместить наш ручной SPI. Займет это все 3-4 порта, зависит от необходимости в канале SS. Для моих целей  SS не нужен, т.к. он выбран всегда.

Шаг 1: Определяем порты и частоту

В моем случае:

  • PC3 – выход
  • PC2 – вход
  • PC1 – тактирование

Чтобы не мучиться сразу зададим все дефайнами:

#define MO0 PORTC&=~(1<<PC3)
#define MO1 PORTC|=(1<<PC3) 
#define SCK 8
#define C SCK/2
#define SCK_ON PORTC|=(1<<PC1)
#define SCK_OFF PORTC&=~(1<<PC1)

Соответственно: 1,2  - строки определяют 1/0 на выходе; 5,6 – 1/0 на линии такта; SCK – количество тактов за один период SPI,  если частота кристалла 8МГц, а SPI 2МГц, то это число будет 4. Да и надо помнить, что меньше 2 оно не может быть.

Шаг 2: Определяем главную последовательность

   // Поднимаем такт для режима 4 (для 0 - опускаем линию такта)
   for(bit=0; bit<8;bit++){ // Далее передаем 8 бит данных
     //передаем первый бит входных данных (byte)
     // опускаем линию такта (для режима 0 - поднимаем)
     // считываем бит и записываем в выходной регистр
     // поднимаем линию такта (для режима 0 - опускаем)
   }

Таким образом у нас получится такая вот картина

1234921860_15347_FT18372_zilog_spi_sck_

 

Шаг 3: Расставляем по своим местам

unsigned char SPI (unsigned char byte){
   unsigned char re=0;
   unsigned char bit=0;
   SCK_ON;
   for(bit=0; bit<8;bit++){
      //write
      if (byte&(1<<bit))
         MO1;
      else
         MO0;
      //SCK on
      wait(C);
      SCK_OFF;
      //Read
      re<<=1;
      if(PINC&(1<<PC2))
         re|=(1<<0);//0x01
      else
         re&=~(1<<0);
      // SCK off
      wait(C);
      SCK_ON;
    }
}

 

Готовый проект My SPI под AVRStudio 6

Программатор для AVR своими руками

Первое c чего начинает каждый решивший начать изучать микроконтроллеры это программатор. И так, поискав я нашел вариант полностью меня устроил. Спасибо PROTTOSS. Все инструкции к этому устройству можно найти там же. Здесь же будет рассказано о том как это сделал я.

IMG_0461

Готовый макет.

Для начала, почему именно он?

Наверное вы уже заметили, что с ПК он связан через USB, а другие  наиприятнейшие варианты требуют наличия LTP порта (6 проводов). Хотя, к нему мы еще вернемся.

Почему не USBasp?

Вот тут как говорится, что первое под руку попало=)

Хотя в защиту своего выбора могу заметить, что по данным сайта разработчика, USBasp поддерживается на:

  • AVRDUDE
  • BASCOM-AVR
  • Khazama AVR Programmer
  • eXtreme Burner – AVR

А AVR910:

  • AVRProg v.1.4,
  •  ChipBlasterAVR v.1.07 Evaluation,
  •  CodeVisionAVR,
  • AVROSP (ATMEL AVR Open Source Programmer)

И если вы хотите идти по праведному пути, и использовать AVRStudio или на худой конец CV AVR, то выбор очевиден.

Вступление

Для этого программатора, как и для всех рукодельных присуща философская проблема, курицы и яйца. Что-бы сделать программатор надо иметь программатор. А вот в случае с 6 проводным, все просто. Так что прежде чем начинать, убедитесь в существовании LTP порта в доступной близости или же наличие друзей, коллег, однокурсников имеющих готовый программатор.

Для любителей сделать все красиво ЛУТ в руки, я же хотел проверить для начала будет это вообще работать или нет. Так что купил просто однослойную макетку.

И так, что нам нужно?

Посмотрим на схему нам предлагаемую

shematic

 

Вот что нам надо будет закупить:

  1. MINI USB ( я ставил обычный и в результате куча проблем, мини лучше спаяется и проводов таких у всех дома навалом )
  2. Провод USB <-> MINI USB
  3. Разъем ISP на 10 ног ( вообще 10 ногий выход не используется на макетных платах ATmega и Tiny, но на 6 ног всегда можно сделать переходник )
  4. Контроллер Atmega8 ( купил сразу 2, 1- в программер, а другой будем уже использовать)
  5. Светодиодов 3шт ( когда разных цветов – веселее, опять же лучше с запасом для своей платы, выбираем их по току не меньше 10мА )
  6. Сопротивления 330 Ом, 100 Ом, 1.5 кОм, 10 кОм, 1 МОм
  7. Конденсаторы … все как обычно, только не забываем С5 - электролитический (банка) на 10В
  8. Кварц 12 МГц
  9. Джампер и 3 штырьки под него

J3 мне не пригодился а вот J1/J2 понадобится при программировании самого программатора

Файл прошивки и драйвер есть все на сайте PROTTOSS.COM

Там же заявлено, что его видят практически все кто мне нужно, но к нему подключиться смог только CVAVR, в прочем это не мешает писать код в AVRStudio компилировать и прошивать через CVAVR.

Шаг 1: Пайка

2013-07-30 13.33.02

 

На фото видно обратную сторону. Все элементы находятся на одной стороне, а пайка их с обратной. Для более продвинутых пользователей паяльника, но все еще ленивые, можно использовать SMD компоненты.

Шаг 2: Прошивка

Возможно одного энтузиазма будет мало, для прошивки программатора надо будет, если у вас нет COM или LTP порта на компьютере. Хотя для отчаянных есть еще такой вариант (Моя платка с использованием этого чипа).

В любом случае прошивается через PonyProg

Шаг 3: Тестируем

 

Альтернативные программаторы

PS: Подробнее о совместимости с AVRStudio