'**************************************************************** '* Name : lwg_4.BAS * '* Author : Lucas Volwater * '* Notice : Copyright (c) 2007 Lucas Volwater * '* : All Rights Reserved * '* Date : 3-11-07 * '* Version : 1.0 * '* Notes : freqout is sine, we want a squarewave * '* : so we made one. Also made a "reset" function * '**************************************************************** ;Programma voor LWG IR (LightWarGame InfraRed) een soort lasergamen met infrarood licht. ;program for LWG IR (LightWarGame InfraRed) some kind of lasergaming with infrared light. ;pinning: ;schietknop op RB4, aantal keren geraakt op Led's op RA4, RB0 tm RB3, ;IRled(voorschakR=47R) + gewone led(voorschakelR=1K8) via transistor etc. op RB5 ; IR reciever op RB 6 ;aantal "dodende lichtstralen (IR 36khz burst) over op RA0,RA1,RA6,RA7,RB7 ; lwg_4 is de huidige code. DEVICE = 16F628A ; we gebruiken de PIC16F628A CONFIG intrc_osc_noclkout, wdt_off, cp_off, mclre_off, lvp_off, boden_on, pwrte_on ALL_DIGITAL = true ;alle pinnen digitaal i/0 ; 76543210 hulplijntje voor onthouden tris/pin TRISA = %00001100 TRISB = %01010000 CLEAR ;wis het ram DIM irrays AS BYTE ;tellervariabele voor aantal stralen DIM hitcount AS BYTE ;tellervariabele voor aantal keren geraakt DIM schiettijd AS WORD ; tellervar om 1 sec te schieten PORTA.4 = 0 ;alle LED's uit PORTB.0 = 0 PORTB.1 = 0 PORTB.2 = 0 PORTB.3 = 0 PORTA.0 = 0 PORTA.1 = 0 PORTA.6 = 0 PORTA.7 = 0 PORTB.7 = 0 hitcount = 0 ; de teller op 0x geraakt PORTB.5 = 0 ; irled + gewone led uit GOTO RELOAD knipper: ; "vastloper" indien 5x geraakt schiettijd = 5 ; even schiettijd recyclen als tellervar knipper2: DELAYMS 700 ; 0,7 seconden wachten PORTA.4 = 0 ; alle led's uit PORTB.0 = 0 PORTB.1 = 0 PORTB.2 = 0 PORTB.3 = 0 IF PORTB.4 = 0 THEN DEC schiettijd IF schiettijd = 0 THEN hitcount = 0 GOTO RELOAD ; als de schietknop lang word ingedrukt weer opnieuw beginnen. END IF END IF DELAYMS 700 ; 0,7 seconden wachten PORTA.4 = 1 ; alles weer aan PORTB.0 = 1 PORTB.1 = 1 PORTB.2 = 1 PORTB.3 = 1 GOTO knipper2 ; terug naar label knipper: (loop vast) RELOAD: ; Label waarnaar gesprongen word bij herladen PORTB.7 = 1 ; alle IRstraaltellerled's aan, met pauze's ertussen DELAYMS 500 PORTA.6 = 1 DELAYMS 1000 PORTA.7 = 1 DELAYMS 1500 PORTA.0 = 1 DELAYMS 2000 PORTA.1 = 1 irrays = 5 ; en ook de teller op 5 zetten (5 stralen over) ; note: IRled en gewone LED blijven uit WHILE 1=1 ; hoofdprogramma IF PORTB.4 = 0 THEN ; als de schierknop is ingedrukt dan: IF irrays = 0 THEN ; als de stralenteller op 0 staat dan: GOTO RELOAD ; herlaad ELSE ; wel genoeg stralen? ; FreqOut PORTB.5 , 500 , 36000 ; vuur een halve seconde lang een 36 khz IRstraal af, nu blokgolf: FOR schiettijd = 19200 TO 0 STEP -1 ; 29131*26uS = 500ms , dit is dus net iets korter PORTB.5 = 1 DELAYUS 13 ; 13uS aan en 13uS uit: ongeveer 36Khz PORTB.5 = 0 DELAYUS 13 NEXT irrays = irrays - 1 ; werk ook de stralenteller bij PORTB.5 = 0 ; zeker weten dat IRled NOOIT ongepulsed word aangestuurd END IF ; einde geneste lus END IF ; einde lus SELECT irrays ; bekijk het aantal stralen en zet zonodig led's uit CASE 5 DELAYMS 1 CASE 4 PORTA.1 = 0 CASE 3 PORTA.0 = 0 CASE 2 PORTA.7 = 0 CASE 1 PORTA.6 = 0 CASE 0 PORTB.7 = 0 ENDSELECT ; einde bekijklus IF PORTB.6 = 0 THEN ; geraakt? IF irrays = 0 THEN GOTO RELOAD ELSE hitcount = hitcount + 1 ; hitcounter bijwerken DELAYMS 500 END IF END IF SELECT hitcount ; "hoeveel keer geraakt" bekijklus / bijwerken LED's CASE 1 PORTA.4 = 1 CASE 2 PORTB.0 = 1 CASE 3 PORTB.1 = 1 CASE 4 PORTB.2 = 1 CASE 5 ; als je 5 keer geraakt bent? PORTB.3 = 1 DELAYMS 500 GOTO knipper ENDSELECT ; einde "hoeveel keer geraakt?" WEND END