DT - Thanks, that fixed the issue.
Now, an unexpected one has appeared. First I'll explain the product.
We are looking for a 1 to 2ms pulse appearing on either porta.0 or porta.1. Upon receipt of the pulse I have to send out a 1, 2, 4 or 8ms pulse to turn on 2 FETs located at portb.0 and portb.1 The time of the pulse depends upon dipswitch settings.
So if set to 4ms, the program should scan the capacitors for the correct voltage, wait for a pulse input, fire FET's for 4ms when received, go back and wait for the next pulse in.
The problem is the FETS fire anywhere from 1 time to 6 times per one 1 ms pulse input.
I need an ultra fast reaction time so after a pulse is recieved I cant go and do other stuff before turning on the FET's.
I thought about adding a 10ms delay at the end of the flash subroutine and I've thought about adding a count. If count = 1 and there is a pulse received, I could tell it to ignore the input. The count would have to get to reset to zero in the loop somewhere.
Heres the code as it stands right now.
Code:
OSCCON = $70 'set internal resonator to 8mhz
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 5 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 20 ' Set sampling time in uS
DEFINE OSC 8
BNK1 VAR WORD
BNK2 VAR WORD
DUR VAR WORD
ADCON0 = %00000001
ADCON1 = %01111100
ADCON2 = %10111110
TRISA = %11111111
TRISB = %11110000
PORTB.0 = 1
PORTB.1 = 1
PORTB.2 = 1
PORTB.3 = 0
BNK1 = 0
BNK2 = 0
DUR = 0
MAIN:
DUR = 0
PORTB.3 = 0
BNK1 = 0
BNK2 = 0
ADCIN 0, BNK1
ADCIN 1, BNK2
IF PORTB.4 = 1 then
DUR = 8
endif
IF PORTB.5 = 1 THEN
DUR = 4
endif
IF PORTB.6 = 1 THEN
DUR = 2
endif
IF PORTB.7 = 1 THEN
DUR = 1
endif
IF (BNK1 => 466) OR (BNK2 => 466) THEN FLASH
goto MAIN
FLASH:
IF PORTA.4 = 1 OR PORTA.5 = 0 THEN
PORTB.0 = 0 : PORTB.1 = 0 : PORTB.3 = 1
endif
IF DUR = 1 THEN
PAUSE 1
endif
IF DUR = 2 THEN
PAUSE 2
endif
IF DUR = 4 THEN
PAUSE 4
endif
IF DUR = 8 THEN
PAUSE 8
endif
PORTB.0 = 1 : PORTB.1 = 1 : PORTB.3 = 0
GOTO MAIN
Bookmarks