7-Segment-Uhr - Spielerei von HinterBlauenAugen

ah_bf_gt

Neues Mitglied
16. Aug. 2010
7
0
0
Sprachen
Hi!
Bei YouTube bin ich über ein Video von HinterBlauenAugen gestolpert (http://www.youtube.com/watch?v=LtGDgXXdcsA). Darin zeigt er (oder sie?) eine Spielerei mit einer 7-Segment-Uhr am ATmega.
Sieht witzig aus, und mich interessiert, wie das programmiert ist. Weil er (oder sie? :) ) hier im Forum aktiv ist, dachte ich, ich frag einfach mal, ob ich den Code dazu bekommen könnte. :adore: Ich möchte mir gern ebenfalls eine Uhr basteln und vom Programm abkucken...

Viele Grüße, Armin
 
Hi Armin,

Bei YouTube bin ich über ein Video von HinterBlauenAugen gestolpert (http://www.youtube.com/watch?v=LtGDgXXdcsA). Darin zeigt er (oder sie?) eine Spielerei mit einer 7-Segment-Uhr am ATmega.
sieht echt nett aus ;)

Sieht witzig aus, und mich interessiert, wie das programmiert ist. Weil er (oder sie? :) ) hier im Forum aktiv ist, dachte ich, ich frag einfach mal, ob ich den Code dazu bekommen könnte. :adore: Ich möchte mir gern ebenfalls eine Uhr basteln und vom Programm abkucken...
Code einfach nur abkupfern ? ... äähhhh ... da solltest du besser selber fragen :rolleyes:
Lernen wie es gemacht wird ... sollte kein Thema sein (wenn du wirklich willst) ;)

Also für mich sieht es eigentlich recht einfach aus ... :D

- Du programmierst ne normale Uhr für 7Segment.
- Die alte Anzeige wird in einem Puffer (zwischenspeicher) gehalten.
- Wenn sich die Anzeige ändert dann dimmst du von den Musterdaten im
Puffer zu den aktuellen neuen Musterdaten über.
- Du schiebst die neuen aktuellen für den nächsten Dimmvorgang in den Puffer
- ... same Procedure as every Second :D (das Spiel von vorn)

über verschiedene Subroutinen steuerst du die verschiedenen Dimmvorgänge.
du schaltest je nach Wunsch zwischen den Subroutinen für die Dimmung um.

So würde ich es machen. Ist natürlich noch "Feintuning" zu machen. Aber
im Prinzip sollte es so funktionieren :cool: Ist aber auch nur ne grobe Erklärung.

Aber genau kann es uns wohl HBA selber sagen ;)

Gruß
Dino
 
Hallo Armin!

Ja ja, der HBA hat immer wieder nette Ideen..... und auch das Know how dazu! :)

Ich weiß nicht, ob HBA dir einfach den Code zur Verfügung stellt, (dass wird er dir schon selber schreiben) oder ob er den Beispiel-Code dazu vielleicht sogar schon veröffentlich hat.
Hier im Forum habe ich zwar davon noch nichts gelesen.... könnte er aber auch im "Nachbarforum" beschrieben haben. ;)


Dabei fällt mir gerade ein, dass ich an meiner 8x8 LED-Matrix mal wieder weiter arbeiten sollte. :hmmmm:
Das Video macht zumindest wieder Lust......
Das ganze Shiften habe ich ja auch schon fertig. Fehlt eigentlich nur noch die Kommunikation unterhalb der Module. :rolleyes:

Ach so....
Willkommen im AVR-Praxis Forum, Armin! :ciao:


Gruß,
Cassio
 
