$regfile = "M8DEF.DAT" $crystal = 16000000 $baud = 9600 Config Watchdog = 2048 'reset after 2048 mSec Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Config Pinc.5 = Input Config Pinc.4 = Input Config Pinc.3 = Input Config Pinb.2 = Output Config Pinb.1 = Output Config Pinb.0 = Output Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1 Enable Timer1 'schalte den Timer1 ein On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1 Enable Interrupts Timer1 = 3035 'Timer1 soll schon von 34285 wegzählen Config Adc = Single , Prescaler = Auto Start Adc Dim Ta1 As Bit Dim Ta2 As Bit Dim Ta3 As Bit Dim Discharge As Bit Dim Berechnen As Bit Dim H As Byte Dim M As Byte Dim S As Byte Dim Menu As Byte Dim Ad_a As Word Dim Ad_v As Word Dim Uend As Word Dim Eeuend As Eram Word Dim Eesaved As Eram Byte Uend = Eeuend If Uend < 700 Then Uend = 960 ' standartwert 9,6v end If Uend > 2000 Then Uend = 960 Dim Temp As Single Dim Temp2 As Single Dim Temp3 As Single Dim Temp4 As Single Dim Cap As Single Dim Wh As Single Dim Eecap As Eram Single Dim Eewh As Eram Single Dim Eeh As Eram Byte Dim Eem As Eram Byte Dim Ees As Eram Byte Deflcdchar 0 , 9 , 32 , 14 , 1 , 15 , 17 , 15 , 32 ' replace ? with number (0-7) Deflcdchar 1 , 32 , 14 , 17 , 17 , 17 , 10 , 27 , 32 ' replace ? with number (0-7) Deflcdchar 2 , 32 , 32 , 10 , 21 , 21 , 10 , 32 , 32 ' replace ? with number (0-7) Cursor Off Cls Upperline Lcd "Akku Kapazit" ; Chr(0) ; "ts-" Lowerline Lcd "messger" ; Chr(0) ; "t v1.1" Wait 5 Upperline Lcd " (c) 2006 by " Lowerline Lcd "maltepoeggel.de " Wait 3 If Pinc.3 = 0 Then Goto Testmode If Eesaved = 1 Then Cap = Eecap Wh = Eewh H = Eeh M = Eem S = Ees Eesaved = 0 Upperline Lcd "Entladen forts. " Goto Begin End If Endspg: Stop Watchdog Discharge = 0 Reset Portb.0 Do Upperline Lcd " Endspannung: " Lowerline Temp = Uend / 100 Gosub Wert2ausgeben Lcd " V M=OK" Gosub Tastenchecken2 Reset Portb.1 set Portb.2 Loop Until Pinc.3 = 0 If Eeuend = Uend Then Else Eeuend = Uend Upperline Lcd "Beginne entladen " Begin: Set Portb.1 Reset Portb.2 Lowerline Lcd " bis " Temp = Uend / 100 Gosub Wert2ausgeben Lcd " V " Wait 3 Start Watchdog Set Portb.0 Discharge = 1 Set Portb.2 Do If Menu = 0 Then Upperline Temp = Cap / 1000 Gosub Wertausgeben Locate 1 , 6 Lcd " Ah " Locate 1 , 9 Temp = Ad_a / 100 Lcd " " If Temp < 10 Then Lcd " " Lcd Fusing(temp , "#.##") Lcd " A " Lowerline If H < 10 Then Lcd "0" Lcd H ; ":" ; If M < 10 Then Lcd "0" Lcd M ; ":" ; If S < 10 Then Lcd "0" Lcd S ; Locate 2 , 9 Lcd " " Temp = Ad_v / 100 If Temp < 10 Then Lcd " " Lcd Fusing(temp , "#.##") Lcd " V " End If If Menu = 1 Then Upperline Temp = Wh / 1000 Gosub Wertausgeben Locate 1 , 6 Lcd " Wh " Locate 1 , 9 Temp = Ad_a / 100 Temp2 = Ad_v / 100 Temp = Temp * Temp2 Lcd " " Gosub Wert2ausgeben Lcd " W " Lowerline If H < 10 Then Lcd "0" Lcd H ; ":" ; If M < 10 Then Lcd "0" Lcd M ; ":" ; If S < 10 Then Lcd "0" Lcd S ; Locate 2 , 9 Lcd " " Temp = Ad_v / 100 Temp2 = Ad_a / 100 Temp = Temp / Temp2 If Ad_a < 2 Then Lcd " " ; Chr(2) ; " " Else Gosub Wert2ausgeben Lcd " " ; Chr(1) ; " " End If If Menu = 2 Then Upperline If Discharge = 1 Then Lcd " Entlade... " Else Lcd " Fertig! " Lowerline Lcd " U End: " Temp = Uend / 100 Locate 2 , 9 Gosub Wert2ausgeben Lcd " V " If Discharge = 0 Then Reset Portb.1 Set Portb.2 End If End If Gosub Tastenchecken If Berechnen = 1 Then Gosub Berechnen Loop Isr_von_timer1: 'ISR von Timer1 Timer1 = 3035 Berechnen = 1 Return Wertausgeben: Select Case Temp Case Is >= 100 Lcd Fusing(temp , "#.#") Case Is >= 10 Lcd Fusing(temp , "#.##") Case Else Lcd Fusing(temp , "#.###") End Select Return Tastenchecken: If Pinc.5 = 0 Then If Ta1 = 0 Then Incr Menu Ta1 = 1 If Menu = 3 Then Menu = 0 Else Ta1 = 0 End If If Pinc.4 = 0 Then If Ta2 = 0 Then Decr Menu Ta2 = 1 If Menu = 255 Then Menu = 2 Else Ta2 = 0 End If If Pinc.3 = 0 Then Gosub Umenue Return Wert2ausgeben: Select Case Temp Case Is >= 100 Lcd Fusing(temp , "#.#") Case Is >= 10 Lcd Fusing(temp , "#.##") Case Else Lcd " " Lcd Fusing(temp , "#.##") End Select Return Testmode: Do Ad_a = Getadc(0) Ad_v = Getadc(1) Upperline Lcd "ADC0A=" ; Ad_a ; " " Lowerline Lcd "ADC1V=" ; Ad_v ; " " Loop Tastenchecken2: If Pinc.5 = 0 Then If Ta1 = 0 Then Incr Uend Ta1 = 1 If Uend > 2000 Then Uend = 2000 Else Ta1 = 0 End If If Pinc.4 = 0 Then If Ta2 = 0 Then Decr Uend Ta2 = 1 If Uend < 700 Then Uend = 700 Else Ta2 = 0 End If Return Umenue: Do If Berechnen = 1 Then Gosub Berechnen Loop Until Pinc.3 = 1 Do Upperline Lcd " Sp" ; Chr(0) ; "ter forts.? " Lowerline Lcd " + Ja M Nein " If Pinc.5 = 0 Then Goto Speichernundfortsetzen If Berechnen = 1 Then Gosub Berechnen Loop Until Pinc.3 = 0 Do If Berechnen = 1 Then Gosub Berechnen Loop Until Pinc.3 = 1 Do Upperline Lcd "Endspg. " ; Chr(0) ; "ndern? " Lowerline Lcd " + Ja M Nein " If Pinc.5 = 0 Then Goto Endspg If Berechnen = 1 Then Gosub Berechnen Loop Until Pinc.3 = 0 Do If Berechnen = 1 Then Gosub Berechnen Loop Until Pinc.3 = 1 Return Speichernundfortsetzen: Discharge = 0 Reset Portb.0 Stop Watchdog Eecap = Cap Eewh = Wh Eeh = H Eem = M Ees = S Eesaved = 1 Upperline Lcd " Gespeichert. " Lowerline Lcd "Akku abklemmen !" Reset Portb.1 set Portb.2 End Berechnen: Reset Watchdog Ad_a = Getadc(0) If Ad_a < 4 Then Ad_a = 0 Ad_v = Getadc(1) Ad_v = Ad_v * 2 If Discharge = 1 Then If Ad_v <= Uend Then Discharge = 0 Menu = 2 Reset Portb.0 End If Incr S If S = 60 Then S = 0 Incr M End If If M = 60 Then M = 0 Incr H End If If H = 24 Then H = 0 End If If Cap < 999900 Then Temp3 = Ad_a * 10 ' in milliampere Temp3 = Temp3 / 60 Temp3 = Temp3 / 60 ' milliamperesekunden Cap = Cap + Temp3 If Cap > 999900 Then Cap = 999900 End If If Wh < 999900 Then Temp3 = Ad_a * 10 ' in milliampere Temp4 = Ad_v / 100 ' in volt Temp3 = Temp3 * Temp4 ' ergibt milliwattstunden Temp3 = Temp3 / 60 Temp3 = Temp3 / 60 ' ergibt milliwattsekunden Wh = Wh + Temp3 If Wh > 999900 Then Wh = 999900 End If Toggle Portb.1 Portb.2 = Not Portb.1 Print "STA," ; H ; ":" ; M ; ":" ; S ; "," ; Ad_a ; "," ; Ad_v ; "," ; Cap ; "," ; Wh ; ",END" End If Berechnen = 0 Return