Hallo zusammen,
habe eine Uhr auf einem Atmega 8 programmiert die auch einige Zeit
funktionierte.
Nun habe ich den Code der Übersicht wegen geändert und kann nun keine
Zeit mehr auslesen, jedoch das Datum.
Anezige ist in etwa so :
1
[ ]
2
[ Datum: 21. 8.18]
Das Display bleibt in der ersten Zeile leer.
Komischerweise geht das Datum obwohl die Funktionen quasi identisch
sind.
Zweites Problem:
Falls jemand weiss, wie ich die 0 auch als 0 anzeigen kann, würde ich
mich über einen Tipp freuen.
Kann mir da jemand weiterhelfen ?
Vwerwendet werden die Libs von P. Fleury
Das Programm sieht so aus:
Gut, das Porgramm läuft jetzt.
Allerdings bekomme ich die Zahlen nicht vernünftig ausgegeben, bei jedem
Überlauf der Sekunden zählt er in Buchstaben weiter.
Wie löst man dieses Problem am besten ?
Marcel B. schrieb:> Allerdings bekomme ich die Zahlen nicht vernünftig ausgegeben, bei jedem> Überlauf der Sekunden zählt er in Buchstaben weiter.>> Wie löst man dieses Problem am besten ?
Was erwartest Du?
Du gibst sämtliche Werte hexadezimal aus und wunderst Dich dann über
Buchstaben in der Ausgabe?
Marcel B. schrieb:> Gut, das Porgramm läuft jetzt.>> Allerdings bekomme ich die Zahlen nicht vernünftig ausgegeben, bei jedem> Überlauf der Sekunden zählt er in Buchstaben weiter.>> Wie löst man dieses Problem am besten ?
d, i int as a signed decimal number. %d and %i are synonymous for
output, but are different when used with scanf() for input (where using
%i will interpret a number as hexadecimal if it's preceded by 0x, and
octal if it's preceded by 0.)
Nicht wirklich, die Werte werden ja trotz Hex-Ausgabe (%2x) vernünftig
als Zahl ausgegeben, nach dem lesen der RTC.
Und das Obwohl sie im BCD Format sind.
Da ist gerade mein Verständnisproblem.
Gebe ich die zahlen als INT aus, kommen von anfang an nur falsche Daten
heraus.
Nach dem auslesen stimmt alles, aber wie zähle ich das manuell hoch ?
Marcel B. schrieb:> Falls jemand weiss, wie ich die 0 auch als 0 anzeigen kann, würde ich
Was meinst Du damit? Willst Du die Zahlen zweistellig mit gegebenenfalls
führender Null ausgeben? Falls ja, dann schreib das doch einfach mit in
Deine Formatanweisungen rein. Wie steht in der entsprechenden
Dokumentation, z.B. der hier:
http://www.cplusplus.com/reference/cstdio/printf/
Marcel B. schrieb:> 0x3B = 59. Die Zahlen sind eh Binär gespeichert, also ist die Art, wie> ich vergleiche egal.
Uninteressant.
In der Zeile davor hast du sec auf 0 gestellt, falls sec == 0x3B.
Wie kann sec dann in der Zeile darunter wieder 0x3B sein ?
Marcel B. schrieb:> 0x3B = 59.
Und warum schreibst Du dann nicht einfach gleich 59 hin?
Allerdings hast Du gerade selbst geschrieben, daß die Zahlen im
BCD-Format sind! Und damit sind Deine Vergleiche dann sowieso ziemlich
daneben.
Außerdem ging es Marc nicht um die Art des Vergleichs, sondern um die
Sinnlosigkeit des zweiten 'if', da dieses niemals wahr wird.
Btw. Daß Dein obiges Programm überhaupt irgenwie zählen soll kann ich
auch nicht so recht glauben. Dein 'clock_continue' wird ja nirgends
aufgerufen.
Das habe ich bereits aufgerufen,
habe es zum Test des ersten Problems im Startbeitrag rausgenommen.
Was hier falsch ist, sehe ich auch, aber eine Lösung habe ich nicht,
darum würde ich mir sehr über Tipps diesbezüglich freuen.
guest schrieb:> Außerdem ging es Marc nicht um die Art des Vergleichs, sondern um die> Sinnlosigkeit des zweiten 'if', da dieses niemals wahr wird.
Danke, ein Problem weniger.
Wie inkrementiere ich denn BCD manuell ?
Marcel B. schrieb:> Wie inkrementiere ich denn BCD manuell ?
Addieren und auf Überlauf prüfen, halt genau wie mit Deinen Sekunden und
Minuten, nur für die einzelnen Dezimalstellen.
Deutlich einfacher wäre es allerdings die Werte in 'RTC_GetDateTime'
gleich von BCD ins normale Format zu wandeln. Das würde Dir die ganzen
Klimmzüge mit dem BCD ersparen (in 'RTC_SetDateTime' dann natürlich
wieder zurück nach BCD).
Z.B. so:
Marcel B. schrieb:> Das habe ich bereits aufgerufen,> habe es zum Test des ersten Problems im Startbeitrag rausgenommen.
Wo denn normalerweise? Innerhalb von 'while(1)' in 'main'? Dann hast Du
durch die unterschiedlichen Laufzeiten von 'clock_continue' ein
Anzeigeproblem. Du wirst z.B. nie einen Sekundenwert von 59 zu Gesicht
bekommen, Deine Anzeige springt von 58 auf 0. Besser mit 60 vergleichen
und die zusätzlichen '_delay_ms' wegwerfen. Also so in etwa: