mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom: vom Sekundentakt zur Stunde


Autor: micha b (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin einfach zu blöd zum Suchen, ist bestimmt schon 100x irgendwie
erklärt worden, doch wenn man nicht weiß wonach suchen...

Problemstellung:
Um mir den externen Quarz zu ersparen gewinne ich meinen Sekundentakt
aus dem Prozessortakt über Zähler1 mit Preset usw.
Der Interrupt zählt dann in der ISR sekündlich ein LONG als
Sekundenzähler hoch.
Nun möchte ich aus dem LONG eine Stunden  Minute  Sekunde Anzeige
ausrechnen.

Könnte natürlich in der ISR auch gleich die Stunden  Minuten 
Sekunden ausrechnen lassen,

dim Sekunden as Byte , Minuten as Byte , Stunden as Byte ,
Sekundenzaehler as LONG

ISR: ' angesprungen im Sekundentakt von Zähler 1
incr sekunde
if sekunde = 60 then
  sekunde = 0
  incr minute
end if
if minute = 60 then
usw...

Da ich aber die Uhr dann auch ganz einfach stellen möchte (über einen
Taster: Incr bzw Decr Sekundenzähler) sind mir das nach Einbindung
zuviel IF in der ISR. Einfacher währe eben die Errechnung aus dem
Sekundenzähler direkt.

Aber wie?
Und gibt es einen Weg die errechneten Bytes Stunden  Minuten 
Sekunden dann in einem String zusammen zu fassen? Z.B. 19:20:07

Meine erste Idee:
Stunde = Sekundenzähler / 3600 ' ist z.B. 19,1784563864

Wie bekome ich die Stunde "Sauber" d.h. , wie mache ich aus dem
19,1.. eine 19 ?

Ich weiß, das sind absolute Basics, aber ich bin ja nicht blöd, sondern
mir fehlen nur die Grundlagen. Alles andere (mehrere ADC, Pinabfragen,
Pinansteuerungen, Ausgabe auf Farb-LCD in versch. Schriftgrößen usw)
funktionieren schon.

Danke für eure Hilfe ! ;-)

Autor: PeterK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ist nicht so schwer. Entweder zum Berechnen den Bascom Befehl Frac()
nutzen um Nachkommastellen abzuschneiden oder direkt mit Integerwerten
arbeiten, dann werden die Nachkommastellen automatisch gelöscht.
Einfach nur z.B. durch 3600 dividieren (dann verschwinden die
Nachkommastellen) und wieder mit 3600 multiplizieren und von den
Sekunden abziehen; dann bleiben nur noch die Sekunden für Minuten und
Sekunden übrig,
dann das gleiche mit 60 und die Restsekunden bleiben übrig.
Hier ein Beispiel für 14 Uhr 23 Minuten und 46 Sekunden. Der
sekundenzähler steht also auf 51826:
'-----------------------------------------------------------------
'Beispiel
'PeterK
'www.display3000.com
'
Dim Sekundenzaehler As Long , Stunden As Byte , Minuten As Byte ,
Sekunden As Byte , Temp1 As Long , Temp2 As Long

Sekundenzaehler = 51826
Temp1 = Sekundenzaehler / 3600
Stunden = Temp1
Temp1 = Stunden * 3600
Temp2 = Sekundenzaehler - Temp1

Temp1 = Temp2 / 60
Minuten = Temp1
Temp1 = Minuten * 60
Sekunden = Temp2 - Temp1

Print Stunden ; ":" ; Minuten ; ":" ; Sekunden
End
'-----------------------------------------------------------------

Allerdings noch viel einfacher aber auch langweiliger ist die Bascom
Funktion Time() !

PeterK

Autor: micha b (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
drsch

Da hätt ich auch selbst drauf kommen können... lol Danke Peter!

Kannst du mir auch sagen, wie ich das...

>> Print Stunden ; ":" ; Minuten ; ":" ; Sekunden

...in einen einzelnen String bekomme, möglichst noch mit führender Null
z.B. bei 07:03:06 Uhr morgens ?

Autor: micha b (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ach ja, der TIME() - Befehl funktioniert doch nur nach

Config Clock = soft

Geht der trotzdem, obwohl ich ja die intere Clock gar nicht nutze ....

Autor: PeterK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Time() und Clock: weiß nicht müsste ich auch erst nachlesen - das kannst
du dann auch selber :-)
Nur selber lernen macht schlau.

Formatierung: Schau dir den Befehl Format() an, der bietet, was du
brauchst. Ansonsten selber zusammenbasteln nach dem Motto
stringA = stringA + stringB

PeterK

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte doch einfacher gehen:
std = zaehl / 3600
min = (zaehl % 3600) / 60  oder  (zaehl-std*3600)/60
sek = zaehl % 60  oder zaehl-std*3600-min*60

%  modulo-Funktion  (weiß nicht, wie das in BasCom heißt)

Natürlich darf das zaehl dazwischen nicht hochgezählt werden.

Es gibt auch noch die Möglichkeit, die einzelnen Ziffern zu berechnen:

std10 =   zaehl / 36000
std01 =  (zaehl / 3600) % 10
min10 =  (zaehl % 3600) / 600
min01 = ((zaehl % 3600) / 60) % 10
sek10 =  (zaehl % 60) / 10
sek01 =   zaehl % 60

ließe sich noch weiter beschleunigen, wenn man zur Berechnung von min
und sek nur noch einen 16-bit-Wert statt eines 32-bit-Wertes verwendet
(tmp = zaehl % 3600).

daraus läßt sich leicht ein String berechnen:
zeit = chr(48+std10) + chr(48+std01) + ':' + chr(48+min10) +
       chr(48+min01) + ':' + chr(48+sek10) + chr(48+sek01)

oder wie immer das in BasCom heißen mag.
Das ruft schon nach einer For-Schleife und einem Array
chr soll den Buchstaben mit dem Ascii-Wert von 48+x, also die Ziffern 0
.. 9 berechnen.

Alles ohne Gewähr, habe das aus dem Stegreif ohne Kontrolle
geschrieben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.