Серийный новичок: почему я не могу просто подключить провода?


14

Я пытаюсь передать данные с ATtiny85 на ПК, используя код Arduino-esque через USB-Serial конвертер, не разбираясь во многом. Я был шокирован и потрясен тем, что это не сработало.

Я подтвердил, что крошечный индикатор мигает напряжением на одном из его выводов, но когда я подключаю этот вывод для передачи или приема по кабелю USB-serial и пытаюсь прослушивать его с помощью программы терминала, я ничего не получаю.

Я не уверен, как сказать, какая часть сломана.

Нужно ли больше, чем VCC, GND и TXD для передачи последовательного?


Детали:

Код для крошечного написан в среде Arduino, и аналогичный код успешно мигает на всех 4 выводах «PORTB», по крайней мере, в соответствии со светодиодами. Я использую код из HLT и Saporetti, чтобы позволить мне использовать Arduino диалект C ++ для его программирования. Программа все еще входит под K.

#include <SoftwareSerial.h>

SoftwareSerial s(0,1); //receive on "0", and transmit on "1" aka "PB1" aka pin 6

void setup() { s.begin(4800); } // assuming 1Mhz, 4800 baud
void loop() { s.println(millis()); } // transmit something at every opportunity

Здесь много перевода, но код довольно простой. Код, который устанавливает скорость в бодах, кажется, принимает 1 МГц, но, к счастью, у моего attiny есть заводские предохранители по умолчанию и он работает на 1 МГц. Во всяком случае, контакт 6 мигает своим напряжением в соответствии со светодиодом.

Поэтому я использую маленькие провода, чтобы подключить конец «ftdi» преобразователя USB-последовательностей FTDI к крошечному: черный к GND, красный к VCC, оранжевый к 6. Я открываю программу «minicom» на ПК, устанавливаю скорость передачи данных Оцените 4800 и ждите, ничего. При разговоре с моим Boarduino , это не проблема.

Кабель преобразователя FTDI имеет следующую распиновку: черный - GND, коричневый - «CTS», красный - VCC (+ 4,98 В), оранжевый - «TXD», желтый - «RXD», зеленый - «RTS».

Если я хочу передать данные с крошечного на ПК, должен ли я мигать напряжением на «TXD» или «RXD»? Другими словами, является ли провод передачи для передачи от подчиненного устройства к хосту или от хоста к подчиненному устройству?

Я на самом деле пробовал оба, ни один не работал. Пока я поджарил оборудование на сумму менее одного доллара, и я становлюсь дерзким, поэтому просто подключаю провода к кабелю. Может быть, я не должен игнорировать провода "CTS" и "RTS"?

Нужно ли использовать какие-либо другие провода? RTS и CTS делают что-нибудь?

Аппаратное обеспечение представляет собой ATTiny85-PU (пакет DIP-8, работающий на частоте 1 МГц, рассчитанный на 20 МГц), работающий от USB при напряжении 4,98 В. Хост-компьютер - это MacBook, и он успешно выполняет все функции Arduino, в том числе использует ArduinoISP для программирования ATtiny на мгновение оцепенения.

Ответы:


9

Вы можете определенно передавать данные, используя только TX и GND.

Во-первых, вы хотите подключить линию ATtiny85 TX к линии FTDI RX (желтый на TTL-232R). Убедитесь, что USB-адаптер может работать с напряжением 5 В - я уверен, что даже 3.3 В TTL-232R допускает 5 В.

В соответствии с примером страницы для SoftwareSerial вам необходимо установить направление линий TX & RX в вашей функции настройки:

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

Скорость передачи данных будет 4800 в вашем случае. Библиотека SoftwareSerial, похоже, не поддерживает CTS & RTS, поэтому просто убедитесь, что вы не используете их в программном обеспечении хоста.

Посетите справочную страницу для получения более подробной информации, где они рассказывают о некоторых потенциальных проблемах синхронизации, которые могут усугубиться, если вы работаете на частоте 1 МГц с использованием внутреннего генератора на крошечном устройстве.


Благодарность! На странице справки было ясно, что скорость 4800 слишком высокая, поэтому я упал до 300 бод, и все стало «лучше». PinMode не влияет на передачу, но я все равно добавил его, чтобы сделать вещи более понятными. Я сейчас пытаюсь замедлить изменение задержки между битами, пока что-то не получено. Миником просто показывает? отмечается прямо сейчас. В худшем случае мои генераторы 16 МГц и 20 МГц прибывают в пятницу.
Джек Шмидт

Как вы думаете, это может быть проблема с напряжением? Настройка времени все еще не сработала, и я получаю много вопросительных знаков, так что что-то передается. Можно ли это исправить, просто понизив Vcc до крошечного до 3 В, то есть можно просто подключить его к некоторым батареям вместо USB? Подключить ли заземление как к заземлению USB, так и к заземлению аккумулятора?
Джек Шмидт

О, также спасибо за указание на желтый провод для моей крошечной передачи. Оранжевый провод, кажется, много мигает (подключен к светодиоду от ПК). ПК передает или он остается включенным большую часть времени?
Джек Шмидт

Да, должен оставаться HI в режиме ожидания и мерцать при передаче - я не уверен, способен ли FTDI подавать достаточный ток для управления светодиодом. AVR будет в порядке, но я бы убрал светодиод из линии FTDI-TX. Кристалл должен устранить проблемы с синхронизацией (но вам нужно установить предохранители для переключения с внутреннего генератора).
Питер Гибсон

Все еще работаю над этим, но я убежден, что это проблема синхронизации или ужасная проблема программного обеспечения Arduino-on-ATTiny. Несколько средних 2-3 байта принимаются (но не отображаются), а остальные искажаются как 0x80. Я напишу свою собственную (тривиальную) функцию последовательной отправки AVR, пока жду кристалла. Есть ли какой-нибудь простой / дешевый способ узнать, что отправляется? 300 бод все еще довольно быстро для моих старых глаз.
Джек Шмидт

7

Таким образом, ответ, по-видимому, таков: вы можете просто подключить провода, на самом деле просто GND (черный) и RXD (желтый), и все будет работать, пока программное обеспечение хорошее.

Вещи, которые не имели значения:

  • Внутренний генератор работает просто отлично. Это кажется относительно стабильным для моего ограничивающего тестирования. На скорости 9600 бод любые проблемы, которые у него есть, незначительны.

  • Использование питания USB на сигналах работает просто отлично. Вы можете использовать отдельный источник напряжения (с общим заземлением), но кабель FTDI отлично считывает сигналы как 3 В, так и 5 В. Я подключил батарейный блок - к GND как FTDI, так и крошечного, + к VCC крошечного, и это работало просто отлично. Однако просто использовать VCC (красный) FTDI (USB-питание 5 В) значительно проще и эффективнее.

То, что я сделал не так:

  • Желтая линия FTDI «RXD» получает биты от микроконтроллера, поэтому она подключается к входу на микроконтроллере. Я мог бы сам в этом разобраться, подключив передающую и приемную линии (оранжевую и желтую) к светодиодам или Arduino и проверив, какое напряжение мигало при передаче с ПК.

  • Ни SoftwareSerial, ни NewSoftSerial не работают из коробки с ATtiny. В то время как ATmega328p и ATtiny85 имеют много общего, есть достаточно различий, что просто получить старое программное обеспечение для компиляции для нового чипа недостаточно.

  • Более медленные скорости передачи данных не излечивают вещи. 300 бод требует более сложных процедур задержки, поскольку число циклов между битами значительно больше, чем у 8-битного счетчика. 9600 бод работает просто отлично, и более высокая скорость передачи данных возможна.

  • Будьте осторожны при написании критического по времени кода на C, особенно во встроенных функциях. Время выполнения зависит от того, как компилятор его оптимизирует. В частности, при калибровке задержки, просто изменяя ее вверх и вниз, вы получите другой ответ, чем при использовании (определяемой по времени компиляции) постоянной задержки, поскольку сгенерированная сборка может быть довольно разной. Дело не в том, что C «медленный», а в том, что он был слишком быстрым. В какой-то момент я отправил 1 с быстрее, чем 0 (предположительно, они более аэродинамические).

  • Чтобы начать передачу, вы устанавливаете линию НИЗКОЙ (начальный бит), а затем вам необходимо убедиться, что линия находится в нужном напряжении в каждой из следующих 8 точек выборки, а затем убедиться, что напряжение в ВЫСОКОМ напряжении на 9-й выборке , NewSoftSerial упоминает о половине задержки на стартовом бите, но это не сработало для меня. Я использовал задержку 75% в начале и задержку 125% в конце.

  • Реальное беспокойство по поводу напряжения может заключаться в том, что некоторое «последовательное» (особенно RS232) напряжение составляет ± 12 В, а не 0 В / 5 В. Я потратил много времени, пытаясь понять, как я могу отрегулировать напряжение от 5 В до 3,3 В, но я думаю, что это было совершенно неактуально.

Во всяком случае, передавать сериалы легко, но очень важно получить идеальное время. Для меня это был просто вопрос кодирования передачи в сборке, чтобы я мог считать циклы.


2
+1 для 1 является более аэродинамическим :) FTDI TTL232R выводит сигналы логического уровня Uart (0-5 В), если вы напрямую взаимодействовали со стандартным последовательным портом, вам понадобится интерфейсная ИС, такая как MAX232, которая преобразует напряжение уровни в обе стороны.
Питер Гибсон

Поздравляю с тем, что он заработал. Спасибо за ваш подробный пост, я надеюсь, что это поможет многим другим людям в их проектах ATtiny.
Дэвидкари
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.