Универсальный внешний накопитель для всех iOS-устройств, совместим с PC/Mac, Android
Header Banner
8 800 100 5771 | +7 495 540 4266
c 9:00 до 24:00 пн-пт | c 10:00 до 18:00 сб
0 Comments

ATMega8 / Передача данных по шине I2C

Устройство шины I2C достаточно простое. Она представляет собой 2-проводное соединение, которое может связывать множество устройтв для обменаданными. В самом простом случае оно связывает одно ведущее устройство (MASTER) с одним илинесколькими ведомыми устройствами (SLAVE). Все устройства подключаются к двум проводам шины I2C параллельно.Эти провода известны как линии SDA (вывод 4 порта “С” в Atmega8) и SCL (вывод 5 порта “С”)SCL  – тактирующая линия, которая управляется ведущим устройством. SDA – двунаправленная линия данных.Для передачи данных ведущее устройство посылает ведомому

Для  управления  интерфейсом  TWI исаользуются регистры TWBR, TWCR, TWSR, TWDR,TWAR

Регистр TWBR

76543210
TWBR7 TWBR6
TWBR5
 TWBR4  TWBR3 TWBR2
TWBR1
 TWBR0

Регистр TWBR  устанавливает величину делителя для генератора такта.

Регистр TWCR

76543210
TWINT TWEA
TWSTA
 TWSTO  TWWC TWEN
 TWIE

Регистр TWCR используется для управления работой TWI – включения TWI, отправки условия START, STOP, Receiver ACK. Он также показывает ошибки записи, если предпринимается попытка записи данных в  регистр TWDR, когда он недоступен.

TWINT – флаг разрешения прерываний по окончанию работы TWI. После обработки прерывания TWINT не сбрасывается в 0 автоматически, и это нужно сделать вручную. Сброс в 0 этого флага снова вулючает TWI.

Схема передачи данных

1. Отправка условия START. Отправка осуществляется записью в TWCR специального значения, указывающего оборудованию передать условие START. Какое значение записывается в TWCR будет описано позже.

Для начала передачи данных необходимо сбросить бит TWINT регистра TWCR (обратите внимание, что бит TWINT сбрасывается записью в него лог.1)

2. После отправки условия START, бит TWINT снова выставляется, а в регистре TWSR будет содержаться специальный код статуса, сигнализирующий об успешности отправки START

3.  Послен проверки регистра TWSR на успешность отправки START необходимо записать SLA+W в TWDR, сбросить TWINT  и отправить SLA_W.

4. Когда адресный пакет SLA_W будет передан флаг TWINT будет автоматически установлен, и в регистре TWSR будет содержаться соответствующий статус. Статус будет также содержать информацию о том,  подтвердило ли принятие пакета ведомое устройство

5. Если статус в регистре TWSR подтверждает успешность отправки адресного пакета, а также бит ACK соответствует ожидаемому, записываем в регистр TWDR данные и передаём их.

6. Когда данные будут переданы флаг TWINT будет автоматически установлен, и в регистре TWSR будет содержаться соответствующий статус. Статус будет также содержать информацию о том,  подтвердило ли принятие пакета ведомое устройство

7. Если статус в регистре TWSR подтверждает успешность отправки данных, то в регистр TWCR записывается STOP условие

Режимы работы TWI

TWI может работать в 4 режимах – Master Transmitter, Master Receiver, Slave Transmitter, Slave Receiver

Master Transmitter

Для передачи условия START в этом режиме необходимо записать лог.1 в биты TWINT, TWSTA, TWENT регистра TWCR.

После передачи START значение регистра TWSR должно принять значение 0x08. Далее для входа в режим нужно передать команду SLA+W.

Для передачи команды SLA_W нужно записать её в регистр TWDR, и затем отправить её, установив лог.1 в битах TWINT и TWENT регистра TWCR. После того, как команда отправлена и получен бит подтверждения TWINT снова устанавливается (сбрасывается в лог.0) а значение регистра TWSR принимает одно из следующих значений  – 0x18, 0x20, или 0x38.

После этого можно отправлять пакет с данными, записав их в регистр TWDR. Записывать нужно когда TWINT установлен (TWINT=0). Если это условие не соблюдается, то будет установлен бит ошибки записи TWWC регистра TWDR. Отправка пакета данных осуществляется установкой лог.1 в битах TWINT и TWENT регистра TWCR. Эта схема повторяется до тех пор, пока все байты данных не переданы. Затем передачу данных нужно остановить отправив условия STOP или REPEATED START.

Для передачи условия STOP  необходимо записать лог.1 в биты TWINT, TWSTO, TWENT регистра TWCR.

Для передачи условия REPEATED START  необходимо записать лог.1 в биты TWINT, TWSTA, TWENT регистра TWCR. После успешной передачи REPEATED START в регистре состояния TWSR установится знаячение 0x10. Repeated START позволяет переключаться между ведомыми устройствами, а также между режимами работы ведущего устройства без потери управления шиной.

Возможные статусы в регистре TWSR для Master Transmitter

Код статуса Состояние шины To/From TWDR STA STO TWINT TWEA Следующее действие
0x08 Передано условие START SLA+W 0 0 1 X Отправка команды SLA+W.
В ответ ожидается пакет ACK или NOT ACK
0x10 Передано условие REPETED START SLA+W 0 0 1 X Отправка команды SLA+W. В ответ ожидается бит ACK или NOT ACK
0x10 Передано условие REPETED START SLA+R 0 0 1 X Отправка команды SLA+R. Переключение в режим Master Receiver
0x18 Передана команда SLA+W, бит ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK
0x20 Передана команда SLA+W, бит NO ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK
0x28
Передан байт данных, бит ACK получен
Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK
0x30 Передан байт данных, бит NO ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK

Возможные статусы в регистре TWSR для Master Receiver

Код статуса Состояние шины To/From TWDR STA STO TWINT TWEA Следующее действие
0x08 Передано условие START SLA+R 0 0 1 X Отправка команды SLA+R. В ответ ожидается пакет ACK или NOT ACK
0x10 Передано условие REPETED START SLA+R 0 0 1 X Отправка команды SLA+R. В ответ ожидается бит ACK или NOT ACK
0x10 Передано условие REPETED START SLA+W 0 0 1 X Отправка команды SLA+W. Переключение в режим Master Transmitter
0x38 Бит ACK не  получен
       
0x40 Передана команда SLA+R, бит  ACK получен
0 0 1 0 Получение байта данных, возврат бита NOT ACK
0x40 Передана команда SLA+R, бит  ACK получен
0 0 1 1 Получение байта данных, возврат бита  ACK
0x48 Передана команда SLA+R, бит  NO ACK получен
1 0 1 X Будет передана команда Repeated Start
0x48 Передана команда SLA+R, бит  NO ACK получен
0 1 1 X Будет передана команда STOP и сброшен флаг TWSTO
0x48 Передана команда SLA+R, бит  NO ACK получен
1 1 1 X Будет передана команда STOP и последующая команда START и сброшен флаг TWSTO
0x50 Получен байт данных и отдан бит  ACK

0 0 1 0
Будет получен новый байт данных отдан бит NO ACK
0x50
Получен байт данных и отдан бит  ACK

0 0 1 1
Будет получен новый байт данных отдан бит ACK
0x58 Получен байт данных и отдан бит NO ACK

1 0 1 X Будет передана команда Repeated Start
0x58 Получен байт данных и отдан бит NO ACK

0 1 1 X Будет передана команда STOP и сброшен флаг TWSTO
0x58 Получен байт данных и отдан бит NO ACK

1 1 1 X Будет передана команда STOP и последующая команда START и сброшен флаг TWSTO

Режим Slave Receiver

В этом режиме ведомое устройство принимает данные от ведущего устройства. Для активации режима нужно  выставить биты TWAR и TWCR следующим образом.

