Ik ben weer een stukje verder.

http://members.lycos.nl/mmsoft/Software/PIC_Project.zip
(Rechtermuis klik - Doel opslaan als)

Werkt dit bij jullie, of moet er nog iets toegevoegd worden, zoals een of andere DLL, INF bestand etc.) ?

Omdat ik al vanalles heb geïnstalleerd kan ik dat niet testen...

Edit:
Bij download problemen:
www.mmsoft.nl.nu
Onderaan 'PIC - USB Project 1'

[Bericht gewijzigd door MMSoft op ]

Hmmm linkje lijkt niet helemaal te werken?

Op 9 juni 2006 21:14:26 schreef KillerB the Supreme:
Hmmm linkje lijkt niet helemaal te werken?

'Rechtermuis klik' en dan 'Doel opslaan als' !

[Bericht gewijzigd door MMSoft op ]

Ja dan krijg ik een beschadigde zip?

Vreemd, ik heb het hier 3x getest....

Komt per mail....

Edit:
Wat is het nut van deze getalen ?:
READ_VERSION = 0x00,
LED_ONOFF = 0x31,
READ_SWITCH = 0x32,
RD_POT = 0x37,
RESET = 0xFF

Ik ben nu bezig om er nog een Pot.meter bij te maken (A1).
Helaas krijg ik bij beide pots dezelfde waade..
Mocht iemand tips hebben, dan hoor ik het graag

[Bericht gewijzigd door MMSoft op ]

Die getallen zijn dus declaraties van de functionaliteit die je wilt hebben.

Jij stuurt het getal 0x31 naar je device en de device weet dan dat ie een LED aan of uit moet zetten. Het is maar helemaal wat je er zelf van maakt.
Je hoeft er ook niet perse een naam aan te geven, alleen dit leest makkelijker.

Oh ja, ik heb je code geprobeerd, en dat lijkt goed te werken. Er wordt om drivers gevraagd, maar die heb je dus idd niet bijgeleverd in de zip.
Zou je me die nog eens op kunnen sturen?

edit

Die problemen met de potmeter kan misschien komen doordat je te weinig pauze neemt voor de AD conversie. De PIC heeft namelijk maar 1 echte AD converter, de uitgangen worden er gewoon op gemultiplexed. Als jij direct na het overswitchen naar een ander kanaal de AD waarde uitleest, dan lees je feitelijk nog de oude AD conversie uit. Gooi er eens een pauze bij in zou ik zeggen.

[Bericht gewijzigd door KillerB the Supreme op ]

WOEHAAAA ik heb de delphi code werkend!!!

Ik heb nu assembly firmware en een vendor specific device :D
Een snelheidstestje laat nog niet bepaald indrukwekkende snelheden zien, maar tis een begin: 250 bytes/sec. (toch 2kbit/sec ;) )
Oftwel 1000x een led aan en uitzetten duurt ongeveer 8 seconde.

Supergaaf, ik ga direct de rest van de DLL functies ook implementeren en kijken of ik de functionaliteit en snelheid wat kan vergroten.

edit...
Begint een beetje monoloog te worden hier op de vrijdagavond, was niet helemaal de bedoeling.

[Bericht gewijzigd door KillerB the Supreme op ]

Gefeliciteerd dat je het ook aan de gang hebt.
Ik weet hoe frustrerend het is als je maar niet verder komt...

Edit:
Wat doe je nu anders dan daarvoor ?

De Drivers komen eraan (de drivers die ik denk dat je nodig hebt).

Edit2:
Met de 2e Pot.meter lukt nog niet zo...
Het probleem is dat ik niet erg thuis ben in C, geef mij maar ASM !

Ook vindt ik het erg lastig dat er zoveel file's zijn, in de ene file staat dit, en en de andere file waar dat.
Gewoon één lange overzichtelijke ASM listing heeft mijn voorkeur....

[Bericht gewijzigd door MMSoft op ]

Ben ook echt blij dat het nu werkt, was inderdaad behoorlijk frustrerend toen het niet werkte.

Probleem zat hem in een bug van de DLL. Als ik een usb_open command doe en daarna direct een usb_close command, dan krijg ik een windows exception. Ik ging ervanuit dat het probleem lag bij het verkrijgen van de handle, maar dat was niet zo. Het is namelijk noodzakelijk om minimaal 1 usb_control_msg te versturen, daarna werkt het close commando wel goed.

Ik moest overigens wel 'stdcall' aan mijn prototypes toevoegen, anders kreeg ik dus een null-pointer terug. Maar goed, dat had ik ook al veel eerder geprobeerd, maar aangezien het close commando hier ook op vast liep dacht ik dat dit ook niet goed was. Bleek dus wel goed te zijn...

