I think I have found the problem with interupt. When the interupt hangs and won't leave, it seems BSR=5, when this happens PIR1.1 doesn't get cleared so it just re-enters the int. So the question is, why doesn't PBP make sure the BSR=0 before it tries to PIR1.1=0?
Or the bigger question is why does it work for Darrel???
I am posting the program as it is right now, I am using MPLAB, chooseing MPLAB SIM from the debugger menu. then choose the >> not > to animate the program. With this you can see it enter the interupt and leave. I left it running for about 30 min without issue. rem the LAT line and instant hang. sometimes it takes a few times through to get stuck.
PLEASE, can I get a few people to try this so at least I will know I am not going crazy!!
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 = %10010000'manual ready,servo out,dac out,flood input,4en,3en,2en,1en
TRISG = %11100111'x,x,icsp/mclr,rly2,rly1,Rx2,Tx2,SPINDLE ON
'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
DEFINE NO_CLRWDT 1
'Variables
'Port assignments
'------------------port B
ENALL VAR PORTB.0
ESTOPO VAR PORTB.1
HO1 VAR PORTB.2
HO2 VAR PORTB.3
HO3 VAR PORTB.4
HO4 VAR PORTB.5
'------------------port D
LED0 VAR PORTD.0
LED1 VAR PORTD.1
LED2 VAR PORTD.2
LED3 VAR PORTD.3
LED4 VAR PORTD.4
LED5 VAR PORTD.7
'------------------port F
EN1 VAR PORTF.0
EN2 VAR PORTF.1
EN3 VAR PORTF.2
EN4 VAR PORTF.3
DIGIN VAR PORTF.5
SERVO VAR PORTF.6
MANREADY VAR PORTF.7
'------------------port G
SPINON VAR PORTG.0
RLY1 VAR PORTG.3
RLY2 VAR PORTG.4
'---------------------Bytes
CNT VAR BYTE
FRAMECT VAR BYTE
POS VAR BYTE
MYFLAGS VAR BYTE
PRELOAD VAR BYTE
SPEED VAR BYTE
DUMRUN VAR BYTE
'---------------------Bits
COUNTUP VAR MYFLAGS.0
COUNTDN VAR MYFLAGS.1
MS VAR MYFLAGS.2
LIMIT VAR MYFLAGS.3
DRIVEON VAR MYFLAGS.4
HOMED VAR MYFLAGS.5
'---------------------INIT VARIABLE VALUE
COUNTUP = 1
COUNTDN = 0
POS = 127
FRAMECT = 0
MS = 0
HOMED = 0
CNT = 0
SPEED = 0
PRELOAD = 39 'PRELOAD 39 PR = NUMBER OF CYCLES-1
'5.0 uSec OR 200,000 Hz INTERRUPTS
'INT HANDLER COMPLIMENTS OF DARREL TAYLOR
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
GOTO START
START:
GOSUB NOTREADY
Main: 'DO WHATEVER YOU WANT HERE
IF DRIVEON = 0 THEN
GOSUB CHECKREADY
ENDIF
IF (ENALL = 0) AND (DRIVEON = 1) THEN
GOSUB NOTREADY
ENDIF
IF (MANREADY = 0) AND (DRIVEON = 1) THEN
GOSUB NOTREADY
ENDIF
IF (LIMIT = 1) AND (PORTE = $FF) THEN
GOSUB READY
ENDIF
IF SPINON THEN
SPEED=POS
RLY1 = 1
ELSE
SPEED = 0
RLY1 = 0
ENDIF
IF DIGIN THEN
RLY2 = 1
ELSE
RLY2 = 0
ENDIF
READYRETURN:
IF CNT >= 200 THEN
TOGGLE LED5
CNT=0
FRAMECT = FRAMECT + 1
MS = 1
ENDIF
IF FRAMECT >=20 THEN
FRAMECT = 0
MS=0
HIGH SERVO
ENDIF
IF PORTE != $FF THEN
GOSUB SWITCHHIT
ENDIF
GOSUB SERVOCHECK
GOTO Main
SERVOCHECK:
IF MS =1 THEN
IF CNT >= SPEED THEN
LOW SERVO
MS =0
ENDIF
ENDIF
RETURN
SWITCHHIT:
IF HOMED=0 THEN
GOTO HOMESWITCH
ENDIF
ESTOPO = 1
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
LIMIT = 1
DRIVEON = 0
RETURN
HOMESWITCH:
IF PORTE = 253 THEN HO1=1
IF PORTE = 247 THEN HO2=1
IF PORTE = 223 THEN HO3=1
IF PORTE = 127 THEN HO4=1
IF PORTE = 85 THEN HOMED = 1
RETURN
NOTREADY:
PORTD = PORTD & $F0
PORTF = PORTF | $0F
DRIVEON = 0
HOMED = 0
RETURN
CHECKREADY:
IF ENALL = 0 THEN RETURN
IF MANREADY = 0 THEN RETURN
IF LIMIT = 1 THEN RETURN
READY:
PORTD = PORTD | $0F
PORTF = PORTF & $F0
DRIVEON = 1
LIMIT = 0
RETURN
'---[TMR2 - interrupt handler]--------------------------------------------------
FiveMicroSec:
LATF = LATF ^ 32 ; TOGGLE DAC
CNT =CNT+1
PORTC = PORTA
PIR1.1 = 0 ; clear the interrupt flag
@ RETFIE
Bookmarks