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