Биты  1-7 регистра TWAR задают адрес ведомого устройства. Последний бит регистра TWAR отвечает за то, бкдет ли устройство доступно при обращении  по General Call адресу 0x00;

Регистр TWCR должен быть настроен следующим образом:

76543210
TWINT = 0
TWEA = 1
TWSTA  =  0
 TWSTO  = 0
 TWWC= 0 TWEN = 1
0  TWIE

Когда регистры TWAR и TWCR настроены, ведомое устройство  ждёт обращения по своему адресу (заданному в TWCR), за которым следует “бит  направления”. Если бит направления = 0 (запись), то ведомое устройство будет работать  в режиме Slave Receiver. Если бит направления = 1 (запись), то ведомое устройство будет работать  в режиме Slave Transmitter.

Если у вас есть какие-то замечания по этому документу или что-то осталось непонятно, то вы можете оставить свой отзыв или вопрос

Шина I2C и AVR пример, PCF8583 (RTC) вечный календарь

Шина I2C очень распространена, существуют АЦП, ЦАП, термометры, память с интерфейсом I2C. При проектировании устройств и их починке приходится сталкиваться с этой шиной. Рассмотрим ее поподробнее. Шина I2C была спроектирована компанией Philips в начале 80-х и предназначена для низкоскоростной передачи данных по двум сигнальным проводникам, SDA для данных и SCL для тактирования.

Для подтяжки линий SDA, SCL используются резисторы номиналом 4.7кОм (при большой емкости шины номинал подтягивающих резисторов требуется уменьшить). Для успешного обмена данными на шине обязательно присутствие одного ведущего устройства (master device), которое производит тактирование и одного или более ведомых устройств (slave device). Количество ведомых устройств ограничено емкостью шины 500пФ и адресным пространством. Каждое ведомое устройство на шине должно иметь8-ми битный адрес, по которому оно отзывается.
При начале обмена данными по I2C, ведущему устройству необходимо сгенерировать так званое условие старта (start condition), а при окончании – условие остановки (stop condition). Эти условия выглядят так:

При старте на линию SDA подается низкий уровень, при высоком уровне на SCL и удерживается так в течении некоторого времени. При стопе линия SDA отпускается до высокого уровня, при высоком уровне на SCL. За конкретными таймингами нужно лезть в спецификацию шины I2C. После подачи условия старта, необходимо подать 8-ми битный адрес устройства, с которым мы хотим продолжить «общение». Это делается вот так:

Начиная со старшего бита, подаем на линию SDA данные, после записываем их импульсом на линии SCL, и так 8 раз. После чего ведомое устройство, адрес которого был назван, должно откликнуться, для этого предназначен 9-й синхроимпульс на линии SCL, во время которого адресуемое устройство должно удерживать логический ноль на линии данных SDA, тем самым обозначает свое наличие. Это подтверждение в документации называется ACK (Acknowledge) и используется каждый раз после передачи байта. Подавать сигнал ACK должно устройство которому предназначается команда или данные. То есть, если мы записываем данные в ведомого, откликается ведомый, а если считываем данные – то откликаться должен ведущий, после корректного приема байта. Дальнейший обмен данными производиться по той же схема, 8 бит данных, 1 для ACK и т.д. На словах работа с шиной проста. Предлагаю сварганить простые часы на микросхеме вечного календаря PCF8583, с интерфейсом . Выводить время и дату будет на символьный ЖКИ Wh2602A с помощью микроконтроллера ATmega8. Рассмотрим подключение шины I2C к микроконтроллеру.

Тактироваться микроконтроллер будет от внутреннего RC генератора частотой 4 МГц. Кварц Х1 – часовой на 32768Гц, конденсатор С1 – 30пФ, С5,С7 – электролиты на 100 и 200мкФ соответственно, С4,С6 – керамика на 0,1мкФ. Подтягивающие резисторы R1,R4 – 4,7кОм. Ограничительные резисторы R2 – 1кОм, R3 – 17 Ом, потенциометр для регулировки контраста ЖКИ VR1 – 10кОм. Три кнопки послужат для задание даты и времени.
А вот как это выглядит на макетке:

В этой заметке я хочу использовать программный I2C, так как морочиться с аппаратным пока нет желания. Не вдаваясь в подробности работы PCF8583, скажу, что если к ней присоединить кварц с конденсатором и подать питание, то с ее регистров можно будет считать время и дату в BCD формате. Т.е. 23 часа 45 минуты 11 секунд будет закодировано вот так: 0х23 часа 0х45 минуты 0х11 секунд. Кажется удобным, но мне чего-то не понравилось.

PCF8583 кроме стандартного питания и SDA, SCL имеет ножку А0, которая используется для задания одного из битов ее адреса, для возможности работы двух PCF8583 на одной шине. Также имеется ножка INT, которая может сгенерировать низкий уровень при наступлении некоторого события. Так, как на шине PCF8583 всего одна и всякие события использоваться не будет, то смело подключим А0 к земле, а INT не будем задействовать. Адрес PCF8583 состоит из 2-х тетрад, неизменяемой и изменяемой:

Для того, чтобы записать данные в PCF8583 (в нашем случае А0=0), нужно выдавать адрес 0хА0. Для чтения же, нужно выдавать адрес 0хА1. Немного неудобно. Интересующее время/дата храниться в регистрах начиная с адреса 0х02 и заканчивая адресом 0х06:

То есть, наша задача периодически считывать эти данные и выводить их на ЖКИ, предусмотрев возможно записи введенных с клавиш, данных в саму PCF8583. Считывать данные с PCF8583 нужно в таком порядке:

Выдаем на шину условие старта, выдаем адрес для записи 0хА0, выдаем адрес регистра, начиная с которого хотим считать данные, в нашем случае это 0х02. Далее снова выдаем условие старта, адрес устройства для чтения 0хА1 и считываем по одному байты из PCF8583. При последнем считанном байте не нужно давать ACK (этого делать я не стал, т.е. все время даю сигнал ACK, на работоспособность это не повлияло).
Также просмотрим диаграмму для записи данных в PCF8583:

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

  1. #define SDA 0

  2. #define SCL 1

  3.  

  4. #define READ_PCF 0xa1 //Адрес для чтения

  5. #define WRITE_PCF 0xa0 //Адрес для записи

  6.  

  7. ////edition by МIROSLAV SAMES

  8. //#define READ_PCF 0xA3 //

  9. //#define WRITE_PCF 0xa2 //

  10. //to test replace by two strings below

  11.  

  12. unsigned char ack=0; //АСК, если=1 – произошла ошибка

  13. unsigned char data[5]={}; //Данные время/даты

  14. DDRB=0x03; //init PORTB

  15. PORTB=0x0c;

  16. void start_cond (void) //Генерация условия старта

  17. {

  18. PORTB=_BV(SDA)|_BV(SCL);

  19. asm("nop");

  20. PORTB&=~_BV(SDA);

  21. asm("nop");

  22. PORTB&=~_BV(SCL);

  23. }

  24.  

  25. void stop_cond (void) //Генерация условия стоп

  26. {

  27. PORTB=_BV(SCL);

  28. asm("nop");

  29. PORTB&=~_BV(SDA);

  30. asm("nop");

  31. PORTB|=_BV(SDA);

  32. }

  33.  

  34. void send_byte (unsigned char data) //Отправка байта по I2С

  35. { unsigned char i;

  36. for (i=0;i<8;i++)

  37. {

  38. if ((data&0x80)==0x00) PORTB&=~_BV(SDA); //Выставить бит на SDA

  39. else PORTB|=_BV(SDA);

  40. asm("nop");

  41. PORTB|=_BV(SCL); //Записать его импульсом на SCL

  42. asm("nop");

  43. PORTB&=~_BV(SCL);

  44. data=data<<1;

  45. }

  46. DDRB&=~_BV(SDA);

  47. PORTB|=_BV(SDA);

  48.  

  49. asm("nop");

  50. PORTB|=_BV(SCL);

  51. asm("nop");

  52. if ((PINB&_BV(SDA))==_BV(SDA)) ack=1; //Считать ACK

  53. PORTB&=~_BV(SCL);

  54.  

  55. PORTB&=~_BV(SDA);

  56. DDRB|=_BV(SDA);

  57. }

  58.  

  59. unsigned char get_byte (void) //Считывание байта по I2C

  60. { unsigned char i, res=0;

  61.  

  62. DDRB&=~_BV(SDA);

  63. PORTB|=_BV(SDA);

  64.  

  65. for (i=0;i<8;i++)

  66. {

  67. res=res<<1;

  68. PORTB|=_BV(SCL); //Импульс на SCL

  69. asm("nop");

  70. if ((PINB&_BV(SDA))==_BV(SDA)) res=res|0x01;//Чтение SDA

  71. PORTB&=~_BV(SCL);

  72. asm("nop");

  73. }

  74.  

  75. PORTB&=~_BV(SDA); //Подтверждение ACK

  76. DDRB|=_BV(SDA);

  77.  

  78. asm("nop");

  79. PORTB|=_BV(SCL);

  80. asm("nop");

  81. PORTB&=~_BV(SCL);

  82.  

  83. return res;

  84. }

  85.  

  86. void read_date_time (void) //Считать данные в массив data

  87. { unsigned char i;

  88.  

  89. start_cond();

  90. send_byte (WRITE_PCF);

  91. send_byte (0x02);

  92.  

  93. start_cond();

  94. send_byte(READ_PCF);

  95. for (i=0;i<5;i++)

  96. data[i]=get_byte();

  97. stop_cond();

  98. }

  99.  

  100. void write_date_time (void) //Записать данные из массива data

  101. { unsigned char i;

  102.  

  103. start_cond();

  104. send_byte (WRITE_PCF);

  105. send_byte (0x02);

  106.  

  107. for (i=0;i<5;i++)

  108. send_byte (data[i]);

  109. stop_cond();

  110. }


