Bob,
I've used the ubiquitous MAX232 to a PC RS232 port with success in an automated tester using Hserin and Hserout. I'm jumping on on this cause I use the PIC16F876A also.
The DB9 on this end is Female so you can use a standard male to female cable to the PC.
Here's some syntax and I'll drop in the related schematic. I have it set at 4800 baud, but I'm sure it'll run much faster. I deleted a bunch of stuff from the diagram, but I left the ISP hookup, as well as the reset button.
This bit of code will wait for *T from the PC, run the TECH subroutine, then after sending the A/D results, waits for 3 numbers, converts them into decimal, uses that for the PWM value, then waits for FN to go on it's way.
The formating stuff in the HSEROUT code is to pad 0s cause the PC (running Labview) was looking for precisely 3 bytes at that point.
Code:
DEFINE OSC 8' USE 8MHZ CRYSTAL OSC.
DEFINE ADC_BITS 10' +VREF= 2VDC 1 = .00195V OR ~ 2MV
DEFINE ADC_SAMPLEUS 50' SAMPLE TIME .1MS
DEFINE CCP1_REG PORTC' Hpwm channel 1 pin port
DEFINE CCP1_BIT 2' Hpwm channel 1 pin bit
DEFINE CCP2_REG PORTC' Hpwm channel 2 pin port
DEFINE CCP2_BIT 1' Hpwm channel 2 pin bit
DEFINE HSER_RCSTA 90h' Set RECIEVE Enabled
DEFINE HSER_TXSTA 24h' Set XMIT Enabled HS
DEFINE HSER_BAUD 4800' IL1700 BAUD RATE
DEFINE HSER_CLROERR 1' CLEAR OVER RUN ERRORS
DEFINE CHAR_PACING 1000' CHAR PACING(uSEC) TO 1MS
TRISA=%00001111' SET UP PORTA I/O (1=IN,0=OUT)
TRISB=%11001000' SET UP PORTB I/O
TRISC=%10000000' SET UP PORTC I/O
ADCON1=%10100101' USE PORTA.3 PIN5 AS VREF+ @ 2.0VDC
ADCON0=%01000000' A/D OFF -- RIGHT JUSTIFY. 6MSB=0 ADRESH
HSERIN[WAIT("*"),BUNDONE]
IF BUNDONE = "T" THEN GOTO TECH ' T FOR TECH
TECH:' **************** TECH ************
'
BLEDOUT = 0' TURN BLUE LED ON
HPWM 1, BLUELVL, 5000' CCP1=BLUE SET CURRENT
ADCON0 = %01001101' BLUE ADC
ADCIN 1, BLUSNS' READ IT
BLEDOUT = 1' TURN BLUE OFF
RLEDOUT = 0' TURN RED ON
HPWM 2, REDLVL, 5000' CCP2 =RED SET CURRENT
ADCON0=%01000001' RED A/D
ADCIN 0, REDSNS:REDSNS=REDSNS MIN 999
RLEDOUT = 1' TURN RED OFF
'HPWM 1, 0, 5000' STOP PWM
'HPWM 2, 0, 5000
IF BLUELVL <10 THEN
HSEROUT["00",DEC BLUELVL]:GOTO RED1
ENDIF
IF BLUELVL <100 THEN
HSEROUT["0",DEC BLUELVL]:GOTO RED1
ELSE
HSEROUT [DEC BLUELVL]
ENDIF
GOTO RED1
RED1:
IF REDLVL <10 THEN ' FORMATING
HSEROUT["00",DEC REDLVL]:GOTO BLU1
ENDIF
IF REDLVL <100 THEN
HSEROUT["0",DEC REDLVL]:GOTO BLU1
ELSE
HSEROUT [DEC REDLVL]
ENDIF
GOTO BLU1
BLU1:
IF BLUSNS <10 THEN
HSEROUT["00",DEC BLUSNS]:GOTO RED2
ENDIF
IF BLUSNS <100 THEN
HSEROUT["0",DEC BLUSNS]:GOTO RED2
ELSE
HSEROUT [DEC BLUSNS]
ENDIF
GOTO RED2
RED2:
IF REDSNS <10 THEN
HSEROUT["00",DEC REDSNS]:GOTO WAITF
ENDIF
IF REDSNS <100 THEN
HSEROUT["0",DEC REDSNS]:GOTO WAITF
ELSE
HSEROUT [DEC REDSNS]
ENDIF
GOTO WAITF
WAITF:
HSERIN [WAIT ("F"),EFF]
IF EFF = "N" THEN
GOTO BEGIN
ELSE
GOTO BLULEDSET
ENDIF
GOTO TECH
BLULEDSET:'----------------------SET BLUE--------------------------
HSERIN [WAIT("@"),STR INCOM\3]
INCOM[0] = (INCOM[0]-"0") '
INCOM[1] = (INCOM[1]-"0") ' Convert to decimal
INCOM[2] = (INCOM[2]-"0")
X = 0 ' RESET THE VARIABLE
X = X + INCOM[0] * 100
X = X + INCOM[1] * 10
X = X + INCOM[2]
BLUELVL = (X MIN 255)
X = 0
HPWM 1, BLUELVL, 5000' CCP1 AND SET CURRENT
Then more of the same for the Red channel.
I hope this helps, and I pasted everything correctly!
Bron
Bookmarks