erstellt 15.03.2009
Datenlogger
Ziel ist es, einen Datenlogger zu entwickeln, der in der Programmiersprache Bascom ( ähnlich Basic) zu Programmieren ist , weil der Compiler
(Compiler = der das Programm in eine für den Mikrocontroller passende Sprache übersetzt) dazu bis zu einer bestimmten Programmgröße kostenlos ist
Der Datenlogger, sollte für verschiedene Zwecke nutzbar sein , beispielsweise um Spannungsmessungen in Langzeitverfahren zu bewerkstelligen, oder auch um
Schaltzustände von Elektronischen oder Mechanischen Schaltern zu überwachen. Aber hier ist der Fantasie eigentlich keine Grenzen gesetzt.
Hardware
Zuerst einmal zur Hardware, die Schaltung besteht in der Hauptsache aus einem Atmega 8 (Mikroprozessor) und ein Serielles EEprom als Speicherbaustein , dazu noch einige andere diversen Kleinigkeiten .
Die Schaltung beinhaltet zwei Taster die beide mehrfach genutzt werden. Ein IC Max 232 , der die Schnittstelle zum PC herstellt um die später ausgelesenen Daten am PC weiter zu bearbeiten , oder sie evtl grafisch sichtbar zu machen . Ein Display mit 2 mal 16 Zeichen, um die Uhrzeit anzuzeigen und einzustellen.Ein Netzteil welches aber zum späteren Zeitpunkt durch eine Batterie ersetzt werden soll. Den Prozessor dessen Takt mit einem Quarz von ca 3,6 Mhz erzeugt wird. Und der Programmierschnittstelle über der die Software in den Prozessor gelangt.

Vergrößern hier:
Schaltplan hier laden
Stückliste

C1 = 100n
C2 = 100n
C6 = 100n
C7 = 100n
C8 = 100n
C9 = 100n
C10 = 10µ
C11 = 100n
C12 = 100n

LCD Display = 2X16 Zeichen

Qz1 = 3,686400

Spannungsregler = 7805

Prozessor = Atmega 8
Bu = Sub-D 9 (F)
IC2 = DIL 16

Jmp1 = Jumper
Jmp2 = Jumper
Jmp3 = Jumper
Jmp4 = Jumper
Jmp5 = Jumper
Jmp6 = Jumper
Jmp7 = Jumper

R1 = 1k
R2 = 10k
R5 = 220
R6 = 220




D2 = 1N4148
D3 = 1N4148
D4 = 1N4148

LED1 = Gelb
LED2 = Blau
LED4 = Rot

P1 = 10k

S1 = Kippschalter
S2 = Druckschalter
S3 = Druckschalter

Datenlogger 3C Datum 03.08.2008 by Ms
F U N K T I O N

Nach dem einschalten wird die Uhrzeit angezeigt beginnend bei 00:00:00.
Mit dem Linken Taster hat man die Möglichkeit die Stunden, und mit dem Rechten Taster die Minuten zu erhöhen, um damit die ungefähre Zeit einzustellen.
Sekunden können nicht eingestellt werden, weil diese Genauigkeit hier nicht gefordert wird.
Mit der Dritten Taste können wir das Ende der Eingabe quittieren .
Im anschließenden Menü kann die Messzeit ( Messzyklus) in Sekunden angegeben werden linke Taste erhöht die Zeit, rechte Taste verringert die Zeit.
Anschließend muss mit dritten Taste quittiert werden.
Es erfolgt für kurze Zeit die Anzeige der kompletten Messzeit in Stunden abhängig davon wie groß der Speicher ist- wie groß der Messzyklus ist und wie viele Werte pro Messung geschrieben werden sollen.
In diesem Beispiel werden 5 Werte gespeichert, davon sind

1. Wert sind die Stunden
2. Wert sind die Minuten
3. Wert sind die Sekunden
4. Wert oberer Teil der Spannungsmessung
5. Wert unterer Teil der Spannungsmessung
Sollte die Messzeiteingabe den Wert Null haben, und wird dann mit der Rechten Taste quittiert, dann wird der Komplette Speicher ausgelesen.

Der Timer wird auf einen bestimmten Wert voreingestellt Um auf eine 1 Hz Zeitbasis zu kommen.
Dazu wird erst einmal die Frequenz des Quarz durch 1024 geteilt ist in diesem Fall 3600. Dieser Wert wird vom höchsten Zählwert subtrahiert ,
also 1024 minus 3600 bleibt 61935 übrig.
Dieser Wert wird voreingestellt
Pinbelegung Display an folgenden Ports:
Enable = Port B.5 RS = Port B.4 DB7 = Port B.3 DB6 = Port B.2 DB5 = Port B.1 DB4 = Port B.0 Taster an Port D.2 Links Taster an Port D.3
Rechts Taster an Port D.6 Bestätigen Led an Port D.5 Rot oder Ton Led an Port D.7 Blau

Konfiguration des Prozessors
49 $baud = 9600 RS232 Dateübetrasgungsrate
50 $regfile "m8def.dat" 'Definiert den Atmega als Atmega 8
51 $crystal = 3686400 Gibt die Quarzfrequenz an in Herz
52 Config Lcd = 16 * 2 definiert das LCD Display in Art und Größe
54 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5 Pinbelegung für LCD
Konfiguration der Portanschlüsse für EEprom
60 Config Sda = Portc.4 I2C Datenleitung
61 Config Scl = Portc.5 I2C Taktleitung
Variable zuständig für die Analogeingangs Abfrage
64 Dim Volt0 As Word  
65 Dim Volt01 As Single  
66 Dim Volt1 As String * 10  
67 Dim Volt11 As String * 10  
68 Dim V1 As Long At $95 Analogwert ab Adresse 95 ablegen
69 Dim V2 As Byte At $95 Overlay erste Byte aus V1 ab Adresse 95 auslesen
70 Dim V3 As Byte At $96 Overlay zweite Byte aus V3 ab Adresse 96 auslesen
71 Dim X1 As Word  
72 Dim X2 As Word  
73 Dim Y1 As Long At $100  
74 Dim Y2 As Byte At $100 Overlay  
75 Dim Y3 As Byte At $101 Overlay  
76 Dim X3 As Word  
77 Dim X4 As Word  
78 Dim X5 As Single  
79 Dim X55 As String * 10  
Variable für Eingabe der Zeit für den Messintervall
82 Dim M As Word  
83 Dim Takt As Word  
84 Dim K As Word ' Für Restanzeige der Messzeit
Analogeingang ADC0 aktivieren
88 Config Adc = Single , Prescaler = Auto , Reference = Avcc  
89 Start Adc  
Deklarieren der Variablen für die Uhr
93 Dim Sekunde As Word 'Variable in der Sekunden gespeichert werden
94 Dim Minute As Word 'Variable in der Minuten gespeichert werden
95 Dim Stunde As Word 'Variable in der Stunden gespeichert werden
101 Dim Stunde_format As String * 2 Wird benötigt für die Formatumwandlung, dass Stunden,Minuten, Sekundenjeweils mit Zwei stellen angezeigt wird , auch wenn der Wert unter 10 ist Variable für die Konvertierung der Uhrzeit für die aus dem EEprom gelesen wird
102 Dim Minute_format As String * 2
103 Dim Sekunde_format As String * 2
104 Dim Form As String * 2
106 Dim W As Word  
107 Dim V As Word  
108 Dim U As Word  
109 Dim T As Word  
110 Dim S As Word  
111 Dim R As Word  
Variable für EEprom speichern und auslesen
114 Dim Lesen As Byte Die Adresse mus als Word Variable angesprochen werden (Word=16bit)= 0...65535 Damit kann ein EEprom mit 256kbit (24c256) angesprochen werden,der hier Benutzte EEprom Baustein ( 24c64) benötigt 8192 Adressen .Adresse besteht aus 16 bit und wird auf Speicherplatz 160 abgelegt, dann wird die Adresse aufgeteilt in ersten 8 bit also von rechts lesen = Lowbyte und die zweiten 8 Bit als Highbyte
123 Dim Adresse As Word At $160
124 Dim Low_adresse As Byte At $160 Overlay
125 Dim High_adresse As Byte At $161 Overlay
Zum Auslesen der 5 gespeicherten Werte des Eeproms
129 Dim Lese_sekunde As Byte  
130 Dim Lese_minute As Byte  
131 Dim Lese_stunde As Byte  
132 Dim Lese_volt_low As Byte  
133 Dim Lese_volt_high As Byte -  
138 Ddrd = &B10100000 Port d.5 und d.7 als Ausgang,alle anderen als Eingang definieren
140 Portd = &B01001100 PullUp von Portd.2 und Portd.3 und Portd.6 aktivieren
142 Config Timer1 = Timer , Prescale = 1024 Bestimmt das Timer 1 verwendet wird und teilt Takt durch 1024
144 Enable Timer1 startet Timer 1
145 On Timer1 Test Hier wird dem Timer gesagt das er zum Programmpunkt "Test" springen soll wenn der Timer einen Überlauf meldet
147 Enable Interrupts Hier wird der Interuppt aktiviert
148 Timer1 = 61935 Voreinstellung des Timers
161 Do Schleife um die Uhrzeit einzustellen
163 Cls  
164 Lcd "Uhr einstellen ?"  
165 Print "Bitte Uhr stellen"  
166 Print " Aktuelle Zeit ist :" ; Stunde ; ":" ; Minute ; ":" ; Sekunde  
167 Locate 2 , 1  
Berechnung der Zeit aus dem Systemtakt
169 If Sekunde > 59 Then Incr Minute  
170 If Sekunde > 59 Then Sekunde = 0  
171 If Minute > 59 Then Incr Stunde  
172 If Minute > 59 Then Minute = 0  
173 If Stunde > 23 Then Stunde = 0  
174 Lcd "Zeit " ; Stunde ; ":" ; Minute ; ":" ; Sekunde  
175 Waitms 300  
177 If Pind.2 = 0 Then  
178 Waitms 30  
179 If Pind.2 = 0 Then  
180 Incr Stunde  
181 If Pind.2 = 0 Then Portd.7 = 1  
183 Waitms 30  
184 Portd.7 = 0  
185 End If  
186 End If  
189 If Pind.3 = 0 Then  
190 Waitms 30  
191 If Pind.3 = 0 Then  
192 Incr Minute  
193 If Pind.3 = 0 Then Portd.7 = 1  
195 Waitms 20  
197 Portd.7 = 0  
198 End If  
200 End If  
202 If Pind.6 = 0 Then  
203 Waitms 30  
204 If Pind.6 = 0 Then  
205 Portd.7 = 1  
206 Waitms 20  
207 Portd.7 = 0  
209 If Pind.6 = 0 Then  
211 Exit Do  
212 End If  
214 End If  
215 End If  
216 Loop  
Abfrage über Speicherintervall und ob ausgelesen werden soll
223 Wait 1 Pause damit Tastedruck aus der vorangegangene Schleife nicht auch in dieser Schleife wirksam wird
224 Do  
225 Cls  
227 Lcd "Messintervall ?"  
228 Locate 2 , 1  
229 Lcd "+"  
230 Locate 2 , 13  
231 Lcd "-"  
232 Locate 2 , 3  
233 Lcd M  
234 Locate 2 , 9  
235 Lcd "Sek."  
236 Cursor Off Noblink  
237 Waitms 300  
239 If Pind.2 = 0 Then  
240 Waitms 30  
241 If Pind.2 = 0 Then  
242 Incr M  
243 If Pind.2 = 0 Then Portd.7 = 1  
244 Waitms 20  
245 Portd.7 = 0  
246 End If  
247 End If  
250 If Pind.3 = 0 Then  
251 Waitms 30  
252 If Pind.3 = 0 Then  
253 Decr M  
254 If Pind.3 = 0 Then Portd.7 = 1  
255 Waitms 20  
257 Portd.7 = 0  
258 End If  
259 End If  
263 If Pind.6 = 0 Then  
264 Waitms 30  
265 If Pind.6 = 0 Then  
266 Portd.7 = 1  
267 Waitms 20  
268 Portd.7 = 0  
270 If Pind.6 = 0 And M = 0 Then  
271 Gosub Lese_eeprom  
272 Else  
273 Exit Do  
275 End If  
277 End If  
278 End If  
280 Loop  
283 Cls  
284 Locate 1 , 1  
285 Lcd "Speicherzeit ges."  
286 K = 8192 \ 5 Wert 8192 sind die Speicheradrssen beim 24C64
287 K = K * M M ist die eigegebene Messzeit in Sekunden
288 K = K \ 360 360 rechnet von Sekunden in Minuten um
290 Locate 2 , 1  
291 Lcd K ; " Stunden"  
293 Wait 4  
Anfang des Hauptprogramms
296 Do  
298 If Takt > M Then Takt = 0  
300 If M = Takt Then Gosub Schreib_eeprom  
301 Print " Takt " ; Takt  
303 Print " M " ; M  
304 Waitms 50  
Berechnung der Zeit aus dem Systemtakt
310 If Sekunde > 59 Then Incr Minute  
311 If Sekunde > 59 Then Sekunde = 0  
312 If Minute > 59 Then Incr Stunde  
313 If Minute > 59 Then Minute = 0  
314 If Stunde > 23 Then Stunde = 0  
Berechnung Analogeingang
319 V1 = Getadc(0) Analogeingang wird abgefragt mit V1 dann aufgeteilt in das untere Byte V2 und das Obere Byte V3
320 Cls  
321 Locate 1 , 1  
322 Lcd "Zeit " ; Stunde ; ":" ; Minute ; ":" ; Sekunde  
323 Print Stunde_format ; ":" ; Minute_format ; ":" ; Sekunde_format  
324 Print " Aktuelle Zeit ist :" ; Stunde ; ":" ; Minute ; ":" ; Sekunde  
325 Waitms 50  
332 Loop  
334 End Hauptprogramm Ende
Eeprom Speichern
343 Schreib_eeprom: Hierhin wird von Gosub aus gesprungen
344 Cls ' Display löschen
345 Lcd " Schreibe im " ' Ausgabe auf Display  
346 Locate 2 , 1 ' Position auf Display
347 Lcd " EEprom"  
348 Incr Adresse  
349 If Adresse > 8192 Then Goto Ende  
353 Print " Speicher ins EEprom " ' Ausgabe auf Monitor  
358 Portd.7 = 1 ' Blaue Led einschalten  
360 I2cstart  
361 I2cwbyte &HA0  
362 I2cwbyte High_adresse  
363 I2cwbyte Low_adresse  
364 I2cwbyte Stunde ' Stunden in den Speicher schreiben
365 I2cstop  
366 Waitms 30  
367 Print "Speicher auf Adresse " ; Adresse  
368 Print " Stunden" ; Stunde  
370 Portd.7 = 0 ' Blaue Led ausschalten  
372 Waitms 200 'Pause zum Testen  
Zweiter Wert ( Minuten ) ins EEprom abspeichern
378 Portd.7 = 1 ' Blaue Led einschalten
380 Incr Adresse ' Adresse um eins erhöhen
381 I2cstart  
382 I2cwbyte &HA0  
383 I2cwbyte High_adresse  
384 I2cwbyte Low_adresse  
385 I2cwbyte Minute ' Minuten in den Speicher schreiben  
386 I2cstop  
387 Waitms 30  
388 Print "Speicher auf Adresse " ; Adresse  
389 Print " Minuten" ; Minute  
390 Portd.7 = 0 ' Blaue Led ausschalten
391 Waitms 200 ' Pause zum Testen
Dritter Wert ( Sekunden ) im EEprom speichen
396 Portd.7 = 1 ' Blaue Led einschalten
397 Incr Adresse ' Adresse um eins erhöhen
398 I2cstart  
399 I2cwbyte &HA0  
400 I2cwbyte High_adresse  
401 I2cwbyte Low_adresse  
402 I2cwbyte Sekunde ' Sekunden in den Speicher schreiben
403 I2cstop  
404 Waitms 30  
405 Print "Speicher auf Adresse " ; Adresse  
406 Print "Sekunden" ; Sekunde  
407 Portd.7 = 0 ' Blaue Led ausschalten  
408 Waitms 200 'Pause zum Testen  
Vierter Wert ( Unteres Byte der Analogen Spannungsmessung) im Eeprom speichern
413 Portd.7 = 1  
414 Incr Adresse ' Adresse um eins erhöhen
415 I2cstart  
416 I2cwbyte &HA0  
417 I2cwbyte High_adresse  
418 I2cwbyte Low_adresse  
419 I2cwbyte V2 ' Untere Byte des Analogwertes in speicher schreiben
420 I2cstop  
421 Waitms 30  
422 Print "Speicher auf Adresse " ; Adresse  
423 Print " unterer Bitwert" ; V2  
424 Portd.7 = 0  
425 Waitms 200  
Fünfter Wert ( Oberes Byte des Analogen Spannungsmessung) im Eeprom speichern
430 Portd.7 = 1  
431 Incr Adresse  
432 I2cstart  
433 I2cwbyte &HA0  
434 I2cwbyte High_adresse  
435 I2cwbyte Low_adresse  
436 I2cwbyte V3 'Obere Analogwert speichern  
437 I2cstop  
438 Waitms 30  
439 Print "Speicher auf Adresse " ; Adresse  
440 Print " oberer Bitwert " ; V3  
441 Portd.7 = 0  
442 Waitms 200  
444 Return ' Rücksprung zum Ursprung  
Eeprom auslesen
453 Lese_eeprom: Sprungadresse für
455 for Adresse=1 to 8192  
456 Portd.7=1  
458 Print " Lese aus EEprom "  
459 I2cstart  
460 I2cwbyte &HA0  
461 I2cwbyte High_adresse  
462 I2cwbyte Low_adresse  
463 I2cstop  
464 I2cstart  
465 I2cwbyte &HA1  
466 I2crbyte Lese_stunde , Nack  
467 I2cstop  
468 Waitms 30  
470 Print " Lese ab Adresse " ; Adresse  
472 Toggle Portd.5 ' Ton an Portd.5 ausgeben
Lese aus EEprom die Minuten aus
478 Incr Adresse  
479 I2cstart  
480 I2cwbyte &HA0  
481 I2cwbyte High_adresse  
482 I2cwbyte Low_adresse  
483 I2cstop  
484 I2cstart  
485 I2cwbyte &HA1  
486 I2crbyte Lese_minute , Nack  
487 I2cstop  
488 Waitms 30  
489 Toggle Portd.5  
Lese aus EEprom die Sekunden aus
496 Incr Adresse  
497 I2cstart  
498 I2cwbyte &HA0  
499 I2cwbyte High_adresse  
500 I2cwbyte Low_adresse  
501 I2cstop  
502 I2cstart  
503 I2cwbyte &HA1  
504 I2crbyte Lese_sekunde , Nack  
505 I2cstop  
506 Waitms 30  
509 Toggle Portd.5  
Lese aus EEprom die unteren Analogbyte aus
513 Incr Adresse  
514 I2cstart  
515 I2cwbyte &HA0  
516 I2cwbyte High_adresse  
517 I2cwbyte Low_adresse  
518 I2cstop  
519 I2cstart  
520 I2cwbyte &HA1  
521 I2crbyte Lese_volt_low , Nack  
522 I2cstop  
523 Waitms 30  
525 Toggle Portd.5  
lese aus EEprom die obere Analogbyte aus
529 Incr Adresse  
530 I2cstart  
531 I2cwbyte &HA0  
532 I2cwbyte High_adresse  
533 I2cwbyte Low_adresse  
534 I2cstop  
535 I2cstart  
536 I2cwbyte &HA1  
537 I2crbyte Lese_volt_high , Nack  
538 I2cstop  
539 Waitms 30  
541 Portd.7 = 0  
543 Toggle Portd.5  
Konvertiert die ausgelesene Uhrzeit in ein 2 stelliges Format
547 Stunde_format = Str(lese_stunde)  
548 Stunde_format = Format(stunde_format , "00")  
549 Minute_format = Str(lese_minute)  
550 Minute_format = Format(minute_format , "00")  
551 Sekunde_format = Str(lese_sekunde)  
552 Sekunde_format = Format(sekunde_format , "00")  
Berechnen der ausgelesenen Bits in Volt
557 X3 = Lese_volt_high * 256  
558 X4 = X3 + Lese_volt_low  
561 X5 = 5 / 1023  
562 X5 = X5 * X4  
563 X55=str(X5)  
564 X55 = Left(x55 , 4)  
565 Print "Zeit";Stunde_format;":";Minute_format;":";Sekunde_format;"";X55;"Volt"  
567 Cls  
568 Locate 1 , 1  
569 Lcd "Lese " ; Stunde_format ; ":" ; Minute_format ; ":" ; Sekunde_format  
570 Locate 2 , 1  
571 Lcd "Lese," ; " " ; X55 ; "" ; "Volt"  
574 Waitms 20  
575 Next Adresse  
576 Return  
Test:Sprungmarke von Timer 1
578 Incr Sekunde ' Zählt Sekunde immer um einen Wert hoch  
579 Incr Takt ' Takt für Abfrage Messintervall  
580 Timer1 = 61935 ' Timer soll ab 61935 hochzählen  
581 Toggle Portd.5 ' Tonausgabe  
582 Return  
Sprungmarke Programmende bzw. Speicher voll
585 Ende:  
586 Cls  
587 Lcd " Speicher voll"  
589 End  
     
