시리얼 초보자 : 왜 전선을 연결하지 못하는가?


14

나는 많은 것을 이해하지 않고 USB 직렬 변환기를 통해 Arduino-esque 코드를 사용하여 ATtiny85에서 PC로 전송하려고합니다. 나는 충격을 받고 그것이 효과가 없다는 것을 두려워했다.

작은 핀이 핀 중 하나에서 전압을 깜박이는 것을 확인했지만 USB 직렬 케이블에서 송수신하기 위해 해당 핀을 연결하고 터미널 프로그램을 사용하여 청취하려고하면 아무것도 얻지 못합니다.

어떤 부분이 고장 났는지 알 수 없습니다.

직렬을 전송하려면 VCC, GND 및 TXD 이상이 필요합니까?


세부:

작은 코드는 Arduino 환경에서 작성되었으며 유사한 LED는 적어도 LED에 따라 4 개의 "PORTB"핀을 모두 성공적으로 깜박입니다. HLT와 Saporetti코드를 사용하여 C ++의 Arduino 방언을 사용하여 프로그래밍 할 수 있습니다. 이 프로그램은 여전히 ​​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

많은 번역이 필요하지만 코드는 매우 기본적입니다. 전송 속도를 설정하는 코드는 1MHz로 가정하지만 운 좋게도 공장 기본 퓨즈가 있고 1MHz로 실행됩니다. 어쨌든 핀 6은 LED에 따라 전압이 깜박입니다.

그래서 작은 전선을 사용하여 FTDI USB 직렬 변환기 의 "ftdi"끝을 작은 것으로 연결합니다 : 검은 색 -GND , 빨간색 -VCC, 주황색-6 PC에서 "minicom"프로그램을 열고 전송 속도를 설정합니다 4800으로 평가하고 아무것도 기다리지 마십시오. 내 Boarduino 와 대화 할 때 아무런 문제가 없습니다.

FTDI 변환기 케이블에는 다음과 같은 핀 배치가 있습니다. 검은 색은 GND, 갈색은 "CTS", 빨간색은 VCC (+ 4.98V), 주황색은 "TXD", 노란색은 "RXD", 녹색은 "RTS"입니다.

소형에서 PC로 전송하려면 "TXD"또는 "RXD"의 전압을 깜박 여야합니까? 즉, 슬레이브에서 호스트로 또는 호스트에서 슬레이브로 전송하기위한 전송 와이어입니까?

나는 실제로 둘 다 시도했지만 둘 다 작동하지 않았습니다. 지금까지 1 달러 미만의 장비를 튀 겼고, 거칠어지고 있으므로 전선을 케이블에 꽂기 만하면됩니다. "CTS"와 "RTS"전선을 무시해서는 안될까요?

다른 전선을 사용해야합니까? RTS와 CTS는 무엇을합니까?

하드웨어는 4.98V의 USB 전원을 사용하는 ATTiny85-PU (DIP-8 패키지, 1MHz에서 실행, 20MHz로 정격)입니다. 호스트 PC는 MacBook이며 ArtininoISP를 사용하여 ATtiny가 작은 심장을 깜박이도록 프로그래밍하는 것을 포함하여 arduino의 모든 작업을 성공적으로 수행합니다.

답변:


9

TX & GND 만 사용하여 데이터를 확실히 전송할 수 있습니다.

먼저, ATtiny85 TX 라인을 FTDI RX 라인 (TTL-232R의 노란색)에 연결하려고합니다. USB 어댑터가 5V를 처리 할 수 ​​있는지 확인하십시오. 3.3V TTL-232R도 5V를 견딜 수 있습니다.

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를 지원하지 않는 것 같으므로 호스트 소프트웨어에서 사용하지 않아야합니다.

내부 오실레이터를 사용하여 1MHz에서 실행하는 경우 악화 될 수있는 몇 가지 잠재적 타이밍 문제에 대한 자세한 내용 은 참조 페이지를 참조 하십시오.


감사! 참조 페이지에 4800이 너무 빠르다는 사실이 밝혀 졌으므로 300 보드로 떨어졌고 상황이 더 낫습니다. pinMode는 전송에 영향을 미치지 않지만 어쨌든 명확하게하기 위해 추가했습니다. 나는 무언가가 수신 될 때까지 비트 간 지연을 변경하는 속도를 늦추려고합니다. 미니 컴이 방금 보이고 있습니까? 지금 마크. 최악의 경우, 16MHz 및 20MHz 발진기가 금요일에 도착합니다.
Jack Schmidt

전압 문제 일 수 있다고 생각하십니까? 타이밍 조정이 여전히 작동하지 않고 많은 물음표가 표시되어 무언가가 전송되고 있습니다. Vcc를 작은 3V로 낮추는 것만으로 문제를 해결할 수 있습니까? 즉, USB 대신 일부 배터리에 연결할 수 있습니까? USB 접지와 배터리 접지 모두에 접지를 연결합니까?
잭 슈미트

아, 노란 와이어를 지적 해 주셔서 감사합니다. 주황색 선이 많이 깜박입니다 (PC의 LED에 연결). PC가 전송 중입니까, 아니면 대부분 "켜져"있습니까?
잭 슈미트

