Pytanie tylko po co?
RS-232 niewątpliwie jest prosty, ale z punktu widzenia elektronika ma dwie poważne wady:
- wymaga konwertera poziomów (tzw. transceivera, np. max232), jest to układ tani, ale zajmuje miejsce na PCB, wymaga zwykle 4 zewnętrznych kondensatorów, no i zawsze to jakiś element dodatkowy,
- złącze RS-232 nie ma wyprowadzonego zasilania. Co prawda parenaście mA można wyciągnąć z nieużywanych linii interfejsu, jednak nie jest to za wiele.
A jakie RS-232 ma zalety? Dosyć poważne:
- prostota - nawet początkujący uruchomi transmisję w ciągu kilkunastu minut,
- w USART wyposażony jest praktycznie każdy mikrokontroler, a nawet jeśli nie jest, to stosunkowo łatwo go emulować programowo.
- możliwość komunikacji na duże odległości.
Wydaje się, że przedstawione zalety przeważają tym bardziej, że zanikający port RS-232 możemy zawsze protezować wykorzystując różnego typu przejściówki, z których najpopularniejsze oparte są na znanym układzie FT232 i różnych jego odmianach. Inna strategia polega na programowej emulacji USB bezpośrednio w procesorze dzięki bibliotece V-USB.
Emulacja programowa USB z pewnością jest tania i wymaga tylko kilku prostych elementów zewnętrznych, ale bardzo obciąża procesor i nie do końca jest zgodna ze standardem USB.
Z kolei wykorzystanie przejściówek opartych na FT232 kosztuje:
- sam układ FT232 około 14-18zł (cena 2013r.),
- do tego zajmuje on trochę miejsca na PCB (co także kosztuje),
- no i nie każdy lubi lutować układy SMD.
Przejściówki USB-RS232
Dla tych co nie lubią lub boją się montażu SMD różne firmy oferują zmontowane przejściówki w cenie 30-60zł. Taką przejściówkę wystarczy połączyć przy pomocy listy kołkowej z naszym układem i możemy się cieszyć możliwością komunikacji z PC przy pomocy wirtualnego portu szeregowego. Co ważne, od strony mikrokontrolera komunikacja ciągle przebiega z wykorzystaniem interfejsu USART.
Alternatywy
Wszystko pięknie, ale świat idzie do przodu i to co było na topie 2-3 lata temu obecnie niekoniecznie jest najlepszym rozwiązaniem. Na rynku mikrokontrolerów, w tym mikrokontrolerów AVR, pojawiły się układy dysponujące wbudowanym interfejsem USB (w wersji host, jak i device).
W rodzinie AVR sprzętowy interfejs USB-device (co wystarcza do implentacji dowolnego urządzenia USB podłączanego do PC) posiadają mikrokontrolery ATMega z literką U w nazwie.
Literka U musi być przy oznaczeniu mikrokontrolera, a nie po myślniku – wtedy znaczy coś innego.
Czyli np. ATMega32U2 posiada interfejs USB, z kolei ATMega32-AU, to zwykły mikrokontroler bez tego interfejsu.
Tak samo jest w rodzinie Xmega - ATXMEGA128A1U posiada sprzętowy interfejs USB, a ATXMEGA128A1-AU nie posiada.
Czyli np. ATMega32U2 posiada interfejs USB, z kolei ATMega32-AU, to zwykły mikrokontroler bez tego interfejsu.
Tak samo jest w rodzinie Xmega - ATXMEGA128A1U posiada sprzętowy interfejs USB, a ATXMEGA128A1-AU nie posiada.
Niemniej obecnie (2013r.) nie ma właściwie żadnego uzasadnienia dla używania rodziny ATMega, gdyż pod każdym względem (także cenowym) lepsze od nich są mikrokontrolery XMEGA.
Taki interfejs posiadają także pokazane wcześniej minimoduły z mikrokontrolerami XMEGA256A3-BU i XMEGA128A3U. Co więcej, posiadane moduły są wyposażone w gniazdo USB i wszystko co do komunikacji jest wymagane. Spróbujmy więc je wykorzystać.
Podłączenie - schemat
Jeśli ktoś nimi nie dysponuje i nie jest przekonany do bezpośredniego łączenia procesora z USB poniżej pokazuję schemat takiego połączenia. Jak widzimy jest on banalnie prosty – odpowiednie linie sygnałowe D+ i D- łączymy bezpośrednio z odpowiednimi sygnałami w gnieździe USB.
Naprawdę prościej już się nie da :-)
Jak widzimy piny mikrokontrolera PD7 i PD6 są połączone bezpośrednio z odpowiednimi stykami gniazda USB. Jest to możliwe, gdyż XMEGA posiadają wewnętrzne układy dopasowujące. Oczywiście zwolennicy dmuchania na zimne mogą umieścić dodatkowe rezystory szeregowe na tych liniach (typowo 22Ω).
Zasilanie
Warto zwrócić uwagę na jeszcze jedną rzecz – USB dostarcza napięcia zasilającego, które możemy wykorzystać do zasilania podłączonego układu (maksymalna wydajność przed enumeracją to 100mA, po enumeracji 500mA dla USB do 2.0 i 900mA dla USB 3.0 lub 1,5A bez jednoczesnej transmisji danych).
Jednak napięcie na tym interfejsie (około 5V) jest wyższe niż dopuszczalne dla XMEGA (maksymalnie 3,6V). Stąd też jeśli chcemy zasilać XMEGA z USB musimy dodać zewnętrzny regulator napięcia, typu low-drop (bardzo ważne, ze względu na niewielką różnicę napięć pomiędzy wejściem a wyjściem). Nie jest to żadnym problemem, gdyż zazwyczaj i tak jakiś regulator w układzie mamy.
Warto podkreślić, że posiadacze pokazanych wcześniej modułów, mają już taki regulator zamontowany. Odpowiednią zworką mogą wybierać zewnętrzne źródło napięcia lub zasilanie z USB.
Jak widzimy połączenia elektryczne są niezwykle proste, warto ewentualnie pomyśleć o dodatkowym filtrowaniu napięcia z USB (komputer jest potężnym źródłem zakłóceń), ale dla naszych rozważań nie jest to niezbędne.
Kwarc, czy generator wewnętrzny RC?
Uważni obserwatorzy naszego bloga i osoby znające się co nieco na AVR-ach z pewnością zaprotestują – jak to, a gdzie kwarc? Przecież na wewnętrznym generatorze RC, to w życiu nie zadziała!
No i są w błędzie. XMEGA posiadają naprawdę stabilny wewnętrzny generator RC, w efekcie nie tylko do realizacji transmisji RS-232, ale nawet do pracy z wykorzystaniem USB żadne zewnętrzne elementy nie są potrzebne! Tak więc przedstawiony schemat jest kompletnym, działającym układem interfejsu XMEGA-USB.
Program
Ok, mamy sprzęt, czas na program. W pokazanej implementacji wirtualnego portu szeregowego wykorzystane zostanie oprogramowanie dostarczone przez firmę Atmel.
Firma ta jest tak miła, że za darmo dostarcza nam gotowych bibliotek i przykładów. Taką gotową biblioteką zawierającą wszystko co potrzeba do realizacji RS-232 przez USB jest ASF (Atmel Software Framework).
Biblioteka trochę ciężka i na pierwszy rzut oka skomplikowana, dlatego osobiście preferuję „własne” rozwiązania. Ale nie ma co wyważać otwartych drzwi – zamiast narzekać wykorzystałem gotowy kod, tylko nieco go „odchudziłem” wyrzucając zbędne komponenty ASF i niepotrzebne definicje.
Lecz dobra wiadomość jest taka – dzięki pokazanemu przykładowi w ogóle nie musisz zagłębiać się w tajniki implementacji CDC (USB communications device class – klasy urządzeń komunikacyjnych, do których zalicza się m.in. urządzenie wirtualnego portu szeregowego). Miało być prosto – i będzie prosto!
Tak więc mamy nieco zmodyfikowaną bibliotekę firmy Atmel implementującą klasę CDC, dzięki czemu w ogóle nas nie interesuje jak to wszystko działa. Natomiast interesuje nas (a przynajmniej powinno) poznanie jak z tego korzystać.
Czas więc ściągnąć przykładowy projekt – jest on przygotowany dla Atmel Studio 6.1 i w tym programie możemy go bezpośrednio otworzyć. Ze wszystkich plików, które są zawarte w tym projekcie interesuje nas plik main.c, w którym znajduje się cała obsługa RS-232:
Przykład 1 (w kompilatorze)
int main(void) { //Włączamy wszystkie poziomy przerwań (potrzebujemy tylko najniższy) PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; sei(); sysclk_init(); udc_start(); while (1) { char ch; if (udi_cdc_is_rx_ready()) { ch = udi_cdc_getc(); switch(ch) { case 'n' : udi_cdc_write_buf("Pozdrowienia z XMEGA!\n\r", 23); break; default : udi_cdc_write_buf("O co chodzi?\n\r", 14); break; } } } }
Co nasz przykład robi?
Jak widzimy najpierw włączane są przerwania. Ponieważ kontroler przerwań w XMEGA obsługuje trzy poziomy przerwań, włączamy je wszystkie (chociaż nasz sterownik USB wykorzystuje tylko przerwania najniższego poziomu) i ustawiamy globalną flagę zezwolenia na przerwania instrukcją sei().
Następnie inicjalizowane są podsystemy mikrokontrolera – zegar oraz włączany jest sterownik USB.
Implementacja USB zaproponowana przez firmę Atmel jest o tyle fajna, że wykorzystuje ona przerwania i bufory, w efekcie cała obsługa USB jest zupełnie niezależna od kodu użytkownika.
Od tego momentu nasz mikrokontroler może wymieniać dane z PC udając port szeregowy.
W pętli głównej, sprawdzamy czy w buforze odbiornika znajduje się jakiś znak - funkcja udi_cdc_is_rx_ready(), jeśli tak to go odbieramy. Po sprawdzeniu co to za znak podejmujemy odpowiednią akcję – wysyłamy do komputera PC łańcuch znaków - funkcja udi_cdc_write_buf().
Funkcja ta przyjmuje jako argumenty adres bufora, w którym znajduje się wysyłany łańcuch oraz jego długość. Oczywiście mamy też do dyspozycji funkcję udi_cdc_putc(int value), która wysyła jeden znak (argument value).
I to wszystko, prawda, że proste?
Część osób uważnie czytających ten artykuł z pewnością zapyta – a gdzie inicjalizacja portu szeregowego? Przecież musimy ustawić odpowiednią szybkość transmisji, prawda?
Otóż nie. Jedną z przyjemnych cech emulacji portu szeregowego jest to, że szybkość transmisji nas zupełnie nie interesuje. Dlaczego? Ano dlatego, że jest to parametr istotny dla fizycznego interfejsu RS-232 dzięki niemu odbiornik wie jak szybko nadawane są dane przez nadajnik, co jest niezbędne, gdyż typowa transmisja RS-232 jest transmisją asynchroniczną (czyli nie przesyłamy żadnego zegara taktującego transmisję).
Tu dane wysyłane są przez interfejs USB, w efekcie sposób ich wysyłania i szybkość zupełnie nas nie interesują. Przez interfejs USB przechodzą one zawsze tak szybko jak tylko się da. To aplikacja może je wysyłać lub pobierać wolniej. W efekcie w terminalu możemy ustawić dowolną szybkość transmisji danych!
Ale zanim to zrobimy musimy wczytać nasz przykładowy program do XMEGA. Możemy to uczynić przy pomocy programatora, albo tak jak wcześniej pokazałem przy pomocy programu FLIP – właściciele prezentowanych wcześniej modułów dysponują XMEGA z preprogramowanym bootloaderem.
Po uruchomieniu programu, nasz ulubiony system powinien wykryć nowe urządzenie USB. Jeśli naszym ulubionym systemem jest MS Windows, to zapewne nie będzie on dysponował odpowiednimi sterownikami. Nie ma problemu – odpowiednie sterowniki znajdują się w katalogu RS232overUSB/RS232overUSB – plik atmel_devices_cdc.inf. Jeśli system nie znalazł właściwych sterowników, należy mu wskazać ten plik. Po poprawnym zainstalowaniu sterowników powinniśmy w menagerze urządzeń zobaczyć nowe urządzenie:
Jest nim EVK1XXX Virtual Com Port (COM7).
Dlaczego taka dziwaczna nazwa? Problem w tym, że urządzenia USB muszą posiadać swój unikalny identyfikator VID/PID. W naszym przykładzie pasożytujemy nieco na firmie Atmel, wykorzystując ich identyfikatory (pamiętaj jednak, że absolutnie nie wolno robić tego w urządzeniach komercyjnych!).
Ponieważ użyliśmy VID/PID, który w pliku .inf ma przypisaną powyższą nazwę, stąd też nasz układ tak się przedstawia. Oczywiście można to zmienić, ale skorzystanie z pliku .inf firmy Atmel ma jeszcze jedną zaletę – jest on podpisany cyfrowo. Tak, to nie bajki, pliki tekstowe .inf też mają w Windows swoje podpisy cyfrowe.
O ile dla Windows XP i Windows 7 brak podpisu nie jest zasadniczo problemem, o tyle użytkownicy Windows 8 mieliby problem. Jeśli plik opisu sterownika (urządzenia klasy CDC nie wymagają instalacji żadnych sterowników) jest podpisany cyfrowo, to także użytkownicy Windows 8 mogą z naszego przykładu korzystać bez problemów.
Ok, na tym etapie zakładam, że twój system rozpoznał nowy układ, a sterowniki są poprawnie zainstalowane. Co dalej? Warto w menagerze urządzeń sprawdzić numer wirtualnego portu COM – na powyższym zrzucie był to COM7, ale w twoim przypadku może to być zupełnie inny port.
Nadeszła więc pora na test – odpalamy nasz ulubiony terminal. Ja używam RealTerm – nie jest to żaden cud, ale ma wszystko co jest potrzebne, no i jest za darmo (jeśli go nie masz, to go możesz pobrać stąd: http://realterm.sourceforge.net).
Uruchamiamy więc terminal, wybieramy port, który jest połączony z naszą XMEGA (możemy wybrać po numerze lub nazwie, np. \USBSER000 i zaczynamy zabawę.
A co nasz przykład robi? Po jego uruchomieniu oczekuje on na dane z komputera, po otrzymaniu litery n wysyła pozdrowienia, które powinniśmy zobaczyć na terminalu, po wysłaniu dowolnego innego znaku wysyła zapytanie „O co chodzi?” – poniższy rysunek.
I to wszystko, prawda, że proste?
Mam nadzieję, że przekonałem Was do używania USB zamiast archaicznych rozwiązań typu emulacja USB lub przejściówki USB - RS232. Jeśl będzie taka potrzeba to pokażemy więcej przykładów rozwiązań opartych na USB.
Program zajmuje 7,5kB - to dużo, czy mało?
Chwila, ale czemu ten prosty przykład zajmuje prawie 7,5kB? A dlaczego nie, pamiętaj, to XMEGA, mamy pamięci sporo! A pamięć leżąca odłogiem, to pamięć zmarnowana.
Nie przekonuje cię to? Mnie też nie Prawda jest prozaiczna – nasz przykład, to przycięty fragment ASF – biblioteki fajnej, ale uniwersalnej. A jak wiemy za uniwersalność się płaci – najczęściej wzrostem objętości kodu i wolniejszym działaniem. Jeśli by ją dalej przyciąć i np. ustawiać zegar systemowy wpisując gotowe wartości, to spokojnie można zejść do 2-3 kB. Ciągle więcej niż w przypadku USART, ale za to o ile fajniej? :-)
Do pobrania
Pliki projektu Atmel Studio 6.1: RS232overUSB.zip
Plik IntelHex do bezpośredniego programowania dla XMEGA256A3BU (moduły Xplained XMEGA256A3BU lub moduł z modulowo.pl): RS232overUSB-XMEGA256A3BU.zip
Plik IntelHex do bezpśredniego programowania dla XMEGA128A3U (moduł z Leon Instruments): RS232overUSB-XMEGA128A3U.zip
Inne XMEGA
Jeśli posiadasz inny XMEGA niż użyty w projekcie XMEGA256A3BU, to po prostu zmień w projekcie typ procesora i przekompiluj go. Uzyskasz nowy plik hex, do zaprogramowania.
Kilka RS-232
Oczywiście możesz na raz podłączyć do PC więcej mikrokontrolerów XMEGA – w takiej sytuacji pojawią się kolejne porty szeregowe:
A czy jedna XMEGA może udawać kilka urządzeń USB? Jak sądzisz? :-)
Oczywiście, że tak, nawet nie jest to dużo trudniejsze, ale to już całkiem inna historia ...
Wstęp do XMEGA: Spis treści
W dokumentacji Xmegi można wypatrzeć tryb USB "Mass storage" czyli taki sam jak w pamięciach przenośnych. Jest możliwe wykonanie na Xmedze i podpiętej do niej karcie microSD "pendrive'a" z możliwością dostępu do niego spod eksploratora windows?
OdpowiedzUsuńJest możliwe podpięcie np. microSD, tak aby przez USB (PC) całość była widziana jako Mass storage. Nie jest możliwe podpięcie pod USB XMEGA pendrive. USB XMEGA wymaga jako partnera urządzenia USB-host.
OdpowiedzUsuńA czy istnieje jakiś w miarę tani sposób na podpięcie modułu do sieci LAN / WiFi?
OdpowiedzUsuńModuły od ARDUINO po ~300 zł raczej odpadają.
Serwer WWW chyba da się zrobić na module?
Pozdrawiam, Mireczek
Tak, da się, są fajne moduły po około 140zł/sztuka z firmy Redpine. Są też tańsze oparte na chipe Marvell, ale trzeba do nich portować sterowniki z ARMa.
OdpowiedzUsuńTo wydaje mi się, że bardziej opłaca się zająć modułem XMC45_RELAX_V1. Cena 199 zł, ale wszystko już jest zamontowane.
OdpowiedzUsuńW moim przypadku przymierzam się do "inteligentnego" sterownika sprzętów / oświetlenia w mieszkaniu. Potrzebuję dużo wejść, wyjść, obsługi poprzez LAN / Internet i zegara czasu rzeczywistego.
Mireczek
Pisałem o module WiFi, moduł powyżej (XMC45_RELAX_V1) WiFi nie ma. Jeśli chodzi o zwykły LAN to moduł oparty o ENC to koszt kilkunastu złotych.
OdpowiedzUsuńJeśli miałbym kupować zmontowany moduł mający prawie wszystko to taniej niż wskazany wychodzi np. Raspberry Pi.
W moim przypadku oprogramowanie dołączone do(XMC45_RELAX_V1) chyba przeważy. Elektroniką zajmuję się amatorsko z przerwami od 40 lat, a więc z wykonaniem sterownika raczej nie będzie problemu. Gorzej może być z oprogramowaniem, bo znam wszelkie odmiany Basic'ów i Pascala. Tutaj oprogramowanie dołączone do w/w modułu może bardzo pomóc. Raspberry Pi jakoś mnie w tej chwili nie przekonuje. Może jak więcej poczytam takich stron jak ta, to coś mi się odmieni. :)
OdpowiedzUsuńMireczek
Jak dla mnie to przydałaby się obsługa timerów, adc, pwm, itd. Jakiś podstawy jak to ogarnąć w Xmega'ch :)
OdpowiedzUsuńZ tego wyszła ponad 600 stronnicowa książka, raczej trudno by to było przełożyć na artykuły na blogu.
OdpowiedzUsuńtmf: Mozna prosic o tytuł ??
OdpowiedzUsuńOdpowiadam teraz, bo nie zauważyłem pytania wcześniej. Tytuł: AVR. Praktyczne projekty.
UsuńCo do ADC, timerów itd. Będą kolejne artykuły jak najbardziej. Piszcie na jaki temat mają być, jaklepiej jeśli temat będzie w miarę wąski, żeby dało się go przedstawić na paru stronach.
Czy jest szansa na tę książkę w pdf ? Jest praktyczniejsze i wygodniejsze od papieru, poza wieloma innymi zaletami.
OdpowiedzUsuńJuż jest w tej wersji zarówno na Helion jak i eBookPoint. Sprawdź w obu, bo mogą być promocje i różnice w cenie.
UsuńZaglądając do dokumentacji Atmela na temat komunikacji USB zlapalem sie za glowe. Szok mnie spotkał widząc taki krótki kod źródłowy. Jednak jedna rzecz mnie zastanawia. Pewien gostek Dean Camera utworzył bibliotekę do obsługi pendrivewów flash dla ATXMEGA z usb inboard. Wydaje się wszystko spoko, tylko co z trybem Hosta USB?
OdpowiedzUsuńhttp://www.fourwalledcubicle.com/files/LUFA/Doc/130901/html/index.html
XMEGA nie mają hosta USB, więc mogą co najwyżej emulować pendrive po podłączeniu np. do PC (zresztą może taki przykład pokażę, tylko jak widać zainteresowanie niewielkie ze strony czytelników trochę zniechęca). Dean rozwija swój projekt LUFA, który korzysta m.in. z AT90USBxxx, które posiadają także uproszczoną wersję USB-host.
UsuńSwoją drogą, mnie LUFA średnio przypadła do gustu, IMHO implementacja Atmela, jakkolwiek pokręcona i przesadnie skomplikowana jest fajniejsza - m.in. oparcie USB o zdarzenia i obsługa całości w przerwaniach znakomicie ułatwia pisanie większych aplikacji wykorzystujących USB. Doskonale się to zreszą uzupełnia z 3-poziomowym konrolerem przerwań w XMEGA, dzięki czemu obsługa USB nie gryzie się z wątkami o potencjalnie wyższym priorytecie uruchomionymi przez aplikację.
Jakoś nie widzę zastosowań jeśli chodzi o emulacje atxmegi jako pendriva.
UsuńStosunkowo mala pamięć, no chyba zeby dzialal jako adapter podlaczonej karty sd/microsd. Ale to tez nic specjalnego, wartego uwagi chyba?
Nie chodzi o wykorzystanie XMEGA jako urządzenia do przechowywania danych, tylko o sposób wymiany danych pomiędzy układem (np. dataloggerem) a komputerem PC. Jeśli XMEGA emuluje pendrive to np. zgromadzone dane komputer może widzieć jako pliki, dzięki czemu każdy program, a nie tylko program dedykowany je odczyta. Można też w ten sposób np. uaktualniać firmware procesora.
UsuńJeśli jest tak jak mówisz, to twój artykuł byłby niezmiernie pomocny. W moim urządzonku nie musiał bym sie bawic w poszukiwanie odpowiedniego portu com / łączenie.. Pamięć masowa jak podejrzewam będzie mogła nosic nazwe urzadzenia. (brak problemu zmiany infa i certyfikacji). Mam do zgromadzenia jakies 7-8 wartosci ADC, oraz moze z 2-3 typu 0/1 . Kurde, wlasnie mam przesiadke z atmegi8 na xmege 192A3U. Z tego co widze jest tutaj troche zabawy w programowanie obiektowe. Troszke czasu na pewno bede musial poswiecic na skumanie tego. Twoj artykul n/t xmega-pendrive z pewnością oszczędzil by mi jak i innym osobom troche czasu. Jedyne czego sie obawialem w tego rodzaju rozwiazaniu to czy nie będzie przypadkiem tak, że będzie trzeba non-stop zamykac plik/otwierac zeby zauwazyc zmiany w pliku. Pozdrawiam mistrzu.
UsuńJeszcze taki pomysl mi wpadl do glowy a propo loggera. Napiszę skrótowo. ATXMEGA <> PC <> C# software copy <> copy google disk folder <> google disk Script, (wykres na androidzie), sterowanie urządzeniem. Wykonalne? Jest prostsze rozwiązanie?
UsuńAha, program w C# zbędny. wystarczy chyba tylko w programie googledisk wskazac folder ( w tym przypadku pendrive flash xmega ). Sposob w jaki piszesz artykuly jest mega przejrzysty i prosty/ praktyczny, wiele ludzi ceni sobie taki sposob przedstawienia sprawy.
UsuńZapewne trzeba będzie otwierać/zamykać plik, bo każdy OS buforuje sobie dostęp do pliku. Nie pamiętam, czy deskryptor urządzenia mass storage nie umożliwia czasem wyłączenia buforowania, w takim przypadku każde odwołanie do pliku skutkuje przekazaniem żądania do urządzenia. Niemniej pliki nie są zbyt wygodne do wymiany danych zmieniających się dynamicznie.
UsuńNatomiast pomysł z plikiem i folderem google disk a następnie wyświetleniem tego na androidzie jest jak najbardziej realny.
Odnosząc się do Twoich doświadczeń zakładam że najlepszym rozwiązaniem będzie napisanie dedykowanej aplikacjii w C# visual studio zbierającej na bieżąco dane z loggera/Xmega, kompilowanie zebranych wartości załóżmy raz na minutę do pliku(jakis tam txt), udostępnienie zawartości do sieci (na życzenie), obróbka przez google script( rysowanie wykresów, kontrolki stanów/załączenia ).Oprócz tego Owy windowsowy programik byłby zdolny do otworzenia zebranych danych z dłuższego okresu czasu z karty SD/microSD (zmiana parametrów w określonej jednostce czasu) . Póki co karty sieciowe / wifi odpadają. Za małe doświadczenie / umiejętności w temacie / cena chyba że się myle co do trudności takiego rozwiązania. Jedynie wysyłanie poleceń przez googledisk mogło by skomplikować sprawę. I to chyba znacząco(chociaż może jakby stworzyć specjalny plik kontrolny, nie danych). W mojej aplikacjii niestety jest wymagana duża skuteczność(odporność na błędy). ponieważ koszty błędów przekraczają cenę urządzenia czterokrotnie :D
UsuńSam pomysł z uploadem firmware genialny... Użycie urządzenia jako virtual serial / flash to jest to. Tutorial please :D
OdpowiedzUsuńDla wszystkich przesiadających się z ATMEGA na ATXMEGA polecam artykuł wyjaśniający nowy sposób programowania Xmeg w C. Okazuje się to banalnie proste.
OdpowiedzUsuńhttp://www.atmel.com/Images/doc8075.pdf
Zastosowałem przykład powyższy program obsługi USB w moim projekcie. Komunikacja po USB działa dobrze jednak po wykonaniu się linii "sysclk_init();" przestają działać pozostałe perypetia (USART i SPI). Próbowałem poniższych funkcji ale nie pomogły:
OdpowiedzUsuń"sysclk_enable_peripheral_clock(SYSCLK_USART0);
sysclk_enable_peripheral_clock(SYSCLK_SPI);".
Prosiłbym o jakąś podpowiedź jak ruszyć dalej.
BTW.
W którym miejscu w tym projekcie zmienić częstotliwość pracy procesora?
Powyższy kod wyłącza niepotrzebne peryferia. W tym celu wykorzystuje rejestry redukcji poboru mocy. Wystarczy ten fragment zakomentować i problem zniknie.
UsuńKorzystam z Eclipse - nie chcę wszczynać dyskusji czy to lepiej czy gorzej, mam tylko pytanie. Czy da się jakoś wyciągnąć potrzebne pliki z tego projektu AS6 i wrzucić do Eclipse (po prostu potrzebne pliki nagłówkowe i źródłowe), tak żeby działała komunikacja RS232 przez USB? Jakie to pliki? Dzięki :)
OdpowiedzUsuńPo prostu trzeba stworzyć projekt w eclipse - a potrzebne są wszystkie pliki + odpowiednia konfiguracja (ścieżki).
OdpowiedzUsuńA jak stworzyć taki projekt jak wyżej od zera (ale wykorzystując ASF) zamiast przerabiać gotowca?
OdpowiedzUsuńKupić porządną książkę o USB i zagłębić się w niej mniej więcej na rok :)
UsuńA bardziej poważnie - po to producend daje kody referencyjne, żeby z nich korzystać. Jeśli miałbym pisać od zera USB, to wywaliłbym ASF.
Uruchomienie projektu oraz następnie dodanie innych bibliotek ASF do projektu wiąże się z wywaleniem masy błędów podczas kompilacji. (wynika to z tego iż masa bibliotek ASF korzysta z tych samych plików .h .c , które są nadmieniane, takie jak zegary, sleepmgr itd...nie pamiętam dokładniej). Ot taka drobna uwaga ku przestrodze.
UsuńZałączony projekt nie jest projektem ASF, więc czemu się dziwisz, że z ASF nie współpracuje?
UsuńJestem nowy w temacie ASF, Jednak dobrze wiedzieć. Czyli decyzje o tym czy chce się robić z ASF czy nie należy podjąć przed pisaniem projektu?
OdpowiedzUsuńTak, gdyż wymagana jest odpowiednia prekonfiguracja, poza tym dużo rzeczy robi się z konfiguratora (dodawanie driverów itd.).
UsuńZainteresowało mnie łączenie XMEGI przez USB z PC, ale w treści napisano że nie wolno materiałów udostępnionych przez ATMEL stosować w celach komercyjnych. To co i gdzie powinienem kupić żeby jednak móc stosować komercyjnie taki typ połączenia?
OdpowiedzUsuńMarek ( sorry jestem anonimowy ponieważ może w to trudno uwierzyć ale nie mam nigdzie żadnego profilu )
Zapewne chodzi o jakieś nieporozumienie. Atmel jest jedna z najbardziej liberalnych firm, jeśli chodzi o prawa autorskie. Kod, który dają, m.in. w ASF jak najbardziej można stosować w projektach komercyjnych, w końcu do tego został stworzony.
UsuńNo to czegoś nie rozumiem, albo nie czytam ze zrozumieniem.
UsuńAutor tego artykułu tmf napisał:
"
Dlaczego taka dziwaczna nazwa? Problem w tym, że urządzenia USB muszą posiadać swój unikalny identyfikator VID/PID. W naszym przykładzie pasożytujemy nieco na firmie Atmel, wykorzystując ich identyfikatory (pamiętaj jednak, że absolutnie nie wolno robić tego w urządzeniach komercyjnych!).
"
A teraz przeczytałem odpowiedź j.w.
Ta odpowiedź nie przystaje do zacytowanej treści albo czytam to wszystko bez zrozumienia. Proszę wyjaśnij mi i innym jak jest z tym kodem?
Z góry dziękuję.
Marek
VID/PID nie ma nic wspólnego z kodem. To identyfikator urządzenia USB, przydzielany przez organizację USB.org. Aby dostać własny identyfikator musisz wykupić członkostwo w organizacji i pulę identyfikatorów. Są one potrzebne do tego, aby OS rozpoznał twoje urządzenie. Jeśli budujesz urządzenia komercyjne z USB to skontaktuj się z organizacją USB w celu wykupienia puli numerów. Natomiast sam kod udostępniany przez Atmel możesz sobie wykorzystywać do woli.
UsuńNo to teraz kapuję. Jeszcze nie stosowałem USB, ale robię jakieś przymiarki. Te informacje trochę mnie zniechęcają do dalszych prac. Może powinienem zostać przy RSach. Swoją drogą nie wiedziałem że aby korzystać ze złącza USB to trzeba jakiejś organizacji płacić haracz. A nie ma jakiś uniwersalnych, otwartych, wolnych, noname identyfikatorów VID/PID. Da się to jakoś ugryźć bez naginanie prawa i bycia na bakier z przepisami. Bo jakoś czuję przez skórę że wykupienie własnej puli to worek pieniędzy kosztuje.
UsuńMarek
Nawet spory worek - $5000 :)
UsuńCiekawa rzecz - można kupić licencję na V-USB https://www.obdev.at/products/vusb/license.html (najtańsza kosztuje $9.90) która daje VID/PID
UsuńKupić można, tyle, że jest to zgodnie z umową z USBOrg nielegalne. Czyli jak się wkurzą to zbanują numery V-USB. W praktyce jednak nic to nie zmieni, bo tych numerów odsprzedać innej firmie i tak nie mogą. Tyle, że jeśli na swoim urządzeniu umieścisz logo USB to złamiesz licencję, a to już w UE jest zagrożone konkretnymi karami. Także tak jak piszą na stronie - do użytku prywatnego ok (tylko po co wtedy w ogóle kupować i rezerwować VID/PID), do użytku komercyjnego tylko jeśli masz ochotę jakiś czas spędzić nie niepokojony w odosobnieniu lub masz nadmiar kasy.
UsuńWitam,
OdpowiedzUsuńMam problem z dodaniem odchudzonej biblioteki ASF. Projekt nie chcę się się kompilować. W jaki sposób w/w bibliotekę poprawnie połączyć z projektem?
Marek
Projekt ze strony się kompiluje? Jeśli tak, to proponuję porównać czym się różni od twojego projektu. Zakładam też, że kompilator pisze coś więcej, a nie tylko "nie chcę ci skompilować tego projektu" :) Warto byłoby więc pokazać na co narzeka. Proponuję na elektrodzie.
UsuńMi projekt ze strony ruszył ale zauważyłem że prędkość zegara jest zmieniana zależnie od tego co się dzieje na USB. Czy to ma jakiś wpływ na to że nie chcą mi pracować timery? Czy można tą bibliotekę jakoś zblokować żeby nie ruszała zegara i żeby dało się pracować z timerami? Możliwe, że wypisuję głupoty, ale takie mam obserwacje z ostatniego tygodnia zabawy. Możliwe, że mój punkt obserwacji wypacza rzeczywistość :)
UsuńMarek ten pierwszy
Po skonfigurowaniu zegarów na potrzeby USB, nie są one nigdzie potem ruszane. Także problem leży w kodzie, który dodałeś.
UsuńDobrze to może inaczej. Może masz to w głowie i bez sprawdzania napiszesz które zegary są zaangażowane w obsługę USB to spróbuję zastosować inne.
UsuńTen projekt jest dość rozbudowany i nie wszystko potrafię w nim jeszcze odnaleźć.
Marek
sysclk_init() wyłącza wszystkie peryferia. Zakomentuj // w pliku biblioteki ASF/common/services/clock/xmega:
Usuń//uint8_t *reg = (uint8_t *)&PR.PRGEN;
//uint8_t
oraz dalej w funkcji:
/* Turn off all peripheral clocks that can be turned off. */
for (i = 0; i <= SYSCLK_PORT_F; i++) {
*(reg++) = 0xff;
} */
i powinno być ok:)
TAKTYK
Ten powyżej się kompiluje. Chodzi mi o dołączanie folderu ASF (odchudzonego) z przykładów do książki, lub folderów ASF i Config powyżej (to chyba ten sam). Ale przy dołączaniu ich do dowolnego nowego projektu (sic!). Powstają błędy kompilacji np.: compiler.h: No such file or directory. Jesli w AS6 otworzę nowy projekt i skopiuje wszystkie pliki z z pliku ZIP, z folderu src, powyżej to się nie skompiluje - compiler.h No such file or directory :) Dlaczego?
OdpowiedzUsuńWygląda na to, że nie można w taki sposób załączyć odchudzonej biblioteki do nowego projektu.
MArek
Projekt to nie tylko pliki, ale także jego konfiguracja, mówiąca m.in. jak to skompilować i gdzie szukać potrzebnych elementów. Popatrz na opcje zawarte we właściwościach projektu. Generlanie najprościej wczytać powyższy przykład, a następnie zapisać go jako szablon (template) Atmel Studio i potem przy tworzeniu nowych projektów używać utworzonego szablonu.
UsuńWitam,
OdpowiedzUsuńCzy jest gdzieś dobrze opisana biblioteka ASF do USB?
Pomoc jest dostępna na stronie np, tutaj:
Usuńhttp://wa4bvy.com/xmega_doxy/index.html
Aczkolwiek Wszyscy liczymy po cichu, że więcej znajdzie się w trzeciej książce Tomka (tmf) :P
TAKTYK
Witam,
OdpowiedzUsuńDzisiaj udało mi się skomunikować xmege z PC przez USB, bardzo fajnie (i łatwo). Jednak pojawił mi się pewien problem - gdy chciałem jednocześnie działać z USB i wyświetlaczem LCD (według tego poradnika http://www.leon-instruments.pl/2013/12/kurs-xmega-wyswietlacz-lcd-05.html) to o ile USB nadal działało, to na LCD leciały śmieci.
Dokładnie to miałem taki kod
int main(void)
{
LcdInit();
Lcd("1234567890");
PMIC.CTRL = PMIC_LOLVLEN_bm| PMIC_MEDLVLEN_bm |PMIC_HILVLEN_bm;
sei();
sysclk_init();
udc_start();
while (1)
{
char ch;
if (udi_cdc_is_rx_ready())
{
ch = udi_cdc_getc();
switch(ch)
{
case 'n' :
udi_cdc_write_buf("Pozdrowienia z XMEGA!\n\r", 23);
break;
default :
udi_cdc_write_buf("O co chodzi?\n\r", 14);
break;
};
char * str = "USB ";
str[3]=ch;
LcdWrite(str);
}
}
}
Dobra, sam sobie odpowiem, ale może komuś z takimi samymi pomysłami pomoże. Problem był w http://www.leon-instruments.pl/2013/12/kurs-xmega-wyswietlacz-lcd-05.html, a konkretnie w tym, że w h44780.c jest zdefiniowane F_CPU na 2000000UL i delaye były za krótkie.
UsuńCzy przycinał ktoś skutecznie w/w projekt (z clk'ów) do minimum, jak to autor wspomina o takiej możliwości, i mógłby się ze mną podzielić? Pracuję na Qzewn 16M + PLLx2 czyli na 32M i mam to porobione w swoim pliku i pod to różne konfiguracje USARTów. A chciałbym dodać jedynie minimalną część "ASF" właśnie tylko z obsługą USB. Z góry dziękuję za pomoc.
OdpowiedzUsuńprm_ex (elektroda)
Kolejne pytanie z "Czy próbował Ktoś skutecznie" dokleić do tego analizator logiczny z książki TMF AVR Praktyczne... . Próbuję z LogicSniffer'em 9.7.2 ale nie chcą się dogadać.
OdpowiedzUsuńPrzecież przykład z książki zawiera wszystko to co trzeba. Masz tam też frontend na PC. Będzie to działać ze wszystkim co obsługuje ten sam protokół.
OdpowiedzUsuńWypróbowalem wszystkie dostępne protokoły i nic. Sprzętowo jest ok - pułapki w case'ie obsługi komend działają,w terminalu też wyświetla meta dane, software 9.7.2 nie rozpoznaje jednak urządzenia - chciałem przerobić żeby po usb działo ale mnie to blokuje.
UsuńTomaszu, jesteś niezawodny!
OdpowiedzUsuńDzisiaj kupiłem Twoją drugą książkę. Moduł X3-DIL64 od Dominika już mam. Czas działać!
Dzięki za miłe słowa. Jeśli podoba ci się ten artykuł, to tu:
Usuńhttp://mikrokontrolery.blogspot.com/2011/03/ESP8266-Modul-WiFi-Bezposrednia-wymiana-danych.html
masz ciąg dalszy. Przy okazji WiFi jest kod przykładu urządzenia złożonego składającego się z kilku portów szeregowych emulowanych na USB. Super sprawa, bo jednym portem mogą iść dane aplikacji, a innym np. informacje ułatwiające debugowanie programu.
Fajny poradnik, szybko można uruchomić komunikację. Mam jednak pytanie odnośnie pamięci RAM zajmowanej przez moduł usb. Według datasheeta tryb cdc full speed zajmuje na xmegach około 1,5kB pamięci RAM, więc w procesorze np. xmega32a4u to już jest dość dużo, jeżeli połączy się to z odtwarzaniem dźwięku (bufory, fatfs), to nagle okazuje się, że powstaje poważny problem.
OdpowiedzUsuńW moim przypadku program uruchamia się w dwóch trybach - w jednym korzysta tylko z usb do konfiguracji urządzenia, natomiast w drugim korzysta z twi, spi itd., ale nie wykorzystuje już USB. Tzn de facto, jak jest uruchomiony podłączony do portu usb, to następuje wykonanie innej części programu, niż gdy jest uruchomiony niepodłączony do portu usb.
Czy da się w takim wypadku zwolnić pamięć zajmowaną normalnie przez moduł USB? Myślałem, że brak wywołania polecenia udc_start() załatwi sprawę, ale rozmiar "data" pokazywany po kompilacji (który jak rozumiem określa pamięć ram zajmowaną przez zmienne globalne i statyczne) jest niezależny od tego, czy jest ona wywoływana, czy nie. No i oczywiście organoleptycznie, programowi nie robi różnicy, czy polecenie jest wywoływane, czy nie.
Pamięć zajmowana jest przez bufory. Można je zmniejszyć, trzeba tylko pogrzebać w sterowniku, można też je alokować dynamicznie (standardowo użyta jest alokacja statyczna). W przypadku alokacji dynamicznej, pamięć jeśli nie wykorzystujesz USB nie byłaby wtedy używana.
UsuńDziękuję bardzo za odpowiedź.
UsuńRzeczywiście, dokopałem się do pliku udi_cdc.h, gdzie pod nazwą UDI_CDC_DATA_EPS_FS_SIZE krył się rozmiar bufora ustawiony nominalnie na 64 (przy czym w ostatecznej implementacji symbol ten mnożony jest jeszcze razy 5 - ( #define UDI_CDC_TX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) ), z możliwością zmniejszenia do 8, co skroiło 1kB używanej pamięci RAM w programie. To w zasadzie powinno wystarczyć dla mojego zastosowania, jednak korzystając z okazji chciałbym zapytać, czy moje rozumowanie odnośnie alokacji dynamicznej jest poprawne (w zasadzie nigdy tego nie robiłem, jestem dopiero raczkujący zarówno w świecie programowania w ogóle, jak i programowania mikrokontrolerów).
Gdybym musiał zwolnić cały RAM zajmowany przez USB, to bufor, który jest zadeklarowany oryginalnie tak:
COMPILER_WORD_ALIGNED static uint8_t udi_cdc_tx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_TX_BUFFERS];
musiałbym zamienić na wskaźnik, znaleźć wszystkie odniesienia do niego i zmienić zapis tablicowy na operacje na wskaźnikach, a potem w funkcjach udc_start i udc_stop kolejno zarezerwować pamięć za pomocą malloc i przypisać wartość otrzymanego wskaźnika do wcześniej zadeklarowanego wskaźnika na bufor, a potem za pomocą funkcji free zwolnić tą pamięć. Czy z grubsza dobrze rozumuję?
Dziękuję z góry za odpowiedź :)
Dobrze rozumujesz. Odwołania można zmienić automatycznie korzystając z opcji refactoringu kodu w AS.
UsuńMam takie pytanie. Czy jest jakaś możliwość pobrania pliku projektu? Niestety linki podane powyżej nie działają.
OdpowiedzUsuńZnalazłem ten sam kod w temacie na elektrodzie https://www.elektroda.pl/rtvforum/topic2631840.html
UsuńCześć, mam problem z wykorzystaniem CDC w swoim projekcie. Mianowicie podczas pracy urządzenia zmienia się częstotliwość taktowania CPU. Przy wykonywaniu danych fragmentów kodu wysyłam informacje na komputer po USB, przy użyciu rozwiązań zawartych w tym artykule. Kiedy odłącze urządzenie od PC-ta to funkcje delay działają z innym skutkiem, co świadczy o tym, że taktowanie się zmieniło. Co zrobić z tym fantem ? :(
OdpowiedzUsuńCześć,
OdpowiedzUsuńNie da się pobrać pliku. Jeśli to możliwie poproszę o ponowne wgranie?
Cześć,
OdpowiedzUsuńMam problem z zainstalowaniem sterowników. Mianowicie Windows nie rozpoznaje podłączonej Xmegi. Próbowałem zainstalować atmel_devices_cdc.inf (z RS232OverUSB), ale niestety wyskakuje błąd:
"Określony folder nie zawiera zgodnego oprogramowania sterownika dla urządzenia. Jeśli folder zawiera sterownik, upewnij się, że sterownik jest przeznaczony dla urządzeń Systemu Windows dla systemów opartych na procesorze x64".
Próbowałem już wszystkie możliwości i bez skutku.. Bardzo proszę o pomoc.
Pozdrawiam