Думаю особые объяснения не нужны, все делалось по диаграммам. Снятую осциллограмму с логического анализатора при чтении данных из PCF8583 можно глянуть здесь:

При отлове багов я столкнулся с «черной магией». Клавиши хаотично нажимались, не поддаваясь контролю. Причину их странного поведения выявить удалось не сразу. Виноватым оказалось пересечение проводков от клавиш и линии SCL, из которой передавались наводки, поэтому клавиши вынес на PORTC. Также мне показалось неудобной работа с BCD арифметикой и учетом всяких високосных/невисокосных годов, месяцев с 30/31 днями и т.д. Неудобен с точки зрения микроконтроллера человеческий календарь.
Посмотреть на работу часов можно здесь:

Скачать полный код проекта для AVR Studio 4

Модуль I2C 1602 для LCD с драйвером HD4478. Совместная работа с микроконтроллером Atmega8

Модуль под названием I2C LCD1602 является альтернативой другому описанному мной модулю управления LCD с использованием регистра 74HC164. Оба поддерживают LCD с драйвером HD4478.

С другой стороны, преимуществом модуля LCD1602 является освобождение еще большего количества выводов микроконтроллера. Для управления используются только два вывода — для работы по шине I2C. Готовый модуль LCD1602 — тоже плюс. Модуль с 74HC164 намного дешевле, но требует сборки платы и сборки элементов.

Описываемый модуль LCD1602

В одном интернет-магазине я насчитал три разных варианта этого модуля. Пишу о внешнем виде, потому что электрически он может быть разным (соединения). У меня есть версия, представленная на картинке выше.

Стоит отметить следующие основные особенности:

  • Модуль на базе расширителя PCF8574T
  • Источник питания 5В
  • Светодиодная индикация питания
  • Регулировка контрастности на плате с помощью монтажного потенциометра
  • Взаимодействие со светодиодными экранами на базе драйвера HD44780
  • Перемычки [2..0] для изменения адреса устройства. По умолчанию перемычки разомкнуты, а контакты адреса подтягиваются резисторами 10 кОм к напряжению питания (высокое состояние), что означает (согласно документации) адрес модуля 0x27 на шине I2C.
  • Установлены резисторы 4,7к, протягивающие линии I2C шины
  • Управление подсветкой ЖК-дисплея. Также есть перемычка для отключения подсветки ЖК-дисплея.

Что касается запуска, то вначале я пошел очень простым путем, используя Arduino Uno и библиотеку LiquidCrystal_V1.2.1, я без проблем запустил чип.

Модуль запущен с Arduino

В свою очередь, с моим модулем и ATmega 8 было не так весело. Я проверил несколько разных скриптов в сети, но ни с одним из них дисплей не работал. Подключенный логический анализатор (дешевый клон анализаторов Saleae) пролил свет на проблему.

Оказалось, что после отправки адреса линия SCL переходила в низкое состояние. Проблема была в байте, в котором я отправлял адрес без бита записи.

Для работы самого ЖК-дисплея я использовал решение от Davide Gironi. На одной из страниц его блога «Библиотека AVR Atmega для жк-дисплея на базе HD44780, подключенного через I2C» вы можете найти систему на базе расширителя ATmega 8 и PCF8574 и поддержки, написанной на C. Упомянутая библиотека Fleury использовалась для поддержки шины I2C.

Следовательно, для работы модуля требуется только соответствующая конфигурация. Тем более что схема подключения отличается от описываемого модуля. В частности, отличаются соединения выходных контактов модуля с модулем LCD. Нужно также помнить о тактовой частоте ATmega, равной 1 МГц (в моем случае это была 16 МГц) и ее влиянии на частоту шины I2C (линии SCL).

Проще говоря, из кода, прилагаемого к указанной статьи я взял на свои нужды только код из каталогов lcdpcf8574 и pcf8574. Остальные каталоги, то есть uart и i2chw меня не интересовали, потому что первый из перечисленных мне не был нужен. А второй (поддержка I2C Fleury) я скачал себе уже ранее.

Установка данного модуля, подключенного к Atmega с тактовой частотой 16MHz и управления четырехстрочным дисплеем сводилась к модификации констант в файлах, указанных ниже:

Файл Twimaster. c

  • Тактовая частота ATmega 16 МГц
    #define F_CPU 16000000UL
  • Тактовая частота I2C 100 кГц
    #define SCL_CLOCK 100000L

Файл Lcdpcf8574.h

  • Количество строк дисплея (в моем случае 4, по умолчанию было 2)
    #define LCD_LINES 4
  • Адреса первых символов для 3-й и 4-й строк (они оказались отличными от стандартных — 0x14 и 0x54 соответственно)
    #define LCD_START_LINE3 0x10
    #define LCD_START_LINE4 0x50
  • Конфигурация контактов расширителя (совсем другая, чем по умолчанию)
    #define LCD_DATA0_PIN 4
    #define LCD_DATA1_PIN 5
    #define LCD_DATA2_PIN 6
    #define LCD_DATA3_PIN 7
    #define LCD_RS_PIN 0
    #define LCD_RW_PIN 1
    #define LCD_E_PIN 2
    #define LCD_E_PIN 2 #define LCD_

Файл pcf8574.h

  • Изменение базового адреса (по умолчанию можно было обрабатывать до 8 таких модулей)
    #define PCF8574_ADDRBASE (0x27)
  • Ограничение максимального количества модулей одним
    #define PCF8574_MAXDEVICES 1
  • Измените путь к коду обработчика I2C
    #define PCF8574_I2CFLEURYPATH «. ./i2c/i2cmaster.h»

Модуль запущен с ATmega 8

Ниже приведена ссылка на полный код:

Скачать файл проекта (23,0 KiB, скачано: 140)

