One statement causes compile error
Quote:
Originally Posted by
Darrel Taylor
√. If you haven't already ... download and extract the USBDemo from the beginning of this thread.
√. Then create a new folder (USBDemo260) and copy the
USBDemo.pbp file from Steve's archive into the new folder.
That is the only file that is valid with 2.60, so don't copy any of the others.
√. Download the
USBDEMOdesc.bas.txt (descriptor) file attached to this post and place it in the same folder.
Remove the .txt extension.
√. In the
USB18 folder, inside your PBP folder ...
Copy the following files to the project ...
usb_dev.asm
usb_dev.inc
usb_hid.asm
usb_hid.inc
usb_mem.asm
√. Add this line to the USBDemo.PBP program ... and compile.
Code:
INCLUDE "USBDEMOdesc.bas"
Darrel, I followed steps you listed explicitly and then tried to compile with PBP 2.6. Got the following error:
" ERROR line 81: Redefinition of VAR. USBDemo.pbp]"
which I don't understand since the UCFG variable is not declared anywhere else in the code...just this line where the code occurs.
The error applies to the statement
"UCFG VAR BYTE EXT ' include UCFG register... Yeah Melabs didn't :o("
I went to manual on 2.6 compiler to check syntax of this statement. I guess I don't understand the use of EXT at the end of the statement....manual doesn't explain that.
Can you tell me what might be wrong and why this won't compile?? I would really like to get this USBDemo going for my 18F4550.
Also don't understand why Steve's schematic that you posted varies from the hardware description in the USBDemo260 code:
Here is the Hardware description from the code:
Hardware:
' ---------
' 4 Push Buttons on PORTA<5:2> with pull-down resistors
' 2 Trim pot on PORTA<1:0>
' 8 LEDs attach between PORTB and GND
' 2 LEDs attach to CCP<2:1> pins
' 4 MHZ crystal & all the usual USB stuff
Yet the schematic shows no pushbuttons on PORTA <5:2>, no trim pota on PORTA <1:0>, no LEDS on PORTB or CCP, and a 20 MHz crystal rather than 4 MHz. Can you advise me of the correct hardware hookups for the USBDemo260 code...the schematic or the code description??
Now working except for RA4 pushbutton??
Quote:
Originally Posted by
Darrel Taylor
Sweet!
Doesn't matter, the VB program will pick up when it connects, and sometimes when it disconnects. :eek:
<br>
Darrell, thanks to your help I now have the USBDemo running on my EasyPic6 and everything appears to work except an annomaly with the RA4 pushbutton. When I initially power up, the VB6 window shows all four pushbutton lights on (GREEN). When I push each of the RA2-RA5 pushbuttons on the EasyPic6, the lights go temporarily out while the pushbutton is depressed, which is expected. However, when RA4 is released it stays unlit, unlike the other pushbuttons. Then if I power down and power backup or if I reset, it is lit again along with the others, and the sequence described above happens again if I depress the buttons.
I don't understand why the RA4 pushbutton doesn't operate like the others as a momentary switch. I checked the code and it appears it should. Is there some reason for this? I thought it might even be a problem with my EasyPic6, but the RA4pushbutton is operating normally in other codes I have that use it on the EASYPIC6. I didn't do anything about changing the capacitors on the EasyPic6 that
I also notice that the RX window continuously shows 10 line entries of "USBDemo" and when you click the Clear RX button, it immediately repopulates the RX window with the same 10 entries. I am trying to understand this and presume that these entries are due to the TMR0 interrupt executing every 100 usec to run the goto at DoUSBService, which reloads the TMR0. I presume each time this reload takes place and the TMR0 overflows, a USBDemo line appears in the RX window. Am I understanding what is happening???
I am TOTALLY impressed with this code and the functionality Steve created in this demo! He is to be highly commended for sharing this since it helps people (like me) to finally understand at a basic level how to incorporate a USB interface into our applications.
Now I have to figure out how to modify it for a specific application that operates this way...am explaining in hopes you or someone else on this thread will have some ideas:
1) the Main code wakes up from SLEEP mode every night at midnight and executes 6-12 ultrasonic range finder measurements which are averaged and the average result is logged into EEPROM, and then it goes back to SLEEP till next midnight.
2) This data logging occurs every night at midnight. If at any time a USB cable is plugged into the USB connector (which will only happen once every 30 days to download the 30 averaged range measurements from EEPROM), it must recognize this as an interrupt to the normal data logging application and permit the User on the other end of the USB interface (a laptop) to recover the 30 averaged range measurements from EEPROM to the laptop and export them into a spreadsheet.
Now that I have the USB interface working, I am struggling with how best to support this scenario with an interrupt that recognizes when the USB cable is connected. I thought I might use an RBIE: RB Port Change Interrupt in the MCU code that would be created by the laptop User when one of the RBx boxes in the VB6 User Interface is clicked. Do you have any better suggestions as to how to do this??
Would also appreciate any pointers you might have to the best approach for a midnight to midnight interrupt without having to add a RTC to my application. I thought a TMR1 approach with 24 hr delays might work for this, but have doubts that it would keep time accuracy well enough to always happen exactly at midnight. Any ideas are appreciated??
Solved problem! Would still like answer to other questions.
Quote:
Originally Posted by
jellis00
I don't understand why the RA4 pushbutton doesn't operate like the others as a momentary switch. I checked the code and it appears it should. Is there some reason for this?
I also notice that the RX window continuously shows 10 line entries of "USBDemo" and when you click the Clear RX button, it immediately repopulates the RX window with the same 10 entries. I am trying to understand this...
The problem resolved itself and I don't know exactly why. The only changes I made were to make sure the pull-down resistors were enabled properly and to connect the RA0 pin to the potentiometer for the Analog A/D input. Either as a result of these changes or some other unknown reason, the annomaly of the RA4 pushbutton and the "USBDemo" messages in the RX window went away. I see now that the "USBDemo messages are not a result of the TMR0 reloads but only appear when the pushbuttons are pressed and the RX window clears normally now and stays clear until the next pushbutton.
Even though these problems are solved, I would still appreciate any inputs/ideas regarding my other questions. It begins to look like I can achieve my intentions for detecting USB connection by implementing the "self-power only" circuit as shown in Figure 17-11 of the 18F4550 data sheet. Will try it and report in later post.
Here are the 18F4550 _CONFIG settings
[QUOTE=Darrel Taylor;80423]OzGrant,
See this thread about how to fix the configs ...
http://www.picbasic.co.uk/forum/show...=6775#post6775
Attached .txt document is a list of the _CONFIG settings for the 18F4550 from its corresponding P18F4550.INC file in MPLAB folder. It is always a good idea to have this list handy when setting up code for a new program.
Compiles and programs but USB doesn't connect
Quote:
Originally Posted by
Darrel Taylor
USBDemo Warning, the example is setup for 13K50/14K50.
Comment the configs, and uncomment the other configs (if needed).
Change ANSELs to ADCON1 (if needed).
I made these changes to the BasicUSB.pbp code for use with 18F4550 as you can see in my listed code below. It compiles OK into a .hex file which I then programmed into the 18F4550 using the PicFlash programmer in my EasyPic6. By all appearances everything was OK until I turned on power to the MCU with Steve's VB6 program running....at that point the USB connection was not recognized and nothing else happened. Can you look at this code and tell me what is wrong. I made shure both the include files were in the PBP folder and since it compiled I interpreted that to mean the INCLUDES were OK. Since I was able to get Steve's code to run in my EasyPic6 I believe that eliminates the VB6 code as the problem, so need to figure out how to debug yours and when it doesn't connect or do anything visible, I don't know how to debug it.
Quote:
I'm not even going to tell you how it works. :eek:
I defy you to not understand what it does.
Up until you ask a question.
I studied the code in both the test program and in DT__HID.bas and unfortunately I guess I don't understand what it does since I can't get it to work. I need your HELP.
Code:
'**********************************
'* Name : BasicUSB.pbp *
'* Author : Darrel Taylor *
'* Notice : Copyright (c) 2009 *
'* Date : 7/23/2009 *
'* Version : 1.0 *
'* Notes : *
'* : *
'**********************************
;--- if you un-comment these, you must comment the ones in the .inc file ---
ASM ; 18F2550/4550, 8mhz crystal as used in EasyPic6
__CONFIG _CONFIG1L, _PLLDIV_2_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
__CONFIG _CONFIG3H, _PBADEN_OFF_3H
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM
ASM ; 18F13K50/14K50 Only 12mhz crystal can be used for USB
; __CONFIG _CONFIG1L, _CPUDIV_NOCLKDIV_1L & _USBDIV_OFF_1L
; __CONFIG _CONFIG1H, _FOSC_HS_1H & _PLLEN_ON_1H & _PCLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
ENDASM
DEFINE OSC 48
clear
;--- Setup Interrupts ------------------------------------------------------
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_Handler
endm
INT_CREATE ; Creates the interrupt processor
endasm
;--- Setup USB -------------------------------------------------------------
INCLUDE "DT_HID260.pbp"
DEFINE USB_VENDORID 6017
DEFINE USB_PRODUCTID 2000
DEFINE USB_VERSION 1
DEFINE USB_VENDORNAME "Darrel Taylor"
DEFINE USB_PRODUCTNAME "DT_HID"
DEFINE USB_SERIAL "001"
DEFINE USB_INSIZE 32 ; IN report is PIC to PC (8,16,32,64)
DEFINE USB_OUTSIZE 16 ; OUT report is PC to PIC
DEFINE USB_POLLIN 10 ; Polling times in mS, MIN=1 MAX=10
DEFINE USB_POLLOUT 10
; --- Each USB LED is optional, comment them if not used ----
DEFINE USB_LEDPOLARITY 1 ; LED ON State [0 or 1] (default = 1)
DEFINE USB_PLUGGEDLED PORTB,0 ; LED indicates if USB is connected
DEFINE USB_TXLED PORTC,2 ; " " data being sent to PC
DEFINE USB_RXLED PORTC,1 ; " " data being received from PC
OutCount VAR WORD : OutCount = 0
Value VAR WORD
X VAR WORD
;--- Setup ADC -------------------------------------------------------------
DEFINE ADC_BITS 10 ; Number of bits in ADCIN result
ADCON2.7 = 1 ; right justify (Change this if ADFM in diff register)
ADCON1 = %00010000 ; AN4/RC0 Analog
'ANSELH = 0
;--- The Main Loop ---------------------------------------------------------
Main:
FOR X = 0 to 1000 ; Check for incomming USB data while pausing
@ ON_USBRX_GOSUB _HandleRX
PAUSE 1
NEXT X
ADCIN 4, Value
OutCount = OutCount + 1
ARRAYWRITE USBTXBuffer,["AN0=",DEC Value," -",DEC OutCount," "]
IF Plugged THEN GOSUB DoUSBOut ; only send when USB is connected
GOTO Main
;---- This just sends the received packet back to the PC -------------------
HandleRX:
ARRAYWRITE USBTXBuffer,[STR USBRXBuffer\USBBufferSizeRX]
return
Made config change..compiles, nothing happening
[QUOTE=Darrel Taylor;80452]Apparently, I missed the CONFIG2L.
I always miss that one, weird ...
Code:
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_ON_2L
I made this _CONFIG change in the code. Compiles/assembles OK and appears to program the 18F4550 OK.
Quote:
And try the HIDmonitor program from the .zip
When I said it works with Steve's original program, well it will, but it's not set up to send/receive the same analog values and switches/LED's. With HIDmonitor you should see when it connects and what data it's sending.
Tried both your HIDmonitor and Steve's VB6 routine after programming and power/resetting the 18F4550 . Although I hear a low "click" and see the USB icon appear in my WINDOWS tray when the USB cable is connected from the PC, I don't see any indication of the connection on the HIDmonitor or on Steve's VB6. And the USB icon disappears out of the tray about 10 secs after the next keyboard key or mouse button is pressed with no audible "click". Nor do I hear another "click" or see any visual indication of disconnect when USB cable is disconnected. Nor is there any indication of any communications on either the HIDmonitor or the VB6 window.
Do you have any suggestions how I might monitor what is happening in the code while running so I can debug? I don't have a usable ICD.
1 Attachment(s)
Working!..a couple of more questions.
Quote:
Originally Posted by
Darrel Taylor
Do you have anything on RB0, RC1 or RC2.
I've got some Status outputs to LED's on those pins, that shows when it's connected and when it sends/receives data.<br>
Thanks, Darrel...this led me to the problem. The EasyPic6 has dip-slide switches that let you connect LEDs to the A/E, B, C, and D ports for troubleshooting. I had the switch selected for Ports B and C. When I finally realized I needed to shut them off everything started working properly.
However, one question. I notice while running MisterE's VB6 monitor side-by-side with your DT_HID monitor I see the Rx data showing some variances. I have attached a screen-snapshot of this so you can see.
Notice in the screen snapshot that when when AN=123, AN0= 1023; when AN=51, AN0=510, and when AN=-4, AN0=0. Since both are receiving the same data as transmitted by the PIC, shouldn't the displayed values be equal in both monitors??? Don't understand this. Can you explain for me??
My next step is to figure out how to capture what appears in the DT_HID Rx data window into a text file or better yet into a spreadsheet. Any suggestions as to how to do this in the DT_HID code?,
1 Attachment(s)
Data from PIC works...data to PIC doesn't
Quote:
Originally Posted by
Darrel Taylor
OK, this program should work with Steve's original USBDemo GUI.
Darrel,
Everything compiles/assembles/programs in my EasyPic6 configuration with 18F4550 (8 MHz crystal), and it does run with Steve's VB6 GUI, but only for data from the PIC....data to PIC side of the GUI doesn't work. I double checked that I didn't have anytheng on the EasyPic6 connected to the pins you are using. See attached screen snapshot of the VB6 GUI that shows what is working and what isn't.
I also notice that when I remove the comments on the DEFINE statements for the status LEDs that they do not light during the PLUGGED, TX or RX actions are supposedly taking place that they are suppose to indicate.
I looked at your code and I couldn't see where the problem is. Any ideas??
Working as advertised! Another question.
Quote:
Originally Posted by
Darrel Taylor
The ones on the left require 8-LEDs on PORTB, and 2 other LEDs on the CCP outputs, RC1/RC2.
Quote:
The USB D-/D+ are on RC4/RC5, so I don't think you can just enable the whole bank of LED's on PORTC. You'll need to attach LEDs to only the 2 CCP Pins to get the faders working.
Turns out you can enable all the whole bank of LED's on PORTC and it keeps working. You can then see the LEDs on RC1 and RC2 vary in brightness as you change the sliders.
Quote:
But you should be ok with LEDs on PORTB.
Except for the LEDs on RB0, RB5, Rb6 & RB7 (which are used in your code) you can now click the check boxes on B1 thru B4 on the VB6 Gui and they work to light the corresponding LEDs.
I now have Steve's VB6 GUI and the DT_HID monitor running side by side and everything works as advertised except for the exceptions I listed above for the B0 thru B7 check boxes. Your support to me in getting to this has been outstanding, Darrel. Thanks so much!
Now I only have to figure out how to capture the data coming across the USB interface from the PIC into a spreadsheet. Your suggestion to use CDC and HYPERTERM would be an easier option except that my application requires a USB interface that is also used to connect to a cell phone, and I don't have physical room for both an RS232 and a USB interface within the physical board size contstraint or panel connector space. Looks like I have to figure out how to do the capture in Steve's USB VB6 GUI. I will modify the PIC side to send comman delimited data per your suggestion, but don't know how to approach capturing the comma delimited data from the VB6 USB Gui that is showing into a spreadsheet. Can you refer me to any forum ideas or reference tutorials in this area??
Thanks again, Darrell. Your contributions & presence on this forum is what makes it worthwhile.
Made changes per your suggestions...now an assembly error
:(
Quote:
Originally Posted by
Darrel Taylor
The USB routines are not setup to handle a resume.
So your best bet it probably to connect the +5V from the USB cable to one of the INT pins with a pull-down resistor.
When the cable gets plugged in, it will generate an interrupt, at which point you would execute an @ RESET to reset the processor and initialize the USB again.
HTH
OK, so I made changes to my code per your suggestions (see partial code below) including an IF Plugged =1 test in the Main loop to pole for USB connection and go to my USB servicing procedure when connected. I didn't do anything to get SLEEP mode yet because I want to make sure the interrupts are working first in this code.
This code compiles, but creates a single error during assembly that says
"Error[101]c:\PathToAsmfile.asm 1132:ERROR:(INT_ENABLE priority state not found)". So I can't get it to run yet with this error.
I'm not sure what this error is telling me...the required statement for @ INT_ENABLE INT2_INT is in the code. Does it also require an INT_ENABLE USB_HANDLER statement for the USB interrupt??
Code:
Include "Modedefs.Bas"
INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ' Include if using PBP high priority interrupts
INCLUDE "ALLDIGITAL.pbp" ' Sets all registers for digital ops.
DEFINE OSC 48
;--- if you un-comment these, you must comment the ones in the .inc file--
ASM ; 18F2550/4550, 8mhz crystal
__CONFIG _CONFIG1L, _PLLDIV_2_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 ; PortB resets as digital
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM
' Initialize Hardware
' ===================
Spare_1 VAR PORTB.7 ' PGD for ICSP & Spare I/O for normal ops
Spare_2 VAR PORTB.6 ' PGC for ICSP & Spare I/O for normal ops
'Set registers
TRISA = 0 ' PORTA all outputs for LCD use
TRISB =%00011000 ' RB4 & RB3 set as RTC Alarm1 & Alarm2 inputs
TRISC = 0
TRISD = 0
TRISE = 0
'------------SETUP FOR USING DS1337 Real Time Clock (RTC)---------------
'***********************************************************************
' Setup Hardware for uart
' =======================
DEFINE HSER_BAUD 115200
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_CLROERR 1
' Aliased Variables for CLock
' ===========================
Alarm1 VAR PORTB.4 ' Alarm1 input from DS1337 INTA
Alarm2 VAR PORTB.3 ' Alarm2 input from DS1337 INTB
SCL VAR PORTB.1 ' I2C clock pin
SDA VAR PORTB.0 ' I2C data pin
RTC CON %11010000 ' RTC device write address(byte addressing)
' This is a list of allowable clock contrl settings, one which must be
' setup in the SetTimeAndDate subroutine as intended.
'contrl CON %00000011 ' Starts the oscillator, sets the SQW/OUT
' to 1 Hz, enables INTA interrupt from A1F
' or from A2F. WORKS as intended!!
'contrl CON %00000111 ' Starts oscillator, enables INTA interrupt
' from A1F or INTB from A2F. WORKS OK!
' Both interrupts staggered 30 secs apart.
' RTC Address definitions
' ========================
SecReg CON $00 ' seconds address (00 - 59)
' MSB of SecReg must be set to a 0 to enable RTC
MinReg CON $01 ' minutes address (00 - 59)
HourReg CON $02 ' hours address (01 - 12) or (00 - 23)
DayReg CON $03 ' day address (1 - 7)
DateReg CON $04 ' date address (01 - 28/29, 30, 31)
MonthReg CON $05 ' month address (01 - 12)
YearReg CON $06 ' year address (00 - 99)
' Alarm 1 Address definitions
' ===========================
Alm1sec CON $07 ' Alarm 1 seconds address (00 - 59)
Alm1min CON $08 ' Alarm 1 minutes address (00 - 59)
Alm1hr CON $09 ' Alarm 1 hours address (01 - 12) or (00 - 23)
Alm1Day CON $0A ' Alarm 1 day address (1 - 7)
' Alarm 2 Address definitions
' ===========================
Alm2min CON $0B ' Alarm 2 minutes address (00 - 59)
Alm2hr CON $0C ' Alarm 2 hours address (01 - 12) or (00 - 23)
Alm2Day CON $0D ' Alarm 2 day address (1 - 7)
' Alias of Clock register addresses
' =================================
ContReg CON $0E ' CONTROL register address
StatusReg CON $0F ' STATUS register address
' Clock Variables
' ================
sec VAR BYTE ' seconds
MINs VAR BYTE ' minutes
hr VAR BYTE ' hours
day VAR BYTE ' day
date VAR BYTE ' date
mon VAR BYTE ' month
yr VAR BYTE ' year
' ALARM1 VARIABLES
' ================
A1sec VAR BYTE ' seconds
A1MINs VAR BYTE ' minutes
A1hr VAR BYTE ' hours
A1day VAR BYTE ' day
' ALARM2 VARIABLES
' ================
A2MINs VAR BYTE ' minutes
A2hr VAR BYTE ' hours
A2day VAR BYTE ' day
GoSub SetTimeAndDate ' Setup current time & alarm settings
'*----------------SETUP FOR USING USB INTERFACE-------------------------
'***********************************************************************
INCLUDE "DT_HID260.pbp"
DEFINE USB_VENDORID 6017
DEFINE USB_PRODUCTID 2000
DEFINE USB_VERSION 1
DEFINE USB_VENDORNAME "Mister E/DT"
DEFINE USB_PRODUCTNAME "USBDemo"
DEFINE USB_SERIAL "001"
DEFINE USB_INSIZE 8 ; IN report is PIC to PC (8,16,32,64)
DEFINE USB_OUTSIZE 8 ; OUT report is PC to PIC
DEFINE USB_POLLIN 10 ; Polling times in mS, MIN=1 MAX=10
DEFINE USB_POLLOUT 10
; --- Each USB status LED is optional, comment them if not used ---------
; ---They can be assigned to any pin, and no further action is required --
;DEFINE USB_LEDPOLARITY 1 ; LED ON State [0 or 1] (default = 1)
;DEFINE USB_PLUGGEDLED PORTB,7 ; LED indicates if USB is connected
;DEFINE USB_TXLED PORTB,6 ; " " data being sent to PC
;DEFINE USB_RXLED PORTB,5 ; " " data being received from PC
;--- Variables ----------------------------------------------------------
Value0 VAR WORD
Value1 VAR WORD
X VAR WORD
DUTY1 VAR WORD
DUTY2 VAR WORD
Old_PORTA VAR BYTE
New_PORTA VAR BYTE
;--- Setup ADC ----------------------------------------------------------
DEFINE ADC_BITS 8 ; Number of bits in ADCIN result
;--- Initialize ---------------------------------------------------------
CCPR1L = 0
CCPR2L = 0
CCP1CON = %00001100 ' CCP1, PWM mode
CCP2CON = %00001100 ' CCP2, PWM mode
PR2 = 249 ' 0-1000 duty range
T2CON = %00000101 ' TMR2 on, prescaler 1:4
TRISB = 0
OUTPUT PORTC.1
OUTPUT PORTC.2
ADCON2.7 = 0 ; left justify (Change this if ADFM in diff register)
ADCON1 = %1101 ; AN0/AN1 Analog
'------------------------SETTINGS FOR INTERRUPTS------------------------
'***********************************************************************
'Set interrupt related registers
RCON.7 = 1 ' Set Interrupt Priority Enable bit (Bit7=IPEN)
' to enable priority levels on interrupts
INTCON.7 = 1 ' Set Global Interrupt Enable bit
INTCON.6 = 1 ' Set PEIE to enable low priority periph interrupts
INTCON2 = %10001000 ' Enable PORTB Pull-ups (Bit7-high), set INTEG2
' for falling edge (Bit4-low) on RTC's interrupt.
INTCON3 = %10001000 ' Set INT2IP high priority (Bit7-high),
' enable INT2IE for interrupt(Bit4-high)
RTC_INT_FLG VAR INTCON3.1 'Alias for RB4 INTA interrupt from RTC
'Setup external interrupt macros
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_Handler
INT_Handler INT2_INT, _Alarm, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE INT2_INT ; enable external (INT) interrupts
' -----------------------BEGIN MAIN PROGRAM LOOP-----------------------
'***********************************************************************
Main:
Pause 1000
IF Plugged = 1 THEN
HIGH PORTC.6
GOTO USB ' USB cable is plugged-in
ENDIF
' Else, do other things if not connected
' If Alarm interrupt, read current time & ALARM settings from DS1337
' Perform range measurements if Midnight
LOW PORTC.6
USB:
'Process data from EEPROM to PC via USB interface
GoTo Main ' Endless Loop
End ' Safety measure to insure program stops if reaches here
'--------------------( Begin Interrupt Handler )------------------------
'***********************************************************************
Alarm:
HIGH PORTC.7 ' Test LED if Interupt
' Put code here to service the Alarm interrupt
LOW PORTC.7
' Resume Main Program
@ INT_RETURN
End ' Safety measure to insure program stops if reaches here
'------------------{ End of Interrupt Handler }---------------------------
' START LIST OF SUBROUTINES
'**************************
A couple of more questions re: USBDemo
Darrel, first of all let me commend you on they way you created the USBdemo. It has been a god send to me to save time in getting my application to work with a USB interface. However, I have a couple of more questions:
1) I notice that this declaration implies you must use BufferIn(X) where X is either 8.16, 32, or 64.
"DEFINE USB_INSIZE 8 ; IN report is PIC to PC (8,16,32,64)"
Is that true also with the BufferOut(X) per this statement?
DEFINE USB_OUTSIZE 8 ; OUT report is PC to PIC
I ask this question because I need 10 data elements per BufferOut transmission for my application and didn't know whether I could size the BufferOut as 10 or would have to use 16.
2) In my application I need the PIC to read individual Bytes out of EEPROM and then send them as data to the PC via the USB interface. The data is stored in EEPROM during normal ops as 75 data sets, each data set consisting of 3 bytes. The PIC code reads each data set into a three element array, arrData(i,j,k), where i, j,k range from 0 to 74. My question is how to code the PIC to best fit this data into the BufferOut array to send each arrData(i,j,k) over the USB interface, at the rate of one per second. The data is in the PIC code in the form of:
arrData(0,0,0)
arrData(1,1,1
arrData(2,2,2)
|
|
arrData(74,74,74)
I want each data set to show up at the PC as the three bytes contained in the array element. I guess my question is in essence how to convert each array element into the three BufferOut(X) bytes for transmission.
3) I also notice that the PC's RX Window of my application is showing continuous receipt of a e garbagvalue shown as "p|?|6||", even when none of the PORTA pushbuttons are pressed. But when PORTA.4 button is pressed, the string value "USBDemo" is correctly received. However, when any of the other PORTA buttons are pressed it has no impact on the data stream and just shows another "p|?|6||". All other functions of the USBDemo interface work OK. It almost seems like there is a continuous button bounce going on in PORTA, but causing transmit of garbage values rather than the "USBDemo" string. I don't have a debug ability to see what is causing this. Any ideas?? If seeing my code would help you to assess this, let me know and I will somehow get it to you.