Zeit ohne Sekunden ?

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
kann man bei eine Realzeit (DS1307) anzeige die die Zeit auch ohne die Sekunden anzeigen lassen, so einfach mit die Sekunden hinten weglassen bei der Time$ = "14:40" ist es nicht.

Gruß micha
 
Hallo Micha!

Prinzipiell geht das ganz einfach.

In dem Moment, in dem du die Softclock in BASCOM aktivierst und konfigurierst, werden "intern" mehrere Variablen für die Uhr erzeugt.

Die Bekannteste ist wohl:


CodeBox Bascom

Time$ = ' (ist eine fertige Stringvariable) !


Es gibt aber noch die einzelnen Variablen:
_hour = enthält nur die Stunden
_min = enthält nur die Minuten
_sec = enthält nur die Sekunden

Wenn du also nun nur die Stunden und Minuten anzeigen lassen möchtest, dann gibst du nur die betroffenen Variablen aus.
Zum Beispiel:


CodeBox Bascom

LCD _hour ":" _min ' ergibt 0:0 als Anzeige


Damit aber immer 00:00 angezeigt wird, musst du die einzelnen Variablen noch in Strings wandeln und formatieren.

Zum Beispiel:


CodeBox Bascom

Sec_s = Str(_sec)
Sec_s = Format(sec_s , "00")

Min_s = Str(_min)
Min_s = Format(min_s , "00")

Std_s = Str(_hour)
Std_s = Format(std_s , "00")


Danach kannst du mit:


CodeBox Bascom

Lcd Std_s ":" Min_s ' ergibt 00:00 als Anzeige


Ich denke mal, du bekommst den Rest nun selbst zusammen. ;)

Gruß,
Cassio
 
Hallo Cassio,
danke, hat funktioniert, man müsste nur noch die Doppelpunkte zwischen die Zahlen blinken lassen :D

Gruß micha
 
Hi Micha !

Ist doch kein Thema, mit den blinkenden Doppelpunkten.

Du hast doch mit Aktivierung der Softclock die "Sectic" Subroutine.
Die "Sectic" wird automatisch jede Sekunde einmal aufgerufen.
Dort toggelst du eine Variable:
Zum Beispiel
Code:
Dim Puls As Bit
....

Sectic:
Toggle Puls
Return

Nur wird die Variable jede Sekunde gewechselt..... hat also mal "1" oder "0" !

Jetzt musst du das nur so ins Programm einbauen, dass bei einer "1" die Doppelpunkte angezeigt werden und bei einer "0" ausgeblendet.

Nun lass ich dich aber mal selber weiter knobeln.... ;)


Freue mich dann auf eine positive Rückmeldung und den zugehörigen kleinen Code mit kurzer Erklärung. :)

Gruß,
Cassio
 
Hallo Cassio,
ich habe mir das so vorgestellt wie du im Programm siehst, aber ich glaube der Togglet nicht , die anzeige bleibt immer ohne die Doppelpunkte, normaler weise müsste es so funktionieren.

gruß micha

Code:
Do

Setfont Font16x16
 If Puls = 1 Then
 Lcdat 1 , 20 , Std_s ; ":" ; Min_s ; "" , 0
 Elseif Puls = 0 Then
 Lcdat 1 , 20 , Std_s ; " " ; Min_s ; "" , 0

 End If

 Setfont Font8x8
 Lcdat 3 , 25 , Date$ , 0
 Lcdat 4 , 1 , " " , 0


'##################################

      Sec_s = Str(_sec)
      Sec_s = Format(sec_s , "00")

      Min_s = Str(_min)
      Min_s = Format(min_s , "00")

      Std_s = Str(_hour)
      Std_s = Format(std_s , "00")
 
Loop
End

Sectic:
Toggle Puls
Return
 
Hallo Micha!

Ja, super.... der Ansatz ist OK! :)

Natüich führen viele Wege nach Rom und ich hätte es etwas anders gemacht... letztlich kommt aber das Gleiche bei raus. ;)

Du hast ja nun die Variable "Puls", die jede Sekunde den Wert wechselt.
Damit würde ich eine kleine IF-ELSE Abfrage machen und eine weitere Stringvariable mit "stellen"

Also zum Beispiel so:
Code:
Dim Dp_s As String * 1

....

If Puls = 1 Then
Dp_s = ":"
Else
Dp_s = " "
End If

Ach so... es reicht ein IF-THEN-ELSE.... nicht ein IF-THEN/ELSEIF-THEN !
Entweder ist die Variable 1.... dann sollen die Doppelpunkte erscheinen, oder sie ist 0, dann sollen sie nicht erscheinen.
Einen anderen Zustand gibt es nicht! Darum brauchst du auch kein ELSEIF ! ;)

Nun musst dies nur noch VOR dem Code deiner Anzeige einstellen!

Dein (Grafik)Display kannst du dann immer mit den SELBEN drei Variablen ansteuern:
Code:
Lcdat 1 , 20 , Std_s ; Dp_s ; Min_s , 0

Das sollte eigentlich funktionieren!

Kannst es ja mal probieren!

Ach so.....
Wenn du dich nun fragst, warum denn nun diese olle Variable mit "Puls".... denn du kannst ja die "DP_s" Variable gleich in der Sectic ändern lassen!
Damit hast du in der Hauptschleife eine Variable, die du auch für andere Dinge nutzen kannst... z.B. ein Port im Sekundentakt toggeln lassen, einen Zähler auf- oder abzählen lassen usw. .......und die Secticroutine bleibt immr schön kurz! ;)

Probiere es doch mal, wie oben gezeigt.
Es gibt aber auch noch andere Möglichkeiten und deine sollte mit IF-ELSE eigentlich auch funktionieren.

Gruß,
Cassio
 
Hi Cassio,
habe es so mal versucht wie du es meinst, aber auch keine Veränderung ich denke immernoch das Toggle nicht Toggelt ;) warum auch immer, es hätte auch so funktionieren müssen, wie ich es schon hatte, denke ich, hm seltsam.

gruß micha

Code:
Dim Puls As Bit
Dim Dp_s As String * 1

Time$ = "18:45:00"
Date$ = "15.01.10"

Do

If Puls = 1 Then
Dp_s = ":"
Else
Dp_s = " ";End
Iff


Setfont Font16x16
Lcdatt 1 , 20 , Std_s ;Dpp_s ; Min_s , 0

     Setfont Font8x8
    Lcdatt 3 , 30 ,Datee$ , 0
    Lcdatt 4 , 1 , "W " ; T4 , 0
    Lcdatt 4 , 65 , "OL " ; T5 , 0


     Secc_s =Strr(secc)
     Secc_s = Formatsecc_s , "00")

      Min_s =Strr(_min)
      Min_s = Format(min_s , "00")

      Std_s =Strr(hourr)
      Std_s = Formatstdd_s , "00")


LoopEnd
nSectic

tic:
Toggle Return
eturn
 
Hi Micha!

Ich denke, in deinem Code gab es wohl Probleme beim Kopieren.
So wie er nun aussieht, würdest du den gar nicht erst kompiliert bekommen.... sondern nur Fehlermeldungen von BASCOM ernten! ;)

Ob der "Toggle" auch wirklich toggelt kannst du doch mit einer LED an einem Ausgang überprüfen.

Code:
If Puls = 1 Then
PortX.Y = 1
Else
PortX.Y = 0
End If

Schon hast du die Sicherheit, ob dein Puls auch wirklich toggelt. :)


Ach so....
Ich sehe gerade, du nimmst nicht DCF77, sondern einfach nur die Softclock. :eek:
Dann musst du natürlich erst noch "Gosub = Sectic" oben bei "Config Clock" mit anhängen! Sonst geht es auch nicht! ;)

Also:
Code:
Config Clock = Soft , Gosub = Sectic

Habe ich mit der Vermutung recht gehabt?

Gruß,
Cassio
 
Hi Cassio,
ja das ist wohl beim kopieren passiert,
ich habe nicht den kompletten Code eingesetzt, es reicht doch nur der teil.
Ich habe es schon probiert mit den Port der blinken soll, zum probieren ob sectik geht oder nicht, aber die LED macht auch nichts.

gruß micha

Code:
Config Clock = User , Gosub = Sectic                        ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .



Dim Sec_s As String * 2
Dim Min_s As String * 2
Dim Std_s As String * 2

Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()

Dim Puls As Bit
Dim Dp_s As String * 1

Time$ = "18:45:00"
Date$ = "15.01.10"

Do

Gosub Temperatur

