Ja programma instructies idd. Je kent het wel van assembly waar je org 0x0000 (of ander getal) kan opgeven. Hierdoor weet de linker dat deze code op het fysieke adres 0x0000 moet komen te staan. Dat is natuurlijk handig, omdat de interrupt vector naar een vaste plek in de code springt, namelijk 0x0004.
Kan er iemand iets vertellen over die macros ?
(ik kan mij niet in denken dat er verder niemand geintreseerd in dit tropic
)
[Bericht gewijzigd door MMSoft op ]
Op 13 juni 2006 22:11:02 schreef MMSoft:
ik kan mij niet in denken dat er verder niemand geintreseerd in in dit tropic
Nou, de afgelopen 3 pagina's zijn voornamelijk dialoog, maar ongetwijffeld zijn er meelezers 
En hopelijk ook meedenkers/puzzelaars 
Ook zou het fijn zijn als er iemand verstand had van macros....
Edit:
Dit moet het stuk code zijn van de macro 'forlf'
movlw 0x01 ;? forlf ?
movwf UEP3, BANKED ;
a_00BE2 movf 0x73, W, BANKED ;
subwf 0x74, W, BANKED ;
btfss STATUS, C, ACCESS ;
goto a_00BFA ;
call a_0002C ;? in het begin van het programma ?
movwf POSTINC0, ACCESS ;
incf UEP1, F, BANKED ;
incf UEP3, F, BANKED ;
goto a_00BE2 ;
a_00BFA movlb 0x04 ;
movlw 0x40 ;
xorwf 0x04, W, BANKED ;
andlw 0x40 ;
iorlw 0x88 ;
movwf 0x04, BANKED ;
return ;
Met dank aan Rudy Elyn (www.RE-Applications.be)
voor het Dis assembleren.
[Bericht gewijzigd door MMSoft op ]
Ik ben bezig met de PIC Code.
Om er gewone ASM van te maken...
Lukt het met de Delphi source ?
Edit:
Het is nog niet klaar, en in de tekst kunnen nog foutjes zitten.
Hulp is welkom 
http://members.lycos.nl/mmsoft/Software/ASM.zip
(Rechtermuis klik - Doel opslaan als)
Edit:
Bij download problemen:
www.mmsoft.nl.nu
Onderaan 'PIC - USB Project 2'
[Bericht gewijzigd door MMSoft op ]
Ok ik heb communicatie nu beide kanten op goed werkend. Het versturen van data naar de device toe hadden we hierboven al besproken, ik zal uitleggen hoe je ook data kunt ontvangen.
Het principe dat ik gebruik werkt nog steeds volledig met de controlmessages. Wat je moet doen is het volgende:
Vanuit delphi verstuur je een control message met daarin een verzoek aan de device welke data je wilt ontvangen. De device krijgt dit verzoek binnen (in vendorrequests) en zet de aangevraagde data klaar in de uitgaande endpoint buffer. De data wordt nu automatisch naar de PC verstuurd en komt in de buffer te staan van de delphi control message.
Vanuit delphi is het dus bijzonder makkelijk:
retval := usb_control_msg(usbDev, USB_ENDPOINT_IN OR USB_TYPE_VENDOR OR USB_RECIP_DEVICE,
Command, Param1, Param2, buffer, 8, 100);
Vanuit delphi hoef je dus alleen deze functie aan te roepen en je aangevraagde data staat (als het goed is) direct in de buffer. De buffer is nog steeds een array van 8 chars, netzoals in de voorgaande voorbeelden.
Voor de assembly firmware heb ik even een testpatroon aangemaakt dat verstuurd wordt op het moment dat het commando '1' (RET_TESTPATTERN) verstuurd wordt. Samen met het aan en uitzetten van het ledje komt het er dan zo uit te zien:
#define LED_CONTROL 0x00
#define RET_TESTPATTERN 0x01
#define LED_ON 0x01
#define LED_OFF 0x00
VendorRequests
MOVF USB_buffer_data+bRequest, W, BANKED
select
case LED_CONTROL
MOVF USB_buffer_data+wValue, W, BANKED
select
case LED_ON
BSF PORTB, 3
break
case LED_OFF
BCF PORTB, 3
break
ends
banksel BD0IBC
CLRF BD0IBC, BANKED ; set byte count to 0
MOVLW 0xC8
MOVWF BD0IST, BANKED ; send packet as DATA1, set UOWN bit
break
case RET_TESTPATTERN
banksel BD0IBC
MOVLW 0x08
MOVWF BD0IBC, BANKED ; set byte count to 8
MOVF BD0IAH, W, BANKED
MOVWF FSR0H
MOVF BD0IAL, W, BANKED
MOVWF FSR0L ; copy bufferadress to FSR0
MOVLW 0x03
MOVWF POSTINC0
MOVLW 0x05
MOVWF POSTINC0
MOVLW 0x04
MOVWF POSTINC0
MOVLW 0x06
MOVWF POSTINC0
MOVLW 0x07
MOVWF POSTINC0
MOVLW 0x09
MOVWF POSTINC0
MOVLW 0x08
MOVWF POSTINC0
MOVLW 0x0A
MOVWF POSTINC0 ; Fill the buffer with the testpattern
MOVLW 0x40
XORWF BD0IST, W, BANKED ; toggle the DATA01 bit
ANDLW 0x40 ; clear the PIDs bits
IORLW 0x88 ; set UOWN and DTS bits
MOVWF BD0IST, BANKED
break
default
BSF USB_error_flags, 0, BANKED ; set Request Error flag
ends
RETURN
Probeer het eens uit zou ik zeggen. Kijk wat er in de buffer van delphi komt te staan na het uitvoeren van de controlmessage. Als het goed is staan de 8 getallen van het testpatroon erin.
Op 15 juni 2006 22:33:44 schreef MMSoft:
Het is nog niet klaar, en in de tekst kunnen nog foutjes zitten.
Hulp is welkomhttp://members.lycos.nl/mmsoft/Software/ASM.zip
(Rechtermuis klik - Doel opslaan als)
Wederom geen goede zip? Ik krijg iedere keer maar de eerste 10kb van het bestand binnen. Gaat de upload van de zip wel goed?
Vreemd dat de zip niet binnen te halen is.
Ik heb het ook nog getest op een andere pc, en daar werkt het ook !
Ik heb hem al per mail gestuurd....
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 heb dat zipje ook eens getest en als je het download en de bestandsnaam in ASM.txt wijzigt dan zie je allerlei html rommel. Ik vermoed dat de link niet klopt omdat het naar een download script verwijst.
Ik ben nu op het werk en hier kan ik ook gewoon het zipje binnenhalen....
(Rechtermuis klik -> Doel opslaan als)
Vreemd dat het bij jullie niet werkt....
[Bericht gewijzigd door MMSoft op ]
Ik krijg ook wel een zip binnen, maar die is slechts 10kb groot en corrupt. De zip die je me in de mail toestuurde was 13kb groot.
De corrupte zip bestaat inderdaad uit allemaal html tags, zal wel iets van lycos zijn.
editje
Misschien kun je bij lycos wel helemaal niet direct linken, je krijgt dan namelijk hun fantastische banners niet te zien...
Misschien dat het bij jou wel lukt omdat je bent ingelogd op lycos ofzo?
[Bericht gewijzigd door KillerB the Supreme op ]
Misschien dat het bij jou wel lukt omdat je bent ingelogd op lycos ofzo?
Thuis is er een kleine kans dat er iets van lycos op de PC is verborgen.
Maar hier zeker niet, en hier werkt het wel...
Als ik morgen even tijd heb, dan zet ik het wel op mijn site...
Edit:
Trouwens fijn dat er nu 2 zijdige gegevens verstuurd kunnen worden.
Ik ga daar zeer binnenkort mee aan de slag....
Edit2:
De zips staan nu op mijn site !
(Staat onderaan. Site moet nog opgedeeld worden in Programma's / Elektronika).
[Bericht gewijzigd door MMSoft op ]
De complete code ineens omzetten geeft te veel problemen.
Daarom ga ik ook eerst met de macro's aan de slag.
En het plan is om later de macro's staps gewijs te verwijderen.
Was je nog verder gekomen met de Delphi kant ?
De laatste versie staat nog steeds een aantal posts verder naar boven. Tenminste het interface gedeelte naar de dll. Hoe je het verder in gaat vullen met de commando's laat ik helemaal aan jou over.
Wat ik momenteel al gerealiseerd heb is het schrijven naar de PIC EEPROM (1 byte schrijven per control message) en ook het uitlezen van de eeprom (8 bytes per control message). Bij het schrijven geef ik dan aan dat ik een EEPROM read write actie wil doen (in de request), ik geef het eeprom adres mee (in de index), en natuurlijk de waarde die ik er in wil zetten (in de value).
Lezen op dezelfde manier, alleen dan worden er 8 bytes vanaf het opgegeven adres teruggestuurd.
editje: read moest natuurlijk write zijn
Misschien dat ik nog wel eens wat met die interrupt commando's wil doen, das nog wel geinig voor bijvoorbeeld realtime data uitlezen. Bulk data is verder niet zo interessant gezien de kleine hoeveelheid data die je meestal overstuurd.
Voorlopig houd ik het eerst bij wat ik momenteel heb. Dat is in principe al meer dan voldoende 
Waarvoor dient dit stukje precies ?
banksel BD0IBC
clrf BD0IBC, BANKED ; set byte count to 0
movlw 0xC8
movwf BD0IST, BANKED ; send packet as DATA1, set UOWN bit
[Bericht gewijzigd door MMSoft op ]
Die registers zijn de endpoint buffer control registers. Via deze registers is het mogelijk om met de geintegreerde USB engine van de PIC te communiceren (de usb engine is eigenlijk een apart onderdeel binnen de microcontroller). Kijk maar eens in de datasheet onder het hoofdstuk 17.4, hierin wordt alles uitgelegd.
Waar het op neer komt, iedere endpoint heeft 8 registers toegewezen, 4 voor de inkomende endpoint en 4 voor de uitgaande endpoint. Zo'n groepje van 4 bytes heet een 'buffer descriptor'. Er kunnen maximaal 64 van deze descriptors gedefinieert worden. Ze staan altijd gemapped in het geheugen vanaf adres 0x400. Als je de USB module overigens niet activeert, kun je dit geheugen als normaal werkgeheugen gebruiken, maar wanneer USB aan staat worden het 'automagisch' special function registers 
De 4 registers zien er altijd als volgt uit:
BDnSTAT : Status register
BDnCNT : Byte Count Register
BDnADRL : Adress (low) van endpoint buffer
BDnADRH : Adress (high) van endpoint buffer
waarbij 'n' het endpoint nummer aangeeft
De assembly firmware heeft de buffers jammer genoeg iets ander benoemd (voor de verwarring), voorbeeldje voor inkomende endpoint 0:
BD0STAT = BD0IST
BD0CNT = BD0IBC
BD0ADRL = BD0OAL
BD0ADRH = BD0OAH
Wat je feitelijk met deze registers kan doen is de interne USB engine vertellen waar je inkomende en uitgaande data naar toe geschreven moet worden (mbv de pointer BDnADRH:BDnADRL) en hoeveel bytes dat er getransporteerd moeten worden (mbv BDnCNT). Met BDnSTAT heb je nog wat extra controle mogelijkheden, maar als je dat allemaal wilt weten verwijs ik je naar de datasheet 
Bedankt voor de uitleg !
Toch nog een vraagje.
banksel BD0IBC
Wat doet Banksel hier nu ?
Dit is toch bank select, maar waar wijst deze nu precies naar ?
Naar de bank waarin het register 'BD0IBC' staat of hoe moet ik dat zien...
Jep, daardoor wordt de bank geactiveerd waarin BD0IBC staat. Hierna kun je dan het register aanspreken met de toevoeging -BANKED.
Banking is overigens niet nodig voor alle normale Special Function registers en een aantal user registers (geloof 0x00 - 0x7F). Deze kun je direct aanspreken met de toevoeging -ACCESS. ACCESS mag je overigens ook gewoon weglaten, dit is namelijk de default van de assembler.
Ik ben nu (pas) zover dat ik meerdere uitgangen kan aansturen door middel van Request, Value en Index.
Echter wel zonder gebruik te maken van de macro's.
De Led op B0 gaat direct branden (dat is/was ook al bij de orginele code), ik vindt echter niet waar deze aangestuurd wordt !
SHOW_ENUM_STATUS is uitschakeld !
Edit:
Ook al een beetje bezig met gegevens uitlezen:
retval := usb_control_msg(usbDev, USB_ENDPOINT_IN OR USB_TYPE_VENDOR OR USB_RECIP_DEVICE,
Command, Param1, Param2, buffer, 8, 100);
Welke waarde moet 'USB_ENDPOINT_IN' hebben ?
[Bericht gewijzigd door MMSoft op ]
De Led op B0 gaat direct branden (dat is/was ook al bij de orginele code), ik vindt echter niet waar deze aangestuurd wordt !
SHOW_ENUM_STATUS is uitschakeld !
Opgelost, PortB was ongedefineerd (CLRF PortB, was de oplossing)
Goed om te horen dat de problemen zijn opgelost.
Op 24 juni 2006 17:14:50 schreef MMSoft:
Edit:
Ook al een beetje bezig met gegevens uitlezen:retval := usb_control_msg(usbDev, USB_ENDPOINT_IN OR USB_TYPE_VENDOR OR USB_RECIP_DEVICE,
Command, Param1, Param2, buffer, 8, 100);Welke waarde moet 'USB_ENDPOINT_IN' hebben ?
USB_ENDPOINT_IN staat gedefinieerd in de laatste versie van de DLL interface, die ik een stukje verder naar boven gepost heb.
Daar staat:
USB_ENDPOINT_IN = $80;
Dan zou het ontvangen moeten lukken.