% PDF-1.6 % 18600 0 объект > эндобдж xref 18600 794 0000000016 00000 н. 0000021637 00000 п. 0000021773 00000 п. 0000021990 00000 п. 0000022021 00000 н. 0000022075 00000 п. 0000022114 00000 п. 0000022358 00000 п. 0000022472 00000 п. 0000022561 00000 п. 0000022646 00000 п. 0000022734 00000 п. 0000022822 00000 н. 0000022910 00000 п. 0000022998 00000 н. 0000023086 00000 п. 0000023174 00000 п. 0000023262 00000 н. 0000023350 00000 п. 0000023438 00000 п. 0000023526 00000 п. 0000023614 00000 п. 0000023702 00000 п. 0000023790 00000 п. 0000023878 00000 п. 0000023966 00000 п. 0000024054 00000 п. 0000024142 00000 п. 0000024230 00000 п. 0000024318 00000 п. 0000024406 00000 п. 0000024494 00000 п. 0000024582 00000 п. 0000024670 00000 п. 0000024758 00000 п. 0000024846 00000 п. 0000024934 00000 п. 0000025022 00000 п. 0000025110 00000 п. 0000025198 00000 п. 0000025286 00000 п. 0000025374 00000 п. 0000025462 00000 п. 0000025550 00000 п. 0000025638 00000 п. 0000025726 00000 п. 0000025814 00000 п. 0000025902 00000 п. 0000025990 00000 н. 0000026078 00000 п. 0000026166 00000 п. 0000026254 00000 п. 0000026342 00000 п. 0000026430 00000 н. 0000026518 00000 п. 0000026606 00000 п. 0000026694 00000 п. 0000026782 00000 п. 0000026870 00000 п. 0000026958 00000 п. 0000027046 00000 п. 0000027134 00000 п. 0000027222 00000 п. 0000027310 00000 п. 0000027398 00000 н. 0000027486 00000 н. 0000027574 00000 п. 0000027662 00000 н. 0000027750 00000 п. 0000027838 00000 п. 0000027926 00000 н. 0000028014 00000 п. 0000028102 00000 п. 0000028190 00000 п. 0000028278 00000 п. 0000028366 00000 п. 0000028454 00000 п. 0000028542 00000 п. 0000028630 00000 п. 0000028718 00000 п. 0000028806 00000 п. 0000028894 00000 п. 0000028982 00000 п. 0000029070 00000 н. 0000029158 00000 п. 0000029246 00000 п. 0000029334 00000 п. 0000029422 00000 н. 0000029510 00000 п. 0000029598 00000 п. 0000029686 00000 п. 0000029774 00000 п. 0000029862 00000 н. 0000029950 00000 н. 0000030038 00000 п. 0000030126 00000 п. 0000030214 00000 п. 0000030302 00000 п. 0000030390 00000 п. 0000030478 00000 п. 0000030566 00000 п. 0000030654 00000 п. 0000030742 00000 п. 0000030830 00000 п. 0000030918 00000 п. 0000031006 00000 п. 0000031094 00000 п. 0000031182 00000 п. 0000031270 00000 п. 0000031358 00000 п. 0000031446 00000 п. 0000031534 00000 п. 0000031622 00000 п. 0000031710 00000 п. 0000031798 00000 п. 0000031886 00000 п. 0000031974 00000 п. 0000032062 00000 н. 0000032150 00000 п. 0000032238 00000 п. 0000032326 00000 п. 0000032414 00000 п. 0000032502 00000 п. 0000032590 00000 н. 0000032678 00000 н. 0000032766 00000 п. 0000032854 00000 п. 0000032942 00000 п. 0000033030 00000 п. 0000033118 00000 п. 0000033206 00000 п. 0000033294 00000 п. 0000033382 00000 п. 0000033470 00000 п. 0000033558 00000 п. 0000033646 00000 п. 0000033734 00000 п. 0000033822 00000 п. 0000033910 00000 п. 0000033998 00000 п. 0000034086 00000 п. 0000034174 00000 п. 0000034262 00000 п. 0000034350 00000 п. 0000034438 00000 п. 0000034526 00000 п. 0000034614 00000 п. 0000034702 00000 п. 0000034790 00000 н. 0000034878 00000 п. 0000034966 00000 п. 0000035054 00000 п. 0000035142 00000 п. 0000035230 00000 п. 0000035318 00000 п. 0000035406 00000 п. 0000035494 00000 п. 0000035582 00000 п. 0000035670 00000 п. 0000035758 00000 п. 0000035846 00000 п. 0000035934 00000 п. 0000036022 00000 п. 0000036110 00000 п. 0000036198 00000 п. 0000036286 00000 п. 0000036374 00000 п. 0000036462 00000 н. 0000036550 00000 п. 0000036638 00000 п. 0000036726 00000 н. 0000036814 00000 п. 0000036902 00000 п. 0000036990 00000 н. 0000037078 00000 п. 0000037166 00000 п. 0000037254 00000 п. 0000037342 00000 п. 0000037430 00000 п. 0000037518 00000 п. 0000037606 00000 п. 0000037694 00000 п. 0000037782 00000 п. 0000037870 00000 п. 0000037958 00000 п. 0000038046 00000 п. 0000038134 00000 п. 0000038222 00000 п. 0000038310 00000 п. 0000038398 00000 п. 0000038486 00000 п. 0000038574 00000 п. 0000038662 00000 п. 0000038750 00000 п. 0000038838 00000 п. 0000038926 00000 п. 0000039014 00000 н. 0000039102 00000 п. 0000039190 00000 п. 0000039278 00000 п. 0000039366 00000 п. 0000039454 00000 п. 0000039542 00000 п. 0000039630 00000 н. 0000039718 00000 п. 0000039806 00000 п. 0000039894 00000 п. 0000039982 00000 п. 0000040070 00000 п. 0000040158 00000 п. 0000040246 00000 п. 0000040334 00000 п. 0000040422 00000 п. 0000040510 00000 п. 0000040598 00000 п. 0000040686 00000 п. 0000040774 00000 п. 0000040862 00000 п. 0000040950 00000 п. 0000041038 00000 п. 0000041126 00000 п. 0000041214 00000 п. 0000041302 00000 п. 0000041390 00000 п. 0000041478 00000 п. 0000041566 00000 п. 0000041654 00000 п. 0000041742 00000 п. 0000041829 00000 п. 0000041916 00000 п. 0000042003 00000 п. 0000042090 00000 н. 0000042177 00000 п. 0000042264 00000 н. 0000042351 00000 п. 0000042438 00000 п. 0000042525 00000 п. 0000042612 00000 п. 0000042699 00000 п. 0000042786 00000 н. 0000042873 00000 п. 0000042960 00000 п. 0000043047 00000 п. 0000043134 00000 п. 0000043221 00000 п. 0000043308 00000 п. 0000043395 00000 п. 0000043482 00000 п. 0000043569 00000 п. 0000043656 00000 п. 0000043743 00000 п. 0000043830 00000 н. 0000043917 00000 п. 0000044004 00000 п. 0000044091 00000 п. 0000044178 00000 п. 0000044265 00000 п. 0000044352 00000 п. 0000044439 00000 п. 0000044526 00000 п. 0000044613 00000 п. 0000044700 00000 п. 0000044787 00000 п. 0000044874 00000 п. 0000044961 00000 п. 0000045048 00000 п. 0000045135 00000 п. 0000045222 00000 п. 0000045309 00000 п. 0000045396 00000 п. 0000045483 00000 п. 0000045570 00000 п. 0000045657 00000 п. 0000045744 00000 п. 0000045831 00000 п. 0000045918 00000 п. 0000046005 00000 п. 0000046092 00000 п. 0000046179 00000 п. 0000046266 00000 п. 0000046353 00000 п. 0000046440 00000 п. 0000046527 00000 н. 0000046614 00000 п. 0000046701 00000 п. 0000046788 00000 п. 0000046875 00000 п. 0000046962 00000 п. 0000047049 00000 п. 0000047136 00000 п. 0000047223 00000 п. 0000047310 00000 п. 0000047397 00000 п. 0000047484 00000 п. 0000047571 00000 п. 0000047658 00000 п. 0000047745 00000 п. 0000047832 00000 п. 0000047919 00000 п. 0000048006 00000 п. 0000048093 00000 п. 0000048180 00000 п. 0000048267 00000 п. 0000048354 00000 п. 0000048441 00000 п. 0000048528 00000 н. 0000048615 00000 н. 0000048702 00000 п. 0000048789 00000 н. 0000048876 00000 п. 0000048963 00000 н. 0000049050 00000 п. 0000049137 00000 п. 0000049224 00000 п. 0000049311 00000 п. 0000049398 00000 п. 0000049485 00000 п. 0000049572 00000 п. 0000049659 00000 п. 0000049746 00000 п. 0000049833 00000 п. 0000049920 00000 н. 0000050007 00000 п. 0000050094 00000 п. 0000050181 00000 п. 0000050268 00000 н. 0000050355 00000 п. 0000050442 00000 п. 0000050528 00000 п. 0000050614 00000 п. 0000050700 00000 п. 0000050786 00000 п. 0000050872 00000 п. 0000050958 00000 п. 0000051044 00000 п. 0000051130 00000 п. 0000051216 00000 п. 0000051302 00000 п. 0000051388 00000 п. 0000051473 00000 п. 0000051650 00000 п. 0000051755 00000 п. 0000051859 00000 п. 0000052787 00000 п. 0000053688 00000 п. 0000054663 00000 п. 0000055513 00000 п. 0000056371 00000 п. 0000057037 00000 п. 0000057675 00000 п. 0000058638 00000 п. 0000059681 00000 п. 0000060768 00000 п. 0000060908 00000 п. 0000061305 00000 п. 0000062319 00000 п. 0000063222 00000 п. 0000068577 00000 п. 0000074375 00000 п. 0000074452 00000 п. 0000080404 00000 п. 0000080657 00000 п. 0000080993 00000 п. 0000081518 00000 п. 0000081619 00000 п. 0000082144 00000 п. 0000082245 00000 п. 0000082309 00000 п. 0000082408 00000 п. 0000082524 00000 п. 0000082716 00000 н. 0000082908 00000 п. 0000083091 00000 п. 0000083242 00000 п. 0000083354 00000 п. 0000083535 00000 п. 0000083624 00000 п. 0000083719 00000 п. 0000083857 00000 п. 0000084002 00000 п. 0000084132 00000 п. 0000084382 00000 п. 0000084508 00000 п. 0000084693 00000 п. 0000084937 00000 п. 0000085062 00000 п. 0000085247 00000 п. 0000085484 00000 п. 0000085618 00000 п. 0000085870 00000 п. 0000086103 00000 п. 0000086238 00000 п. 0000086359 00000 п. 0000086535 00000 п. 0000086686 00000 п. 0000086869 00000 п. 0000087121 00000 п. 0000087245 00000 п. 0000087422 00000 п. 0000087620 00000 п. 0000087719 00000 п. 0000087885 00000 п. 0000088057 00000 п. 0000088213 00000 п. 0000088367 00000 п. 0000088555 00000 п. 0000088655 00000 п. 0000088810 00000 п. 0000088960 00000 п. 0000089099 00000 н. 0000089240 00000 п. 0000089447 00000 п. 0000089610 00000 п. 0000089715 00000 п. 0000089966 00000 н. 00000

00000 п. 0000090275 00000 п. 0000090458 00000 п. 0000090597 00000 п.

0000090807 00000 п. 0000091037 00000 п. 0000091163 00000 п. 0000091321 00000 п. 0000091501 00000 п. 0000091641 00000 п. 0000091845 00000 п. 0000092025 00000 п. 0000092165 00000 п. 0000092324 00000 п. 0000092480 00000 п. 0000092587 00000 п. 0000092780 00000 п. 0000092939 00000 п. 0000093103 00000 п. 0000093290 00000 п. 0000093407 00000 п. 0000093668 00000 п. 0000093872 00000 п. 0000094012 00000 п. 0000094191 00000 п. 0000094390 00000 п. 0000094586 00000 п. 0000094718 00000 п. 0000094896 00000 п. 0000095071 00000 п. 0000095174 00000 п. 0000095348 00000 п. 0000095455 00000 п. 0000095637 00000 п. 0000095774 00000 п. 0000095900 00000 п. 0000096016 00000 п. 0000096170 00000 п. 0000096279 00000 н. 0000096436 00000 п. 0000096572 00000 п. 0000096662 00000 н. 0000096826 00000 п. 0000096944 00000 п. 0000097050 00000 п. 0000097156 00000 п. 0000097264 00000 п. 0000097399 00000 н. 0000097516 00000 п. 0000097651 00000 п. 0000097834 00000 п. 0000097938 00000 п. 0000098055 00000 п. 0000098210 00000 п. 0000098336 00000 п. 0000098532 00000 п. 0000098686 00000 п. 0000098815 00000 п. 0000098969 00000 п. 0000099112 00000 п. 0000099286 00000 н. 0000099418 00000 п. 0000099558 00000 п. 0000099704 00000 п. 0000099836 00000 н. 0000100016 00000 н. 0000100182 00000 н. 0000100344 00000 н. 0000100536 00000 н. 0000100662 00000 н. 0000100869 00000 н. 0000101020 00000 н. 0000101163 00000 н. 0000101327 00000 н. 0000101462 00000 н. 0000101587 00000 н. 0000101707 00000 н. 0000101826 00000 н. 0000101992 00000 н. 0000102135 00000 н. 0000102270 00000 н. 0000102419 00000 п. 0000102520 00000 н. 0000102643 00000 п. 0000102771 00000 н. 0000102902 00000 н. 0000103049 00000 н. 0000103166 00000 п. 0000103293 00000 н. 0000103443 00000 н. 0000103578 00000 п. 0000103710 00000 п. 0000103876 00000 н. 0000104036 00000 н. 0000104204 00000 н. 0000104352 00000 п. 0000104544 00000 н. 0000104714 00000 н. 0000104892 00000 н. 0000105018 00000 н. 0000105155 00000 н. 0000105281 00000 п. 0000105407 00000 н. 0000105532 00000 н. 0000105724 00000 н. 0000105893 00000 п. 0000106043 00000 н. 0000106199 00000 п. 0000106388 00000 п. 0000106543 00000 н. 0000106686 00000 п. 0000106883 00000 н. 0000107005 00000 н. 0000107122 00000 н. 0000107294 00000 н. 0000107435 00000 п. 0000107592 00000 п. 0000107750 00000 н. 0000107931 00000 п. 0000108097 00000 п. 0000108267 00000 н. 0000108447 00000 н. 0000108610 00000 п. 0000108783 00000 н. 0000108964 00000 н. 0000109147 00000 н. 0000109306 00000 н. 0000109478 00000 п. 0000109634 00000 п. 0000109751 00000 п. 0000109874 00000 п. 0000110028 00000 н. 0000110218 00000 н. 0000110378 00000 п. 0000110480 00000 н. 0000110588 00000 н. 0000110728 00000 н. 0000110856 00000 н. 0000111026 00000 н. 0000111207 00000 н. 0000111364 00000 н. 0000111538 00000 н. 0000111644 00000 н. 0000111801 00000 н. 0000111989 00000 н. 0000112143 00000 н. 0000112323 00000 н. 0000112446 00000 н. 0000112587 00000 н. 0000112761 00000 н. 0000112892 00000 н. 0000113033 00000 н. 0000113156 00000 н. 0000113309 00000 н. 0000113499 00000 н. 0000113647 00000 н. 0000113776 00000 н. 0000113949 00000 н. 0000114092 00000 н. 0000114216 00000 н. 0000114395 00000 н. 0000114590 00000 н. 0000114774 00000 н. 0000114969 00000 н. 0000115163 00000 н. 0000115332 00000 н. 0000115523 00000 н. 0000115625 00000 н. 0000115735 00000 н. 0000115855 00000 н. 0000115996 00000 н. 0000116220 00000 н. 0000116376 00000 н. 0000116548 00000 н. 0000116766 00000 н. 0000116926 00000 н. 0000117071 00000 н. 0000117227 00000 н. 0000117404 00000 н. 0000117510 00000 н. 0000117637 00000 н. 0000117825 00000 н. 0000117982 00000 н. 0000118159 00000 н. 0000118284 00000 н. 0000118425 00000 н. 0000118548 00000 н. 0000118700 00000 н. 0000118872 00000 н. 0000118996 00000 н. 0000119174 00000 н. 0000119332 00000 н. 0000119522 00000 н. 0000119701 00000 н. 0000119802 00000 н. 0000119908 00000 н. 0000120012 00000 н. 0000120145 00000 н. 0000120296 00000 н. 0000120448 00000 н. 0000120569 00000 н. 0000120762 00000 н. 0000120904 00000 н. 0000121077 00000 н. 0000121278 00000 н. 0000121386 00000 н. 0000121491 00000 н. 0000121697 00000 н. 0000121785 00000 н. 0000121981 00000 н. 0000122120 00000 н. 0000122265 00000 н. 0000122473 00000 н. 0000122634 00000 н. 0000122771 00000 н. 0000122993 00000 н. 0000123150 00000 н. 0000123284 00000 н. 0000123422 00000 н. 0000123588 00000 н. 0000123702 00000 н. 0000123873 00000 н. 0000124064 00000 н. 0000124201 00000 н. 0000124327 00000 н. 0000124481 00000 н. 0000124612 00000 н. 0000124775 00000 н. 0000124939 00000 н. 0000125081 00000 н. 0000125208 00000 н. 0000125347 00000 н. 0000125514 00000 н. 0000125680 00000 н. 0000125833 00000 н. 0000126018 00000 н. 0000126205 00000 н. 0000126391 00000 н. 0000126536 00000 н. 0000126711 00000 н. 0000126844 00000 н. 0000126981 00000 п. 0000127106 00000 н. 0000127295 00000 н. 0000127437 00000 н. 0000127591 00000 н. 0000127783 00000 н. 0000127899 00000 н. 0000128007 00000 н. 0000128222 00000 н. 0000128422 00000 н. 0000128540 00000 н. 0000128734 00000 н. 0000128953 00000 н. 0000129067 00000 н. 0000129204 00000 н. 0000129338 00000 н. 0000129478 00000 н. 0000129627 00000 н. 0000129761 00000 н. 0000129896 00000 н. 0000130041 00000 н. 0000130187 00000 н. 0000130337 00000 н. 0000130493 00000 п. 0000130633 00000 н. 0000130777 00000 н. 0000130913 00000 н. 0000131051 00000 н. 0000131255 00000 н. 0000131426 00000 н. 0000131586 00000 н. 0000131762 00000 н. 0000131890 00000 н. 0000132023 00000 н. 0000132239 00000 н. 0000132360 00000 н. 0000132485 00000 н. 0000132647 00000 н. 0000132787 00000 н. 0000132952 00000 н. 0000133138 00000 п. 0000133278 00000 н. 0000133423 00000 н. 0000133613 00000 н. 0000133817 00000 н. 0000133977 00000 н. 0000134117 00000 н. 0000134368 00000 н. 0000134516 00000 н. 0000134672 00000 н. 0000134895 00000 н. 0000135016 00000 н. 0000135149 00000 н. 0000135341 00000 п. 0000135522 00000 н. 0000135675 00000 н. 0000135862 00000 н. 0000136036 00000 н. 0000136214 00000 н. 0000136423 00000 н. 0000136586 00000 н. 0000136731 00000 н. 0000136876 00000 н. 0000137062 00000 н. 0000137202 00000 н. 0000137362 00000 н. 0000137497 00000 н. 0000137676 00000 н. 0000137803 00000 н. 0000137959 00000 н. 0000138216 00000 н. 0000138308 00000 н. 0000138424 00000 н. 0000138554 00000 н. 0000138683 00000 н. 0000138840 00000 н. 0000138943 00000 н. 0000139098 00000 н. 0000139251 00000 н. 0000139409 00000 н. 0000139558 00000 н. 0000139718 00000 н. 0000139874 00000 н. 0000140008 00000 н. 0000140141 00000 п. 0000140284 00000 н. 0000140424 00000 н. 0000140542 00000 н. 0000140723 00000 п. 0000140859 00000 н. 0000140994 00000 н. 0000141145 00000 н. 0000141326 00000 н. 0000141464 00000 н. 0000141624 00000 н. 0000141758 00000 н. 0000141936 00000 н. 0000142086 00000 н. 0000142272 00000 н. 0000142430 00000 н. 0000142569 00000 н. 0000142691 00000 н. 0000142834 00000 н. 0000142982 00000 н. 0000143131 00000 п. 0000143267 00000 н. 0000143444 00000 н. 0000143592 00000 н. 0000143781 00000 п. 0000143941 00000 н. 0000144080 00000 н. 0000144202 00000 н. 0000144350 00000 н. 0000144486 00000 н. 0000144592 00000 н. 0000144789 00000 н. 0000144989 00000 н. 0000145190 00000 н. 0000145389 00000 н. 0000145587 00000 н. 0000145788 00000 н. 0000145985 00000 н. 0000146189 00000 н. 0000146386 00000 п. 0000146583 00000 н. 0000146780 00000 н. 0000146978 00000 н. 0000147178 00000 н. 0000147383 00000 н. 0000147588 00000 н. 0000147788 00000 н. 0000147989 00000 н. 0000148192 00000 н. 0000148393 00000 н. 0000148594 00000 н. 0000148796 00000 н. 0000148997 00000 н. 0000016516 00000 п. трейлер ] / Назад 6239112 >> startxref 0 %% EOF 19393 0 объект > поток a0 雋 \ nE * 8fqIz @ -N = 9R \ L + Р% l ?. Ca۵; U =% 1şl ~ i̕ @ z`1tzϺq; 1F] E / MuzMzDQYuZ’swK .Zn? FrjE DgsJ = է Zfohy, T e @ 0`4 [k8b_ Oub] Q “ΗX ȼ .-} zSJZcp

