Well I would think I would only need one in the loop, just to make sure the Reset(HWPM) and Horizontal 2 are on their rising edge as in synch as possible.
Well I would think I would only need one in the loop, just to make sure the Reset(HWPM) and Horizontal 2 are on their rising edge as in synch as possible.
What if I did something like this??
horizloop:
PORTB.2 = 0
PORTB.3 = 1
PAUSEUS 139
ENABLE
ON INTERRUPT GOTO H2lock
DISABLE
PAUSEUS 15
ADCIN 0, adval ' A/D 8 bit value from PORTA.0 into adval
SEROUT2 PORTC.6,16416,[BIN8 adval,13,10] ' Output 8 bit word serially to PC from C.6
PAUSEUS 87
horizpulse = horizpulse + 1
IF horizpulse < 784 THEN
GOTO horizloop
ELSE
PAUSEUS 270
GOTO vertloop
ENDIF
H2lock:
PORTB.3 = 0
PORTB.2 = 1
RESUME
NOP, On Interruot goto is placed at the header of your code before your main loop. Since it's working in background, it will jump by himself to the interrupt routine. did you look at my previous link?
INTCON and probably others have to be set for interrupt type/source.
i'll make something like this later today.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
What do you think of something like this>?
' Connect analog input to (RA0)
' Connect clocks to PORTB
' PORTB.0 is the Vphase1 clock
' PORTB.1 is the Vphase2 clock
' PORTB.2 is the Hphase1 clock
' PORTB.3 is the Hphase2 clock
' PORTB.4 is the reset clock
' Connect pin 2 from the DB9 connector to PORTC.6
' Have a +5V source ready to touch PORTA.2 to trigger clocking process
include "modedefs.bas"
' Define ADCIN parameters
Define ADC_BITS 8 ' Set number of bits in result
DEFINE OSC 20 ' Sets clock speed to 20Mhz
Define ADC_CLOCK 4 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ON INTERRUPT GOTO H2lock ' When Reset clock is high
INTCON1 = %1001000 ' Enable RB0 Interrupt
INTCON = $80 ' Disables Interrupts
TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %00001101 ' Set PORTA analog, except for pin 2
TRISB = %00000000 ' Set PORTB to all output
Pause 500 ' Wait .5 second
Pause 500 ' Wait .5 second
horizpulse var byte
vertpulse var byte
adval var byte ' Create adval to store result
horizpulse = 1 ' Initialize counters, initial states
vertpulse = 1
PORTB.0 = 0
PORTB.1 = 0
PORTB.2 = 1
PORTB.3 = 0
PORTB.4 = 0
buttonloop:
IF PORTA.2 = 1 then
GOTO vertloop
else
GOTO buttonloop ' Waits for 5V that signals shutter is closed
ENDIF
vertloop:
horizpulse = 1
PORTB.0 = 1
PAUSEUS 139
PORTB.0 = 0
PORTB.1 = 1
PAUSEUS 139
PORTB.0 = 1
PORTB.1 = 0
PAUSEUS 139
PORTB.0 = 0
PAUSEUS 270
vertpulse = vertpulse + 1
IF vertpulse < 512 THEN
GOTO horizloop
ELSE
GOTO buttonloop
ENDIF
horizloop:
PORTB.2 = 0
PORTB.3 = 1
PAUSEUS 139
INTCON = $80 ' Re-enables interrupts
PAUSEUS 15
ADCIN 0, adval ' A/D 8 bit value from PORTA.0 into adval
SEROUT2 PORTC.6,16416,[BIN8 adval,13,10] ' Output 8 bit word serially to PC from C.6
PAUSEUS 87
horizpulse = horizpulse + 1
IF horizpulse < 784 THEN
GOTO horizloop
ELSE
PAUSEUS 270
GOTO vertloop
ENDIF
DISABLE
H2lock:
PORTB.3 = 0
PORTB.2 = 1
RESUME
ENABLE
END
Also, I saw a blurb in the PBP manual about the fact that I can check the interrupt flag without actually enabling interrupts. If I did it that way, then I could merely do a check condition statement, similar to this, right?:
IF PORTB.2 = 1 AND INTERRUPTFLAG = 1 ' When horizontal 1 is high and reset is high
' Do the H1 > low, H2 > high, ADC conversion and the SEROUT2
OK, I checked the datasheet and the interrupt flag bit is bit 1 of the INTCON register. It also says that I have to reset it in software once an interrupt has occurred. So I was thinking if I just set the INTCON.1 = 0 right before the condition statement, then I could just wait until the INTCON.1 = 1 before clocking the horizontals. What do you think?
Yep. I do this all the time.
Disable global interrupts (INTCON.7 = 0), and just monitor & reset interrupt flags as needed. Very handy.
Bookmarks