Seryjny nowicjusz: dlaczego nie mogę po prostu podłączyć przewodów?

14

Próbuję przesyłać dane z ATtiny85 na komputer PC za pomocą kodu Arduino za pomocą konwertera USB-Serial, nie rozumiejąc niczego. Byłem zszokowany i przerażony, że to nie zadziałało.

Potwierdziłem, że maleńki miga napięcie na jednym ze swoich pinów, ale kiedy podłączam ten pin, aby nadawać lub odbierać za pomocą kabla szeregowego USB i próbować słuchać za pomocą programu terminala, nic nie dostaję.

Nie jestem pewien, jak powiedzieć, która część jest zepsuta.

Czy potrzebuję więcej niż VCC, GND i TXD do transmisji szeregowej?


Detale:

Kod malucha jest zapisany w środowisku Arduino i podobny kod z powodzeniem miga na wszystkich 4 pinach „PORTB”, przynajmniej zgodnie z diodami LED. Używam kodu z HLT i Saporetti, aby pozwolić mi używać dialektu Arduino w C ++ do programowania. Program nadal wchodzi w kategorii 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

W grę wchodzi wiele tłumaczeń, ale kod jest dość prosty. Kod, który ustawia prędkość transmisji, wydaje się przyjmować 1 MHz, ale na szczęście moje attiny ma fabryczne domyślne bezpieczniki i działa z częstotliwością 1 MHz. W każdym razie pin 6 miga swoim napięciem zgodnie z diodą LED.

Używam więc małych przewodów, aby podłączyć końcówkę „ftdi” konwertera szeregowego USB FTDI do malutkiego: czarnego na GND, czerwonego na VCC, pomarańczowego na 6. Otwieram program „minicom” na komputerze, ustawiam bod oceń do 4800 i poczekaj na nic. Rozmawiając z moim Boarduino , nie ma problemu.

Kabel konwertera FTDI ma następujące wyprowadzenie: czarny to GND, brązowy to „CTS”, czerwony to VCC (+ 4,98 V), pomarańczowy to „TXD”, żółty to „RXD”, zielony to „RTS”.

Jeśli chcę transmitować z maleńkiego na PC, czy powinienem migać napięcie na „TXD” lub „RXD”? Innymi słowy, czy przewód transmisyjny ma transmitować z urządzenia podrzędnego do hosta, czy host do urządzenia podrzędnego?

Właściwie to wypróbowałem oba, żadne nie działało. Do tej pory smażyłem sprzęt o wartości mniejszej niż dolar i robię się zarozumiały, więc po prostu podłączam przewody do kabla. Może nie powinienem ignorować przewodów „CTS” i „RTS”?

Czy muszę używać innych przewodów? Czy RTS i CTS coś robią?

Sprzęt to ATTiny85-PU (pakiet DIP-8, działający z częstotliwością 1 MHz, o znamionowej częstotliwości do 20 MHz) zasilany przez USB o częstotliwości 4,98 V. Komputer hosta to MacBook, który z powodzeniem wykonuje wszystkie czynności arduino, w tym ArduinoISP do programowania ATtiny w taki sposób, aby mrugał okiem.

Jack Schmidt
źródło

Odpowiedzi:

9

Zdecydowanie możesz przesyłać dane, używając tylko TX i GND.

Po pierwsze, chcesz podłączyć linię ATtiny85 TX do linii FTDI RX (żółty na TTL-232R). Upewnij się, że adapter USB może obsłużyć 5 V - jestem całkiem pewien, że nawet 3,3 V TTL-232R jest odporny na 5 V.

Zgodnie ze stroną przykładową dla SoftwareSerial , musisz ustawić kierunek linii TX i RX w funkcji konfiguracji:

// 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);
}

W twoim przypadku prędkość transmisji wyniesie 4800. Biblioteka SoftwareSerial nie obsługuje CTS i RTS, więc upewnij się, że nie używasz ich w oprogramowaniu hosta.

Sprawdź stronę referencyjną, aby uzyskać więcej informacji, gdzie omawiają niektóre potencjalne problemy z taktowaniem, które mogą się zaostrzyć, jeśli pracujesz z częstotliwością 1 MHz przy użyciu wewnętrznego oscylatora na maleńkim.

Peter Gibson
źródło
Dzięki! Strona referencyjna wyjaśniła, że ​​4800 było za szybkie, więc spadłem do 300 bodów i wszystko jest „lepsze”. PinMode nie wpływa na transmisję, ale i tak go dodałem, aby wszystko było bardziej zrozumiałe. Próbuję teraz spowolnić zmianę opóźnienia między bitami, aż coś zostanie odebrane. Minicom właśnie pokazuje? znaki w tej chwili. W najgorszym przypadku moje oscylatory 16 MHz i 20 MHz przybywają w piątek.
Jack Schmidt
Czy uważasz, że może to być problem z napięciem? Dostosowywanie czasu nadal nie działało, a otrzymuję wiele znaków zapytania, więc coś jest przesyłane. Czy mogę to naprawić, obniżając Vcc do małego do 3 V, to znaczy, czy mogę po prostu podłączyć go do niektórych akumulatorów zamiast USB? Czy podłączam uziemienie zarówno do uziemienia USB, jak i uziemienia akumulatora?
Jack Schmidt
Och, również dzięki za wskazanie, że żółty przewód jest dla mojego malucha do przekazania. Pomarańczowy drut wydaje się bardzo migotać (podłączony do diody LED z komputera). Czy komputer transmituje, czy też pozostaje „włączony” przez większość czasu?
Jack Schmidt
Tak, powinien pozostać na poziomie HI w stanie bezczynności i migotać podczas transmisji - nie jestem pewien, czy FTDI jest w stanie dostarczyć wystarczającą ilość prądu do zasilania diody LED. AVR będzie w porządku, ale usunęłbym diodę LED z linii FTDI-TX. Crystal powinna naprawić problemy z synchronizacją (ale musisz ustawić bezpieczniki, aby przełączyły się z wewnętrznego oscylatora).
Peter Gibson
Nadal nad tym pracuję, ale jestem przekonany, że jest to problem z czasem lub straszny problem z oprogramowaniem Arduino-on-ATTiny. Kilka środkowych 2-3 bajtów jest odbieranych (ale nie jest wyświetlanych), a pozostałe są zniekształcone jako 0x80. Napiszę własną (trywialną) miękką funkcję seryjnego wysyłania AVR, czekając na kryształ. Czy istnieje jakiś łatwy / tani sposób na sprawdzenie, co jest wysyłane? 300 bodów jest wciąż dość szybkie jak na moje stare oczy.
Jack Schmidt
7

Więc odpowiedź wydaje się być: ty możesz po prostu podłączyć przewody rzeczywiście tylko GND (czarny) i RXD (żółty) i wszystko działa tak długo, jak oprogramowanie jest dobre.

Rzeczy, które nie miały znaczenia:

  • Wewnętrzny oscylator działa dobrze. Wydaje się względnie stabilny do moich ograniczających testów. Przy prędkości 9600 bodów jakiekolwiek problemy są znikome.

  • Używanie zasilania USB na sygnałach działa dobrze. Możesz użyć osobnego źródła napięcia (dzielącego wspólną masę), ale kabel FTDI doskonale odczytuje zarówno sygnały 3V, jak i 5V. Podłączyłem akumulator, - do GND zarówno FTDI, jak i malutkiego, + do VCC malutkiego, i to zadziałało dobrze. Jednak samo użycie VCC (czerwonego) FTDI (zasilanie USB 5 V) jest znacznie prostsze i równie skuteczne.

Rzeczy, które zrobiłem źle:

  • Żółta linia FTDI „RXD” odbiera bity z mikrokontrolera, więc łączy się z transmisją mikrokontrolera. Mógłbym to sam rozwiązać, podłączając linie nadawczo-odbiorczą (pomarańczową i żółtą) do diod LED lub Arduino i sprawdzając, które napięcie migało podczas transmisji z komputera.

  • Ani SoftwareSerial, ani NewSoftSerial nie działają od razu z ATtiny. Podczas gdy ATmega328p i ATtiny85 mają wiele podobieństw, istnieje wystarczająco dużo różnic, które nie wystarczą, aby zmusić stare oprogramowanie do kompilacji dla nowego układu.

  • Niższe prędkości transmisji nie leczą rzeczy. 300 bodów wymaga bardziej skomplikowanych procedur opóźnień, ponieważ liczba cykli między bitami jest znacznie większa niż licznik 8-bitowy. 9600 bodów działa dobrze, a możliwe są wyższe prędkości transmisji.

  • Uważaj na pisanie krytycznego kodu czasowego w C, szczególnie w funkcjach wbudowanych. Czas potrzebny do uruchomienia zależy od tego, jak kompilator zoptymalizuje go. W szczególności, podczas kalibracji opóźnienia przez samą zmianę w górę i w dół, otrzymasz inną odpowiedź niż przy użyciu stałego opóźnienia (wykrywalnego w czasie kompilacji), ponieważ wygenerowany zestaw może być całkiem inny. Nie chodzi o to, że C jest „wolny”, ale o to, że było za szybkie. W pewnym momencie wysyłałem 1s szybciej niż 0 (przypuszczalnie są one bardziej aerodynamiczne).

  • Aby rozpocząć transmisję, ustaw linię LOW (bit początkowy), a następnie upewnij się, że linia ma właściwe napięcie w każdym z kolejnych 8 punktów próbnych, a następnie upewnij się, że napięcie jest WYSOKIE na 9 próbce . NewSoftSerial wspomina o opóźnieniu o połowę długości bitu startowego, ale nie działało to dla mnie dobrze. Użyłem 75% opóźnienia na starcie i 125% opóźnienia na końcu.

  • Prawdziwym problemem związanym z napięciem może być to, że niektóre „szeregowe” (zwłaszcza RS232) mają ± 12 V, a nie 0 V / 5 V. Spędziłem dużo czasu próbując zrozumieć, w jaki sposób mogę wyregulować napięcie z 5 V na 3,3 V, ale myślę, że to zupełnie nie miało znaczenia.

W każdym razie transmisja szeregowa jest łatwa, ale uzyskanie idealnego czasu wydaje się bardzo ważne. Dla mnie było to tylko kwestia zakodowania transmisji w asemblerze, abym mógł policzyć cykle.

Jack Schmidt
źródło
2
+1 dla 1 jest bardziej aerodynamiczne :) FTDI TTL232R wysyła sygnały Uart poziomu logicznego (0-5 V), jeśli łączysz się bezpośrednio ze standardowym portem szeregowym, potrzebujesz interfejsu IC takiego jak MAX232, który przekształca napięcie poziomuje w obie strony.
Peter Gibson
Gratulacje za uruchomienie. Dziękuję za szczegółowy post, mam nadzieję, że pomoże to wielu innym osobom w ich projektach ATtiny.
davidcary