RonaldBoard: Программирование ISP + связь I2C | Детали

В то время, когда я начинал этот проект, мне не удалось найти ни одного проекта, который сочетал бы связь между интернет-провайдером и I2C. Поэтому я решил сделать это сам. Поскольку все должно быть в шифровании, и я все еще хочу иметь возможность обновлять прошивку с SSH, ISP должен быть доступен «без рук».

предупреждение – предупреждение – предупреждение – предупреждение – предупреждение – предупреждение – предупреждение – предупреждение – предупреждение

 Это может убить ваш Rasbperry Pi, будьте особенно осторожны с линиями 5V. обрабатывать ШИМ и АЦП, на что ATMega8 способен лучше, чем на Raspberry Pi.

Поскольку Герт назвал свою плату расширения GertBoard, я решил назвать свою RonaldBoard (как голландец? По крайней мере, имя Герта звучит по-голландски . ..).

Все, что нужно, - это Raspberry Pi, At * и провода. Для Pi я выбрал ATMega8, а не ATTiny45 из-за более дешевого ввода-вывода.

Дизайн выглядит следующим образом:

Примечание! Хотя нумерация контактов в порядке, нумерация GPIO неправильная! Проверьте [1] для правильной информации

  • Вывод / RESET подключен к выводу 22 GPIO-заголовка. PB0 дублируется как SDA (связь I2C) и вывод MOSI (ISP)
  • PB1 подключен к MOSI, и может быть используется с осторожностью, чтобы управлять чем-то другим, когда он не находится в режиме программирования (светодиод в этом примере)
  • PB2 дублируется как SCL (связь I2C) и SCK (ISP) контакт
  • PB3 подключен к светодиодному индикатору

