;V-1 ;Compileren met Crownhill Proton+ PIC Basic compiler. ;Voor aansluitschema en bediening zie website www.picbasic.nl/handdoekrek ; ; PIC12F629: +--v--+ ; +5V >[ ]< GND ; (L293D/motor) Uitschuiven <[ ]> L293D Chip Enable ; (L293D/motor) Inschuiven <[ ]> LED op print ; Vpp >[ ]< QT110 sensor (pin 2) ; +-----+ ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 12F629 CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF ;Interne RC-oscillator, geen clocksign naar buiten (= geen OSC_OUT pin) ALL_DIGITAL TRUE ;Normale aliases (constanten) SYMBOL AanhaakTijd = 1200 ;10mSec: Tijd dat rek blijft staan voordat het weer terug gaat SYMBOL KrachtUitsch = 100 ;0..255: De kracht voor uitschuiven, hoe hoger, hoe meer kracht (hoe sneller) SYMBOL KrachtInsch = 75 ;0..255: De kracht voor inschuiven, hoe hoger, hoe meer kracht (hoe sneller) SYMBOL MaxKrachtTijd= 800 ;mSec : De tijd dat het rek op volle kracht uitschuift, alvorens over te schakelen op halve kracht SYMBOL MinKrachtTijd= 500 ;cycles: Het aantal PWM cycles dat de motor op halve kracht over schakelt SYMBOL TerugTijd = 999 ;10mSec, moet deelbaar door 3 zijn: Maximum tijd dat het handdoekrek terugloopt ;Logische aliases (constanten) SYMBOL AAN = 0 ;Omgekeerd ON SYMBOL FALSE = 0 SYMBOL OFF = 0 SYMBOL ON = 1 SYMBOL TRUE = 1 SYMBOL UIT = 1 ;Omgekeerd OFF ;Poort aliases ;Bij wijzigen ook TRIS veranderen SYMBOL L293D_Enable = GPIO.0 ;!! PGM pin! L293D chip enable SYMBOL LED = GPIO.1 ;!! PGM pin! Controle LED op print SYMBOL Sensor = GPIO.2 ;QT110 aanraak-sensor SYMBOL x = GPIO.3 ;!! PGM pin 13V! SYMBOL Inschuiven = GPIO.4 ;12V= RB35 motor linksom SYMBOL Uitschuiven = GPIO.5 ;12V= RB35 motor rechtsom ; 76543210 TRISIO = %11001100 PORTB_PULLUPS ON ;WORD DIM Tijd AS WORD ;Bevat actuele tijd voor heen- of teruglopen ;BYTE DIM Snelheid AS BYTE ;Motor snelheid, hoe hoger hoe sneller GPIO = 0 ;Alle uitgangen uit CLEAR ;Wis alle RAM GOTO HoofdProgramma ;Spring over de subroutines ;SUBROUTINES Aanhaken: OUTPUT Uitschuiven ;PWM laat pin als input achter, daarom weer output van maken, anders moet je constant refreshen om de motor stil te houden Uitschuiven = OFF ;Motor stilzetten LED = OFF ;Indicatie LED op print Tijd = AanhaakTijd ;Tijd om handdoek af te halen of op te hangen (motor staat stil) REPEAT DELAYMS 10 ;Om de 10mSec kijken of de sensor is aangeraakt IF Sensor = AAN THEN Tijd = AanhaakTijd ;Als de sensor is aangeraakt, begint de tijd weer van voren af aan te tellen DEC Tijd ;Tijd verlagen UNTIL Tijd = 0 ;Wachten totdat de tijd voorbij is Snelheid = KrachtInsch ;Langzame snelheid van teruglopen Tijd = TerugTijd ;Stel timer Tijd in op de maximum teruglooptijd LED = ON ;Indicatie LED RETURN Herstart: ;Rek moet onmiddelijk weer uitschuiven want tijdens inschuiven is de sensor aangeraakt OUTPUT Inschuiven ;PWM laat pin als input achter, daarom weer output van maken, anders moet je constant refreshen om de motor stil te houden Inschuiven = OFF ;Inschuiven onmiddelijk stoppen (motor meteen stilzetten) DELAYMS 50 ;Korte uitlooptijd (motor liep KrachtInsch tijdens inschuiven) PWM Uitschuiven, KrachtUitsch, 1800 ;Dit keer op langzame snelheid uitschuiven GOSUB Aanhaken ;Tijd om handdoek af te halen of op te hangen (motor staat stil) RETURN ;HOOFDPROGRAMMA HoofdProgramma: WHILE 1 = 1 WHILE Sensor = UIT : WEND ;Wacht tot de sensor wordt aangeraakt L293D_Enable = ON ;L293D inschakelen Uitschuiven = ON ;Volle kracht en snelheid vooruit LED = ON ;Indicatie LED op print DELAYMS MaxKrachtTijd ;De tijd dat het rek op volle kracht uitschuift PWM Uitschuiven, KrachtUitsch, MinKrachtTijd ;Na opstart met volle kracht, met gemiddelde kracht uit laten lopen GOSUB Aanhaken ;Tijd om handdoek af te halen of op te hangen (motor staat stil) REPEAT PWM Inschuiven, Snelheid, 2 ;2 x 5mSec = 10mSec (Bij 4MHz kristal (dus ook interne osc.) duurt 1 dutycycle 5mSec) IF Sensor = AAN THEN GOSUB Herstart ;Tijdens teruglopen is opnieuw de sensor aangeraakt, rek onmiddelijk weer uitschuiven IF Tijd = (TerugTijd / 3) THEN Snelheid = KrachtInsch - 12 ;Laatste 1/3 afstand iets afremmen DEC Tijd ;Tijd verlagen UNTIL Tijd = 0 ;Teruglopen totdat de tijd voorbij is OUTPUT Inschuiven ;PWM laat pin als input achter, daarom weer output van maken, anders moet je constant refreshen om de motor stil te houden Inschuiven = OFF ;Motor stilzetten LED = OFF ;Indicatie LED op print L293D_Enable = OFF ;L293D uitschakelen (hierdoor loopt de motor vrij) WEND END