I added another battery and just copy some routine..
[code:1:92394513c8]'MICRO-CONTROLLER BASED SOLAR CHARGE CONTROLLER
'USED CHIP: ATMEGA8L WITH INTERNAL RC OSCILLATOR
'***************************************************************
' INITIAL SETTINGS
'***************************************************************
$regfile = "m8def.dat" 'REGISTER FILE FOR ATMEGA8
$crystal = 1000000 'OSCILLATOR FRQUENCY=1MHZ
$swstack = 40 'SOFT STACK SIZE
$hwstack = 32 'HARDWARE STACK SIZE
$framesize = 32 'FRAME SIZE
'***************************************************************
' DEFINE INPUT/OUTPUT PORTS
'**************************************************************
Config Portd.2 = Output
Config Portd.3 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Output
Config Portb.7 = Output
'**************************************************************
' DEFINE ALIAS FOR GOOD READEBILITY
'**************************************************************
Charging Alias Portd.3
_load Alias Portd.2
Ch_led Alias Portb.3
Bat_h_led1 Alias Portb.1
Bat_l_led1 Alias Portb.2
Bat_h_led2 Alias Portb.4
Bat_l_led2 Alias Portb.5
Ac_led Alias Portb.6
Ac_chrg Alias Portb.7
'***************************************************************
' SETUP ADC MODULE
'***************************************************************
Config Adc = Single , Prescaler = Auto , Reference = Avcc '_2.56_nocap
Start Adc
'***************************************************************
' VARIABLE DECLARATIONS
'***************************************************************
Dim W As Word , W_single As Single
Dim Sol_v As Single , B1_high As Single
Dim Bat1_v As Single , Bat2_v As Single
Dim B1_low As Single , B2_high As Single , B2_low As Single
Dim Gp1 As Byte , Gp2 As Byte
'***************************************************************
' MAIN PROGRAM LOOP
'***************************************************************
Main:
Gosub Check_adc
If Bat1_v < B1_high And Sol_v > Bat1_v Then
Charging = 1 'CHARGING ON
Ch_led = 0 'CHARGING LED ON
Bat_h_led1 = 1 'BAT HIGH LED OFF
_load = 0 'LOAD CONNECT TO BATT2
End If
If Bat1_v >= B1_high Then
Charging = 0 'CHARGING STOPS
Ch_led = 1 'CHARGING LED OFF
Bat_h_led1 = 0 'BAT HIGH LED ON
Bat_l_led1 = 1 'BAT LOW LED OFF
_load = 1 'LOAD CONNECT TO BATT1
Else
Bat_h_led1 = 1 'BAT HIGH LED OFF
End If
If Sol_v < Bat1_v Then
Ac_led = 1
Ch_led = 0 'CHARGING LED ON
Ac_chrg = 1 'TURN AC CHARGER ON.
_load = 1 'LOAD CONNECT TO BATT2
End If
If Bat2_v < B2_high And Sol_v > Bat2_v Then
Charging = 1 'CHARGING ON
Ch_led = 0 'CHARGING LED ON
Bat_h_led2 = 1 'BAT HIGH LED OFF
_load = 1 'LOAD OFF
End If
If Bat2_v >= B2_high Then
Charging = 0 'CHARGING STOPS
Ch_led = 1 'CHARGING LED OFF
Bat_h_led2 = 0 'BAT HIGH LED ON
Bat_l_led2 = 1 'BAT LOW LED OFF
Else
Bat_h_led2 = 1 'BAT HIGH LED OFF
End If
If Sol_v < Bat2_v Then
Ac_led = 1
Ch_led = 0 'CHARGING LED ON
Ac_chrg = 1 'TURN AC CHARGER ON.
_load = 0 'LOAD CONNECT TO BATT1
End If
If Bat2_v <= B2_low Then
_load = 0 'LOAD OFF
Bat_l_led2 = 0 'BAT LOW LED ON
Else
Bat_l_led2 = 1 'BAT LOW LED OFF
End If
Goto Main
'***************************************************************
' ADC MEASUREMENT SUB ROUTINE
'***************************************************************
Check_adc:
For Gp1 = 1 To 7 'Loop through Gp1 (2-5) This is the ADC number we'll read later
W_single = 0 'Setup an accumulator
For Gp2 = 1 To 200 'Read the ADC 200 times in this loop
W = Getadc(gp1) 'Actually read the ADC Value
W_single = W_single + W 'Add to the accumulator
Next Gp2 '
If W_single <> 0 Then 'If the total of all ADC values read for this ADC is > 0 then
W_single = W_single / 200 'Divide by 200 (The number of times we read the ADC). This will give us an average
Else
W_single = 0
End If
Select Case Gp1 'Where should the average value for the ADC just read be stored?
Case 2 : Sol_v = W_single 'Save value from ADC 2 to Sol_v
Case 3 : B1_high = W_single 'Save value from ADC 3 to B1_High
Case 4 : B1_low = W_single 'Save value from ADC 4 to B1_low
Case 5 : Bat1_v = W_single 'Save value from ADC 5 to Bat1_v
Case 6 : B2_high = W_single 'Save value from ADC 6 to B2_High
Case 7 : B2_low = W_single 'Save value from ADC 7 to B2_low
Case 8 : Bat2_v = W_single 'Save value from ADC 1 to Bat2_v
Case Else
End Select
Next Gp1
Return
'****************************************************************
End 'end program[/code:1:92394513c8]
[/code]
Simulation seems to be fine..
↧