Обратите внимание, что, поскольку PB1 используется Pi при программировании ATTiny, его, вероятно, не следует использовать для e.грамм. управлять сервоприводом с помощью ШИМ.

Для связи Pi <=> Atmega8 я выбрал I2C, потому что в то время я не мог заставить работать SPI (без побитового взлома). Для Tiny45 контакты такие же; для моего ATmega8 это стоило мне двух дополнительных контактов ...

Настроить

Если вы хотите использовать это в своем собственном проекте, убедитесь, что у вас есть следующее:

  • Raspberry Pi, подключенный к RonaldBoard
  • Установлена ​​библиотека pigpio
  • avrdude (пропатченная версия)
  • Пример исходного кода (проверьте файлы проекта на наличие I2c.tar.gz)
  • /etc/avrdude.conf, настроенный с помощью программатора pgio на правильные контакты:
 программист
  id = "gpio2";
  desc = "Использовать интерфейс sysfs для разбивки линий GPIO";
  type = gpio;
  сброс = 25;
  sck = 3;
  mosi = 2;
  мисо = 9;
; 

Использование

Перед первым запуском после загрузки убедитесь, что pigpiod запущен и у вас загружен модуль i2c. Я сделал такой сценарий:

sudo./ modprobes

После того, как все настроено, прошиваем RonaldBoard:
  make
sudo сделать предохранитель
sudo make flash  

Makefile проверяет, настроены ли GPIO для связи I2C на повторное чтение, используя команды pigs.

Тогда проверьте это:

  ./i2ctest  

В окне терминала вы должны увидеть что-то вроде этого:

  i2cdetect:
     0 1 2 3 4 5 6 7 8 9 а б в г д е
00: - - - - - - - - - - - - -
10: - - - - - - - - - - - - - - - -
20: - - - - - - 26 - - - - - - - - -
30: - - - - - - - - - - - УУ - - - -
40: - - - - - - - - - - - - - - - -
50: - - - - - - - - - - - - - - - -
60: - - - - - - - - - - - - - - - -
70: - - - - - - - -
тест на получение значения регистра 0x42:
0x42
тестирование АЦП читаем:
0xc0
0xd5
0xb7
тестирование ШИМ. 

Кроме того, светодиод должен погаснуть, а затем засветиться все ярче и ярче.

Подержанные работы

Библиотеки Eagle для ATTiny и Pi (обе впоследствии изменены в Inkscape, но очень полезны для базового символа):

Библиотеки:

Сравнение двухпроводного последовательного интерфейса с трехпроводным для RTC

Решение:

Основное различие между SPI (3-проводным интерфейсом) и I2C (2-проводным интерфейсом) заключается в том, что вы должны отправить адрес при использовании I2C. Так что это будет не так быстро, как SPI, потому что вам нужно отправить больше данных.

При использовании SPI вам понадобится дополнительный вывод для сигнала включения микросхемы. Это потребуется для каждого ведомого. Так что это быстрее, но вам нужно больше выходных контактов.

Я бы предпочел I2C, потому что скорость в этом сценарии не имеет значения.

Микроконтроллер ATMega имеет периферийное оборудование для обоих методов, так что выбор на ваше усмотрение

Первый запускается по I2C. Информация о времени представлена ​​на Рисунке 5 на странице 7 таблицы данных.

Второй запускается от SPI. Информация о времени представлена ​​на Рисунке 4 на странице 8 таблицы данных.

Похоже, что у ATmega8 есть TWI и SPI, как и у всех других частей ATmega, вы можете использовать оба с ним одновременно, если захотите. Я бы предпочел SPI. С ним немного легче работать, и, поскольку протокол имеет тенденцию быть немного менее темпераментным.

Это зависит от нескольких факторов:

  1. Конструкция оборудования: если вы используете только этот чип со своим микроконтроллером, подойдет любой из них. Но если ваша конструкция состоит из двух или более устройств, использующих интерфейс I2C, имеет смысл использовать I2C RTC, чтобы вам не приходилось выполнять дополнительные интерфейсы, просто добавьте RTC к существующей шине. То же самое относится и к SPI, но имейте в виду, что при добавлении дополнительных устройств к шине SPI вам понадобится один дополнительный сигнал SS для каждого устройства. Это также зависит от периферийного оборудования, которое у вас есть в вашем микроконтроллере. Если ваш микроконтроллер имеет аппаратное периферийное устройство SPI, но не имеет I2C, тогда имеет смысл использовать устройство SPI поверх устройства I2C.То же самое и с периферийным устройством I2C.

  2. Дизайн программного обеспечения. Еще одним решающим фактором является реализация того или иного протокола в программном обеспечении. I2C требует немного больше работы, чем SPI. Вы также можете найти некоторые реализации кода в Интернете. Если у вас уже есть код I2C с высокой степенью уверенности, используйте его. То же самое применимо, если вы достаточно уверены в фрагменте кода для SPI, который вы нашли в Интернете.

  3. Ваше понимание: выбор также зависит от вашего понимания любого из протоколов и того, насколько хорошо вы разбираетесь в них.Если вы использовали какой-либо из них раньше, имеет смысл использовать предыдущий опыт.

Плата сервопривода и ультразвукового дальномера с управлением по I2C

Плата с сервоприводом и ультразвуковым дальномером с управлением по I2C

Плата сервоконтроллера I2C


Оборудование - плата контроллера DIY

Макет печатной платы, готов:

Файлы CadSoft Eagle: atmega8servo.sch atmega8servo.brd

Детали: ATMEGA8, несколько кристаллов 8..16 МГц, предпочтительно небольшой корпус HC49US, регулятор LM7805 5V TO-220, Понижающий стабилизатор LM2576 или LM2597-5V TO-220, любой 5A 30V schottky, 330uH тороидальный индуктор с ферритовым сердечником, 10kOhm Пихер / подстроечный резистор, несколько полипропиленовых импульсных конденсаторов и хороший электролитик, пара конденсаторов для поверхностного монтажа и резисторы (легко паять!)

Характеристики платы: 6. Вход .20 В, настроен с помощью команд I2C, 6 управляемых сервоприводов (рабочие), бортовое питание сервопривода 3А макс. всего и с регулируемыми 5..6 В, 2 дальномера SRF04 (еще не закодированы), 4 канала АЦП (еще не закодированы), 4 ввода / вывода (еще не закодированы), собственные блок питания для сервоприводов.

Сервоприводы: плата была протестирована с Hitec HS-322HD и цифровым Graupner 5149 DS8077, так что другие обычные и «цифровые» сервоприводы тоже должны работать нормально. Будьте осторожны с распиновкой сервокабеля. На плате используется сигнал Vcc GND, который является обычным распиновкой для Hitec. и Граупнер.При необходимости выньте штыри сервокабеля, сначала приподняв «зажимы» ножом, а затем вставьте их обратно в разъем. переставил порядок.

Дальномер: плата подает + 5В на SRF04 дальномер и использует распиновку SRF04 для сигналов запуска и эха. Другие модули дальномера, например SRF08 наверное использовать нельзя.

