- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Uhrzeit h:m:s in BASCOM auf LCD darstellen?

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Anzeige

    Praxistest und DIY Projekte
    Kann man die Zeit nicht einfach als "Uhrzeit" ausgeben also 00:00:00???

    z.B. so in etwa:
    Code:
    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!!!
    
    Do
    Uhr = Time(sekunden)                                        'konvertierung der Uhrzeit
    Loop
    
    Print "Uhrzeit" ; Uhr
    war so ne Idee,

    Tobi
    ...

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Tobi!
    Ich hab Deinen Vorschlag mal geladen, da geht nix. Macht aber nix, denn meine Anzeige funktioniert ja inzwischen wunderbar auch wenn's etwas umständlich gemacht ist.

    Deines hab ich mir trotzdem mal abgespeichert.
    Ich werde es mir bei Gelegenheit nochmal genauer ansehen.
    Das mit den Bascom Uhrzeitbefehlen hatte ich schon mal über Weihnachten probiert und nicht hinbekommen.

    Danke für die Mühe.
    Gruß
    Hans

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    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
    ...

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Tobias!
    Genau sowas habe ich gesucht. Ich hab mir ein paar Teile von Dir in mein Programm eingebaut und angepasst. => es geht! Super!!
    Auch Deine Struktur gefällt mir, das werde ich ab jetzt auch so machen.
    Danke auch für die Erklärungen die Du dazu geschrieben hast.
    Gruß
    Hans

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Das freunt mich - ich find das auch besser als irgendwelche zusammenhangslose Codeschnipsel - die schwer zu verstehen sind

    PS: ich hoffe die Uhr läuft jetzt auch
    ...

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Das freut mich - ich find das auch besser als irgendwelche zusammenhangslose Codeschnipsel - die schwer zu verstehen sind

    PS: ich hoffe die Uhr läuft jetzt auch
    ...

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    ups - dumm gelaufen - schade
    ...

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Ja die läuft prima!
    Danke nochmal.
    Gruß
    Hans

  9. #19
    Unregistriert
    Gast

    Uhr läuft nicht richtig

    hallo habe das 2 Programm zum laufen gekriegt.
    Benutz myAVR Board mit Atmega 8A
    3,6864 MHz.
    habe das Programm laufen und die Uhrzeit , zeigt 9:47:45 und es real 10:20
    wie kann man das so schreiben das die Sekunden richtig laufen

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Hans,

    noch eine Anmerkung:

    Code:
     If Minuten = 60 Then
          Minuten = 0
          Incr Stunden
      End If
    Ist schlechter Programmierstil und unsicher!

    Stell dir vor, Minuten hat den Wert 61.
    So etwas kann immer mal durch eine Störung auftreten.
    Wird jetzt noch eine 32-Bit Datentyp verwendet, dauert es Jahrhunderte bis zum Overflow auf 0.

    Man sollte also immer
    Code:
     If Minuten => 60 Then
          Minuten = 0
          Incr Stunden
      End If
    oder
    Code:
     If Minuten > 59 Then
          Minuten = 0
          Incr Stunden
      End If
    verwenden!

    Wie ich gesehen habe, wurde es in den anderen Code-Beispielen richtig gemacht.

    Solche Details machen den Unterschied zwischen stabilen Programmen und den anderen, mit unerklärlichen Abstürzen aus.
    Man sollte immer damit rechnen, dass auch einmal Störungen auftreten können oder das ein Modul mit falschen, ungültigen Parametern aufgerufen wird. In solchen Fällen sollte das Programm nicht gleich abstürzen, sondern irgendwie wieder auf die Füsse fallen!

    Hier ein sehr bekanntes Beispiel, welches die Ursache darin hatte, dass man bewährte Software verwendet hat:
    http://www4.in.tum.de/lehre/seminare...g-27-11-02.pdf

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test