'=========================================================== '= Controller for film processing = '= = '= Manfred Mornhinweg, September 2002 = '= continued May 2003 = '=========================================================== 'Variables: Temp var Word 'Temperature CRem var byte 'Counts remaining CperC var byte 'Counts per Celsius 'addr var byte(8) 'Sensor address c var byte 'Universal counter sign var byte 'sign character MaxTime var byte 'sensor timeout counter SetVal var byte 'set value for output Target var word 'target value, integer in low byte, 'decimals in high byte I var byte 'Integral of control loop Time1 var word 'Seconds for first bath Time2 var word 'Seconds for second bath Time3 var word 'Seconds for third bath TarInt var byte 'Target degrees Celsius TarDec var byte 'decimals for above TCount var word 'Time counter ICount var nib 'Tank inversion counter 'Constants: bp CON 15 'Sensor bus pin dp CON 0 'Display pin s1 CON 6 'Switch one pin s2 CON 7 'Switch 2 pin op CON 8 'Temp output pin sp CON 5 'Speaker pin ds CON 16494 'Display setup 'TarInt CON 38 'degrees Celsius 'TarDec CON 50 'decimals for target temp SetVal=0 LOW op 'keep heater off PAUSE 1000 'wait for display startup SEROUT dp,ds,[254,"X",254,"C",254,"K"," FODelectronic Photo Processor"] PAUSE 1500 FREQOUT sp,943,530 FREQOUT sp,943,795 PAUSE 3000 SelProc: SEROUT dp,ds,[254,"X","Select process:"] FREQOUT sp,943,795 No0: SEROUT dp,ds,[254,"G",0,2,"Tetenal E6-3 (1)"] PAUSE 500 No1: IF IN6=0 THEN No2 IF IN7=1 THEN No1 FREQOUT sp,943,795 TarInt=38 TarDec=50 Time1=375 Time2=360 Time3=360 SEROUT dp,ds,[254,"X","Tet E6-3/1"] GOTO StartRun No2: SEROUT dp,ds,[254,"G",0,2,"Tetenal E6-3 (2)"] PAUSE 500 No3: IF IN6=0 THEN No4 IF IN7=1 THEN No3 FREQOUT sp,943,795 TarInt=38 TarDec=50 Time1=390 Time2=420 Time3=420 SEROUT dp,ds,[254,"X","Tet E6-3/2"] GOTO StartRun No4: SEROUT dp,ds,[254,"G",0,2,"Tetenal E6-3 (3)"] PAUSE 500 No5: IF IN6=0 THEN No0 IF IN7=1 THEN No5 FREQOUT sp,943,795 TarInt=38 TarDec=50 Time1=405 Time2=480 Time3=480 SEROUT dp,ds,[254,"X","Tet E6-3/3"] StartRun: SEROUT dp,ds,[254,"G",0,2,"Preheat..."] Target.HIGHBYTE=TarInt Target.LOWBYTE=(TarDec*256/100) PAUSE 1000 No10: GOSUB TempCont IF IN6=0 THEN No11 IF IN7=1 THEN No10 'sense both switches No11: FREQOUT sp,943,795 SEROUT dp,ds,[254,"G",0,2,"Tank warmup s"] TCount=300 No12: SEROUT dp,ds,[254,"G",13,2,DEC3 TCount] GOSUB TempCont TCount=TCount-1 IF TCount>0 THEN No12 SEROUT dp,ds,[254,"G",0,2,"Start 1st Dvlp! "] c=10 No13: FREQOUT sp,943,795 PAUSE 250 c=c-1 IF c>0 THEN No13 '--------------- Bath 1 No14: GOSUB TempCont IF IN6=0 THEN No15 IF IN7=1 THEN No14 'sense both switches No15: FREQOUT sp,943,795 SEROUT dp,ds,[254,"G",0,2,"1st Dvlp. s"] TCount=Time1 No16: SEROUT dp,ds,[254,"G",13,2,DEC3 TCount] GOSUB TempCont TCount=TCount-1 IF TCount>0 THEN No16 SEROUT dp,ds,[254,"G",0,2,"Wash/Color Dvlp!"] c=10 No18: FREQOUT sp,943,795 PAUSE 250 c=c-1 IF c>0 THEN No18 '----------------------- Bath 2 No19: GOSUB TempCont IF IN6=0 THEN No20 IF IN7=1 THEN No19 'sense both switches No20: FREQOUT sp,943,795 SEROUT dp,ds,[254,"G",0,2,"Color Dvlp. s"] TCount=Time2 No21: SEROUT dp,ds,[254,"G",13,2,DEC3 TCount] GOSUB TempCont TCount=TCount-1 IF TCount>0 THEN No21 SEROUT dp,ds,[254,"G",0,2,"Wash, then Blix!"] c=10 No23: FREQOUT sp,943,795 PAUSE 250 c=c-1 IF c>0 THEN No23 '====================== Third bath TarInt=36 'Lower temperature for BLIX Target.HIGHBYTE=TarInt No24: GOSUB TempCont IF IN6=0 THEN No25 IF IN7=1 THEN No24 'sense both switches No25: FREQOUT sp,943,795 SEROUT dp,ds,[254,"G",0,2,"Bleach&Fix s"] TCount=Time3 No26: SEROUT dp,ds,[254,"G",13,2,DEC3 TCount] GOSUB TempCont TCount=TCount-1 IF TCount>0 THEN No26 SEROUT dp,ds,[254,"G",0,2,"Wash&stabilize! "] c=10 No28: FREQOUT sp,943,795 PAUSE 250 c=c-1 IF c>0 THEN No28 No29: GOSUB TempCont IF IN6=0 THEN No30 IF IN7=1 THEN No29 'sense both switches No30: SEROUT dp,ds,[254,"G",0,2," Process ready! "] c=2 FREQOUT sp,943,795 FREQOUT sp,943,1002 FREQOUT sp,943,1191 Target=0 'switch off Heater No32: GOSUB TempCont IF IN6=0 THEN No33 IF IN7=1 THEN No32 'sense both switches No33: GOTO SelProc '--------------------------------------------- TempCont: OWOUT 15,1,[$CC,$44] 'make sensor convert temperature PAUSE 25 OWIN 15,4,[temp] IF temp<>0 THEN NoSensor CheckForDone: PAUSE 25 OWIN 15,4,[temp] IF temp=0 THEN CheckForDone OWOUT 15,1,[$CC,$BE] 'ask single sensor for data OWIN 15,2,[Temp.Lowbyte,Temp.highbyte,CRem,CRem,CRem,CRem,CRem,CPerC] temp=temp>>1 'strip half-degree bit temp=temp<<8 'leave just sign on the left. High byte=integers temp=temp-64 'discount half step of basic resolution temp=temp-(CRem*16) 'add fraction IF temp.bit15=1 then Negative sign=" " GOTO Adjready Negative: temp=-temp sign="-" AdjReady: ' DEBUG sign,DEC2 temp.HIGHBYTE,".",dec2 temp.LOWBYTE*100/256," " SEROUT dp,ds,[254,"G",12,0,DEC2 temp.HIGHBYTE,".",DEC2 temp.LOWBYTE*100/256] IF temp>(Target+510) THEN TurnOff IF temp<(Target-510) THEN TurnON GOTO Lin TurnOff: SetVal=0 I=127 GOTO LinOut TurnOn: SetVal=255 I=127 GOTO LinOut Lin: SetVal=127+((Target-temp)/4) IF temp>Target THEN Down IF I=255 then PI I=I+1 GOTO PI Down: IF I=0 then Pi I=I-1 PI: IF I=>127 THEN AddI IF SetVal<(127-I) THEN SVZero SetVal=SetVal-(127-I) GOTO Linout AddI: IF SetVal>(255-(I-127)) THEN SVFull SetVal=SetVal+(I-127) GOTO LinOut SVZero: SetVal=0 GOTO LinOut SVFull: SetVal=255 GOTO Linout LinOut: ' DEBUG DEC SetVal," ", DEC I, CR PWM 8,SetVal,255 PAUSE 281 RETURN NoSensor: SEROUT dp,ds,[254,"G",12,0,"Temp?"] PAUSE 954 RETURN