Forum: Mikrocontroller und Digitale Elektronik uhr richtig anzeigen lassen 00:00


von basti (Gast)


Lesenswert?

Hallo ich habe ein kleines problem und zwar möchte ich eine 
zeitschaltuhr bauen die uhrzeit kriege ich mit dem dcf das klappt auch 
schon. Jetzt habe ich mir für die zeit 2 variabel erstellt minute und 
stunde als byte wenn ich jetzt aber lcd stunde ; ":"  ; minute dann wird 
bei 00:00 nur 0:0 angezeigt das will ich aber nicht was muss ich machen 
das das klappt ? Sorry für die schreibweise habe gerade nur ein handy 
mit internet

von H.Joachim S. (crazyhorse)


Lesenswert?

Welche Ausgabe/Konvertierfunktion benutzt du?

von Achim M. (minifloat)


Lesenswert?

hallo ich habe ein problem ich sitze oft vorm rechner und bin in diesem 
forum dem mikrocontroller net unterwegs da kommt dann immer plötzlich so 
ein posting wo keine satzzeichen verwendet werden und kleinschreibung 
das einzige ist was es gibt...

Tipp: Wenn es printf ist, dann könnte %2d eventuell helfen, da es auch 
einstellige Zahlen auf zwei Ziffern aufpustet.

mfg mf

PS: Ich werde mir kein Smartphone kaufen, bis nicht eine einfandfreie 
Eingabe eines Satzes nach den geltenden deutschen Sprachregeln des 
geschriebenen Wortes möglich ist.

von Stephan H. (stephan-)


Lesenswert?

eine "Vornullunterdrückung" wäre schön.! 0:00

von Interessent (Gast)


Lesenswert?

Wenn die Stunde und Minute dez oder Hex Null sind wird nur 0 : 0 
angezeigt.
Warum übernimmst du nicht die Variablen-Werte der Uhr, die sind doch im 
passenden Format?

von basti (Gast)


Lesenswert?

Nein weder noch kenne sowas noch nicht deshalb frage ich ja was ich 
machen kann

von Oliver J. (skriptkiddy)


Lesenswert?

1
sprintf(buffer, "%2i:%02i", stunde, minute);

Gruß Oliver

von Ottmar K. (wil1)


Lesenswert?

Überprüfe mal Deine Dezimalzerlegung der Uhrzeit. Grundsätzlich brauchst 
Du ja nur dieses Ausgabeformat ans LCD:
Stunde_Zehner Stunde_Einer : Minute_Zehner Minute_Einer
(natürlich als Ascii-Code).
Wenn Du jedoch ausgibst
Stunde:Minute,
Dann ist Null Stunden eben nur 0 und nicht 00.
Gruss Ottmar

von holger (Gast)


Lesenswert?

>sprintf(buffer, "%2i:%02i", stunde, minute);

Ich mach das immer so:

sprintf(buffer, "% 2i:%02i", stunde, minute);

von Ottmar K. (wil1)


Lesenswert?

Hallo basti,
Du solltest wohl mitteilen ob Du in C oder Assembler 
programmierst,nebenbei wäre auch noch der Typ des µC interessant. Du 
bekommst sonst Ratschläge in C Kobol, Assembler C++ Basic usw.. :-)
mfG Ottmar

von Oliver J. (skriptkiddy)


Lesenswert?

Er programmiert wahrscheinlich mit bascom-avr.

Und da macht man so Etwas mit dem Befehl format [1].


[1] http://avrhelp.mcselec.com/format.htm

Gruß Oliver

von basti (Gast)


Lesenswert?

Richtig bascom und ich wollte gerne nur die 2 variabel weil ich diese 
per rc5 dann einstelle und ich habe insgesamt 10 zeiten die ich 
einstellen muss und danach ins eeprom speicher dann müßte ich ja zich 
variabel erstellen es muss ja gehen weil es geht ja auch bei config 
clock

von Herr von FORTRAN (Gast)


Lesenswert?

> Richtig bascom

Richtig FORTRAN:

    INTEGER STUNDE, MINUTE
    STUNDE=0
    MINUTE=0
    WRITE(*,90) STUNDE, MINUTE
90  FORMAT(i2.2,":",i2.2)
    END

von Interessent (Gast)


Lesenswert?

Du hast die Variablen doch schon im richtigen Format in der DCF-Routine 
vorliegen. Sie nennen sich _hour und _min.

von basti (Gast)


Lesenswert?

Ja stimmt aber ich möchte nicht die sekunden einstellen können und die 
sind dann in time$ drin und ich will die auch nicht sehen können

von Bit-Bastler (Gast)


Lesenswert?

DFC77 liefert dir doch die Bits alle der Reihe nach. Wenn du die in drei 
Variablen zusammenfaßt, als Stunden, Zehnerminuten und Einerminuten 
kannst du die ganz direkt ausgeben und hast keine Probleme mit 
irgendwelcher Vornullenunterdrückung.
Wenn die Stunden auch immer 2-stellig erscheinen sollen, faßt du die 
Bits dafür nicht als Stunden sondern ebenfalls in separaten Variablen 
für Zehner- und Einerstunden zusammen.