Die komplette Datei kann als Bascom Datei runtergeladen werden
Hier die Basic Datei laden
  
Um die gespeicherten Daten wieder auszulesen gibt es mehre Möglichkeiten, die einfachste ist wohl über das von Bascom integrierte Terminal Programm, darin hat man die Möglichkeit eine Logdatei mitzuschreiben, wobei die gelesenen Daten in eine einfache Textdatei mit der Endung LOG gespeichert werden,

Auszug aus der Log Datei mitgeschrieben vom Terminalprogramm

Aktuelle Zeit ist :0:0:20
Bitte Uhr stellen
Aktuelle Zeit ist :0:0:20
Zeit 17:15:60 2.37Volt
Zeit 17:16:60 2.31Volt
Zeit 17:17:60 2.30Volt
Zeit 17:18:60 2.30Volt
Zeit 17:20:00 2.29Volt
Zeit 17:21:01 2.28Volt
Zeit 17:22:02 2.28Volt
Zeit 17:23:03 2.26Volt
Zeit 17:24:04 2.26Volt
Zeit 17:25:05 2.29Volt
Zeit 17:26:06 2.28Volt
Zeit 17:27:07 2.28Volt
Zeit 17:28:08 3.35Volt
Zeit 17:29:09 3.34Volt
Zeit 17:30:10 3.34Volt
Zeit 17:31:11 3.34Volt
Zeit 17:32:12 3.33Volt
Zeit 17:33:13 3.32Volt
Zeit 17:34:14 4.86Volt
Zeit 17:35:15 4.85Volt
Zeit 17:36:16 1.85Volt
Zeit 17:37:17 1.79Volt
Zeit 17:38:18 3.01Volt
Zeit 17:39:19 3.00Volt
Zeit 17:40:20 2.98Volt
Zeit 17:41:21 2.97Volt

  
Mit der etwas abgeänderten Version, soll meine Schaltung bei einem Wechsel an einem bestimmten Digitaleingang ( offen / geschlossen) diesen Wechsel , mit der passenden Uhrzeit im EEprom speichern.
  Aktualisiert 28.01.2019
Copyright by Ms 2009