If Puls = 1 Then
Dp_s = ":"
Else
Dp_s = " ";End
Iff


Setfont Font16x16


Lcdatt 1 , 20 , Std_s ;Dpp_s ; Min_s , 0

     Setfont Font8x8
    Lcdatt 3 , 30 ,Datee$ , 0
    Lcdatt 4 , 1 , "W " ; T4 , 0
    Lcdatt 4 , 65 , "OL " ; T5 , 0


     Secc_s =Strr(secc)
     Secc_s = Formatsecc_s , "00")

      Min_s =Strr(_min)
      Min_s = Format(min_s , "00")

      Std_s =Strr(hourr)
      Std_s = Formatstdd_s , "00")

     Iff Puls = 1Thenn
     Portcc.3 = 1
     Elsee
     Portcc.3 = 0
     EnddIff
LoopEnd
nSectic

tic:
Toggle Return
eturn
 
ich habe nicht den kompletten Code eingesetzt, es reicht doch nur der teil.


Hallo Micha!

Das ist leider oft ein Irrglaube!

So kann ich immer nur Teile des Programms sehen und weiß nicht, wie sie wirklich eingebunden sind!

Ist immer ein bisschen wie Fischen im Trüben. :cool:

Wenn also nun nichts passiert, muss der Fehler irgendwo anders liegen....
Sei es nun im Programm, oder in der Hardware.

Theoretisch hast du alle Infos, die dir die Funktion ermöglichen müsste!

Tja, entweder stellst du doch noch den ganzen Code hier ein, oder du suchst selbst noch mal nach dem Fehler. ;)

Gruß,
Cassio
 
ja das stimmt schon was du sagst mit den Code.
so, nun funktioniert es so wie ich es gemacht habe und nun den ganzen Code noch mal.

gruß micha

Code:
$regfile = "m16def.dat"
$crystal = 8000000                                          '
$hwstack = 128                                              '
$swstack = 128                                              '
$framesize = 128


$lib "glcdSED1520.lib"

Config Graphlcd = 120 * 64sed , Dataport = Porta , Controlport = Portd , Ce = 5 , Ce2 = 6 , Cd = 3 , Rd = 4

Cls
Waitms 10
                                                   'Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on
Config 1wire = Portc.2

Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte

Dim Id3(8) As Byte
Dim Id4(8) As Byte
Dim 1ar1(9) As Byte
Dim 1ar2(9) As Byte

Config Portc.3 = Output


Config Sda = Portc.1                                        ' I2C Bus konfigurieren
Config Scl = Portc.0
Const Ds1307w = &HD0                                        ' Addresse der Ds1307 Uhr
Const Ds1307r = &HD1

Config Clock = User , Gosub = Sectic                        ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .



Dim Sec_s As String * 2
Dim Min_s As String * 2
Dim Std_s As String * 2

Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()

Dim Puls As Bit
Dim Dp_s As String * 1

Time$ = "18:45:00"
Date$ = "17.01.10"

Do

Gosub Temperatur




Setfont Font16x16


 Lcdat 1 , 20 , Std_s ; Dp_s ; Min_s , 0

     Setfont Font8x8
     Lcdat 3 , 30 , Date$ , 0
     Lcdat 4 , 1 , "W " ; T4 , 0
     Lcdat 4 , 65 , "OL " ; T5 , 0


      Sec_s = Str(_sec)
      Sec_s = Format(sec_s , "00")

      Min_s = Str(_min)
      Min_s = Format(min_s , "00")

      Std_s = Str(_hour)
      Std_s = Format(std_s , "00")

      If Puls = 1 Then
       Dp_s = ":"
      Else
       Dp_s = " "
      End If
      Toggle Puls

Loop
End

'Sectic:
'Toggle Puls
'Return



Dim Weekday As Byte
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) :
   _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) :
  _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return

End

Temperatur:

1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
      Tmp = Ar1(1) And 1
      If Tmp = 1 Then Decr Ar1(1)
      T = Makeint(ar1(1) , Ar1(2))
      T = T * 50
      T = T - 25
      T1 = Ar1(8) - Ar1(7)
      T1 = T1 * 100
      T1 = T1 / Ar1(8)
      T = T + T1
      T = T / 10
      T6 = T / 10
      T4 = Fusing(t6 , "#.#")

