Program Laser_target2

#include "LowPower.h"

long int high;

long int low;

float period;

float duty;

int average=500;

int sensorpin = A0; // select the input pin for the photosensor

int sensorValue = 0; // variable to store the value coming from the sensor

char i=0;

int j=0;

int p=0;

int k=0;

int m=0;

int n=0;

int Q;

unsigned char puls_cnt=0;

int delayT[]={125,125,125,125,125,125};

int dspnum[]={3,3,3,2,2,2}; // these are numner pins each state

int dspval[]={2,3,4,5,6,7,2,3,4,5,2,3,6,4,7};

//

void setup()

{

for (i=2;i<21;i++)

{

digitalWrite(i,LOW);

}

pinMode(2, OUTPUT); // dsp outputs

pinMode(3, OUTPUT); // display outputs

pinMode(4, OUTPUT);

pinMode(5, OUTPUT);

pinMode(6, OUTPUT);

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

pinMode(9, OUTPUT); // set to some value

pinMode(10, OUTPUT);

pinMode(11, OUTPUT);

pinMode(12, OUTPUT);

pinMode(13, OUTPUT);

pinMode(15, OUTPUT);

pinMode(16, OUTPUT);

pinMode(17, OUTPUT); // set to some value

pinMode(18, OUTPUT);

pinMode(19, OUTPUT);

pinMode(20, OUTPUT);

delay(1000);

digitalWrite(5,HIGH);

delay(5000);

digitalWrite(5,LOW);

}

void loop()

{

j=0;

i=0;

k=0;

LowPower.powerDown(SLEEP_30MS, ADC_OFF,BOD_OFF);

digitalWrite(8,HIGH); // power to sensor

delayMicroseconds(40);

int Q=analogRead(sensorpin);

if (average>150)

{

j=.15*average;

if (Q>average | (average-Q)<j)

{

average=(Q+4*average)/5;

}

else

{

while(i<1)

{

low=micros();

j= 85; // 1250

k=.85*average;

while (analogRead(sensorpin)<k & j>0)

{

j--;

delayMicroseconds(500); // 42.5ms

}

if (j>0)

{

high=micros();

low=high-low;

j= 50; // 1250

while (analogRead(sensorpin)>=k & j>0) // assume ~8us

{

j--;

delayMicroseconds(500); // 35.5ms

}

if (j>0)

{

digitalWrite(8,LOW); // disable power to sensor

high=micros()-high;

period=high+low;

duty=low/period;

period=period/1000;

// qualify period and duty cycle for 3 consequentuive pulses (no gap)

if (period>35 & period<58) //17 /<28Hz

{

if (duty> .48 & duty < .67) // single pulse sequence

{

puls_cnt++;

if (puls_cnt>0)

{

digitalWrite(8,LOW); // disable power to sensor

setdisplay();

puls_cnt = 0;

i=1;

}

}

else

{

puls_cnt =0;

i=1;

}

}

else

{

puls_cnt =0;

//i=1; reset pulse cnt but loop to qualify a next pulse

}

}

else

{

puls_cnt =0;

i=1;

}

}

else

{

average = .95*average;

puls_cnt =0;

i=1;

}

}

}

}

digitalWrite(8,LOW); // disable power to sensor

}

//

// ************************************************

void setdisplay()

{ // execute display

n=1;

// exec sequence

for (i=0;i<6;i++) // 6 matches the # of display states

{

j=n-1;

m=dspnum[i]; // dspnum is number of items to display this state

for (k=0;k<m;k++)

{

digitalWrite(dspval[n-1],HIGH);

n++;

}

delay(delayT[i]);

for (k=0;k<m;k++)

{

digitalWrite(dspval[j],LOW);

j++;

}

}

}

********MicroChip PIC12F509 code for triggered pulsed sequence gun ******

Laser Drive (momentary, normally off)

;init F509 based

; 508/9 part

; P1,2 are laser high drive

; P0 is discrete switch, using explicate qualification/ !delta

; does not use WDT 3 each 30 on, 20 off, .254S gap

tmrcnt equ 0x10

pcnt equ 0x11

tmp equ 0x12

bits equ 0x13

#define bounce bits,0

#define done bits,1

#define ZERO 3,2

timage equ 0x14

image equ 0x15

;

clrf 6

movlw 0xF9 ; 1111 1001

TRIS 6

movlw 0x80 ; enb pullup(s)

OPTION

movlw 1

movwf image

top1:

clrf bits ; clr bounce and done

; ***************************************

top: ; wakeup on compare trip

movfw 6

movwf timage

xorwf image,w

andlw 1

btfsc ZERO

goto top2

; not same

movfw timage

movwf image

goto top1

;

top2: ; same

btfsc bounce

goto t4

bsf bounce

movlw .27 ; init tmr,set for 27ms (debounce)

movwf tmrcnt

t8:

call msdelay

decfsz tmrcnt ; wait

goto t8

goto top

t4:

btfsc done

goto top1

btfsc image,0

goto top1

bsf done

movlw 3 ; set for 3 pulse per trip

movwf pcnt

t1:

movlw .30 ; init tmr ; set for 30ms on time

movwf tmrcnt

movlw 0xFF ; assert lasr

movwf 6

t2:

call msdelay

decfsz tmrcnt ; wait

goto t2

movlw .20 ; init tmr ; set for 20ms off time

movwf tmrcnt

movlw 0xF9 ; 1111 1001 ; clr lasr

movwf 6 ; disable lasr

t3:

call msdelay

decfsz tmrcnt ; wait

goto t3

decfsz pcnt ; qual numbe of pulses

goto t1

movlw .250; init tmr ; set for 254ms gap

movwf tmrcnt

t5:

call msdelay

decfsz tmrcnt ; wait

goto t5

;

movlw .96; init tmr ; set for total .5s gap

movwf tmrcnt

t6:

call msdelay

decfsz tmrcnt ; wait

goto t6

goto top1

; **************************************

msdelay: ; subservice

movlw .249

movwf tmp

d1:

nop

decfsz tmp

goto d1

retlw 0

end