' Charge Controller ' Ver 2010B ' 28X chip ' www.thebackshed.com Start: EEPROM 0,( $33 ) EEPROM 1,( $32 ) EEPROM 2,( $28 ) EEPROM 3,( $0C ) EEPROM 4,( $06 ) EEPROM 5,( $01 ) EEPROM 6,("V ") EEPROM 9,("A ") EEPROM 12,("W ") EEPROM 15,("Wmax ") EEPROM 22,("O/P 1 On ") EEPROM 31,("O/P 1 Off ") EEPROM 41,("O/P 2 On ") EEPROM 50,("O/P 2 Off ") EEPROM 60,("Zero Amp Offset") EEPROM 75,("Press UP ") EEPROM 84,("Done ") EEPROM 93,("Wait ") ' Set min watt max W0=0 Poke 204, WORD W0 ' Check to see if we have any O/P switching values in EEPROM read 110, WORD W0 if W0=0 then Menu1 ' if not go to set up menu ' Check to see if we have a the current offset value in EEPROM. read 118, WORD W0 if W0=0 then W0=500 write 118, WORD W0 end if ' Initialise the LCD display FOR b11 = 0 TO 5 READ b11,b12 pause 15 GOSUB SendCmdByte NEXT FOR b11 = 93 TO 97 ' Display "Wait" READ b11,b12 GOSUB SendDataByte NEXT ' start up been and turn off outputs gosub Beep low portc 5 low portc 4 nap 7 ' nap to give the amp ADC a chance to settle. Main: nap 4 ' Have a little sleep to save some power. readadc10 0,W0 'Read in volts poke 200,WORD W0 'Store readadc10 1,W0 'Read in Amps poke 202,WORD W0 'Store gosub DisplayVolt gosub DisplayAmp gosub DisplayWatt if pin1 = 1 then Menu1 ' Is menu button pressed? if pin6 = 0 then OnLoad ' Is Forced Load switch on? if pin7 = 0 then OnCharge ' Is Forced Charge switch on? peek 200, WORD W0 'Get the volage read 110, WORD W1 'Get the O/P 1 On level if W0>W1 then 'Switch on O/P 1. High portc 4 B4=1 end if read 112, WORD W1 'Get the O/P 1 Off level if W0W1 then 'Switch on O/P 2. High portc 5 B5=1 end if read 116, WORD W1 'Get the O/P Off level if W0W3 then W1=W1-W3 else W1=0 end if sertxd("[", #W0, "", #W1, "", #B4, "", #B5, "]") goto main DisplayVolt: b12 = 2 GOSUB SendCmdByte Peek 200,WORD W0 'Get volt value W1=W0/100 b12=W1+48 GOSUB SendDataByte W1=W1*100 W0=W0-W1 W1=W0/10 b12=W1+48 GOSUB SendDataByte b12 = 46 Gosub SendDataByte W1=W1*10 W0=W0-W1 W1=W0 b12=W1+48 GOSUB SendDataByte FOR b11 = 6 TO 8 ' Display "V" READ b11,b12 GOSUB SendDataByte NEXT Return DisplayAmp: ' Same as above, but adds the - and + symbols for current Peek 202,WORD W0 ' Get Amp Reading Read 118,WORD W3 ' Get Amp Offset If W0>W3 then pamp if W0200 then W1=W1/10 W3=W0*W1 W0=W3 W1=W0/10000 b12=W1+48 GOSUB SendDataByte W1=W1*10000 W0=W0-W1 W1=W0/1000 b12=W1+48 GOSUB SendDataByte W1=W1*1000 W0=W0-W1 W1=W0/100 b12=W1+48 GOSUB SendDataByte W1=W1*100 W0=W0-W1 W1=W0/10 b12=W1+48 GOSUB SendDataByte b12 = 46 Gosub SendDataByte W1=W1*10 W0=W0-W1 W1=W0 b12=W1+48 GOSUB SendDataByte else W3=W0*W1 W0=W3 W1=W0/10000 b12=W1+48 GOSUB SendDataByte W1=W1*10000 W0=W0-W1 W1=W0/1000 b12=W1+48 GOSUB SendDataByte W1=W1*1000 W0=W0-W1 W1=W0/100 b12=W1+48 GOSUB SendDataByte b12 = 46 Gosub SendDataByte W1=W1*100 W0=W0-W1 W1=W0/10 b12=W1+48 GOSUB SendDataByte end if FOR b11 = 12 TO 13 ' Display "W" READ b11,b12 GOSUB SendDataByte NEXT Peek 204, WORD W0 Peek 206, WORD W1 if W1>W0 then Poke 204, WORD W1 W0=W1 end if W1=W0/100 b12=W1+48 GOSUB SendDataByte W1=W1*100 W0=W0-W1 W1=W0/10 b12=W1+48 GOSUB SendDataByte W1=W1*10 W0=W0-W1 W1=W0 b12=W1+48 GOSUB SendDataByte FOR b11 = 15 TO 21 ' Display "Wpeak" READ b11,b12 GOSUB SendDataByte NEXT Return Menu1: Read 110, WORD W0 Poke 208, WORD W0 Menu1a: GOSUB Beep pause 500 b12 = 1 GOSUB SendCmdByte b12 = 128 GOSUB SendCmdByte FOR b11 = 22 TO 30 'Display "O/P 1 On" READ b11,b12 GOSUB SendDataByte NEXT Peek 208, WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 Menu1b: pause 100 Peek 208, WORD W0 if pin1 = 1 then Save1 if pin2 = 1 then W0 = W0 + 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if if pin3 = 1 then W0 = W0 - 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if goto Menu1b Save1: Peek 208, WORD W0 Write 110, WORD W0 Menu2: Read 112, WORD W0 Poke 208, WORD W0 Menu2a: GOSUB Beep pause 500 b12 = 1 GOSUB SendCmdByte b12 = 128 GOSUB SendCmdByte FOR b11 = 31 to 40 'Display "O/P 1 Off" READ b11,b12 GOSUB SendDataByte NEXT Peek 208, WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 Menu2b: pause 100 Peek 208, WORD W0 if pin1 = 1 then Save2 if pin2 = 1 then W0 = W0 + 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if if pin3 = 1 then W0 = W0 - 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if goto Menu2b Save2: Peek 208, WORD W0 Write 112, WORD W0 Menu3: Read 114, WORD W0 Poke 208, WORD W0 Menu3a: GOSUB Beep pause 500 b12 = 1 GOSUB SendCmdByte b12 = 128 GOSUB SendCmdByte FOR b11 = 41 TO 49 'Display "O/P 2 On" READ b11,b12 GOSUB SendDataByte NEXT Peek 208, WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 Menu3b: pause 100 Peek 208, WORD W0 if pin1 = 1 then Save3 if pin2 = 1 then W0 = W0 + 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if if pin3 = 1 then W0 = W0 - 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if goto Menu3b Save3: Peek 208, WORD W0 Write 114, WORD W0 Menu4: Read 116, WORD W0 Poke 208, WORD W0 Menu4a: GOSUB Beep pause 500 b12 = 1 GOSUB SendCmdByte b12 = 128 GOSUB SendCmdByte FOR b11 = 50 TO 59 'Display "O/P 2 Off" READ b11,b12 GOSUB SendDataByte NEXT Peek 208, WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 Menu4b: pause 100 Peek 208, WORD W0 if pin1 = 1 then Save4 if pin2 = 1 then W0 = W0 + 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if if pin3 = 1 then W0 = W0 - 1 Poke 208,WORD W0 Poke 200, WORD W0 gosub DisplayVoltLine2 end if goto Menu4b Save4: Peek 208, WORD W0 Write 116, WORD W0 Menu5: GOSUB Beep pause 500 b12 = 1 GOSUB SendCmdByte b12 = 128 GOSUB SendCmdByte FOR b11 = 60 TO 74 'Display "Zero amps offset" READ b11,b12 GOSUB SendDataByte NEXT b12 = 192 GOSUB SendCmdByte FOR b11 = 75 TO 83 'Display "Press UP" READ b11,b12 GOSUB SendDataByte NEXT Menu5a: pause 100 if pin1 = 1 then Start if pin2 = 1 then ZeroAmp goto Menu5a ZeroAmp: readadc10 1,W0 write 118,WORD W0 b12 = 192 GOSUB SendCmdByte FOR b11 = 84 TO 92 'Display "Done " READ b11,b12 GOSUB SendDataByte NEXT gosub beep goto Menu5a OnLoad: gosub beep ' keep beeping to remind us the charger is in a manual state High portc 4 nap 5 High portc 5 Goto Main OnCharge: gosub beep ' keep beeping to remind us the charger is in a manual state low portc 5 nap 5 low portc 4 goto Main DisplayVoltLine2: b12 = 192 GOSUB SendCmdByte W3=W0 W1=W3/100 b12=W1+48 GOSUB SendDataByte W1=W1*100 W3=W3-W1 W1=W3/10 b12=W1+48 GOSUB SendDataByte b12 = 46 Gosub SendDataByte W1=W1*10 W3=W3-W1 W1=W3 b12=W1+48 GOSUB SendDataByte FOR b11 = 6 TO 8 ' Display "V" READ b11,b12 GOSUB SendDataByte NEXT Return SendCmdByte: b13 = %00000000 'Send to Command register SendDataByte: pins = b12 & %11110000 | b13 'Put MSB out first PULSOUT 3,1 'Give a 10uS pulse on E pins = b12 * %00010000 | b13 'Put LSB out second PULSOUT 3,1 'Give a 10uS pulse on E b13 = %00000100 'Send to Data register next RETURN Beep: 'Make a noise. this pin cant use any tone commands so we need to write our own for b8=0 to 5 high portc 0 pause 1 low portc 0 pause 1 next return