Waitms 500
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
      Tmp2 = Ar2(1) And 1
      If Tmp2 = 1 Then Decr Ar2(1)
      T2 = Makeint(ar2(1) , Ar2(2))
      T2 = T2 * 50
      T2 = T2 - 25
      T3 = Ar2(8) - Ar2(7)
      T3 = T3 * 100
      T3 = T3 / Ar2(8)
      T2 = T2 + T3
      T2 = T2 / 10
      T7 = T2 / 10
      T5 = Fusing(t7 , "#.#")



1wreset
1wwrite &H55
1wwrite Id3(1) , 8
1wwrite &H44

Waitms 300


Return




                                                         '
$include "font8x8.font"
$include "font16x16.font"
 
so, nun funktioniert es so wie ich es gemacht habe und nun den ganzen Code noch mal.

Hallo Micha!

Also funktioniert es nun?
Na, dann ist doch alles bestens! :)

Wenn ich mir deinen Code so ansehe, dann hätte ich aber die "Einstellungen" VOR der Ausgabe auf dem Display gemacht! ;)

Ach so....
Du toggelst jetzt den Puls "manuell" in der Hauptschleife. :eek:

Eigentlich müssten die Doppelpunkte nun aber "unregelmäßig" bzw. nicht genau im Sekundentakt blinken, oder?
Wenn sie trotzdem im Sekundentakt blinken, dann hast du ein zeitliches "Problem".... weshalb auch die Sectic nicht richtig ausgeführt werden kann.

Vielleicht liegt es am I2C und der DS1307?
Sorry, aber damit habe ich leider keine Erfahrung!

Gruß,
Cassio


Beispielcode, nach Umstellung:
Code:
Do

Gosub Temperatur

      Sec_s = Str(_sec)
      Sec_s = Format(sec_s , "00")

      Min_s = Str(_min)
      Min_s = Format(min_s , "00")

      Std_s = Str(_hour)
      Std_s = Format(std_s , "00")

      If Puls = 1 Then
       Dp_s = ":"
      Else
       Dp_s = " "
      End If


Setfont Font16x16

 Lcdat 1 , 20 , Std_s ; Dp_s ; Min_s , 0

     Setfont Font8x8
     Lcdat 3 , 30 , Date$ , 0
     Lcdat 4 , 1 , "W " ; T4 , 0
     Lcdat 4 , 65 , "OL " ; T5 , 0

Loop

Sectic:
Toggle Puls
Return

[B]End[/B]
 
ja gut, die Einstellungen habe ich noch nach oben gesetzt.
Ob das blinken nun hundert Prozentich genau ist kann ich nicht sagen, von der Schätzung her ist es schon recht gleichmäßig.
Ich werde es mal so eine weile beobachten, was die zeit so sagt.

gruß micha
 
Hallo Micha!

Was mir eben erst aufgefallen ist....
Code:
Config Clock = [B]User[/B] , Gosub = Sectic ' Interne Time/Date Routinen für Bascom konfigurieren 
Config Date = Dmy , Separator = .

Ich denke mal, da liegt der Hund begraben.

Soweit ich mich erinnern kann bedeutet die Einstellung "User", dass du alles von Hand machen musst.

Da du einen DS1307 benutzt, aktualisierst du deine ganzen Zeit- und Datumsvariablen mit der externen Uhr.

Das wird dann vielleicht auch der Grund sein, warum der Zusatz "Gosub = Sectic" nicht funktioniert. :hmmmm:

Kannst du die Einstellung nicht auf "Config Clock = Soft" ändern und mit deinem DS1307 nur jede Minute (oder ggf. auch Sekunde) die "internen" Uhr- und Datumsvariablen überschreiben?
Das müsste doch auch gehen, oder? :hmmmm:
Dann hättest du zu mindest schon mal alles fertig von BASCOM einrichten lassen. ;)

Wie aber schon geschrieben.... ich habe mit dem DS1307 noch nicht gearbeitet.

Grüße,
Cassio
 
Hi Cassio,
diese Einstellung "Config Clock = Soft" hatte ich gestern schon, da lauft die zeit dann nicht weiter :eek:
Sie Tikert nun ein Tag genau auf die Minute wie der PC, sollte doch so funktionieren dann, oder.
Aber mal zurück zu kommen auf die DCF77 welche ist eigentlich gut für Bascom geeignet ? und empfängt sie auch durch ein Aluminiumgehäuse ? ich weiß, blöde frage, aber nun ja.

