Hallo,
hatte mal zum testen eine "Datenlogger" gebaut um Daten nur mal so - eben schnll zu speichern. Und da hab ich die Uhr drinn - und die funktioniert!
kannst ja mal das Prog laden:
Code:
'Stommessung mit AT MEGA 8 0/4-20mA A/D Wandler
'Version 0.1 (22.12.2007 fertiggestellt)
'1 Analogeingang mit 4*1kOhm paralell=250 Ohm -> 0-20mA = 0-5V = 0-100%
'Uhr
'Led 1 an PB0 blinkt im Sekundentakt
'Led 2 an PB2 leuchtet in dem Moment wenn ein Wert gespeichert wird
'Led 3 an PB2 leuchtet in dem Moment wenn die Werte gesendet werden
'Taster an PC3 um Daten zu senden (Widerstand auf +5V / Taster auf Masse)
'
'Version 0.2
'mit LCD Ausgabe
'Uhrzeit im richtigem Format 00:00:00
'Uhrzeit über PC4 und PC5 einstellbar
'Startzeit wird beim auslesen mitgesendet (Variable Uhr_Speicher)
'in der Variable Uhr_Speicher wird die Uhrzeit gespeichert die beim Zählerstand 0 aktuell war
'also erst Uhr stellen und dann Speicher auslesen um die Variable Zähler auf 0 zu setzen und die aktuelle Uhrzeit zu speichern
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud
'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'TIMER
On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren
Config Timer1 = Timer , Prescale = 1024 '3686400Hz/1024=3600Hz
Enable Timer1
Timer1 = 61935 'Sofort Timer1-Überlauf (Bei 16 Bit: 65535+1=0)
Enable Interrupts
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B111111 '1 Ausgang, 0 Eingang = Pin PB5-0 als Ausgang
Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang
'-------------------------------------------------------------------------------
'LCD konfiguration
Config Lcd = 20 * 4 'LCD größe
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , Rs = Portd.6 , E = Portd.7
Cursor Off Noblink
'-------------------------------------------------------------------------------
' Variablen
Dim Analog_in0 As Word '=0-1023 vom Analogeingang
'Timer
Dim Sekunden As Byte , Minuten As Byte , Stunden As Byte 'ganz wichtig alles zusammen in eine Zeile!!!!
Dim Uhr As String * 8 'zum konvertieren in 00:00:00
Config Clock = Soft 'um die Uhrkonvertierung einzustellen!!!
Dim Sekunden_alt As Byte 'um Veränderungen zu merken
Dim Uhr_speicher As String * 8 'um startzeit zu speichern
'Speicherplätze
Dim Zähler As Word 'zum Werte hochzählen
Dim Merker As Bit 'Werte speichern: damit nur um 1 hochgezählt wird
Dim Wert(450) As Word 'speichern des eigendlichen Wertes (470Werte?)
'Umrechnung in Liter
Dim Liter As Integer
Dim Liter1 As Single
'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------
Zähler = 0 'damit mit Wert1 angefangen wird und nicht mit Wert0 (0 könnte Fehler geben)
Merker = 0 'Werte speichern: damit nur um 1 hochgezählt wird
Do
Uhr = Time(sekunden) 'konvertierung der Uhrzeit
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'Analogeingänge Auslesen:
Analog_in0 = Getadc(0) 'Wert aus Analogeingang0 laden
'-------------------------------------------------------------------------------
'Merker zurücksetzen
If Minuten = 1 Then 'damit jeder Wert nur einmal gespeichert wird
Merker = 0 'Hilfsmerker wird beim speichern gesetzt und hier zurückgesetzt
End If
'---
If Minuten = 16 Then
Merker = 0
End If
'---
If Minuten = 31 Then
Merker = 0
End If
'---
If Minuten = 46 Then
Merker = 0
End If
'-------------------------------------------------------------------------------
'Analogwert umrechnen in Liter
Liter1 = Analog_in0 * 4.80938416422287
Liter = Liter1 - 984
'-------------------------------------------------------------------------------
'Startzeit speichern:
If Zähler = 0 Then
Uhr_speicher = Uhr
End If
'-------------------------------------------------------------------------------
'Werte Speichern alle 15 min:
If Minuten = 0 And Merker = 0 Then 'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
Incr Zähler 'Zähler für die nächste Speichervariable hochzählen
Toggle Portb.2 'Led bei Speicherung umschalten
Wert(zähler) = Liter 'umgerechneten Analogwert in Speicher (WertX) übertragen
Merker = 1 'Hilfsmerker setzen
Print "Zähler: " ; Zähler ; " = " ; Wert(zähler) 'aktuellen Zähler mit Wert anzeigen
End If
'---
If Minuten = 15 And Merker = 0 Then 'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
Incr Zähler 'Zähler für die nächste Speichervariable hochzählen
Toggle Portb.2 'Led bei Speicherung umschalten
Wert(zähler) = Liter 'umgerechneten Analogwert in Speicher (WertX) übertragen
Merker = 1 'Hilfsmerker setzen
Print "Zähler: " ; Zähler ; " = " ; Wert(zähler) 'aktuellen Zähler mit Wert anzeigen
End If
'---
If Minuten = 30 And Merker = 0 Then 'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
Incr Zähler 'Zähler für die nächste Speichervariable hochzählen
Toggle Portb.2 'Led bei Speicherung umschalten
Wert(zähler) = Liter 'umgerechneten Analogwert in Speicher (WertX) übertragen
Merker = 1 'Hilfsmerker setzen
Print "Zähler: " ; Zähler ; " = " ; Wert(zähler) 'aktuellen Zähler mit Wert anzeigen
End If
'---
If Minuten = 45 And Merker = 0 Then 'nur speichern, wenn hilfsmerker bereits zurückgesetzt wurde
Incr Zähler 'Zähler für die nächste Speichervariable hochzählen
Toggle Portb.2 'Led bei Speicherung umschalten
Wert(zähler) = Liter 'umgerechneten Analogwert in Speicher (WertX) übertragen
Merker = 1 'Hilfsmerker setzen
Print "Zähler: " ; Zähler ; " = " ; Wert(zähler) 'aktuellen Zähler mit Wert anzeigen
End If
'-------------------------------------------------------------------------------
'Werte über RS232 Senden:
If Pinc.3 = 0 Then 'Wenn Taster gedrückt
Portb.3 = 1 'Led "EIN" Daten werden gesendet
Print "Startzeit: " ; Uhr_speicher 'Startzeit senden
'Zeit ausgeben:
For Zähler = 1 To 450 Step 1 'Zähler hochzählen um jede Variable (WertX) zu senden
Print "Wert " ; Zähler ; ": " ; Wert(zähler) 'WertX senden
Waitms 2 'kurze Warte
Next 'wiederholen, bis alle Variablen gesendet wurden
'Variablen löschen:
For Zähler = 1 To 450 Step 1 'Zähler hochzählen um jede Variable (WertX) zu senden
Wert(zähler) = 0 'WertX löschen
Waitms 1 'kurze Warte
Next
Zähler = 0 'Zähler auf 0 zurücksetzen
Else 'wenn alle Variablen gesendet und gelöscht wurden
Portb.3 = 0 'Led "AUS" kein Daten Senden
End If
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'UHR einstellen:
'Minuten +
If Pinc.4 = 0 And Minuten <= 59 Then
Minuten = Minuten + 1
Waitms 300
End If
'Stunden+
If Pinc.5 = 0 And Stunden <= 23 Then
Stunden = Stunden + 1
Waitms 300
End If
Gosub Ausgabe
Loop
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
'Uhrzeit erstellen
Ontimer1overflow: 'Timer1-Interruptroutine
'Nächster Überlauf soll in einer Sekunde sein:
Timer1 = 61936 'Überlauf nach 65535, also: 65535+1-3600=61936
Incr Sekunden
If Sekunden >= 60 Then
Sekunden = 0
Incr Minuten
End If
If Minuten >= 60 Then
Minuten = 0
Incr Stunden
End If
If Stunden >= 24 Then
Stunden = 0
End If
Toggle Portb.0 'blink LED zum testen im Sekundentakt
Return
Ausgabe:
'LCD AUSGABE:
If Sekunden_alt <> Sekunden Then
Cls 'Display löschen (IMMER ERST LCD LÖSCHEN UND DANN POSITION ANGEBEN!!!)
Locate 1 , 1
'Lcd "Uhrzeit: " ; + Str(stunden) ; ":" ; + Str(minuten) ; ":" ; + Str(sekunden)
Lcd "Uhrzeit: " ; Uhr
Locate 2 , 1
Lcd "Merker doppelt: " + Str(merker) ;
Locate 3 , 1
Lcd "Wert " + Str(zähler) ; ":" + Str(wert(zähler)) ;
Locate 4 , 1
Lcd "Liter: " + Str(liter) ;
'RS232 AUSGABE:
'Infos nur über RS232 senden, wenn nicht gerade die gespeicherten Daten gesendet werden
If Portb.3 = 0 Then 'WENN Led "AUS" also keine Daten gesendet werden
Print "Zeit: " ; Uhr 'Uhrzeit senden
Print "Analog_in0: " ; Analog_in0 'Analog Eingangswert senden
Print "Liter: " ; Liter 'umgerechneter Analogwert
End If
Sekunden_alt = Sekunden
End If
Return ' wichtig
'===============================================================================
'Pinbelegung µC 4-20mA
'===============================================================================
' AT MEGA 8
'PD0 = RXD +---U---+
'PD1 = TXD Reset PC6 +1 28+ PC5 Taster1 (links)
'PD2 = Freigabe RXD PD0 +2 27+ PC4 Taster2 (mitte)
'PD3 = TXD PD1 +3 26+ PC3 Taster3 (rechts)
'PD4 = Freigabe PD2 +4 25+ PC2
'PD5 = PD3 +5 24+ PC1 (ADC1) 4-20mA von Freelance
'PD6 = LCD / DB7 PD4 +6 23+ PC0 (ADC0)
'PD7 = LCD / E Vcc +7 22+ GND
'PB0 = LCD / RS GND +8 21+ AREF
'PB1 = PWM / Motor PB6 +9 20+ AVCC
'PB2 = LCD / DB6 PB7 +10 19+ PB5
'PB3 = LCD / DB5 PD5 +11 18+ PB4 / LCD / DB4
'PB4 = LCD / DB4 / LCD / DB7 PD6 +12 17+ PB3 / LCD / DB5
'PB5 = / LCD / E PD7 +13 16+ PB2 / LCD / DB6
'PB6 = / LCD / RS PB0 +14 15+ PB1 / OC1 / PWM MOTOR
'PB7 = +-------+
'PC0 = (ADC0)
'PC1 = (ADC1) 4-20mA von Freelance
'PC2 =
'PC3 = Taster3
'PC4 = Taster2
'PC5 = Taster1
'PC6 =
'PC7 =
'===============================================================================
'Pinbelegung AM LCD!!!!!!! ACHTUNG!!!!!
'===============================================================================
'Pin 1: GND
'Pin 2: +5V
'Pin 3: Kontrast (0-5V)
'Pin 4: RS -> AVR
'Pin 5: R/W -> GND (read/write mode, nur writen)
'Pin 6: E -> AVR
'Pin 7-10: -> GND
'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7
'Pin 15-16: Beleuchtung
Lesezeichen