Danke für die schönen Grüße! :rolleyes:
Das Prinzip zum Überblenden ist ganz einfach, hast Du ja auch schön beschrieben, Dino. Ich bin mir nur nicht sicher, ob ich das Ganze hintereinander kriege: Pro Sekunde die Uhrzeit erhöhen (oder das DCF-Signal empfangen und speichern) - ich schätze, über nen Timer-Interrupt; die Bit-Muster der Uhrzeit zig-mal pro Sekunde zu den 7-Segment-Anzeigen schicken - sicherlich über nen zweiten Timer-Interrupt; die Muster aus zwei Puffern abwechselnd mit unterschiedlichem Tastverhältnis anzeigen. Puh :(

Code dazu habe ich übrigens noch nirgens gefunden - und ich hab schon reichlich lange gesucht.

Viele Grüße, Armin
 
Hi,

Code dazu habe ich übrigens noch nirgens gefunden - und ich hab schon reichlich lange gesucht.
den Code findest du im eigenen Kopf :D

Bau dir doch mal ne Multiplexroutine die mit einem Timer läuft. Die Routine
zeigt - sagen wir mal - 16 Durchläufe lang eine Stelle an bis sie dann zur
nächsten Stelle der Anzeige wechselt. Der Timer muß also 16mal so schnell
sein wie die Multiplexfrequenz. Wenn du diese Stelle dann alle 16 Durchläufe
anzeigen läßt ist sie auf voller Helligkeit. Wenn du sie nur bei 8 der 16 Durchläufe
anzeigen läßt ist sie auf 50%. Und schon kannst du die einzelnen Stellen in
16 Schritten dimmen :D So einfach ist das im Prinzip.

Das war der Denkanstoß ... nun experimentier mal ein wenig :D ;)
Der Rest kommt dann mit ein wenig rumspielen auch :cool:

Und versuch es erst mal einfach mit nem normalen Zähler der einfach nur
hochzählt. Bau die Uhr dann erst später in dein Programm ein. Dann steht
die Grundstruktur für die Anzeige bereits.

Gruß
Dino
 
Hm, hört sich ja eigentlich einfach an. Zu einfach - das macht mich mißtrauisch :D

Ich würde für jede der Stellen eine Variable für die Helligkeit einrichten und für jede Stelle die Durchläufe zählen, so wie Du beschrieben hast. Dann kann ich bequem für jede einzelne Stelle die Helligkeit vorgeben. ...und weil das Ganze im Interrupt läuft, kann ich die Helligkeiten bequem ändern (Helligkeit[x]++; Delay(100ms); Helligkeit[x]++ usw.).

Ich probiere mal!

Danke für die Anregungen an einen unbedarften Forums-Neuling!

Armin
 
Hallo zusammen,
fühle mich geehrt, dass es euch gefällt :)
Es war, wie der Titel schon sagt, nur eine Spielerei um mal ein paar Möglichkeiten auszuprobieren.
Ich habe das nicht als Projekt irgendwo eingestellt, weil es nicht ausgearbeitet ist dafür. Will heißen, ich habe keinen Schaltplan, das Programm ist lausig kommentiert und sicherlich an vielen Ecken noch holprig, weil ich rumprobiert habe und es dann so blieb.

Normalerweise würde ich solche Test Programme nicht veröffentlichen. Wenn ihr aber mit diesen Einschränkungen einverstanden seid, kann ich das Programm gerne hier einstellen.

@Armin:
Hauptsinn war, verschiedene Wechselarten auszuprobieren. Daraufhin ist der Code angelegt. Wenn du nur Überblenden willst, ist es wahrscheinlich ineffizient. Hauptschwierigkeit war, das so hinzukriegen, dass die Timerroutine mit 40KHz laufen kann, um die nötigen Stufen für die Soft-PWM hinzukriegen. Das Ganze wird als Matrix direkt vom AVR angesteuert. Nur jede Ziffer hat einen Treiber um den Strom schalten zu können.
Du kannst dir vielleicht ein paar Ideen abschauen. Und wenn du was dabei lernen willst, ist es bestimmt besser, Dinos Ansatz zu nehmen.
Besonders wenn du es eigentlich in C machen willst.

HBA
 
Hi Armin,

Ich würde für jede der Stellen eine Variable für die Helligkeit einrichten und für jede Stelle die Durchläufe zählen, so wie Du beschrieben hast. Dann kann ich bequem für jede einzelne Stelle die Helligkeit vorgeben. ...und weil das Ganze im Interrupt läuft, kann ich die Helligkeiten bequem ändern (Helligkeit[x]++; Delay(100ms); Helligkeit[x]++ usw.).
der Ansatz ist schon mal nicht schlecht ;-)
Wenn das Segment von aus auf an gehen soll zählst du den Dimm-Wert des
Segmentes nach einigen durchläufen jeweils um 1 hoch. Sonst geht es um
1 runter. Ändert sich der Zustand nicht, wird auch nicht gezählt.
Mach es nicht mit Delay(100ms) sondern mit der Anzahl der Durchläufe durch
die Interrupt-Routine. Delay ist dafür Mist. Sonst würde ich deinen Ansatz so
schon einmal al OK abstempeln ;)