von Karl H. (kbuchegg)


Lesenswert?

Bit-Bastler schrieb:
> DFC77 liefert dir doch die Bits alle der Reihe nach. Wenn du die in drei
> Variablen zusammenfaßt, als Stunden, Zehnerminuten und Einerminuten
> kannst du die ganz direkt ausgeben und hast keine Probleme mit
> irgendwelcher Vornullenunterdrückung.
> Wenn die Stunden auch immer 2-stellig erscheinen sollen, faßt du die
> Bits dafür nicht als Stunden sondern ebenfalls in separaten Variablen
> für Zehner- und Einerstunden zusammen.


Autsch.
Machs nicht kompliziert.
Format ist eine perfekte Lösung und genau dafür gedacht.

Denn schliesslich will er ja auch noch 10 Weckzeiten irgendwo speichern 
und ausgeben.

von Interessent (Gast)


Lesenswert?

_hour und _min sind die aktuellen DCF77 Variablen. _sec wäre die für die 
Sekunden. Diese Variablen werden zwar für Time$ auch verwendet, sind 
aber unabhängig von Time$ zu verwenden.

Lcd _hour ; ":" ; _min dürfte das gewünschte anzeigen.

von basti (Gast)


Lesenswert?

Ja dann muss ich aber min als string haben damit kenne ich mich noch 
nicht so gut aus jetzt sagt der mir immer _min=00 passt nicht in die 
variabel

von basti (Gast)


Lesenswert?

Nein so habe ich es ja gemacht und es kommt 0:0