Gruß micha
 
Hallo Micha!

So ganz habe ich deine Ausführungen da oben nun nicht verstanden, aber sei es drum....

Wie schon erwähnt, habe ich immer nur mit der fertigen Softclock, oder dem DCF77 gearbeitet. Ein DS1307 ist mir bis heute noch nicht unter gekommen.

Welches DCF77-Modul du dir besorgst ist eigentlich egal. Sie unterscheiden sich höchstens am Ausgang des Signals.... "normal" oder invertiert.

Ich habe bis jetzt mit Modulen von Reichelt und Pollin gearbeitet und beide funktionieren bestens.
Na, OK, das Reichelt-Modul ist um einiges teurer, als das von Pollin, ist bei mir aber auch schon defekt.
Die Pollin-Module sind günstig und arbeiten bei mir seit Monaten einwandfrei.
Schau einfach mal HIER !

Wie du die Module betreibst und wie dann der Code in BASCOM dazu aussieht, ist hier im Forum schon einige Male beschrieben worden.
Such einfach mal nach den Begriff DCF77. ;)

Gruß,
Cassio
 
Hallo,

und empfängt sie auch durch ein Aluminiumgehäuse ? ich weiß, blöde frage, aber nun ja.
Wie war das mit dem Handyempfang im Aufzug ? Wie ist das mit nem Faraday-Käfig ?
Schon mal Radioempfang in ner Blechdose gehabt ? :D :rolleyes:
Ich glaube das erklärt alles zu deine Frage ;)

Gruß
Dino
 
Hi dino,
ja das konnte ich mir auch so denken, aber Blechbüchse (Eisen) Aufzug (Eisen), aber Aluminium ist nun wieder mal ein NE Metall, ich hab doch gleich gesagt ist eine doofe frage :rolleyes:
Nun frage beantwortet, daher werde ich bei den DS1307 beiben müssen, muss nur mal sehen wo es eingeschrieben wird, wen von Hand über Taster die zeiteinstellung gemacht wird.

Gruß micha
 
Hi Micha,

ja das konnte ich mir auch so denken, aber Blechbüchse (Eisen) Aufzug (Eisen), aber Aluminium ist nun wieder mal ein NE Metall, ich hab doch gleich gesagt ist eine doofe frage :rolleyes:
Naja es sind ja eigentlich Elektro-Magnetische-Wellen. Also mit einem E-Feld
und einem Magnetischen Feld. Bei Langwellen/Längstwellen so um die 77,5kHz
(DCF77) ist der magnetische Anteil bestimmt schon ziemlich hoch und als
Antenne wird ja auch ne Spule auf nem Ferritstab verwendet. Da ich mich
aber mit diesem Funk-Kram nicht so stark auskenne würde ich dafür nicht die
Hand ins Feuer legen :D Aber die Wahrscheinlichkeit das es auch von ner
Alu-Büchse abgeschirmt wird ist doch sehr hoch. Hab ich mich aber noch nicht
direkt mit befaßt. Also einfach mal ohne und mal mit probieren und dann sieht
man es ja ;)

Gruß
Dino
 
Hallo dino,
ja werde ich mal ausprobieren wen ich mal ein Aufbau mit der DCF77 mache, aber ich verwende lieber den DS1307 für meine Zwecke.
Kan mir jemand erklären was ich in den Code rein nehmen muss, wen ich diese über Tastern einstellen möchte, er nimmt es nicht an, wen ich das einfache Menü verwende, ist ja auch klar.
Code:
einfache Menü
Zeit:

Cls                                                                                      
Do
    Lcdat 1 , 1 , "Set Hour:"
                                                          
    Lcdat 2 , 1 ,(_hour)
    Incr _hour 
    If Tast2 = 0 Then                                      
                                                                   
        Lcdat 2 , 1 , 0
        Lcd Makebcd(_hour)
        Waitms 100
    End If
    If Makebcd(_hour) > 23 Then
        Cls
    _hour = 00
    End If                                                  
Loop Until Tast1 = 0
Waitms 200

ich vermute es mal, es liegt mit dieser Zuweisung "I2cwbyte Ds1307w " zusammen, in Getdatetime:.
Hat jemand schon ein DS1307 über Tasten versucht ein zu stellen ?

Gruß micha
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)