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
Quelltexte im RTF-Format wird sich hier niemand anschauen. Oder drehst Du sie etwa auch so durch den Compiler?
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.
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
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.
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.
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
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.
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
Teo D. schrieb: > So, und nu basteln wir noch ne Weckfunktion dazu... Uhren-Quäl-Code. Wilfried schrieb: > uhrenquelcode
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.