Hi HBA,

Normalerweise würde ich solche Test Programme nicht veröffentlichen. Wenn ihr aber mit diesen Einschränkungen einverstanden seid, kann ich das Programm gerne hier einstellen.
Immer rein damit ;)
Würde mich auch interessieren. Egal ob es in C oder BASCOM ist. Das
ungefähre Funktionsprinzip wird man wohl schon erkennen können. Das
reicht auch um es irgendwo anders sauber einzubauen ;) Und manchmal
steht man ja wie ein Ochs vor dem Berg und braucht nur nen kleinen
Schubs in die richtige Richtung. Dafür reicht das Proggi bestimmt allemal :D

Gruß
Dino
 
Hi HBA!
Ich würd mich freuen, wenn ich abkucken darf :) Dass Einschränkungen da sind, ist klar und auch gar kein Problem. Ob das jetzt in C oder in BASCOM ist, sollte keine Rolle spielen. In BASCOM habe ich bisher noch nichts geschrieben, BASCOM halte ich aber eher für anschaulich. Fürs Verständnis reichts aber garantiert.

Hi Dino!
Im Interrupt würde ich also eine Variable hochzählen, und wenn sie einen bestimmten Wert erreicht (oder überläuft oder so), würde ich sie zurücksetzen und die Variable Helligkeit erhöhen (für die Ziffer, die eingeblendet wird).
Klingt vernünftig. Im Hauptprogramm kümmere ich mich in der Zwischenzeit darum, Stunden, Minuten, Sekunden zu zählen und in die einzelnen Ziffern aufzuteilen, vielleicht auch später mal DCF zu lesen.

Hui!

Viele Grüße, Armin
 
Hi,

Hi Dino!
Im Interrupt würde ich also eine Variable hochzählen, und wenn sie einen bestimmten Wert erreicht (oder überläuft oder so), würde ich sie zurücksetzen und die Variable Helligkeit erhöhen (für die Ziffer, die eingeblendet wird).
Klingt vernünftig. Im Hauptprogramm kümmere ich mich in der Zwischenzeit darum, Stunden, Minuten, Sekunden zu zählen und in die einzelnen Ziffern aufzuteilen, vielleicht auch später mal DCF zu lesen.
kann man so sagen.
- Also in der Interrupt-Routine zählst du einen Zähler (Byte) hoch. Mehr nicht.
- In der Hauptroutine testest du ob er Zähler sich geändert hat. Wenn Ja => Subroutine
- In der Sub testest du ob der Zähler über 15 ist (0..15 = 16 Dimmschritte), wenn ja => auf 0 zurück und den Zähler für die Displaystelle einen weiter
- Wenn der Zähler (0..15) über dem Dimmwert für das Segment ist dann schaltest du das Segment ab.
- Über den Displayzähler schaltest du die einzelnen Stellen durch.

Also einen Zähler für den Dimmwert (0..15) der direkt vom Interrupt hochgezählt wird.
Und einen Zähler für die Displaystelle der beim Überlauf des Dimm-Zählers hochgezählt wird.
Wenn das Ende des Displays erreicht ist dann wird der Displayzähler auch wieder auf 0 gesetzt
und das Spiel beginnt von vorn.

So würde ich mir das vorstellen. In der Hauptroutine kann man dann noch
andere Sachen reinschieben.

Kannst ja mal ein wenig rumspielen. Dabei lernt man am besten wie alles auf
eine Änderung reagiert und an welchem Schräubchen man am besten drehen
kann.

Wenn du das Zeitintervall für den Timer intelligent setzt dann kannst du über
ne zweite Zählvariable die in der Interruptroutine hochgezählt wird schon im
ersten Proggi deine Sekunden erzeugen und hast nur einen Timer für Multiplex,
Dimmung und Sekundenerzeugung verwendet :D eventuell mußt du dafür aber
auch etwas mit der Frequenz des verwendeten Quarzes spielen damit du auf
ganzzahlige Teilerverhältnisse kommst.

Gruß
Dino
 
Wow, das hört sich gut an. Danke, dass Du mir das Zusammengeschrieben hast! Ich werd mal am probieren fangen :)
Viele Grüße, Armin
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)