Forum: Mikrocontroller und Digitale Elektronik uhrenquelcode


von Wilfried (wil_w)


Angehängte Dateien:

Lesenswert?

Liebe Forum Teilnehmer
Habe folgendes Problem. Ich möchte eine funktionierende Uhr 
"Stunden+Minuten"
erweitern so dass sie auch Sekunden anzeigt. Den Quellcode habe ich mit 
meinen
bescheidenen Programmierer Kenntnissen erweitert. Leider nur mit mäßigem 
Erfolg. Die Sekunden werden zwar angezeigt "die laufen nach 59 bis 99 
weiter"
und die restliche Anzeige ist ein "CHAOS". Im Anhang findet Ihr den 
Schalt-
plan sowie die Quelltexte. Die Erweiterungen sind farblich hinterlegt. 
Die
Anoden der Anzeige habe ich folgender maßen angeschlossen.
E=PC5;Z=PC4;H=PC1;T=PC0;ZT=PC2;HT=PC3; Für eine Hilfe wäre ich danbar.
Gruß Wilfried

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Quelltexte im RTF-Format wird sich hier niemand anschauen. Oder drehst 
Du sie etwa auch so durch den Compiler?

von Michael B. (laberkopp)


Lesenswert?

Wilfried schrieb:
> Im Anhang findet Ihr den Schalt-
> plan sowie die Quelltexte.

Dein Quelltext möchte 6 Stellen, dein Schaltplan hat nur 4 Stellen, das 
geht logischerweise nicht.

Dann flickst du mal die Sekunden rechts und mal links an die Zahl.

Die Zahl number wird dadurch grösser als 2359, nämlich 235959, zu viel 
für ein 'int' der maximal 32767 fasst.

Die Hälfte vom Quellcode, auf dem interruptgesteuert die Stellen der 
Zahl verteilt werden, fehlt. Will man 2 Stellen mehr, muss der natürlich 
auch geändert werden.

Die Ziffern werden bei 6 statt 4 Stellen noch dunkler, schon so laufen 
sie mit durchschnittlich nur 750uA.

Beitrag #7688482 wurde von einem Moderator gelöscht.
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wilfried schrieb:
> Für eine Hilfe wäre ich danbar.
Häng einfach direkt die Quellcodedateien an (am besten das Original und 
deine geänderte Version), und nicht irgend so ein rtf-Zeug.

Und gib den Dateien sinnvolle Namen.

> E=PC5;Z=PC4;H=PC1;T=PC0;ZT=PC2;HT=PC3
Wie wäre es, wenn du den Stellen ebenfalls sinnvolle Namen gibst,  So 
eine Uhr zählt nicht dezimal, deshalb sind Zehntausender und 
Hunderttausender sinnlos, kein Mensch sagt: "Es ist 
Zweihundertzweiunddreißigtausendvierhundertsechsundfünfzig Uhr!". 
hz,he,mz,me,sz und se wären meine Wahl für die 6 Stellen.

: Bearbeitet durch Moderator
von Thomas W. (dbstw)


Lesenswert?

Es fehlt latuernich noch zwei Transistoren um das Multiplexing von vier 
auf sechs Stellen zu erweitern.

TO: Hast Du einfach ein paar Sieben-Segment-Displays parallel 
geschaltet? Das geht nicht.

von Peter D. (peda)


Lesenswert?

Den Gedankengang möchte ich mal verstehen. Erst verwurstet man alle 
Variablen zu einer großen Zahl, um sie dann umständlich wieder zu 
entwursten. Wozu der unnötige Aufwand?

Typisch nimmt man gerne für jedes Digit eine Variable, dann braucht man 
für die Anzeige überhaupt nichts zu rechnen.
Und vor allem hat man wenigstens 2 Tasten, um die Uhr zu stellen 
(Digitauswahl, Weiterzählen).

Und zeichne erstmal Deinen Schaltplan auf 6 Digits erweitert. Vorher 
kann man das ja nicht programmieren.

von Rainer W. (rawi)


Lesenswert?

Peter D. schrieb:
> Erst verwurstet man alle
> Variablen zu einer großen Zahl, um sie dann umständlich wieder zu
> entwursten. Wozu der unnötige Aufwand?

Allenfalls BCD könnte sinnvoll sein. Die Multiplex-Ausgabe mit Pufferung 
wird dann recht einfach.

: Bearbeitet durch User
von Teo D. (teoderix)


Lesenswert?

So, und nu basteln wir noch ne Weckfunktion dazu... :DDD

von Axel S. (a-za-z0-9)


Lesenswert?

Rainer W. schrieb:
> Allenfalls BCD könnte sinnvoll sein.

Das kriegt man mit

Peter D. schrieb:
> Typisch nimmt man gerne für jedes Digit eine Variable

doch automatisch. Jede der pro-Digit Variablen kann nur einen Wert 
zwischen 0 und 9 (je nach Stelle auch 6 oder 4 oder 2) enthalten. Die 
ALU des µC muß dann auch keine BCD-Arithmetik beherrschen. Für eine Uhr 
braucht es ohnehin nur die INC Operation.