he ik heb je drivers geprobeerd en het werkt allemaal prima hoor. Drivers worden mooi geinstalleerd. Ze zijn alleen niet gecertificeerd ;) Daarna werkt je delphiprogramma prima. Volgens mij valt het met de snelheid ook nog wel mee toch? Kun je eens een test doen, een lus waarin je 500x een led aan en uit zet. Meet dan even hoe lang de routine duurt. Ik zit nu met delphi gemeten op ongeveer 335 commando's per seconde.

Om je vast een opzetje te geven:



procedure TForm1.Button4Click(Sender: TObject);
Var
  buffer : array[0..7] of Char;
  i :integer;
  starttime : DWORD;
  endtime : DWORD;
begin
  If assigned(usbDev) then
  begin
    starttime := gettickcount;
    For i := 0 to 500 do
    begin
      usb_control_msg(usbDev, USB_TYPE_VENDOR OR USB_RECIP_DEVICE, SET_RA0, 0, 0, buffer, 0, 100);
      usb_control_msg(usbDev, USB_TYPE_VENDOR OR USB_RECIP_DEVICE, CLR_RA0, 0, 0, buffer, 0, 100);
    end;
    endtime := gettickcount;
    edit1.text := floattostr(1000 / (endtime - starttime) * 1000);
  end;
end;

Namingconventions is niet mijn sterkste kant, zoals je wel ziet, maar het idee is er. Gettickcount is overigens een standaard windows api call, hoef je dus niet zelf te maken ofzo...

Ik ga hier ook mee aan de slag....

[Bericht gewijzigd door MMSoft op ]

Je bedoelt met de assembly firmware?

Das prima, zal ik wat ik nu al heb even online zetten?

Je bedoelt met de assembly firmware?

Inderdaad, en het Delphi programma daarvoor.

Das prima, zal ik wat ik nu al heb even online zetten?

Graag, of even mailen....

[Bericht gewijzigd door MMSoft op ]

Voor als er nog meer mensen zijn die meekijken (of stiekum meedoen) zal ik het ff online plaatsen.
Ik heb er maar een zipje van gemaakt. Ik weet niet of alles compleet is omdat ik inmiddels ook al zoveel rommel op mn computer heb geinstalleerd.

De assembly code die erbij zit is de standaard lab1 firmware. Je kunt zelf makkelijk wat dingetjes aanpassen in deze firmware aangezien het assembly is.
Oh ja, vergeet niet de het .lkr bestand toe te voegen aan de linkerscripts in MPlab. Pas ook de configuration bits aan voor jouw hardware.

Bedankt voor de bestanden !
Ik ga er mee aan de slag....

Leef jezelf uit zou ik zeggen :) maar onthou wel dat dit nog maar een eerste opzet is. Nog niet alle DLL functies zijn geport naar delphi.

Als ik alles geport heb zal ik er een mooie delphi unit van maken die je eenvoudig in een project kan implementeren. Die zal ik hier dan wel posten voor de geinteresseerden.

Het werkt !

Teminsten met een kristal van 4 Mhz, een 20 Mhz met aangepaste code werkt (nog) niet.

De Speed test geeft de waarde 1000, wat moet ik mij hier precies bij voorstellen ?

Heb je nog gegevens over de werking van de ASM code ?
Aantekeningen, dingen die je al uitgezocht heb enz.

Toevallig heb ik op de B poort B0..B3 ook LED's zitten (van het ander project), en die worden ook op een bepaalde manier aangestuurd als er verbinding met de USB bus wordt gemaakt.
Heb je daar info over ?

[Bericht gewijzigd door MMSoft op ]

Goed om te horen dat het werkt :)

Die speedtest geeft het aantal commando's per seconde aan, dat over de bus verstuurd worden. Of liever gezegd, hoe vaak de LED uit en aan gaat per seconde. Geeft ie iedere keer precies 1000 aan? Het is een beetje variabel namelijk.

Je kunt het aan het ledje zien (RA0), deze moet zacht gaan branden (dutycycle van 50%). Als je liever een andere uitgang wilt hebben moet je het even opzoeken in de assembly code. Bij het label 'VendorRequests' staat de led die wordt aangestuurd.

Het klopt inderdaad dat er op poortB wat uitgangen hoog en laag gemaakt worden. Dit heeft de schrijver van de firmware gedaan voor debug mogelijkheden. Persoonlijk heb ik er helemaal niks aan, dus heb ik ook alles eruit gesloopt. Je kunt dat zelf ook doen, er zijn twee mogelijkheden voor.

Mogelijkheid 1: Haal alle code die tussen de volgende directives staan weg (directives zelf mag je ook weghalen):


