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