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