Het ontvangen lukt nu ook !
Ik krijg 8 byte's binnen, zou het mogelijk zijn om slechts 1 byte binnen te halen (er zijn niet altijd meerdere byte's nodig) ?
In Delphi in de 'usb_control_message', de parameter size van 8 wijzigen in 1 werkt niet.
usb_control_msg(usbDev, requesttype, request, value, index, buffer, size, timeout);
Kijk naar de return value van de usb_control_msg. Deze returned < 0 als er een error was (fout in USB device, of disconnected) of als >= 0 het aantal bytes dat er verzonden / ontvangen is.
Het binnenhalen van 1 byte moet je dus wel regelen in je firmware, daar zet je het byte count register op 1. Vervolgens controleer je dit in delphi met behulp van de returnvalue.
Dat werkt nu ook !
Nu wil ik wat code in de PIC gaan plaatsen.
Code die continu bezig is met vanalles.
Waar zou deze het beste geplaatst kunnen worden, zodat de USB connectie niet wordt verstoord ?
Het verstoren van de USB connectie kan je voorkomen door de USB afhandeling geheel via interrupts te laten verlopen. Ik heb er zelf al over zitten nadenken, maar heb er nog geen tijd voor gehad om dit te doen.
Als je kijkt naar de routine 'ServiceUSB', die constant vanuit je mainloop wordt aangeroepen, dan zie je dat daar niks anders in gebeurd dan pollen van de interrupt flags. Het enige dat je dus hoeft te doen is de betreffende interrupts te enablen en deze op te vangen in de Interrupt Service Routine (ISR). Daar voer je dan de code uit die in 'ServiceUSB' staat.
Met interrupts hoef je je geen zorgen meer te maken om de USB communicatie, deze draait dan lekker onafhankelijk van de mainloop. Daar mag je dan netzoveel pauzes en rommel ingooien wat je maar wilt. De communicatie tussen je mainloop en USB vereist dan wel wat extra werk. (zie het als 2 aparte threads in delphi, communicatie tussen beide zul je moeten syncroniseren op de een of andere manier).
Je kunt overigens best wel wat rommel in je mainloop plempen hoor, maar alst veel langer duurt dan 1msec, dan wordt het oppassen, windows kan dan denken dat de device disconnected is oid.
Als er iets gelezen of gestuurd wordt, dan stuurt Delphi
een control_message naar de PIC.
Dus de PC bepaald wanneer er gekeken/gestuurd wordt.
Zou het mogelijk zijn om de PIC een signaal naar de PC (Delphi) te laten sturen, en dat het PC programma daarop reageerd ?
(Dus zonder dat Delphi continu control_message's hoeft te sturen als er op bijvoorbeeld 1 ingang van de PIC wordt gewacht)
Nee, dat is het grote probleem van USB, alle acties worden vanaf de PC opgestart. De zogenaamde interrupt transfers zijn ook niet wat ze lijken, dit houdt gewoon in dat de device precies 1x per milliseconde (minimum frame tijd) wordt gepolled op nieuwe data. Denk bijvoorbeeld aan een muis, die periodiek gerefreshed wordt.
Je kunt dus alleen met behulp van pollen (handmatig, of automatisch via interrupt transfers) communiceren van microcontroller naar PC.
Lees ook dit verhaal eens, in het bijzonder de interrupt transfers.
Ik ben weer een klein stukje verder.
Kan nu een Pot.Meter die aangesloten is op A0 uitlezen.
KillerB the Supreme, ben jij nog met dit project bezig ?
Ik ben er nog steeds mee bezig, maar het USB gedeelte is wel af voor dit project. Communicatie werkt beide kanten op. De controlmessages geven meer dan genoeg bandbreedte voor de meeste microcontroller projecten, dus hier laat ik het even bij. (complete eeprom uitlezen, 256 bytes, doe ik nu in 0.25 seconde)
Voor een vervolg project zal ik nog eens kijken hoe ik de usb routines via interrupt kan laten verlopen, dat maakt de main routine wat minder kritisch. Handig voor als je veel delays hebt enzo.
Ik ben nu zover dat ik nieuwe Firmware heb voor de K8055 (USB Experiment interface board) van Velleman.
Op dit Boardje is de weerstand R35 verwijderd, en het kristal van 6 Mhz vervangen door 20 Mhz.
-8 Uitgangen aansturen
-5 Ingangen inlezen
-2 Pot.meters inlezen (zowel '8 Bits: 0...255' en ook '10 Bits: 0...1023')
-2 PWM uitgangen.
Edit:
www.mmsoft.nl.nu
Onderaan 'PIC - USB Project K8055.zip'
[Bericht gewijzigd door MMSoft op ]
Op 18 juni 2006 15:43:24 schreef KillerB the Supreme:
Ik vind het ook raar dat het niet werkt met die zips van lycos.Maar goed, ik heb hem via de mail binnen, en hij lijkt prima te werken. Ik kan er in ieder geval naar connecten vanuit delphi.
Ik denk overigens dat ik de macro's er gewoon in laat zitten, is wel zo makkelijk. Dingen die ik zelf toevoeg zullen overigens zonder macro's zijn.Ik heb ook een nieuwe versie van de DLL interface voor delphi online gezet. Niet alles van de originele dll is vertaald, maar alles wat je nodig hebt voor delphi staat er in principe in. Ik heb er nu overigens een aparte unit van gemaakt. Routines als OpenDevice enzo komen ergens anders in te staan, bijvoorbeeld in je hoofdunit, of een eigen unit speciaal voor usb routines. Ik heb het laatste gedaan, wel zo overzichtelijk. Laat me even weten of je er problemen mee hebt
Ik probeer deze interface te douwnloaden maar de link werkt niet!
Heb je hier iets aan:
www.mmsoft.nl.nu
Kies: Elektronica (PIC Microprocessors)
Zie: Eigen firmware t.b.v. K8055 (incl. PC programma)
[Bericht gewijzigd door MMSoft op ]
Ziet er mooi uit. Heb hem al bij mijn favorites gezet.
Maar ik ben op zoek naar de DLL interface voor Delphi.
Ik zou graag zelf een applicatie in delphi maken met de usb.
Ik ben een jaar geleden gestart met de 18F2555
http://pe.ece.olin.edu/ece/projects.html
heb verschillende test gedaan met HID en PIC maar door omstandigheden gestopt.
gebruikte delphi met JDI USB component maar ben alles verloren geraakt.
Heb toen ICD2 (RdSs232) gebouwd ben nu zinnes om ICD2 USB te bouwen
http://www.icd2clone.com/wiki/Main_Page
Ben op zoek gegaan naar JDI component maar kan het niet terug vinden op het net.
Ben toen op dit forum terecht gekomen bij de DLL interface
[Bericht gewijzigd door are op ]