Питание: плата должна питаться 12В. Он генерирует линейно регулируемое напряжение +5 В для логики и регулируемое более высокое напряжение. КПД в коммутируемом режиме> = + 5V 3A для шести сервоприводов.Вы можете взять входной источник питания 12 В, например, от ваш компьютер. 4-контактный разъем питания ПК разъем: черный = GND, желтый = + 12В, красный = + 5В. Если вы опустите блок питания LM2576, вы также можете подключить ПК + 5 В к C10. конденсатор для питания сервоприводов. Обратите внимание, что должен всегда выключать ПК перед подключением платы, в противном случае жесткие диски будет выполнен полный сброс из-за скачка энергопотребления, вызванного конденсаторами платы контроллера. Если подключены полные 6 сервоприводов, проверьте по спецификациям сервоприводов, что ток, потребляемый во время остановки (худший случай) всех 6 сервоприводов вместе, не превышает 3А.


Программное обеспечение - для ATMEGA8 и Windows

Исходный код ATMEGA8 как проект AVR Studio 4 atmega8-servo.aps и atmega8-servo. c. Код основан на оригинальном сервомастере, написанном пользователя Stefan May. Можно найти тестовую версию перезаписи с поддержкой SRF04. в разработке, это незавершенная работа и еще не гарантированно работает целиком.

Некоторые комментарии из исходного кода ATMEGA8, например что нужно для скомпилируйте это:

// Требования:
// ATMEGA8 и плата в atmega8servo.brd Eagle PCB
// WinAVR GCC: WinAVR-20070525-install.exe
// PonyProg: ponyprogV207a.zip
// AVR Studio 4: aStudio4b528.exe
// Программатор параллельного порта:
// LPT 2-> 12 (прямой провод), 3-> 11 (прямой провод),
// LPT 10-> 100 Ом-> MISO, 9-> 100 Ом-> СБРОС
// LPT 7-> 100 Ом-> MOSI, 6-> 100 Ом-> SCK
// Avr ISP I / O, выбранный в настройке интерфейса PonyProg
// Ультразвуковой дальномер SRF04
// интерфейс I2C, например http://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm
 
Предварительно скомпилированные файлы Intel Hex и ELF можно найти в двоичных файлах. Используйте PonyProg для установите флаги синхронизации ATMEGA8 в битах предохранителя на 8 МГц внутренний RC (CKSEL3. .0: 0100) и медленно запуск (SUT1..0: 10) (см. скриншот PonyProg битов конфигурации).

Статус исходного кода: сервоуправление хорошо работает через I2C (позже напишу улучшенный код синхронизации ...). Однако SRF04 и Поддержка АЦП по-прежнему отсутствует.

Хороший программатор параллельного порта, который можно использовать вместе с PonyProg (установить конфигурацию для «Avr ISP I / O») для прошивки ATMEGA8 ниже.Схема, которую я скопировал откуда-то еще в сети;)

Простая программа тестирования контроллера Windows, которая получает доступ к I2C через модуль I2C-USB Robot Electronics: находится в usb-i2c-testprog вместе с .exe и VisualBasic 6 исходный код.


(C) 2007 Ян Вагнер

Arduino и двухпроводной интерфейс (TWI / I2C)

Лаборатория ближайшего будущего »Архив блога» Arduino и Два - Wire Int … Краткое наставление о том, как заставить TWI работать на Arduino Mini Arduino и Два - Провод Интерфейс ( TWI / I2C < / strong>) Включая краткое дидактическое руководство о том, как заставить TWI работать на Arduino Mini. Я использовал the Arduino и микроконтроллер Atmel обычно используют SPI (последовательный периферийный интерфейс), но решили взглянуть на двухпроводный (а.к.а. I2C ). Я делаю это частично потому, что было бы хорошо узнать, как это работает, но также и потому, что он более компактный в электрическом отношении. Он использует только два провода, а не те , которые необходимы для SPI, поэтому схематические конструкции и макетов плат становятся немного более управляемыми. Компромисс - это немного более сложная семантика протоколов, но ничто не выходит из-под контроля. (Я также подумываю использовать двухосевой акселерометр, который намного дешевле, чем трехосный, который я использовал, - 4 доллара против 15 долларов.Для некоторых экспериментов две оси могут быть совершенно нормальными, и я рад сэкономить 11 долларов. Первым шагом было убедиться, что Arduino будет и оставить TWI - это почти бесполезно этого не должно быть, потому что Atmega8 определенно поддерживает и его.Итак, следующим шагом было выяснение того, как лучше всего проводить и транзакции TWI . Для этого я сверился с таблицей спецификаций Atmega8, в которой довольно подробно описаны протокол и подробности реализации на Atmega8. (Есть также несколько полезных замечаний по применению, которые доступны здесь, и здесь.) Он настолько тщательный, что мне пришлось его распечатать. Я довольно хорошо разбирался в и том, как это работает, но прежде чем я начал кодировать, я заметил, что это были библиотеки TWI как в avrlibc и в библиотеке « Wire » на Wiring. org упакованы как «санкционированная» внешняя библиотека для Arduino < / strong>, вот и все.Николас Замбетти, написавший библиотеку Wire , в значительной степени сказал мне, что она должна работать без проблем, и он был в значительной степени прав. Нет проблем. Его библиотека очень хорошо абстрагирует TWI изнутри, поэтому мне не нужно возиться с какими-либо регистрами Atmega или чем-то в этом роде. http://www.nearfuturelaboratory.com/2007/01/11/arduino-< sizesand

I2C связывает Arduino и Beagleboard

Я хочу пересмотреть дизайн своей ЖК-платы на базе I2C.Старый дизайн работает, но он ненадежен и создает большую нагрузку на шину I2C. Я бы предпочел что-то, что создает меньше трафика и предъявляет меньше требований к хосту.

I2C - отличный протокол для подключения датчиков к микрокомпьютерам, но вы также можете использовать его для соединения двух компьютеров.

В решении, которое я рассматриваю, будет использоваться 8-битный процессор AVR Atmel для управления ЖК-дисплеем и работы в качестве ведомого устройства IC2. Таким образом, хост-компьютер должен отправить всего два байта по сети для записи символа.Текущий дизайн отправляет в три или четыре раза больше.

Я собираюсь разработать решение небольшими шагами:

  1. Получите BeagleBoard, говорящий с Arduino по I2C с BB в качестве ведущего и Arduino в качестве ведомого.
  2. Подключите Arduino к ЖК-дисплею.
  3. Добавьте код драйвера ЖК-дисплея в эскиз Arduino и управляйте им с помощью I2C
  4. Вставьте ATMega8 в плату DT104 от Dontronics. У меня есть несколько запасных.
  5. Запрограммируйте загрузчик Arduino в ATMega8.
  6. Загрузите эскиз I2C-LCD в ATMega8.
  7. Создайте простую подставку для ЖК-дисплея и материнской платы и соедините их.

Вуаля!

Шаг первый сделан.

Среди примеров Arduino есть удобный эскиз ведомого устройства I2C и хороший учебник, показывающий, как подключить два Arduinos на основном веб-сайте. Я запрограммировал подчиненное устройство Arduino так, чтобы оно располагалось на адресе I2C 4.

Подключать Arduino и BB безопасно, потому что плата Tincantools Trainer-xM сдвигает 1 Beagle.8 В I2C передает сигнал 5 В, требуемый Arduino, и наоборот.

Я нашел полезное сообщение в блоге об использовании инструментов Beagleboard I2c для управления другим типом устройств; легко адаптировать данную команду для работы с Arduino. Когда я набираю

  i2cwrite 2 4 67  
на Beagleboard он отправляет байтовое значение 67 по шине 2 устройству с I2C-адресом 4, а символ 'C' (десятичный ascii 67) получает Arduino.

Подключение Arduino и LCD

Я ожидаю, что Шаг 2 займет больше всего времени; Соединение Arduino с LDC - сложная задача, но я делал это раньше, и от Oomlout есть очень четкие инструкции для ЖК-дисплея, который они поставляют.

Как только это будет сделано, все остальное должно быть довольно простым.

.

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

Ваш адрес email не будет опубликован.