PDA

View Full Version : USBIN pain



nicjo
- 10th February 2015, 09:52
Hi all,

I trying to send a two byte word down the pipe but I cannot get the received data to equal what's been sent. ASCII char are fine as each is one byte long. I can send a one byte number like 255 and all good. I'm not quite sure if I load a word variable with two bytes from the buffer, like word.byte0=buff[0], word.byte1=buff[2] is where the problem is? The number being transmitted is not ASCII but is a number 0 to FFFF, scratching my head now. Any ideas?

Thanks
John



asm
__CONFIG _CONFIG1L, _PLLDIV_1_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_ON_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
__CONFIG _CONFIG3H, _PBADEN_OFF_3H
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
endasm
DEFINE OSC 48

INCLUDE "cdc_desc.bas" 'Descriptor file for CDC serial demo
;--- Setup Interrupts ------------------------------------------------------
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts
Include "modedefs.bas"
;------LCD -----//
' Set LCD Data port
DEFINE LCD_DREG PORTD
' 'Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 4
' ' Set LCD Register Select port
DEFINE LCD_RSREG PORTD
' 'Set LCD Register Select bit
DEFINE LCD_RSBIT 2
' 'Set LCD Enable port
DEFINE LCD_EREG PORTD
' 'Set LCD Enable bit
DEFINE LCD_EBIT 3
' 'Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 4
' 'Set number of lines on LCD
DEFINE LCD_LINES 2
' 'Set command delay time in us
DEFINE LCD_COMMANDUS 2000
' ' Set data delay time in us
DEFINE LCD_DATAUS 50

buffer Var byte[5]
buffer2 var BYTE[2]

cnt Var Byte

position var word


ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_INT, _DoUSBSERVICE, ASM, yes
INT_Handler INT_INT, _Handle_INT, PBP, yes
endm
INT_CREATE ; Creates the Low Priority interrupt processor
INT_ENABLE USB_INT ;we will do this after we initialize USB
INT_ENABLE INT_INT
ENDASM

;----[Initialise USB and Interrupts]----------------------------------------
PAUSE 100 ; Allow VUSB to stabilize
USBINIT ; initialize the USB driver
USBSERVICE ; service it once
UIE = $7F ; enable USB interrupts
UEIE = $9F ; enable USB Error interrupts
@ INT_ENABLE USB_INT
;----[Main program loop]----------------------------------------------------
lcdout $FE, 1, "Begin"
pause 1000
Main:
cnt = 2 ' Specify input buffer size

USBIn 3, buffer2, cnt, main
'lcdout $FE, 1, str buffer2\4 'this displays ASCII ok provided cnt=4
position.byte0=buffer2[0]
position.byte1=buffer2[1]

lcdout $FE, 1, DEC position

outloop:
USBOut 3, buffer2, 2, outloop
GOTO Main
;----[Interrupt handler -- Service USB]-------------------------------------
DoUSBSERVICE:
USBSERVICE ; Run the SERVICE routines
@ INT_RETURN
;----[Interrupt handler -- INT]
Handle_INT:
; something here
@ INT_RETURN

Tabsoft
- 10th February 2015, 12:52
Can you give us an example?
What value are you sending and what value are you receiving?

Demon
- 10th February 2015, 15:43
Good suggestions. Am curious to see if low and high bytes are reversed.

Robert

Tabsoft
- 10th February 2015, 19:47
My thoughts exactly Robert.

Little Endian vs Big Endian.

nicjo
- 10th February 2015, 19:58
If I set the high order byte to 0, word.byte1=0, and send 255 I get 255 in the display, cant send beyond that as 2nd byte is 0. When both bytes set as buff [0], [1] and send 255 or less I get a number begining in 5 or 6 such as 56324, it makes no sense whats going on. I did discover that the terminal prog I was using only sent single bytes only so that if 256 was sent, nothing happened. Took a while to work that out and thought I'd cracked it, noooo of course not. I'm using a VB application to send the number, and on the pic side if I set the high order byte to 0 I do get up to 255 on the lcd, all good so far, when high order byte set as buff [1] I get garbage. I,m not 100% certain though that whats been tx out the VB app is what I,d expect.

I,ve tried reversing the byte order to see if it was high-low rather than low-high but thats not the issue. Any suggestions on how I would go about further testing appreciated,

john

pedja089
- 10th February 2015, 22:05
Here is my template for USB and VB6
http://www.picbasic.co.uk/forum/showthread.php?t=15322&page=2&p=106812#post106812
I think that value stored in buffer(1) in vb, is value in buffer(0) in PBP...
Values are shifted one place when you compare array on pc and pic.
I'm forget why this is happen, so I'm not sure 100%...

Here is comment from code
PORTA=USBRXBuffer[0]'PC BufferOut(1)

And here is why:
BufferOut(0) = 0 ' first by is always the report ID
' write the data (don't forget, pass the whole array)...

When you send data from PIC to PC, I think that values are on same place...
Hope that this will clear what is going on...
EDIT:
And as you can see from Darrel's post (http://www.picbasic.co.uk/forum/showthread.php?t=15322&page=2&p=106800#post106800) USB buffer are at least 8 byte's
DEFINE USB_INSIZE 64 ; IN report is PIC to PC (8,16,32,64)

nicjo
- 10th February 2015, 23:37
That might explain why garbage appears on the lcd at switch on, however as its confihured as virtual serial and not pure USB as in hid I would,nt have thought that [0] would be reserved, but it does make me think its worth another look. So you think that the buffer size should be at least 8 bytes?

pedja089
- 11th February 2015, 14:23
I'm not sure, but I think it should be at least 8 bytes...
If you are using CDC, than it maybe different... Best choice is that you leave USB variable, as is. Don't change anything.
And for CDC I think that numbers of bytes in packet is not constant... It can be one, it can be more... But again, I'm not sure... I don't have much experience with usb.

Demon
- 13th February 2015, 16:02
Darn, can't remember where I read about buffer length. I would go with 8 bytes too.

It's not going to affect performance much anyways.

Robert

Ioannis
- 21st February 2015, 17:33
I think it is in USB Complete, but have to search and the book is far away right now...

Ioannis

DaveC3
- 22nd February 2015, 00:39
You can have the buffer any length as long as the discriptor is set correctly.

example



USBBufferSizeMax con 16 ' maximum buffer size
USBBufferSizeTX con 16 ' input
USBBufferSizeRX con 16 ' output







; report count (number of fields)
retlw 0x95
retlw 0x10 ; 16 byte buffer




it could be 3 bytes, 5 bytes as many as you want up to 64 bytes