von Bit-Bastler (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Format ist eine perfekte Lösung und genau dafür gedacht.

Um so ein paar Bits in ASCII-Zeichen umzuwandeln, braucht man höchstens 
einen OR-Befehl und einen Pointer.
Was soll der ganze Ballast vom Format-Interpreter. Der ganze Aufwand ist 
hausgemacht, und zwar in dem Moment wo man die so schön passend 
BCD-kodierten Einer und Zehner in einer Variablen zusammenfaßt, die man 
bzw. Format() hinterher wieder auseinanderpuhlen muß.

von Jens (Gast)


Lesenswert?

"passt nicht in die variabel"

Variable!!! Man.

"jetzt sagt der mir immer "

Hörst du Stimmen oder wer spricht da mit dir?

JJ

von basti (Gast)


Lesenswert?

Vielleicht bin ich jetzt auf den falschen weg habe jetzt den string 
minute den wert minute="00" jetzt kann ich aber nicht mehr mit incr 
hochzählen

von Karl H. (kbuchegg)


Lesenswert?

Bit-Bastler schrieb:

> hausgemacht, und zwar in dem Moment wo man die so schön passend
> BCD-kodierten Einer und Zehner in einer Variablen zusammenfaßt, die man
> bzw. Format() hinterher wieder auseinanderpuhlen muß.

Und bei Weckzeitvergleichen muss man sie wieder zusammenpappen und beim 
Einstellen muss man sie zusammenpappen.

Lass doch die Minuten in einem Byte und die Stunden in einem Byte.
Das ist doch kein Hexenwerk wie man Format anwendet.

von Karl H. (kbuchegg)


Lesenswert?

basti schrieb:
> Vielleicht bin ich jetzt auf den falschen weg habe jetzt den string
> minute den wert minute="00" jetzt kann ich aber nicht mehr mit incr
> hochzählen

Basti.
Lass doch deine Minuten in einem Byte. Das ist doch ok.

Alles was du brauchst ist: Wenn die Minuten kleiner als 10 sind, dann 
musst du noch eine zuätzliche 0 ausgeben, ehe du die Minuten 
hinschreibst. Das ist dann auch schon alles.
Es geht nur um die Ausgabe aufs LCD. Nur dann muss eine führende 0 
erzeugt werden. Zum Rechnen brauchst du die ja gar nicht.

von Jens (Gast)


Lesenswert?

"den falschen weg"

Dativ!!!

Es wird Zeit dass du dir etwas mehr Mühe gibst!

JJ

von Karl H. (kbuchegg)


Lesenswert?

Wie das mit Format gehen würde, kannst du dir zb hier
Beitrag "Format-Fehler bei Bascom LCD-Ausgabe??"
ansehen.

Und Bit-Bastler hat recht. Format ist für den konkreten Fall wirklich 
Overkill.
(Ich hatte ganz vergessen, dass BASCOM ja seine Schwächen hat, wenn man 
kompliziertere Ausdrücke zusammenbauen muss).

von basti (Gast)


Lesenswert?

Ja ich habe jetzt es ganz einfach gemacht wenn minute gleich null dann 
lcd null null else lcd minute ist zwar nicht die lösung die ich wollte 
aber eine die ich verstehe format geht nur mit string steht so in der 
hilfe

von Karl H. (kbuchegg)


Lesenswert?

basti schrieb:
> Ja ich habe jetzt es ganz einfach gemacht wenn minute gleich null dann
> lcd null null else lcd minute ist zwar nicht die lösung die ich wollte
> aber eine die ich verstehe format geht nur mit string steht so in der
> hilfe

aber man kann sich mit str() aus einer Zahl einen String machen lassen.

Bleib bei deiner Lösung. Die ist schon in Ordnung. Nur die Sache mit dem 
Vergleich hab ich noch nicht verstanden. 0 an sich ist kein Sonderfall. 
Der Sonderfall besteht darin, dass du eine einstellige Zahl hast. Und 
einstellig ist eine Zahl genau dann, wenn sie kleiner als 10 ist. Dann 
brauchst du eine führende 0 bzw. bei den Stunden ein Leerzeichen davor.

von W.S. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Autsch.
> Machs nicht kompliziert.

So sehen wiel uns wiedell...

Tja Karlheinz, DAS Thema hatten wir doch neulich in ner anderen 
Geschmacksrichtung: Ich habe eine Zahl und weiß partout nicht, wie ich 
die so zur Anzeige kriege wie ich will.

Anstatt zu lernen, wie man mit Zahlen, Bits und CPU's umgeht, kennen die 
jungen Leute nur noch sprintf und klagen dann hier herum - im konkreten 
Falle sogar derart, daß man beim Lesen Probleme hat, die passenden 
Verben den Substantiven zuzuordnen:

basti schrieb:
> Nein weder noch kenne sowas noch nicht deshalb frage ich ja was

Mein Rat an Basti: Kreiere einen String mit 5 Zeichen und fülle deine 
Ergbnisse zu Fuß rein:
 S[1] = '0'+(Stunde div 10)
 S[2] = '0'+(Stunde mod 10)
 S[3] = ':'
und den Rest überlasse ich deiner Programmierkunst

Das war wieder mal ein Kochrezept - eigentlich genau das Falscheste was 
man tun kann, denn an sowas lernen die Kinder nix. Lösung selber 
erarbeiten wäre das Richtige, aber von allein kommen sie ja immer wieder 
nur auf sprintf und Konsorten - so eng sitzen die Scheuklappen.

Je öfter ich hier in diesem Forum lese, desto mehr frage ich mich, ob es 
denn irgend einen gangbaren Weg geben könnte, anstelle von 
Lösungsrezepten den Fragenden das eigenständige Denken beibringen zu 
können. Aber bislang ist mir dazu nicht wirklich was Funktionables 
eingefallen.

W.S.

von W.S. (Gast)


Lesenswert?

Nachtrag:

Vielleicht sollte man den Atmel Leuten mal folgende Seite empfehlen:
http://www.mikroe.com/eng/products/view/227/mikropascal-pro-for-avr/

damit sie wenigstens von sowas wie Bascom und Konsorten wegkommen.

W.S.

von Karl H. (kbuchegg)


Lesenswert?

W.S. schrieb:

> Anstatt zu lernen, wie man mit Zahlen, Bits und CPU's umgeht, kennen die
> jungen Leute nur noch sprintf

wenn sie wenigstens sprintf kennen würden. :-)


> Das war wieder mal ein Kochrezept - eigentlich genau das Falscheste was
> man tun kann, denn an sowas lernen die Kinder nix. Lösung _selber_
> erarbeiten wäre das Richtige,

Nur zu deiner Info.
Genau das hat er. Eine Lösung mit der ER klarkommt und ER hat sie sich 
selbst erarbeitet.

von Bit-Bastler (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und bei Weckzeitvergleichen muss man sie wieder zusammenpappen und beim
> Einstellen muss man sie zusammenpappen.
Der Wecker soll i.A. nur bei "=" wecken und ob man dazu 2 Byte oder 4 
Zeichen vergleicht, macht nun wirklich nicht den großen Unterschied. 
Warum also zusammenpappen? Und ob man beim Stellen auf einen 
Minutenüberlauf bei 60 oder auf die Einzelziffernüberläufe bei 0x0A bzw. 
0x06 achtet, tut sich auch nicht viel. Das konnte schon ein 74x90.

von Bit-Bastler (Gast)


Lesenswert?

W.S. schrieb:
> S[1] = '0'+(Stunde div 10)
> S[2] = '0'+(Stunde mod 10)

Jetzt auch noch zwei Divisionen für eine Operation, die, wenn man die 
originalen BCD-Daten verwenden würde, nicht mehr als ein Dutzend 
Prozessortakte braucht.
Vielleicht sollte man das ganze als Julianisches Datum rechnen, dann 
aber bitte als Double.

von Möp (Gast)


Lesenswert?

if minuten < 10

"0" minuten ":" sekunden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.