Icon

|
| |
The Challenge
At QRL I occasionally need to find failures for system that draw DC current
on certain events. If the system is drawing current for no apparent reason (no
event), there seems to be an issue.
To find such failures you can easily measure the DC current drew from the
power supply. But since the DC current can be within 10 mA and 500 Amps (yes,
not kidding), the requirements against the measurement system are crude.
Especially against the current sensor.
As always, the budget is low. Therefore (actually it is a hobby of mine) I
homebrew a system, which can measure and (very important) log the current. In
addition to that, the system is also able to transmit the data wireless to a
receiver connected to a PC.
The Solution
Based on a micro-computer-system called C-Control I from Conrad
Electronics, I hacked quick and dirty a Basic Code. The Basic program
measures the DC current (I) and the DC voltage (Ubat) once per second.
Subsequently it calculates the Work (Ah), the Power (W) and displays all 4
values on a LC-Display. In addition to that it stores the data in a 64k E²PROM
and, by the same token, transmits the data via a serial wireless link on 433 Mhz
at the speed of max. 9k6 to a PC-Terminal.
Pictures


Souce Code
'********************************************************************
'
' C-Control/BASIC ICON v07.bas
'
' Systemvoraussetzungen:
'
' - Application Board mit angeschlossenem Display und 0.00666777 Ohm Shunt
' - LM324 an AD-Port 1, 3 und 5
' - U_bat mit 10k Poti an AD-Port 7
' - grosses 512k EEPROM !!! bei kleinem EEPROM v06 verwenden !
'********************************************************************
'-------------------------
' *** Daten-Definition ***
define u_mess_merker word: define value word : define output word : define
pwr_intake word
define sekundenzaehler word ': define CRC word
'5 word = 10 bytes
define zaehler byte : define messbereichs_merker byte : define lcd_buf byte
define lcd_param byte : define u_mess_klein_off_set byte : define
pwr_ueberlaufmerker byte
define zeitmerker byte: define pwr_AH_stelle_ueberlaufmerker byte : define
u_bat_merker byte
define key_nr byte : define neg byte : define compare byte : define key_ascii
byte
define RECORD byte
'14 bytes
' *** Definition LCD-Ports ***
define lcd_port byteport[2] : define lcd_rs port[14] : define lcd_rw port[13] :
define lcd_e port[15]
define auto_protect_relais_port port[6]
define u_mess AD[1] : define u_bat AD[7] : define u_mess_klein AD[3] : define
u_mess_gross AD[5]
define keyboard ad[8]
auto_protect_relais_port=0 ' ausschalten des port, da nach booten auf high.
'*** ASCII-Codes ***
define A_ &H41 : define B_ &H42 : define C_ &H43 : define D_
&H44 : define E_ &H45 : define F_ &H46 : define G_ &H47 : define
H_ &H48 : define I_ &H49 : define J_ &H4A
define K_ &H4B : define L_ &H4C : define M_ &H4D : define N_
&H4E : define O_ &H4F : define P_ &H50 : define Q_ &H51 : define
R_ &H52 : define S_ &H53 : define T_ &H54
define U_ &H55 : define V_ &H56 : define W_ &H57 : define X_
&H58 : define Y_ &H59 : define Z_ &H5A
define null_ &H30 : define eins_ &H31 : define zwei_ &H32 : define
drei_ &H33 : define vier_ &H34 : define fuenf_ &H35 : define sechs_
&H36 : define sieben_ &H37
define acht_ &H38 : define neun_ &H39
define klammer_auf_ &H28 : define klammer_zu_ &H29 : define SLASH_
&H2F : define LEERZ &H20 : define MINUS &H2D : define NULL &H30
define GLEICH &H3D : define PUNKT &H2E : define AUSRUFEZEICHEN &H21
define LINKORREKTUR_MITTEL 11 'LM 324 nichtlinearitaet im nichtinvertierenden
verstaerker-betrieb
define LINKORREKTUR_GROSS 156
define UEBERSTROMSCHWELLE 64 '64 == 100A, bei 100 Ampere wird eine Warnmeldung
auf dem Display ausgegeben.
define HOCHSTROMSCHWELLE 250 '250 == 25 A, bei 25 Ampere wird in den grossen
Messbereich umgeschaltet
define KLEINSTROMSCHWELLE 4 '4 = 0.4 A, bei 0.4 Ampere wird in den kleinen
Messbereich umgeschaltet
' define BAUDRATE R2400 ' 2400 baud
define AH_UEBERLAUF_SCHWELLE 3232'1 mA sec 36000 + 3377 ; 3377 ist
KOrrekturfaktor, empririsch gemessen
define wait_loop_cycles 100 'anzahl zyklen, die gewartet werden, bis eingabe
durch user erfolgen muss. falls nicht: default-wert wird genommen !
define filemax 30000 'maximale filegroesse = 32200 - programmgroesse/2
'-------------------------
'*** Programmoperationen *** oder "jetzt geht's lohos !
gosub ERRORBEEP
gosub INIT_VARS 'genutzte variablen werden auf NULL gesetzt
gosub LCD_INIT ' LCD wird initialisiert auf 4 bit modus
gosub LCD_INTRO ' aus dem LCD wird ein kleines INTRO ausgegeben (Name, Version,
SW-status, autorenhinweis
gosub ADJUST ' kleiner messbereich wird auf null-wert justiert !
gosub SETTINGS_BAUDRATE
gosub SETTINGS_RECORD
gosub RECORD_OUTPUT
gosub LCD_CLS
gosub INIT_VARS 'genutzte variablen werden auf NULL gesetzt
auto_protect_relais_port=1
#main
SECOND =0 ' auf null setzen, da mit SECOND die AH-berechnung an die
schleifendauer der main-schleife angepasst wird
for zaehler = 1 to 250 ' schleife wird nur bis zum erreichen des 10 sek Limits
durchlaufen, wert 250 hat nur symbolischen charakter
'---------
zeitmerker = SECOND ' speichern der aktuellen sekundenzahl zum spaeteren warten
bis volle sekunde verstrichen
' u_mess_cache=u_mess
if u_mess > HOCHSTROMSCHWELLE then gosub MESS_GROSS '0 else
messbereichs_merker = 0
if u_mess < KLEINSTROMSCHWELLE then gosub MESS_KLEIN
if u_mess =< HOCHSTROMSCHWELLE AND u_mess => KLEINSTROMSCHWELLE then gosub
MESS_MITTEL
' wenn messwert des mittleren stromwertes < 3, dann wird in den kleinen
messbereich umgeschaltet, ansonsten wird im mittleren bereich verblieben
' falls kleiner messbereich erkannt wurde, wird in die entsprechende routine
gesprungen ansonsten wird der strom im mittleren messbereich ermittelt und der
korrekturfaktor fuer die nichtlinearitaet des OPAMPS eingerechnet
gosub WRITEVALUE_U_MESS_MERKER
if messbereichs_merker=1 then u_mess_merker = u_mess_merker / 10 ' anpassung
fuer korrekte weiterberechnung
'if u_mess < KLEINSTROMSCHWELLE then u_mess_merker = u_mess_merker / 10 '
anpassung fuer korrekte weiterberechnung
gosub SEROUT
messbereichs_merker = 0 ' fuer leistungs-/spannungs-/ und AH berechnung wird
wieder in den mittleren messbereich umgeschaltet
'--------
value = u_bat/10 * u_mess_merker/10 'funktioniert nur bis zu einem strom von
circa 50 A, danach entsteht ueberlauf in der WATT anzeige
gosub WRITEVALUE_WATT
'--------
value = u_bat '* 10
gosub WRITEVALUE_VERSORGUNGSSPANNUNG
'--------
if pwr_intake > AH_UEBERLAUF_SCHWELLE then gosub PWR_UEBERLAUF
pwr_intake = pwr_intake + u_mess_merker
' print "zaehler:";zaehler;" pwr_intake:";pwr_intake;"
pwr_ueberlaufmerker:";pwr_ueberlaufmerker
if RECORD = 1 then gosub WRITE_CURRENT
for key_nr = 0 to 11
looktab keycodes, key_nr, compare
if abs(keyboard-compare) < 3 then gosub HANDLE_KEY_CLOSE
next
wait (SECOND-zeitmerker) ' warten bis angebrochene sekunde verstrichen ist
if SECOND < 10 then next
auto_protect_relais_port=0
'--------
value = pwr_AH_stelle_ueberlaufmerker + pwr_ueberlaufmerker ' AH-wert bestimmen
und ..
gosub WRITEVALUE_AH ' ... ausgeben
'---------
goto main
end 'schluss ende aus !
' ***** an hier beginnen die sub-routinen *****
#MESS_KLEIN ' averaging-schleife fuer kleinen messbereich
messbereichs_merker = 1 'KLEIN
u_mess_merker = abs((u_mess_klein - u_mess_klein_off_set)*2)
return
#MESS_GROSS ' averaging-schleife fuer kleinen messbereich
messbereichs_merker = 2 'GROSS
if u_mess_gross > UEBERSTROMSCHWELLE then gosub UEBERSTROMWARNUNG '64 == 100
A
u_mess_merker = u_mess_gross * LINKORREKTUR_GROSS '/ 10
return
#MESS_MITTEL
u_mess_merker = u_mess * LINKORREKTUR_MITTEL
messbereichs_merker=0 'MITTEL
return
#WRITEVALUE_U_MESS_MERKER
lcd_param = 1 : gosub LCD_GOTOLINE
value = u_mess_merker / 10
gosub WRITEVALUE
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
return
#SEROUT
sekundenzaehler=sekundenzaehler + 1 'sekunden seit start der messung
print
' print "t";
' print "t";sekundenzaehler;" sec "; 'ausgabe
sekundenzaehler
print sekundenzaehler;" ";
u_bat_merker = u_bat
' CRC = abs(u_mess_merker) + u_bat_merker +
pwr_AH_stelle_ueberlaufmerker+pwr_ueberlaufmerker+sekundenzaehler
on messbereichs_merker gosub
SEROUT_MESS_MITTEL,SEROUT_MESS_KLEIN,SEROUT_MESS_MITTEL
' print "z"
print
return
#SEROUT_MESS_MITTEL
' print u_mess_merker/100;".";(u_mess_merker/10) mod 10;(u_mess_merker
mod 100) mod 10;" A ";u_bat_merker/10;".";u_bat_merker mod
10;" V ";pwr_AH_stelle_ueberlaufmerker/10;".";pwr_ueberlaufmerker;"
AH Flags:";messbereichs_merker;"
'CRC:";CRC
print u_mess_merker/100;",";(u_mess_merker/10) mod 10;(u_mess_merker
mod 100) mod 10;" A ";u_bat_merker/10;",";u_bat_merker mod
10;" V ";pwr_AH_stelle_ueberlaufmerker/10;",";pwr_ueberlaufmerker;"
AH "
'print u_mess_merker/100;u_mess_merker/10 mod 10;(u_mess_merker mod 100) mod 10
'print u_mess_merker
'print u_bat_merker/10;u_bat_merker mod 10
'print u_bat_merker
'print pwr_AH_stelle_ueberlaufmerker/10;pwr_ueberlaufmerker
return
#SEROUT_MESS_KLEIN
' print "0.";abs(u_mess_merker/10);abs(u_mess_merker mod 10);" A
";u_bat_merker/10;".";u_bat_merker mod 10;" V ";pwr_AH_stelle_ueberlaufmerker/10;".";pwr_ueberlaufmerker;"
AH Flags:";messbereichs_merker;" CRC:";CRC
print "0,";abs(u_mess_merker/10);abs(u_mess_merker mod 10);" A
";u_bat_merker/10;",";u_bat_merker mod 10;" V ";pwr_AH_stelle_ueberlaufmerker/10;",";pwr_ueberlaufmerker;"
AH "
'print "0";abs(u_mess_merker/10);abs(u_mess_merker mod 10)
'print u_mess_merker
'print u_bat_merker/10;u_bat_merker mod 10
'print u_bat_merker
'print pwr_AH_stelle_ueberlaufmerker/10;pwr_ueberlaufmerker
return
#PWR_UEBERLAUF
pwr_ueberlaufmerker = pwr_ueberlaufmerker +1
if pwr_ueberlaufmerker = 10 then gosub PWR_AH_STELLE_ueBERLAUF_MERKER
pwr_intake = -32767
return
#PWR_AH_STELLE_ueBERLAUF_MERKER
pwr_AH_stelle_ueberlaufmerker = pwr_AH_stelle_ueberlaufmerker +10
pwr_ueberlaufmerker = 0
return
#INIT_VARS
messbereichs_merker = 0
pwr_ueberlaufmerker = 0
pwr_AH_stelle_ueberlaufmerker=0
pwr_intake=-32767
value=0
u_mess_merker =0
output =0
sekundenzaehler =0
zaehler =0
lcd_buf =0
lcd_param =0
' u_mess_klein_off_set =0
zeitmerker =0
u_bat_merker =0
return
#WRITEVALUE_WATT
gosub WRITEVALUE
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = W_ : gosub LCD_WRITECHAR ' WERT =
return
#WRITEVALUE_VERSORGUNGSSPANNUNG
lcd_param = 2 : gosub LCD_GOTOLINE
gosub WRITEVALUE
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = V_ : gosub LCD_WRITECHAR ' WERT =
return
#WRITEVALUE_AH
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
gosub WRITEVALUE
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = H_ : gosub LCD_WRITECHAR ' WERT =
return
#ADJUST
' u_mess_merker =0
u_mess_klein_off_set=0
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = J_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = S_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = I_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = G_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = I_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = 2 : gosub LCD_GOTOLINE
for zaehler = 1 to 16
u_mess_merker=u_mess_merker+u_mess_klein
lcd_param = PUNKT : gosub LCD_WRITECHAR ' WERT =
pause 3
next
u_mess_klein_off_set=u_mess_merker / 16
u_mess_merker=0
' gosub CLEARSCREEN
gosub LCD_CLS
return
#UEBERSTROMWARNUNG
gosub ERRORBEEP
auto_protect_relais_port=1
' gosub CLEARSCREEN
gosub LCD_CLS
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = I_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = AUSRUFEZEICHEN : gosub LCD_WRITECHAR ' WERT =
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = V_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = L_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = F_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
pause 250
' gosub CLEARSCREEN
gosub LCD_CLS
return
#LCD_INTRO
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = S_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = F_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = W_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = V_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = PUNKT : gosub LCD_WRITECHAR ' WERT =
lcd_param = sieben_ : gosub LCD_WRITECHAR
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = klammer_auf_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = C_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = klammer_zu_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = J_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = B_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = null_ : gosub LCD_WRITECHAR ' WERT =
pause 50
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = H_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = W_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR
lcd_param = slash_ : gosub LCD_WRITECHAR
lcd_param = null_ : gosub LCD_WRITECHAR
lcd_param = null_ : gosub LCD_WRITECHAR
pause 100
gosub LCD_CLS
return
#WRITEVALUE
output = abs(value)
'if abs(value) >= 10000 then lcd_param = NULL + output/10000 else lcd_param =
LEERZ
'gosub LCD_WRITECHAR
'output = output mod 10000
' Tausender-Dezimalstelle oder Leerzeichen
if abs(value) >= 1000 then lcd_param = NULL + output/1000 else lcd_param =
LEERZ
gosub LCD_WRITECHAR
output = output mod 1000
' Hunderter-Dezimalstelle oder Leerzeichen
if abs(value) >= 100 then lcd_param = NULL + output/100 else lcd_param =
LEERZ
gosub LCD_WRITECHAR
output = output mod 100
if messbereichs_merker =1 then lcd_param = PUNKT
if messbereichs_merker =1 then gosub LCD_WRITECHAR
if abs(value) >= 10 then lcd_param = NULL + output/10 else lcd_param = NULL
gosub LCD_WRITECHAR
' Zehner-Dezimalstelle oder Leerzeichen
'if abs(value) >= 10 then lcd_param = PUNKT
if (messbereichs_merker =0 OR messbereichs_merker =2) then lcd_param = PUNKT
if (messbereichs_merker =0 OR messbereichs_merker =2) then gosub LCD_WRITECHAR
' einer Dezimalstelle oder Leerzeichen
lcd_param = NULL + output mod 10
gosub LCD_WRITECHAR
return
'*** LCD_Interface ***
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)
#LCD_INIT
' alle ports 0
lcd_port = OFF
' 8-Bit-Modus aktivieren
lcd_param=&H38 : gosub LCD_WRITECMD
' mit 8-Bit-Command in 4-Bit-Modus umschalten
lcd_port=&B00000010
tog lcd_e
tog lcd_e
' ab jetzt 4-Bit-Modus
lcd_param = &H28 : gosub LCD_WRITECMD
lcd_param = &H0C : gosub LCD_WRITECMD
' Display loeschen
#LCD_CLS
lcd_param = &H02 : gosub LCD_WRITECMD
lcd_param = &H01 : gosub LCD_WRITECMD
return
' Zeilenwechsel
#LCD_GOTOLINE
if lcd_param = 1 then lcd_param = &H80
if lcd_param = 2 then lcd_param = &HC0
goto LCD_WRITECMD
' LCD-Kommando
#LCD_WRITECMD
lcd_buf = OFF
goto LCD_WRITE
' Zeichenausgabe
#LCD_WRITECHAR
lcd_buf = &B00100000
' Kommando oder Zeichen an Display senden
#LCD_WRITE
lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
tog lcd_e
tog lcd_e
lcd_port = lcd_buf or (lcd_param and &H0F) ' Lo-Nibble
tog lcd_e
tog lcd_e
return
'----------------------
#SETTINGS_BAUDRATE
'define value word
' die Reihenfolge der Tasten auf dem Keyboard
define KEY_ASTERIX 0
define KEY_7 1
define KEY_4 2
define KEY_1 3
define KEY_0 4
define KEY_8 5
define KEY_5 6
define KEY_2 7
define KEY_CROSS 8
define KEY_9 9
define KEY_6 10
define KEY_3 11
' --- Initialisierung ---
value = 0
neg = 0
' --- Tastaturabfrageschleife ---
gosub SETTINGS_AUSGABE
for u_mess_merker = 1 to wait_loop_cycles
'#LOOP
' anhand einer Tabelle werden die vom A/D-Wandler gemessenen
' Spannungswerte einer Taste zugeordnet, dabei wird eine
' Toleranz von +- 3 zugelassen, um Widerstandstoleranzen
' zu kompensieren
'lcd_param = 2 : gosub LCD_GOTOLINE
for key_nr = 0 to 11
looktab keycodes, key_nr, compare
if abs(keyboard-compare) < 3 then gosub HANDLE_KEY
next
'kleine Pause
pause 2
if value = 65535 then return
' Endlosschleife
next 'goto LOOP
gosub DEFAULT_SETTINGS_AUSGABE
gosub TAKE_2K4
return
' --- Vergleichstabelle mit Werten, die mit keyb1.bas ermittelt wurden ---
' sollten die von Ihnen festgestellten Tasten-A/D-Werte von dieser Tabelle
' etwas abweichen, so ist das normal und durch die Widerstandstoleranzen
' begruendet
' --- Zuordnung von ASCII-Codes fuer die Tasten aus einer Tabelle und Ausgabe
---
' Achten Sie auf die hier implementierten Sonderfunktionen
' der Tasten # und * sowie auf das Setzten des negativen
' Vorzeichens durch Druecken der 0 vor der eigentlichen Eingabe
#HANDLE_KEY
if key_nr = KEY_0 and value = 0 then goto NEGATIVE
if key_nr = KEY_ASTERIX then goto BACKSPACE
if key_nr = KEY_CROSS then goto NEWLINE
' die Eingabe auf den Wertebereich -32000 bis 32000 begrenzen
if abs(value) > 3200 then goto ERRORBEEP
looktab asciicodes, key_nr, key_ascii
value = value * 10 + key_ascii - 48
lcd_param = key_ascii : gosub LCD_WRITECHAR ' WERT =
return
' negatives Vorzeichen
#NEGATIVE
neg = not neg
lcd_param = &H2D : gosub LCD_WRITECHAR ' WERT = print "-";
return
' Loeschen des zuletzt eingegebenen Zeichens
#BACKSPACE
' if value = 0 then neg = not neg
' value = value / 10
value = 0
gosub SETTINGS_TEIL_AUSGABE
for zaehler = 1 to 4
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
next
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
gosub SETTINGS_TEIL_AUSGABE
return
' Eingabe abschliessen
#NEWLINE
'print
' if neg then value = -value
' print "Sie haben "; value; " eingegeben"
'on value gosub TAKE_1K2, TAKE_2K4, TAKE_2K4, TAKE_4K8, TAKE_9K6
if value = 1 then gosub TAKE_1K2
if value = 2 then gosub TAKE_2K4
if value = 4 then gosub TAKE_4K8
if value = 5 then gosub TAKE_9K6
gosub ERRORBEEP
'neg = 0
return
#ERRORBEEP
beep 100,10,0
return
#SETTINGS_AUSGABE
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = B_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = K_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR
lcd_param = K_ : gosub LCD_WRITECHAR
lcd_param = vier_ : gosub LCD_WRITECHAR
#SETTINGS_TEIL_AUSGABE
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = vier_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = vier_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = K_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = acht_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = fuenf_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = neun_ : gosub LCD_WRITECHAR
lcd_param = K_ : gosub LCD_WRITECHAR
lcd_param = sechs_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = sieben_ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
' lcd_param = N_ : gosub LCD_WRITECHAR
' lcd_param = O_ : gosub LCD_WRITECHAR
return
#TAKE_1K2
baud R1200
value = 65535
return
#TAKE_2K4
baud R2400
value = 65535
return
#TAKE_9K6
baud R9600
value = 65535
return
#TAKE_4K8
baud R4800
value = 65535
return
#DEFAULT_SETTINGS_AUSGABE
'gosub CLEARSCREEN
gosub LCD_CLS
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = K_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = K_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = vier_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = B_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = B_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = Y_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = F_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = A_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = L_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = AUSRUFEZEICHEN : gosub LCD_WRITECHAR ' WERT =
pause 150
return
#SETTINGS_RECORD
gosub SETTINGS_RECORD_AUSGABE
value =0
for u_mess_merker = 1 to wait_loop_cycles
'#LOOP
' anhand einer Tabelle werden die vom A/D-Wandler gemessenen
' Spannungswerte einer Taste zugeordnet, dabei wird eine
' Toleranz von +- 3 zugelassen, um Widerstandstoleranzen
' zu kompensieren
'lcd_param = 2 : gosub LCD_GOTOLINE
for key_nr = 0 to 11
looktab keycodes, key_nr, compare
if abs(keyboard-compare) < 3 then gosub HANDLE_KEY_RECORD
next
'kleine Pause
pause 2
if value = 65535 then return
' Endlosschleife
next 'goto LOOP
gosub DEFAULT_SETTINGS_RECORD_AUSGABE
RECORD=0' heisst nicht aufzeichnen
return
#SETTINGS_RECORD_AUSGABE
' gosub CLEARSCREEN
gosub LCD_CLS
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = C_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = klammer_auf_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = Y_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = SLASH_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = klammer_zu_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = 2 : gosub LCD_GOTOLINE
return
#NEWLINE_RECORD
'print
' if neg then value = -value
' print "Sie haben "; value; " eingegeben"
if value = 1 then gosub TAKE_RECORD
if value = 2 then gosub TAKE_NO_RECORD
gosub ERRORBEEP
'neg = 0
return
#HANDLE_KEY_RECORD
if key_nr = KEY_0 and value = 0 then goto NEGATIVE
if key_nr = KEY_ASTERIX then goto BACKSPACE_RECORD
if key_nr = KEY_CROSS then goto NEWLINE_RECORD
' die Eingabe auf den Wertebereich -32000 bis 32000 begrenzen
if abs(value) > 3200 then goto ERRORBEEP
looktab asciicodes, key_nr, key_ascii
value = value * 10 + key_ascii - 48
lcd_param = key_ascii : gosub LCD_WRITECHAR ' WERT =
return
#TAKE_RECORD
RECORD=1 ' es wird ins e2prom aufgezeichnet
' sekundenzaehler = filemax ' grosses EPROM
value = 65535
open# for write
return
#TAKE_NO_RECORD
RECORD=0
value = 65535
return
#DEFAULT_SETTINGS_RECORD_AUSGABE
' gosub CLEARSCREEN
gosub LCD_CLS
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = W_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = I_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = L_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = L_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = C_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = AUSRUFEZEICHEN : gosub LCD_WRITECHAR ' WERT =
pause 150
return
#BACKSPACE_RECORD
' if value = 0 then neg = not neg
' value = value / 10
value = 0
' gosub SETTINGS_TEIL_AUSGABE
' lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = 2 : gosub LCD_GOTOLINE
for zaehler=1 to 16
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
next
' lcd_param = 1 : gosub LCD_GOTOLINE
' lcd_param = 2 : gosub LCD_GOTOLINE
' gosub SETTINGS_TEIL_AUSGABE
return
#WRITE_CURRENT
' lcd_param = 1 : gosub LCD_GOTOLINE
' lcd_param = SLASH_ : gosub LCD_WRITECHAR
if sekundenzaehler < filemax then PRINT# u_mess_merker else gosub CLOSE_IT
'wenn freier e2prom groesser als 2*2 byte, dann wird der aktuelle stromwert in
den speicher geschrieben.
' if sekundenzaehler >= 2 then sekundenzaehler = sekundenzaehler - 2
return
#RECORD_OUTPUT
gosub SETTINGS_RECORD_OUTPUT_AUSGABE
value =0
for zaehler = 1 to wait_loop_cycles
'#LOOP
' anhand einer Tabelle werden die vom A/D-Wandler gemessenen
' Spannungswerte einer Taste zugeordnet, dabei wird eine
' Toleranz von +- 3 zugelassen, um Widerstandstoleranzen
' zu kompensieren
'lcd_param = 2 : gosub LCD_GOTOLINE
for key_nr = 0 to 11
looktab keycodes, key_nr, compare
if abs(keyboard-compare) < 3 then gosub HANDLE_KEY_RECORD_OUTPUT
next
'kleine Pause
pause 2
if value = 65535 then return
' Endlosschleife
next 'goto LOOP
gosub DEFAULT_SETTINGS_RECORD_OUTPUT_AUSGABE
' define RECORD_NO_NO 1' heisst nicht aufzeichnen
return
#SETTINGS_RECORD_OUTPUT_AUSGABE
' gosub CLEARSCREEN
gosub LCD_CLS
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = P_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = C_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = R_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = D_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = klammer_auf_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = Y_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = SLASH_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = klammer_zu_ : gosub LCD_WRITECHAR ' WERT =
return
#NEWLINE_RECORD_OUTPUT
'print
' if neg then value = -value
' print "Sie haben "; value; " eingegeben"
if value = 1 then gosub RECORD_OUTPUT_NOW
if value = 2 then value=65535
gosub ERRORBEEP
'neg = 0
return
#HANDLE_KEY_RECORD_OUTPUT
if key_nr = KEY_0 and value = 0 then goto NEGATIVE
if key_nr = KEY_ASTERIX then goto BACKSPACE_RECORD_OUTPUT
if key_nr = KEY_CROSS then goto NEWLINE_RECORD_OUTPUT
' die Eingabe auf den Wertebereich -32000 bis 32000 begrenzen
if abs(value) > 3200 then goto ERRORBEEP
looktab asciicodes, key_nr, key_ascii
value = value * 10 + key_ascii - 48
lcd_param = key_ascii : gosub LCD_WRITECHAR ' WERT =
return
#RECORD_OUTPUT_NOW
value=65535
OPEN# FOR READ
for sekundenzaehler=1 to filemax
if not EOF then gosub SEROUT_RECORD
'gosub SEROUT_RECORD
if not EOF then next
'next
' gosub SEROUT_RECORD
return
#SEROUT_RECORD
INPUT# u_mess_merker
'PRINT sekundenzaehler;" sec ";
PRINT sekundenzaehler;" sec ";u_mess_merker/100;",";(u_mess_merker/10)
mod 10;(u_mess_merker mod 100) mod 10;" A"
return
#DEFAULT_SETTINGS_RECORD_OUTPUT_AUSGABE
' gosub CLEARSCREEN
gosub LCD_CLS
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = W_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = I_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = L_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = L_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = O_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = P_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = U_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = T_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = AUSRUFEZEICHEN : gosub LCD_WRITECHAR ' WERT =
pause 150
return
' if value = 0 then neg = not neg
' value = value / 10
#BACKSPACE_RECORD_OUTPUT
value = 0
' gosub SETTINGS_TEIL_AUSGABE
' lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = klammer_auf_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = Y_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = SLASH_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = klammer_zu_ : gosub LCD_WRITECHAR ' WERT =
for zaehler=1 to 7
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
next
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = klammer_auf_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = Y_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = eins_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = SLASH_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = N_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = GLEICH : gosub LCD_WRITECHAR ' WERT =
lcd_param = zwei_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = klammer_zu_ : gosub LCD_WRITECHAR ' WERT =
lcd_param = LEERZ : gosub LCD_WRITECHAR ' WERT =
' gosub SETTINGS_TEIL_AUSGABE
return
#HANDLE_KEY_CLOSE
if key_nr = KEY_CROSS then gosub CLOSE_IT
return
#CLOSE_IT
CLOSE#
lcd_param = 1 : gosub LCD_GOTOLINE
lcd_param = AUSRUFEZEICHEN : gosub LCD_WRITECHAR ' WERT =
RECORD = 0
return
table asciicodes
8 55 52 49
48 56 53 50
10 57 54 51
tabend
table keycodes
0 23 46 68
90 111 132 152
173 193 214 233
tabend
| |
|