von Axel S. (a-za-z0-9)


Lesenswert?

Teo D. schrieb:
> So, und nu basteln wir noch ne Weckfunktion dazu... :DDD

Ha! Das erinnert mich daran, wie ich mal auf einem Poly-880 [1] eine Uhr 
mit Weckfunktion programmiert habe. Die hat zur Weckzeit dann die 
Melodie "Wachet auf, wachet auf, es krähte der Hahn!" gespielt. Das ging 
sehr komfortabel, denn der Poly-880 hatte einen Fernschreiber(!) 
Anschluß mit einer Lautsprecherbuchse. Da brauchte man nur eine Box 
anzustecken.

Das Programm paßte natürlich komplett in die 1KB RAM. Und wurde als 
Maschinencode direkt mit der Hex-Tastatur eingegeben. Die Zeit wurde auf 
der 8-stelligen LED-Anzeige angezeigt. Damals habe ich sicherlich die 
BCD-Arithmetik (packed BCD) verwendet, die der Z80 ja beherrschte.


[1] https://de.wikipedia.org/wiki/Polycomputer_880

von Wastl (hartundweichware)


Lesenswert?

Teo D. schrieb:
> So, und nu basteln wir noch ne Weckfunktion dazu...

Uhren-Quäl-Code.

Wilfried schrieb:
> uhrenquelcode

von Wilfried (wil_w)


Lesenswert?

Hallo Lothar
Hast du meine Nachricht mit den Dateien bekommen?
Gruß Wilfried

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wilfried schrieb:
> Hast du meine Nachricht mit den Dateien bekommen?
Nein, da ist nichts gekommen. Aber poste die Dateien doch bitte als 
Anhang hier im Thread. Dafür ist er da. Dann können dir auch andere 
zur Seite stehen.

: Bearbeitet durch Moderator
von Martin V. (oldmax)


Lesenswert?

Hi
Um ein Programm so zu erweitern, damit auch eine erweiterte Hardware 
angesteuert werden kann, solltest du die Programmiersprache verstehen. 
Wenn ein Programm gut modular aufgebaut ist, dann ist es in der Regel 
kein Problem. Manchmal ist es aber besser, das Programm neu zu 
schreiben. Erstens, man lernt die Sprache, zweitens, man versteht das 
Programm. Dazu einfach mal einen brainstorm was gebraucht wird:
Einen Taktgeber 1 Sek.
Zwei Speicher jeweils 6 stellig für Zähler und Dekoder. Nun zählst du 
einfach die Sekunden und überträgst bei 9 nach 0 sowie eins in die 
Zehner-Stelle. Zehnerstelle von 5 nach 0 und eins in die Minute. 9 nach 
0 Minutenzehner +1. Minuten 5 nach 0 + Stunde 1. Nun wird es ein wenig 
komplizierter, weil ja nach 23  ein neuer Tag mit Stunde 0 beginnt. Ist 
die Zehnerstunde <2 muss die einer Stunde bis 9 zählen, bevor die 
Zehnerstunde um eine erhöht wird, Ist die Zehnerstelle der Stunden >1 
setzt du beim Übergang von 3 nach 4 alles auf 0. damit wäre dein 
Zeitzähler fertig. Kommt nun die Anzeige. Die rufst du entweder in jedem 
Zyklus auf, oder noch besser, alle 10 ms per Interrupt. Anzeige 
ausschalten, nächste Stelle adressieren Anzeigemuster aus dem 
Variablenpuffer in den Ausgabeport laden. Nächstes Segment ansteuern und 
Anzeige einschalten. Jetzt hast du zwei Module, ein Zählermodul mit den 
Zeitwerten und ein Ausgebemodul mit der Zeitanzeige, die ja ganz anders 
aufgebaut ist, eben Siebensegment. Nun brauchst du nur noch die 
Verbindung herstellen, das reicht, wenn du es in den Programmzyklus 
einbaust. Dazu brauchst du 10 Speicherzellen, die du mit dem 
Anzeigemuster der Siebensegmentanzeige von 0 - 9 belegst. Nun nimmst du 
die erste Stelle deines Zeitzählers, lädst den Wert, holst die 
Anfangsadresse deines Matrixpuffers, addierst den geladenen Wert dazu 
und holst aus dem Matrixpuffer das Anzeigemuster. Dieses legst du in den 
Ausgabepuffer. Das machst du mit jeder Stelle. Ich kann dir keinen 
C-Code liefern, das musst du schon selber machen, aber mit diesem 
Fahrplan solltest du es schaffen.
Gruß oldmax

von Wastl (hartundweichware)


Lesenswert?

Martin V. schrieb:
> Um ein Programm so zu erweitern, damit auch eine erweiterte Hardware
> angesteuert werden kann, solltest du die Programmiersprache verstehen.

Ach! Echt jetzt?

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.