예, 유휴 상태에서는 HI를 유지하고 전송시 깜박 거립니다. FTDI가 LED를 구동하기에 충분한 전류를 공급할 수 있는지 잘 모르겠습니다. AVR은 정상이지만 FTDI-TX 라인에서 LED를 제거합니다. Crystal은 타이밍 문제를 해결해야합니다 (하지만 내부 발진기에서 전환하도록 퓨즈를 설정해야합니다).
피터 깁슨

여전히 노력하고 있지만 타이밍 문제 또는 끔찍한 Arduino-on-ATTiny 소프트웨어 문제라고 확신합니다. 몇 개의 중간 2-3 바이트가 수신되고 있지만 표시되지는 않지만 나머지는 0x80으로 왜곡됩니다. 크리스탈을 기다리는 동안 (사소한) AVR 소프트 직렬 전송 기능을 작성하겠습니다. 무엇이 전송되고 있는지 알기 쉬운 방법이 있습니까? 내 오래된 눈에는 300 보드가 여전히 빠릅니다.
잭 슈미트

7

대답은 것으로 보인다 않도록 : 당신은 할 수 만 실제로 단지 (검정) 및 RXD (노란색) GND, 모든 것이 한 소프트웨어가 좋다로 작동 와이어를 연결.

중요하지 않은 것 :

  • 내부 발진기가 제대로 작동합니다. 제한 테스트에 비교적 안정적으로 보입니다. 9600 보드에서 문제가 무엇이든 무시할 수 있습니다.

  • 신호에 USB 전원을 사용하면 정상적으로 작동합니다. 별도의 전압 소스 (공통 접지 공유)를 사용할 수 있지만 FTDI 케이블은 3V 및 5V 신호를 완벽하게 읽습니다. 나는 배터리 팩을 FTDI와 작은 것의 GND에, 그리고 작은 것의 VCC에 연결했다. 그러나 FTDI (USB 전원 5V)의 VCC (빨간색) 만 사용하는 것이 훨씬 간단하고 효과적입니다.

내가 잘못한 것들 :

  • Yellow FTDI "RXD"라인은 마이크로 컨트롤러로부터 비트를 수신하므로 마이크로 컨트롤러의 전송에 연결됩니다. 전송 및 수신 라인 (주황색 및 노란색)을 LED 또는 Arduino에 연결하고 PC에서 전송할 때 깜박이는 전압을 확인하여 스스로 알아낼 수있었습니다.

  • SoftwareSerial과 NewSoftSerial은 모두 ATtiny와 함께 사용할 수 없습니다. ATmega328p와 ATtiny85는 많은 유사점을 공유하지만, 기존 소프트웨어를 새로운 칩으로 컴파일하는 것만으로는 충분하지 않다는 차이점이 있습니다.

  • 전송 속도가 느려도 문제가 해결되지 않습니다. 비트 간 사이클 수가 8 비트 카운터보다 훨씬 많기 때문에 300 보드에는 더 복잡한 지연 루틴이 필요합니다. 9600 보드는 정상적으로 작동하며 더 높은 보드 속도가 가능합니다.

  • C, 특히 인라인 함수에서 타이밍 결정 코드를 작성하는 데주의하십시오. 실행 시간은 컴파일러가 최적화하는 방법에 따라 다릅니다. 특히 지연을 위아래로 변경하여 지연을 교정 할 경우 생성 된 어셈블리가 상당히 다를 수 있기 때문에 (컴파일 시간 감지 가능) 일정한 지연을 사용하는 경우와 다른 응답을 얻을 수 있습니다. C가 "느린"것이 아니라 너무 빠르다는 것입니다. 한 시점에서 나는 0보다 1을 더 빨리 보내고있었습니다 (아마도 더 공기 역학적입니다).

  • 전송을 시작하려면 라인을 LOW (시작 비트)로 가져온 후 다음 8 개 샘플 포인트 각각에서 라인이 올바른 전압인지 확인한 다음 9 번째 샘플에서 전압이 HIGH인지 확인해야합니다. . NewSoftSerial은 시작 비트에서 절반 길이의 지연을 언급하지만 이것은 나에게 잘 작동하지 않습니다. 처음에는 75 %의 지연을, 마지막에는 125 %의 지연을 사용했습니다.

  • 전압에 대한 실제 우려는 일부 "직렬"(특히 RS232)이 0V / 5V가 아니라 ± 12V 일 수 있습니다. 5V에서 3.3V로 전압을 조정하는 방법을 이해하려고 많은 시간을 보냈지 만 완전히 관련이 없다고 생각합니다.

어쨌든 시리얼 전송은 쉽지만 타이밍을 "완벽하게"얻는 것은 매우 중요합니다. 나에게 이것은 사이클을 계산할 수 있도록 어셈블리에서 전송을 코딩하는 문제였습니다.


2
1이 공기 역학적으로 증가하는 경우 +1 :) FTDI TTL232R은 로직 레벨 uart 신호 (0-5V)를 출력합니다. 표준 직렬 포트와 직접 인터페이스하는 경우 전압을 변환하는 MAX232와 같은 인터페이스 IC가 필요합니다. 두 가지 방법으로 레벨.
피터 깁슨

작동하게 된 것을 축하합니다. 자세한 게시물을 보내 주셔서 감사합니다. 다른 많은 사람들이 ATtiny 프로젝트에 도움이되기를 바랍니다.
davidcary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.