Here is my latest code. All this really does is check for switches and disable drives, and shift PORTa to PORTc every 5 uS. It also sends a servo pulse out every 20mS with a pulse time sweeping from 1-2 ms just for testing purposes.
Right now, everything seems to work, but I need to remove the RED line from the interupt. When I comment it out, it seems to hang in the interupt and never leave. Uncomment and it works again. I have been struggling with this for a week, so I figured I would just ask and get the answer.
Code:
' Name : Interface card.pbp
' Compiler : PICBASIC PRO Compiler 2.6A
' Assembler : MPASM
' Target PIC : 16F1947
' Hardware : PIMill Interface
' Oscillator : internal
' Keywords :
' Description : PICBASIC PRO program to interface parallel port
' to 4 stepper drives and limit switches
'
'
'
'
' Configure ports
'
'
ANSELA = %00000000 'port A all digital
ANSELE = %00000000 'port E all digital
ANSELF = %00000000 'port F all digital
ANSELG = %00000000 'port G all digital
CM1CON0 = %00000000 'No comparaters
CM1CON1 = %00000000
CM2CON0 = %00000000
CM2CON1 = %00000000
' preload latches before setting direction
LATB = %00000000
LATC = %00000000
LATD = %00010000 'LED's 0 for red, 1 FOR GREEN should start red
LATF = %00001111 ' low nibble is drive enable. 1 disables
LATG = %00000000
' I/O direction
TRISA = %11111111'step and dir inputs
TRISB = %11000001'7-0 icsp,icsp,h4o,h3o,h2o,h1o,estopO,enable In
TRISC = %00000000'step and dir outputs
TRISD = %00000000'led6,i2c,i2c,led5,led4,led3,led2,led1
TRISE = %11111111'ls4,lsh4.ls3,lsh3,ls2,lsh2,ls1,lsh1
TRISF = %00010000'spindle dir,servo out,dac out,flood input,4en,3en,2en,1en
TRISG = %11100111'x,x,icsp/mclr,rly2,rly1,Rx2,Tx2,DI
'REMOVE THIS LINE IF NOT SETTING THE CONFIGS IN CODE SPACE
@ __config _CONFIG1,_FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
@ __config _CONFIG2,_WRT_OFF & _VCAPEN_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_25 & _LVP_OFF
'Internal osc setup
OSCCON = %11110000 'clock is 8 meg. turn on PLL for 32 meg clock
DEFINE OSC 32
'Variables
LED0 VAR PORTD.0 ' Assign name "LED" to PORTD
LED1 VAR PORTD.1
LED2 VAR PORTD.2
LED3 VAR PORTD.3
LED4 VAR PORTD.4
LED5 VAR PORTD.7
SERVO VAR PORTF.6
CNT VAR BYTE
MYFLAGS VAR BYTE
COUNTUP VAR MYFLAGS.0
COUNTDN VAR MYFLAGS.1
MS VAR MYFLAGS.2
ENALL VAR PORTB.0
TEMPF VAR BYTE
FRAMECOUNT VAR BYTE
POS VAR BYTE
EN1 VAR PORTF.0
EN2 VAR PORTF.1
EN3 VAR PORTF.2
EN4 VAR PORTF.3
COUNTUP = 1
COUNTDN = 0
POS = 1
FRAMECOUNT = 0
MS = 0
CNT = 0
'5.0 uSec OR 200,000 Hz INTERRUPTS
'PRELOAD 39 PR = NUMBER OF CYCLES-1
'INT HANDLER COMPLIMENTS OF DARREL TAYLOR
PRELOAD VAR byte
PRELOAD = 39 ' FROM TESTING TO FIND THE RIGHT NUMBER
PR2 = PRELOAD
PIE1.1 = 1 ; Enable Timer2 interrupts
INTCON.6 = 1 ; enable PEIE
INTCON.7 = 1 ; enable GIE
T2CON = %00000100 ; Start Timer2
DEFINE INTHAND _FiveMicroSec
'---[TMR2 - interrupt handler]--------------------------------------------------
FiveMicroSec:
LATF = LATF ^ 1 ; TOGGLE EN1
CNT =CNT+1
PORTC = PORTA
PIR1.1 = 0 ; clear the interrupt flag
@ NOP
@ RETFIE
Main: 'DO WHATEVER YOU WANT HERE
IF ENALL = 0 THEN
GOTO NOTREADY
ELSE
GOTO READY
ENDIF
READYRETURN:
IF CNT >= 200 THEN
' TOGGLE EN2
TOGGLE LED5
CNT=0
FRAMECOUNT = FRAMECOUNT + 1
MS = 1
ENDIF
IF FRAMECOUNT >=20 THEN
FRAMECOUNT = 0
MS=0
HIGH SERVO
IF COUNTUP THEN POS = POS + 1
IF COUNTDN THEN POS = POS - 1
ENDIF
' TOGGLE LED2
IF PORTE != $FF THEN SWITCHHIT
GOTO SERVOCHECK
GOTO Main
SERVOCHECK:
IF MS =1 THEN
IF CNT >= POS THEN
LOW SERVO
MS =0
IF (COUNTUP = 1) AND (POS=199) THEN
COUNTUP = 0
COUNTDN = 1
ELSE
IF POS = 1 THEN
COUNTUP = 1
COUNTDN = 0
ENDIF
ENDIF
ENDIF
ENDIF
GOTO MAIN
SWITCHHIT:
PORTF = PORTF | $0F
IF (PORTE = 253) OR (PORTE = 254) THEN LED0 = 0
IF (PORTE = 247) OR (PORTE = 251) THEN LED1 = 0
IF (PORTE = 223) OR (PORTE = 239) THEN LED2 = 0
IF (PORTE = 127) OR (PORTE = 191) THEN LED3 = 0
' ELSE PORTE = PORTE |$0F
GOTO MAIN
NOTREADY:
PORTD = PORTD & $F0
PORTF = PORTF | $0F
IF ENALL = 0 THEN NOTREADY
PORTD = PORTD | $0F
PORTF = PORTF & $F0
GOTO MAIN
READY:
PORTF = PORTF & $F0
PORTD = PORTD | $0F
GOTO READYRETURN
Bookmarks