Hi,
I am new and this is my first posting, please don't shoot me in case of mistakes.
Today I started to use PicPasic Pro 2.6 with MPLAB IDE 8.60 and tried out the usb_demo.bas sample immediately.
MPLAB file list:
CDC_DEMO.BAS
CDC_DESC.BAS
USB_CDC.ASM
USB_CDC.INC
USB_MEM.ASM
USB_DEV.ASM
USB_DEV.INC
CDC_DEMO.BAS Code:
Code:
' USB sample program for PIC18F4550 CDC serial port emulation
' Requires PBP 2.60 or later
' Compilation of this program requires that specific support files be
' available in the source directory. For detailed information, see
' the file PBP\USB18\USB.TXT.
Include "cdc_desc.bas" ' Include the HID descriptors
Define OSC 48
buffer Var Byte[16]
cnt Var Byte
OSCTUNE.6 = 1 ' Enable PLL for 18F87J50 family
Pause 10
USBInit ' Get USB going
' Wait for USB input
idleloop:
USBService ' Must service USB regularly
cnt = 16 ' Specify input buffer size
USBIn 3, buffer, cnt, idleloop
' Message received
buffer[0] = "H"
buffer[1] = "e"
buffer[2] = "l"
buffer[3] = "l"
buffer[4] = "o"
buffer[5] = " "
buffer[6] = "W"
buffer[7] = "o"
buffer[8] = "r"
buffer[9] = "l"
buffer[10] = "d"
buffer[11] = 13
buffer[12] = 10
buffer[13] = 0
outloop:
USBService ' Must service USB regularly
USBOut 3, buffer, 14, outloop
Goto idleloop ' Wait for next buffer
The test program in the PC is a simple VB6 routine:
Code:
;---------------- Write to PIC --------------------------
Private Sub Out3Byte(bus As Byte, adr As Byte, data As Byte)
Dim Com(2) As Byte
Com(0) = bus: Com(1) = adr: Com(2) = data
'3 byte send
MSComm1.Output = Com
End Sub
;----------------- Receive from PIC ----------------------
Private Sub MSComm1_OnComm()
Dim data As String, ende As Boolean
ende = False: Text1.Text = ""
Static IsActive As Boolean
MSComm1.RThreshold = 0
If IsActive Then
Label4.Caption = "OnComm Ueberschneidung"
Exit Sub
End If
Do Until ende
If MSComm1.InBufferCount > 1 Then 'min 1byte recvd
data = MSComm1.Input
Text1.Text = Text1.Text + Hex$(AscB(data)) + " "
Else
ende = True
End If
DoEvents
Loop
IsActive = False
MSComm1.RThreshold = 1
End Sub
In general it works fine but, for one little but crucial problem I cant find the reason, so I suspect the problem to be with the PBP compilation.
The 3 bytes from the PC are always received properly, but the "Hello World" message arrives in the PC correctly only the first time immediately after Com Port Open statement. When continuously sending and receiving, at the beginning of the messages there is always one garbage byte ahead of "Hello World". The value is always the same, but depends one actual memory location in PIC RAM of "buffer Var Byte[16]"
Can anyone help?
CDC_DEMO_transmission_log:
Code:
35 VB6.EXE IOCTL_SERIAL_SET_BAUD_RATE USBSER000 SUCCESS Rate: 115200
36 VB6.EXE IOCTL_SERIAL_CLR_RTS USBSER000 SUCCESS
37 VB6.EXE IOCTL_SERIAL_SET_DTR USBSER000 SUCCESS
38 VB6.EXE IOCTL_SERIAL_SET_LINE_CONTROL USBSER000 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
39 VB6.EXE IOCTL_SERIAL_SET_CHAR USBSER000 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
40 VB6.EXE IOCTL_SERIAL_SET_HANDFLOW USBSER000 SUCCESS Shake:1 Replace:0 XonLimit:8000 XoffLimit:8000
41 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
42 VB6.EXE IRP_MJ_WRITE USBSER000 SUCCESS Length 3: A1 A9 AF <3 bytes send
43 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
44 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
45 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
46 VB6.EXE IOCTL_SERIAL_WAIT_ON_MASK USBSER000 SUCCESS
47 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
48 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 48 <----- Starts with "H"
49 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
50 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
51 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 65
52 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
53 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
54 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6C
55 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
56 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
57 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6C
58 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
59 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
60 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6F
61 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
62 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
63 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 20
64 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
65 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
66 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 57
67 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
68 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
69 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6F
70 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
71 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
72 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 72
73 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
74 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
75 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6C
76 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
77 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
78 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 64
79 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
80 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
81 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 0D
82 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
83 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
84 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 0A
85 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
86 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
87 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
88 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
89 VB6.EXE IOCTL_SERIAL_GET_PROPERTIES USBSER000 SUCCESS
90 VB6.EXE IRP_MJ_WRITE USBSER000 SUCCESS Length 3: A1 A9 AF <3bytes send
91 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
92 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
93 B6.EXE IOCTL_SERIAL_WAIT_ON_MASK USBSER000 SUCCESS
94 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
95 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
96 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 00 <----- starts with "0x00"
97 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
98 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
99 B6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 48 <----- "H" is 2nd byte
100 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
101 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
102 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 65
103 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
104 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
105 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6C
106 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
107 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
108 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6C
109 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
110 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
111 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6F
112 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
113 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
114 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 20
115 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
116 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
117 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 57
118 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
119 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
120 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6F
121 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
122 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
123 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 72
124 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
125 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
126 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 6C
127 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
128 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
129 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 64
130 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
131 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
132 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 0D
133 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
134 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
135 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 0A
136 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
137 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
138 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
139 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
140 VB6.EXE IOCTL_SERIAL_GET_PROPERTIES USBSER000 SUCCESS
141 VB6.EXE IRP_MJ_WRITE USBSER000 SUCCESS Length 3: A1 A9 AF <3 bytes send
142 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
143 VB6.EXE IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
144 VB6.EXE IOCTL_SERIAL_WAIT_ON_MASK USBSER000 SUCCESS
145 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
146 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
147 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 00 <garbage again
148 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
149 VB6.EXE IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS
150 VB6.EXE IRP_MJ_READ USBSER000 SUCCESS Length 1: 48
Bookmarks