Fórum témák

» Több friss téma
Fórum » PIC - USB - PC projekt
 
Témaindító: JohnyBravo, idő: Szept 26, 2006
Lapozás: OK   30 / 55
(#) zenetom hozzászólása Szept 29, 2010 /
 
Közbe megint bírtam egy kis időt szakítani a témára, hozzáraktam még egy pár LED-et, és mostmár zenére villognak, csakhogy USB-ről (VU meter tulajdonképp)
Viszont egyszerre nem akar normálisan fogadni a PC-től két adatot, a ReceivedDataBuffer 0. és 1. bájtjai keverednek egymással, akárhol hajtom végre a "HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64)" függvényt (vagyis USBOutHandle = HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64) ). De majd hétvégén kiderítem.
szerk.: a ReceivedDataBuffer tömb 0. eleme ugye a LED Toggle, azt meghagytam rajta és ugye az kavarodik be...
(#) Zsika hozzászólása Szept 30, 2010 /
 
Szia Watt!

Nézegettem a firmware mellé mellékelt leírást(igaz spanyol), de közben rájöttem, hogy Vendor ID és a Product ID nincs megadva a programban és gondolom ezért nem kommunikál a géppel. Le van írva hogy adjam meg, de mindig hibát ír ki és nem programozza fel a PIC-et.
A komplett leírást megtalálod Bővebben: Link oldalon.
Megépítettem és a régi firmware-val jól működött.
Próbálkozom addig is hátha rájövök(egyszer úgy is meg kéne tanulni!). Köszi szépen.
(#) zenetom válasza Zsika hozzászólására (») Szept 30, 2010 /
 
Hali!
Mi a kérdés?
(#) Zsika válasza zenetom hozzászólására (») Szept 30, 2010 /
 
Hello!
Tulajdonképpen az hogy VID-et és a PID-et miként kell megadni(bocs nem túl értelmes megfogalmazásért). Szabad fordításban így néz ki amit ők írtak:
-------------------------------------------------- --------------------
Állítsa be a VID és PID a firmware
-------------------------------------------------- --------------------

Abban az időben a berakodás a firmware, hajtsa végre a következő lépések:

1. Nyissuk meg az alkalmazást, és válassza ki a fájlt WinPIC800. HEX
firmware.

2. A lapon az EEPROM (Data), írja az első 4
kódot byte a Vendor ID és a Product ID.

3. Írja be a firmware a PIC.


-------------------------------------------------- --------------------
Állítsa be a VID és PID a firmware
-------------------------------------------------- --------------------

Miután programozott a firmware a VID és PID
be kell állítani a kódok alkalmazásához.

1. Nyissuk meg az alkalmazást, és válassza az Általános Beállítások fülre.

2. A "VID-PID", írja ugyanazt a 4 számok
programozni a PIC.

3. Indítsd újra a kijelző XR, és alkalmazás.


-------------------------------------------------- --------------------
(#) icserny válasza Zsika hozzászólására (») Okt 1, 2010 /
 
A leírás szerint programozás előtt be kell írni az EEPROM-ba szánt adatsor elejére a VID/PID azonosítót.
Saját használatra javaslom valamelyik Microchip demóprogram azonosítóját. (Terjesztéshez venni/kérni kell saját azonosítót).
  1. VID =    0x04D8
  2. PID =    0x003F  //Ez például az USB Device generic HID demo száma


Az EEPROM elejére tehát ezt írd:

D8 04 3F 00
(#) trudnai válasza Zsika hozzászólására (») Okt 1, 2010 /
 
Ez nem 'szabad forditas', hanem 'Google forditas' - de azert lehet erteni...
(#) Zsika válasza icserny hozzászólására (») Okt 1, 2010 /
 
Szia!
Igazából az nem volt világos hogy a kiválasztott VIP/PID azonosítókat hogyan váltom át(biztos alap dolog, de már olyan rég tanultam és egyáltalán nem ebben dolgozom).
Köszi szépen.
(#) zenetom válasza watt hozzászólására (») Okt 3, 2010 /
 
Jól sejtem hogy a PC oldali programban egy helyen kell megadni a tömb elemeit (mármint ha többet akarunk kiküldeni), és utána kiküldeni a WriteSomeData
  1. WriteEx(VendorID, ProductID, @BufferOut[0]);
paranccsal?
Tehát ha mondjuk két elemet akarunk kiküldeni akkor:
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. begin
  3.     BufferOut[0]:= 0;
  4.     BufferOut[1]:= $80;     // LED Toggle kódja
  5.     case radiogroup1.ItemIndex of
  6.      0: BufferOut[2]:= 1;
  7.      1: BufferOut[2]:= 2;
  8.      2: BufferOut[2]:= 3;
  9.      3: BufferOut[2]:= 4;
  10.      4: BufferOut[2]:= 5;
  11.      5: BufferOut[2]:= 6;
  12.      6: BufferOut[2]:= 7;
  13.      7: BufferOut[2]:= 8;
  14.     end;
  15.  
  16.     WriteSomeData;     // Adat kivitele USB-re
  17. end;


PIC oldalon pedig:
  1. // LED parancs vétele és végrehajtása
  2.                 switch(RxD0)
  3.                 {
  4.                     case 0x80:                                  // Toggle LEDs
  5.                         mLED_1_Toggle();
  6.                                         FLAGbits_1.LED_Toggle_Flg = Set;
  7.                             break;
  8.                         }
  9.  
  10.  
  11. switch(RxD1)
  12.                    {
  13.                     case 1: asdsad...;
  14.                     break;
  15.                     case 2: asdasd2...;
  16.                     break;
  17.                     }
  18.  
  19.  
  20.                 if(!HIDRxHandleBusy(USBOutHandle))
  21.             {
  22.                  //Re-arm the OUT endpoint for the next packet
  23.              USBOutHandle = HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64);
  24.                  RxD0 = ReceivedDataBuffer[0];
  25.                  RxD1 = ReceivedDataBuffer[1]
  26.                 }


Már 2 hete csak ezzel kínlódok hogy nem akar menni, valamiért összekeverednek a küldött adatok

szerk.: vagyis a "Toggle LED" elég sebesen villog, vagy néhány*100Hz-el, és a PC felé küldött adat sebessége is kb ennyire gyorsul fel valamiért.
(#) watt válasza zenetom hozzászólására (») Okt 3, 2010 /
 
A HID mindig 64bájtot fog elküldeni, a kezdő címet kell megadni, ahol az adatok kezdődnek. A BufferOut(0) ebben a formában a saját címét adja át a HID függvénynek, így a következő 63 bájt is ki fog menni. Nem tudom, hogy pascal-ban szükséges-e a @ jel, mert a VB-ben nem...
(#) zenetom válasza watt hozzászólására (») Okt 3, 2010 /
 
Kell a @ jel, mert itt delphiben (meg pascalban is) ha csak simán a tömböt írom oda, akkor azt tömbként is veszi, oda pedig a tömb címe kell, vagyis valami pointer féleség, és ezért kell a @ jel.
De nem értem hogy ha több elemet adok meg, akkor miért gubancolódnak össze.
(#) watt válasza zenetom hozzászólására (») Okt 3, 2010 /
 
Nem értem, hogy mit értesz az alatt, hogy több elemet adsz meg? Nem lehet megadni az elemek számát, az mindig 64, ha akarod, ha nem. Bármi van a megadott címtől fogva, azt elküldi.
(#) zenetom válasza watt hozzászólására (») Okt 3, 2010 /
 
Persze, ez világos, viszont ha mondjuk a 3. elemnek is adok értéket:
  1. BufferOut[2]:= 1;
. És ezt kiolvasom a PIC-ben, akkor kezdenek kavarodni a dolgok. Ez megint ilyen abszolút paranormális dolog, ami csak nálam fordul elő
Most megnézem mi történik, ha a PIC-ben nem használom föl a "ReceivedDataBuffer[1]"-t.
(#) zenetom válasza watt hozzászólására (») Okt 3, 2010 /
 
Azt hiszem meg van hol a baj. A főciklusban (mármint a PIC-en) akkor is kell nézni hogy használatban van-e az USB (IDRxHandleBusy), amikor a lekért tömb egy elemét nézzük.
(#) zenetom válasza zenetom hozzászólására (») Okt 3, 2010 /
 
Hopp, meg PC oldalon is volt egy kis hiba, de sikerült rájönni.
(#) nem hozzászólása Nov 1, 2010 /
 
Sziasztok!

A helyzet a következő:
PIC32MX795F512L-el próbálkozunk USB kapcsolatot belőni.

Az alapokkal nincs is gond, bekötés stimmel (Explorer16 board-ról koppintva), sima Device-ként, bulk transfer-el sikerült is belőni, driver a Michrochip honlapról.

Namost a gond csak az, hogy nekünk legalább 1MByte/sec sebesség kellene. Ezt elvileg meg lehet valósítani "isochronous transfer" adatküldési mechanizmussal, ehhez azonban nincs driver.

Tehát a kérdés az, hogy:
- bulkosan be lehet-e lőni a kívánt sebességet?
VAGY
- hogy lehet isochronous transfer-t lekezelő drivert szerezni/csinálni?

hátha valaki próbálkozott már...

köszönök bármilyen ötletet!

Adam
(#) icserny válasza nem hozzászólására (») Nov 2, 2010 /
 
Az USB Device - WinUSB - High Bandwidth Demo-t nézd meg. Úgy látom, hogy ehhez van PIC32 mintaprojekt is.
(#) nem válasza icserny hozzászólására (») Nov 2, 2010 /
 
Szia!

Köszi szépen, ezek szerint lehetséges a dolog.
Annyi kérdés merült fel bennem, hogy ezt ellenkező irányba kéne reprodukálni (tehát a PIC küld 64000 byte-t), viszont az ottani parancsok ezt nem engedik nekem. A demo amit ajánlottál csak úgy van megirva hogy egyedül a gép küld. Néztem a gép oldali programot, ott egy paranccsal kiküldi a 64000byte-t, viszont a PIC-nek maximum 64 byte-s a buffere. Emiatt eléggé érdekesen is fogadja az adatot.

Adam
(#) watt válasza nem hozzászólására (») Nov 2, 2010 /
 
Pont itt akadtam el én is. Hiába tudna gyorsabb sebességet, a buffer behatárolja az egy csomagban elküldött bájtokat, azaz 1000x64/sec, az 64KByte/sec. Nekem lenne 512bájt pufferem is, de nem látom át, hogyan lehetne rávenni a stack-et, hogy ezzel dolgozzon. A PC oldali driverről nem is beszélve... Most tesztelek egy alkalmazást, amiből ki fog derülni, hogy tud-e 64K-nál többet a CDC, miután ott 255 adatot lehet kivinni egy paranccsal. Persze nem fűzök sok reményt a 64bájtos puffer miatt, pedig a CDC-re is 1MByte sebességet írnak az adatlapjában.
(#) nem válasza watt hozzászólására (») Nov 3, 2010 /
 
Hello!

Hát elvileg a bulk transfernél bár 64 byte-s a buffer egy ms alatt (ha a bus teljesen szabad) 19 ilyet tud elküldeni full speed-ben, úgy jön össze az 1MB/s. Már csak az kérdés, hogy pic oldalról ezt hogyan kell kezelni, de valahogy biztos meg lehet oldani. Valószínűleg a CDC is valami hasonló módon oldja meg, de arról még nem sokat tudok.
(#) watt válasza nem hozzászólására (») Nov 3, 2010 /
 
Azt kéne tudni, hogy a puffert hogyan kezeli a program. Lehet, hogy dinamikus puffer, nem várja meg míg tele lesz, hanem küldi, és csak akkor töltődik, ha torlódás van. Elég kevés az infó, már ami érthető is...
(#) icserny válasza watt hozzászólására (») Nov 3, 2010 /
 
A másik Winusb-s demóprogramból (USB Device - WinUSB - Generic Driver Demo) kiderül, hogy hogyan lehet PIC-ből a PC-be küldeni:

The endpoint was not "busy", therefore it is safe to write to the buffer and arm the endpoint. The USBGenWrite() function call "arms" the endpoint (and makes the handle indicate the endpoint is busy). Once armed, the data will be automatically sent to the host (in hardware by the SIE) the next time the host polls the endpoint. Once the data is successfully sent, the handle (in this case USBGenericInHandle will indicate the the endpoint is no longer busy.

  1. ...INPacket[] feltöltése ...
  2. if(!USBHandleBusy(USBGenericInHandle)) {
  3.     USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)&INPacket,USBGEN_EP_SIZE);
  4. }


Tehát a fentiek értelmében minden USBGenWrite() hívás adatátvitelt generál, s rajtad áll, hogy teleírod a 64 bájtos buffert, vagy sem.
(#) watt válasza icserny hozzászólására (») Nov 3, 2010 /
 
Én még ott ragadtam le, hogy az USB Host pollingja 1ms-es. A GenericDriver képes ettől függetlenül átvitelt generálni? Azaz kisebb mint 1ms-es ütemben adatátvitelt bonyolítani?
(#) icserny válasza watt hozzászólására (») Nov 3, 2010 /
 
Én nem értek hozzá, de úgy sejtem, hogy bulk módban ha a host adatot akar kapni, akkor IN tranzakciót indít, s ha iparkodik, akkor egy keretben akár többször is megteheti.

Az 1 ms-onkénti lekérdezés a HID módnál van.
(#) watt válasza icserny hozzászólására (») Nov 3, 2010 /
 
Az a baj, hogy én sem értek hozzá eléggé, én is csak gondolkodom.
Ha jól tudom itt is, mint más master-slave szervezésnél, a host indíthat kommunikációt, a slave csak a kérésre válaszolhat. Ezért valamilyen pollingra szükség van. Én úgy tudom, hogy a CDC az 1MByte/sec-et úgy tudja, hogy 1024 bájtos lehet a csomag mérete. De lehet, hogy ez téves infó.
Ha 64bájtos egy csomag, akkor sokkal gyorsabban kell pollingolnia a host-nak, amit nem nagyon tudok elképzelni, de ki nem zárható.
Az egy, amit el tudok képzelni 1ms-en belül az, hogy a forgalom nem egy 64bájtos csomagban merül ki, hanem tolja kifelé a bájtokat folyamatosan, amíg ideje van egy kereten belül. Ehhez viszont pufferre sem lenne szükség, elég lenne egyenesen a memóriáról kitenni az adatot egy "USB Tx" regiszterbe, mint az UASART-nál. Nemrég beszéltünk róla, hogy milyen gáz, ha valaki csak használ valamit, miközben nem érti a működését. No most pont ebben a cipőben járok és eléggé sajog a lábam! Jó lenne valami emészthető irodalom, legjobb lenne magyar, de bármi is legyen, csak áttekinthető lenne!
(#) icserny válasza watt hozzászólására (») Nov 3, 2010 /
 
Igen, minden tranzakciót a host indít. De bulk üzemmódban nem fix idejű, periodikus pollingban kell gondolkodni, hanem "rendszertelelen" tranzakciókban, melyeket akkor indít a host, amikor igénye van rá, és talál szabad sávszélességet az adott eszköz számára.

Itt találtam egy jónak tűnő előadásvázlatot.
(#) watt válasza icserny hozzászólására (») Nov 3, 2010 /
 
Ez jó anyag, köszi! Világosodik a sok mód közötti eltérés...
(#) nem válasza watt hozzászólására (») Nov 4, 2010 /
 
Hello!

Sikerült a PIC-től PC felé is elérni az 1Mbyte/s-es sebességet bulkos transferrel, felhasználva a high bandwidth demo-t. Ezen a linken: Bővebben: Link nagyjából le van irva miket kell változtatni. Ezután a fordítók még adnak ki hibaüzenet, ezek főleg abból adódnak hogy nem mindenhol irta át a buffer illetve paracsneveket. Emellett ha vkinek szüksége van rá fel tudom tölteni a nekem működő programokat vagy emailben elküldeni, jelezzétek ha szükséges.

Adam
(#) kissi válasza nem hozzászólására (») Nov 4, 2010 /
 
Szia!

Én szívesen megnézném tanulás céljából ( a címem publikus )!

Steve
(#) nem válasza kissi hozzászólására (») Nov 4, 2010 /
 
Hello!

Apró PC gondjaim vannak most,de holnap elküldöm őket.

Adam
(#) kissi válasza nem hozzászólására (») Nov 4, 2010 /
 
OK, köszönöm előre is!

Steve
Következő: »»   30 / 55
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem