logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sprzętowe USB w AVR początki

jacynka84 04 Mar 2011 19:00 4597 26
REKLAMA
  • #1 9098909
    jacynka84
    Poziom 26  
    Prosiłbym kody i info jak się zabrać za sprzętowe USB...
    I pozdrawiam.
    I co zdziałałeś z tym kodem który miałeś Mi, nam okazać.

    Moderowany przez And!:

    Posty dotyczące ciekawego tematu wykorzystania sprzętowego USB,
    wydzielone z tematu:
    V-USB (AVR USB) Tanie urządzenie USB w oparciu o AVR

  • REKLAMA
  • #2 9099137
    Azonic_2006
    Poziom 17  
    Witam!!!
    Co do sprzętowego USB to na stronie atmela jest dużo przykładów.
    A jeżeli chodzi o kod to napewno trzeba zwiększyć rozmiar bufora w enpoincie.
    Plik usbdrv.c
    
    #if USB_CFG_HAVE_INTRIN_ENDPOINT    /* endpoint descriptor for endpoint 1 */
        7,          /* sizeof(usbDescrEndpoint) */
        USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
        (char)0x81, /* IN endpoint number 1 */
        0x03,       /* attrib: Interrupt endpoint */
        16, 0,       /* maximum packet size */<< Tutaj zmieniamy z 8 na 16
        USB_CFG_INTR_POLL_INTERVAL, /* in ms */
    #endif
    

    Jak również zwiększyć rozmiar buforu w programie.
    Plik usbdrv.h
    
    #define USB_BUFSIZE     19  /* PID, 8 bytes data, 2 bytes CRC */ << zmieniamy na 19
    

    Te zmiany pozwoliły wysłać 11 bajtów, ale to jest raczej przykład jak robić nie należy.
    W każdym bądź razie, jeżeli chcesz robić tak złożony projekt to proponuję zainteresować się m32u4 które są dostępne w seguro.
    Jak podejmiesz decyzję to służę pomocą w uruchomieniu układu łącznie z udostępnieniem programu.
    Jedyne co mogę napisać to wysyłanie danych wygląda mniej więcej tak

    
      // Send report           
       Usb_write_byte(0x0f);      	//b0-b3 hat b4-b7 button1-4             
       Usb_write_byte(button_get(0));		//b0-b7 button 5-12            
       Usb_write_byte(button_get(1));    	//b0-b6 button 13                           
       Usb_write_byte(osX.wysylka[0]); 	//b0-b1 ven b2-b7 os x           
       Usb_write_byte(osX.wysylka[1]); 	//b0-b7 os x
       Usb_write_byte(0); 			// os Z	accelate
       Usb_write_byte(0);			// os Rz brake
       Usb_write_byte(0);			// os Y clatch
       Usb_write_byte(0);			//vendor  
       Usb_write_byte(0);			//vendor  
       Usb_write_byte(0);			//vendor  
       Usb_write_byte(a);			//slider
       Usb_write_byte(0);			//vendor  
       Usb_write_byte(0);			//vendor  
       Usb_write_byte(0);			//vendor  
       Usb_write_byte(0);			//slider
       Usb_ack_in_ready();          // Send data over the USB  
    

    Każda linijka to kolejny bajt więc widać, że jest to w sumie banalne.
    Jeszcze wystarczy wstępnie skonfigurować transmisję i usb z głowy.
    Jak podejmiesz decyzję to będziemy myśleć dalej, ale powiem tyle że jak będziesz miał procek to zrobienie USB to jeden dzień a potem zajmujesz się resztą a z resztą przeczytaj tego arta >>Link
    Pozdrawiam!!!
    Azonic_2006
  • #3 9103508
    jacynka84
    Poziom 26  
    Super, jasne że wolałbym sprzętowe USB, ale jednak jeszcze pokombinuję z m8 lub m32.
    A te problemy z wysyłką 12+bajtów to może przez za mały ram czy coś?
    Pozdrawiam.
  • #4 9103602
    Azonic_2006
    Poziom 17  
    Witam!!!
    Tak jak już pisałem.
    W dokumentacji jest napisane że funkcją usbSetInterrupt() można wysłać tylko 8 bajtów.
    Po prostu jest to ograniczenie samego V-usb. Rozwiązaniem jest napisanie własnej funkcji usbFunctionWrite() oraz usbFunctionRead() ,ale nie jest to łatwe.
    Gorąco zachęcam do wybrania jakiegoś procka z USB sprzętowym, ponieważ jest to najprostsze rozwiązanie.
    Jeżeli dodamy do tego, że USB wymaga dobrej synchronizacji czasowej to mogą być problemy z innymi funkcjami a tak tym zajmie się warstwa sprzętowa.
    Powiem tylko tyle, że jestem w trakcie budowy kierownicy łącznie z FFB i powiem tylko tyle, że na V-USB zrobienie tego było by bardzo trudne.
    Obecnie mam płytkę z 4 enkoderami + 5 potencjometrów + 24 wejścia + sterowanie mostkiem H i wszystko działa.
    Jeszcze musi przejść test bojowy, ponieważ nie ma jeszcze konstrukcji, ale elektronika działa.
    Jedynie mogę dodać tylko tyle że twórcy V-USB odwalili kawał naprawdę dobrej roboty, ale po co utrudniać sobie życie skoro są prostsze rozwiązania.

    [Edit]
    Trochę poczytałem i po testowałem i mogę powiedzieć, że moim zdaniem więcej z V-USB wycisnąć się nie da.
    Przesłać dane o większej ilość można, ale problemem jest to ze host nie generuje przerwania a do wymiany danych jest potrzebny program na PC.
    Wykonanie tego jest możliwe a projekt Mjoy jest tego dowodem, ale twórca Igor Češko pisał oprogramowanie w assemblerze i specjalnie pod to urządzenie.
    Jeszcze będę analizował tą bibliotekę i może uda się coś wymyślić, ale wątpię.
    Dorzucam jeszcze program autorstwa Igora który umożliwia podejrzenie stanów przycisków w ilość większej niż 32.

    Pozdrawiam!!!
    Azonic_2006
  • REKLAMA
  • #5 9106852
    jacynka84
    Poziom 26  
    Rzeczywiście po zmianie w tych liczb w usbdrv.x zadziałało, ale wciąż nie więcej niż 32 przyciski.
    Ale nie ważne.
    Zacznę czytać kody itp. do sprzętowego USB w AVRach.
    Jakieś wskazówki, od czego zacząć?
    Pozdrawiam.
  • REKLAMA
  • #6 9107072
    Azonic_2006
    Poziom 17  
    Witam!!!
    Najlepiej zacząć od specyfikacji USB, ale bez tego też da radę.
    Poczytaj o enumeracji, endpointach, sposobach komunikacji i po podglądaj jak wygląda transmisja w programie USBlyzer, ale najpierw kup procesor i wykonaj nawet najmniejszą płytkę prototypowa a potem to już z górki.
    Jak uda się uruchomić pierwszy projekt to potem można poznawać protokół a na to potrzeba czasu.
    Jak będziesz miał prototyp to mogę opisać od A do Z jak uruchomić projekt HID (np. joystick).
    Na tej stronie >> Link są dostępne przykłady od Atmela.
    Jest również projekt alternatywny pod nazwą LUFA, ale na początek przygody z USB odradzam.
    Generalnie zacząć należy od prototypu.
    Pozdrawiam!!!
    Azonic_2006
  • #7 9165128
    jacynka84
    Poziom 26  
    Czekam na M32u4 ze sklepu,i minie ze 2 dni zanim zrobię płytkę ale nadal nie wiem jak to zacząć, mam kod przykładowy na klawiaturę HID, jakiś próbny kod na najprostszy joystik by się przydał.
    Mam problem z ogólnym ogarnięciem, jest kilka plików .h .c i niewiem co do czego, a najlepsze że nie widzę tam zapisu tablicy HID...
    Może podpowiesz kolego azonic jak zacząć zabawę?
  • #8 9165217
    Azonic_2006
    Poziom 17  
    Witam!!!
    Jak obiecałem. że pomogę to pomogę, ale to nie jest najlepszy temat aby kontynuować rozmowę o sprzętowym USB i dlatego chciałbym prosić moderatora o wydzielenie wątku.
    Jak będzie prototyp to wtedy napiszę wszystko od A do Z jak uruchomić projekt HID.
    Jeżeli, chodzi o tablicę to jest w pliku demo\EVK527-series4-hidio\usb_descriptors.c na samym dole.
    Ale, tak jak pisałem to już chyba nie jest miejsce na kontynuowanie.
    Czekamy na pliczek od kolegi multilight ponieważ wygląda na to, że wiem co jest nie tak, ale potrzebuje się upewnić.
    Pozdrawiam!!!
    Azonic_2006
  • #9 9165518
    jacynka84
    Poziom 26  
    Byłoby cacy jak by mod wydzielił temat na sprzętowy usb - początki.
  • REKLAMA
  • #10 9229124
    jacynka84
    Poziom 26  
    Witam znowu.
    Otóż przed momentem ukończyłem płytkę m32u4 (ma pos*aną pinologię)
    i wykrywa jako ATm32U4DFU, tak więc chyba działa prawidłowo.
    Jeszcze nie instalowałem sterów.
    I teraz super ważne pytanie, jak używać, tzn. jak mam ustawić RESET i HWB i fusy, aby za każdym razem była wykrywana przez Atmelowego Flipa, i żeby nie zablokować możliwości programowania przez Bootloader czyli USB, żeby Flip nie przestał jej wykrywać.
    I jakie stery zainstalować, te z flipa ?
  • #11 9229176
    Azonic_2006
    Poziom 17  
    Witam!!!
    To może załóż osobny temat i wtedy można prowadzić dalej rozmowy.
    Co do atmegi to sterowniki będą w folderze od flipa po zainstalowaniu.
    Uruchomienie bootloadera następuje w momencie resetowania procka i jak po resecie wykryje zwarty pin HWB do masy to wtedy program skacze to bootloadera.
    Jest opcja taka żeby HWB zewrzeć do masy na stałe i RST uruchamiać bootloader a odcięciem zasilania i ponownym podaniem program właściwy.
    Fusów przez flipa ustawić się nie da, ale można to zrobić w programie właściwym.
    Zablokowanie bootloadera jest w zasadzie niemożliwe, a jedynie skasowanie ale na stronie atmela jest wsad z bootloderem więc spokojnie.
    Pozdrawiam!!!
    Azonic_2006
  • #12 9229461
    jacynka84
    Poziom 26  
    A jak się kasuje Bootloader? Chcę wiedzieć aby tego nie zrobić.
  • #13 9229831
    Azonic_2006
    Poziom 17  
    Witam!!!
    Można skasować łącząc się po ISP, ale to jest konieczne tylko w przypadku jak koniecznie musimy zmienić fusy.
    W załączniku przygotowałem na szybko program zawierający 8 osi i 64 przyciski.
    Funkcja wysyłania danych znajduje się w pliku hid_task.c a plik hex w folderze GCC.
    Jeżeli, chcemy skompilować projekt w winavr to robimy to na pliku config.mk z folderu GCC.
    Program jest skompilowany dla zegara zewnętrznego 16Mhz a ewentualnej zmiany można dokonać w pliku config.h w folderze conf.
    Pozdrawiam!!!
    Azonic_2006
  • #14 9230310
    jacynka84
    Poziom 26  
    Ok dzięki , rozkminiam bardzo powoli.
    Widzę tam HID z tylko 8 przyciskami i 8 osiami.
    W m32u4 będę używał jedynie 6 osi, na czym polega to że przy 6 pierwszych przyciskach są zera a przy 3 ostatnich 2, 128 i 255??
    Co oznacza liczba w linii "Usb_write_byte(25); // osy" ??
    Pozdrawiam.
  • #15 9230541
    Azonic_2006
    Poziom 17  
    Witam!!!
    "Usb_write_byte(25); // osy" to dziwne to funkcja a liczby dałem jako przykład.
    w miejsce 25 możemy dać dowolną zmienną lub stałą wartość.
    Co do przycisków to button1 oznacza pierwszy bajt raportu czyli pierwsze 8 przycisków.
    Po otworzeniu kontrolerów gier zobaczymy, że niektóre przyciski są naciśnięte a osie są w różny sposób wychylone, ale najlepiej uruchomić kalibracje i zaznaczyć pokaż dane.
    Więcej opiszę ale to nie dzisiaj ponieważ trochę mało czasu mam teraz.
    Co do zmiany osi i tak dalej to w pliku usb_descriptors.c na dole znajduje się tabela HID, ale jest tragiczna ale myślę że z modyfikacją nie powinno być problemów, względnie można dać swoją.
    W pliku usb_descriptors.h w linijce #define SIZE_OF_REPORT 0x38 zmieniamy rozmiar tablicy jak również możemy zmodyfikować nazwy urządzenia.
    Ostatnią rzeczą jest odpowiednia ilość linijek Usb_write_byte(); a musi ich być tyle ile bajtów mamy zadeklarowane w tablicy HID.
    To tyle na początek a zaraz napiszę do moderatora z prośbą o wydzielenie tematu.
    Pozdrawiam!!!
    Azonic_2006
  • #16 9316492
    jacynka84
    Poziom 26  
    Ok działa, przepraszam że długo czekałeś. rzecz jasna zadziałało od pierwszego strzału, pokazało wychylone ośki i przyciski.
    teraz zabieram się za młócenie kodu.
    Tylko ze nie potrzebuję aż 8 osi, pokombinuję.
    Schemat jak schemat ale zamieszczam.
    Sprzętowe USB w AVR początki
  • #17 9320828
    Xaveri
    Poziom 17  
    Trochę z innej beczki...

    Który ATTiny ma USB lub poradzi sobie z obsługą USB programowo (bez stosowania FTDI232). Potrzebuję jak najmniejszy pinowo układ bo w zasadzie oprócz USB potrzebuję ze 2 wejścia/wyjścia cyfrowe i to wszystko...
  • #19 9320911
    Azonic_2006
    Poziom 17  
    Witam!!!
    Może dzisiaj podrzucę kod na 6 osi i jedna uwaga przy uruchamianiu układu to to, że trzeba wyłączyć jtaga ponieważ blokuje pewne piny procka, ale nie pamiętam które.
    Jak wyłączyć można znaleźć na elektrodzie np tutaj >> Link


    Co do kolegi Xaveri to polecam do tak prostego rozwiązania bibliotekę V-USB, a jej wymagania to min. 2kB flash, 128B ram i zegar min. 12MHz.
    Pozdrawiam!!!
    Azonic_2006
  • #20 9332803
    jacynka84
    Poziom 26  
    Jakaś lipa wynikła, po kilku programowaniach przestał reagować na wpisywane wartości jako wychylone stery.
    Poza tym, nie mogę się doszukać, gdzie w źródłach jest nazwa urządzenia która się wyświetla w kompie?
  • #21 9334260
    Azonic_2006
    Poziom 17  
    Witam!!!
    Nazwę można zmienić w pliku usb_descriptors.h podobnie jak w v-usb, a co do braku reakcji to trudno mi powiedzieć, ale najlepiej zobaczyć co się dzieje na szynie za pomocą programu Usblyzer i wtedy wszystko widzimy a tymczasem podrzuć kod do zobaczę co może być nie tak.
    Kod możesz wysłać na priv albo na pocztę azonic_2006(_at_)wp.pl.
    Pozdrawiam!!!
    Azonic_2006
  • #22 9334463
    jacynka84
    Poziom 26  
    Jeszcze nie mam żadnego kodu, majstruję tylko w hid_task.c z tymi wartościami.
    Zabieram się za przyciski.
  • #23 9334579
    Azonic_2006
    Poziom 17  
    Witam!!!
    Ale jakaś przyczyna musi być, że nie reaguje na zmiany.
    Proponuję odinstalować urządzenie z menadżera urządzeni i wtedy zobaczyć.
    Dodatkowo można wykasować wpisy z rejestru szukając urządzenia po numerze PID i VID.
    Jeżeli, nie było znaczących zmian w kodzie to powinno pomóc.
    Pozdrawiam!!!
  • #24 9334613
    jacynka84
    Poziom 26  
    Odinstalowanie też nie pomaga, ale już znalazłem, z jakiejś przyczyny AVR Studio nie robi "rebuild" plików, choć widzę że build przechodzi bez problemów. Jak cisnę build and run to wtedy dopiero pomaga. Z nazwą już sobie poradziłem.
  • #25 9334679
    Azonic_2006
    Poziom 17  
    Jak tak to git.
    Tablica HID znajduje się w pliku usb_descriptors.c i żeby usunąć dwie osie trzeba skasować

    0x09, 0x36,
    0x09, 0x37,

    a potem w pliku usb_descriptors.h w linijce #define SIZE_OF_REPORT od obecnej wartości odjąć 4 czyli musi być tyle ile bajtów ma tablica hid.
    Pozdrawiam!!!
  • #26 9905368
    bolek
    Poziom 35  
    Zapytam z pewną dozą nieśmiałości...
    Mam program na PC który komunikuje sie z prockiem za pomocą RSa. Czy podstawiając na jego miejsce tą U4 będe mógł zrobić wirtualny port i tak samo łatwo (czyt. tak samo jak RSem) wypchać dane do PCta?
  • #27 9906553
    ksz
    Poziom 15  
    bolek napisał:
    Zapytam z pewną dozą nieśmiałości...
    Mam program na PC który komunikuje sie z prockiem za pomocą RSa. Czy podstawiając na jego miejsce tą U4 będe mógł zrobić wirtualny port i tak samo łatwo (czyt. tak samo jak RSem) wypchać dane do PCta?

    Wystarczy nawet AT90USB162 (mniejszy, prostszy, tańszy ;) ).. W kodzie LUFY http://lufa-lib.org znajdziesz prawie gotowca do virtual-COMa
REKLAMA