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. | ||
Schaltplan hier laden | ||
Stückliste |
||
C1 = 100n 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 LED1 = Gelb P1 = 10k S1 = Kippschalter |
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. 1. Wert sind die Stunden |
||
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 |
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 |