#ifdef SHOW_ENUM_STATUS
   ...
   ...

#endif

Mogelijkheid 2: Verwijder de volgende regel


#define	SHOW_ENUM_STATUS

Ik heb het eerste gedaan, daar wordt de code al een stuk leesbaarder van.

Verder ben ik http://www.beyondlogic.org/usbnutshell/ aan het lezen, hier staat echt alles in wat je moet weten over USB, op een duidelijke manier uitgelegd.

edit

Valt me op dat de snelheid van de device omhoog gaat naarmate er meer USB busactiviteit is... Beetje tegenstrijdig maargoed. Heftig met mn USB muis bewegen zorg voor een stijging van 330 naar 370 commando's per seconde.

Speedtest ligt tussen de 984...1000, en heel soms even zo'n 777 (dan zal de PC wel even druk zijn).

Het LEDje gaat inderdaad iets zwakker branden, dat is teminste nog eens snelheid !
Het zal later als alle ASM code en PC source groeit wel iets langzamer worden, maar snelheid is er nu wel !

Er zijn nog veel (nog niet gebruikte) DLL functie's aanwezig, dat ziet er veel belovend uit....

Nu wordt 'usb_open' wel, maar 'usb_close' niet gebruikt.
Is dat niet nodig denk je ?
Anders zou deze bij 'FormDestroy' geplaatst kunnen worden.

Ik kan in iedergeval vooruit !

Edit:
Heb jij ook USB 2.0 ?

Of ik de muis wel of niet snel beweeg tijdens Speedtest maakt hier niets uit.

Bij Speedtest maak ik nu eerst het Edit veld leeg, dan zie je direct dat deze klaar is.
Edit1.Text:= '';
Edit1.Update;

[Bericht gewijzigd door MMSoft op ]

Ik zit hier nog met usb1.1, maar dat zou niet mogen uitmaken gezien de device alleen 1.1 is.

Overigens, die snelheid kan nog vele malen hoger als je echt burst data gaat over gooien. Als je ziet wat er nu aan overhead meegestuurd wordt voor het aanzetten van 1 led, dat kunnen zo wel 30 of 40 bytes zijn...

Die USB close zou er inderdaad nog bij kunnen, maar ach bij sluiten van je applicatie wordt de DLL gereleased en worden de usb devices toch wel automatisch geclosed. Het is uiteraard wel zo netjes om het zelf te doen.

Deze device is toch 2.0 !

PIC18F2455 is toch een HighSpeed Device, of zit ik nu verkeerd ?

Edit:
Volgens de Datasheet:
USB V2.0 Compliant
Low Speed (1.5 Mb/s) and Full Speed (12 Mb/s)

Edit2:
Als ik de kristal verwijder, dan krijg ik bij Speedtest nog steeds de waarde van zo'n 960...1000.
Vreemd toch ?

[Bericht gewijzigd door MMSoft op ]

De device is misschien 2.0 compliant, maar niet highspeed. Dat is namelijk 480Mbit/s

Hoe dan ook, als je het kristal verwijderd, verdwijnt je USB apparaat dan niet uit je hardwarelijst? Het kan zijn dat de DLL dan nog steeds commando's over de bus blijft gooien, hoewel die dan niet geacknowledged zullen worden.

Oh, ja wat misschien een oplossing daarvoor is, is het controleren van de returnvalue van de usb_control_msg functie. Ik doe er nog niks mee in de delphicode, maar je zou er eens naar kunnen kijken. Ik denk dat daarin wel vermeld wordt dat er een error optreed. Eigenlijk moet je de speedtest dan ook stopzetten.

Als ik de kristal verwijder, dan blijft de USB Device IN de hardware lijst staan.

Nadat de PC uit heeft gestaan, moesten Vanmorgen de Drivers weer geïnstalleerd worden.
Gisteren knipperde de LED op A1, deze blijft nu uit.
Het aansturen van LED A0 gaat nog steeds prima !
Vreemd toch ?

Edit:
PIC werkt nu op een 20 Mhz kristal.
PLLDIV = 5
CPUDIV = OSC3_PLL4
FOSC = HSPLL_HS
(Volgens info van Brem eerder in deze discussie)

[Bericht gewijzigd door MMSoft op ]

Het is wel raar dat je USB blijft doordraaien zonder kristal, maar misschien niet geheel onmogelijk. De VCO van de PLL zal namelijk door blijven draaien, en het kan zijn dat ondanks dat ie niet meer gelocked is toch binnen de marge valt van de USB specs. De USB specs liggen voor low speed toch al niet heel hoog, de frequentie mag er +/-1.5% naast zitten.

Ook vreemd dat het LEDje op A1 niet meer knipperd...