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.
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.
źródło