Forum: Mikrocontroller und Digitale Elektronik ATMEGA8(Pong) - Grundsatzfrage bzgl. Überschreiben des alten Zustands der LED


von Pepper (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe eine Uhr auf dem ATMEGA8 programmiert (siehe Anhang), 
allerdings habe ich es nicht ohne die selbsterstellte Funktion 
"clear_all" geschafft,dass sich die LEDs "updaten". Deswegen ist es nun 
so, dass ständig alle angeschalteten LEDs sich wieder aus- und 
anschalten.
Meine Idee wäre ein Logikgatter, welches die Reihenfolge beachtet. Z.B. 
immer wenn das zweite Signal eine 1 ist, dann leuchtet die LED 
ansonsten, wird sie ausgeschaltet.
Ehrlichgesagt grübel ich schon seit Stunden danach und ich will es 
einfach mal versuchen einen Experten zu fragen.

Vielen lieben Dank!

von Peter D. (peda)


Lesenswert?

Quelltexte heißen *.c
Wo ist der Schaltplan?
Beschreibe mal in Worten, was das Programm überhaupt machen soll.

von fop (Gast)


Lesenswert?

Hi,
in Deinem Makro-Zoo, werden die Bitmuster für Stunden und Minuten in die 
selben Variablen des Arrays geschrieben. Das kann doch so nicht stimmen. 
Vor allem, weil zwischen dem Setzen der Muster für die Stunden und dem 
für die Minuten keine Ausgabe erfolgt.

von Pepper (Gast)


Lesenswert?

Hi peda

Danke für die zeitnahe Antwort.
Die LED-Leiste zeigt eine vordefinierte Uhrzeit an und zählt ab dieser 
hoch.
Dies wird mit 2 Timern erreicht, der eine zählt die 1 Sekunde hoch und 
der andere steuert mein Schieberegister.
im oberen LED-Teil wird die Stundenzahl und im unteren die Minutenzahl 
angezeigt, wobei der Doppelpunkt die Sekunden darstellt, sozusagen so:

13: (58. Sekunde)
59

13  (59. Sekunde)
59

14: (60. Sekunde)
00

(Es ist etwas her, dass ich das programmiert habe.)

von Peter D. (peda)


Lesenswert?

Pepper schrieb:
> Die LED-Leiste zeigt eine vordefinierte Uhrzeit an und zählt ab dieser
> hoch.

Da sind wir kein bischen schlauer, als wie zuvor.
Warum kein Schaltplan?

Ich lehne mich mal ganz weit aus dem Fenster und vermute mal je 10 LEDs 
pro Dekade hinter einigen 74HC595.
Da ist die übliche Herangehensweise, man manipuliert das gewünschte 
Pattern in einem SRAM-Array und schiebt es nach jeder Änderung komplett 
in die 74HC595. Bei Sekundenanzeige also einmal je Sekunde.

von Pepper (Gast)


Angehängte Dateien:

Lesenswert?

Ganz vergessen, sorry peda.

@fop
Ich hatte bereits was als Antwort geschrieben, doch war ich 
zwischendurch verwirrt gewesen und versuche mich nun erst nochmal zu 
sortieren.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ Pepper (Gast)

>Pong-Uhr.txt (5,61 KB, 42 Downloads)

Quelltexte hängt man direkt als .c Datei an.

>Ich habe eine Uhr auf dem ATMEGA8 programmiert (siehe Anhang),
>allerdings habe ich es nicht ohne die selbsterstellte Funktion
>"clear_all" geschafft,dass sich die LEDs "updaten". Deswegen ist es nun
>so, dass ständig alle angeschalteten LEDs sich wieder aus- und
>anschalten.

Sicher, u.a. weil du unsinnigerweise mit voller Geschwindigkeit des AVRs 
immer wieder die Zeit neu anzeigen willst. Außerdem ist die 
Aktualisierung der neuen Zeit nicht synchron zum Zählen der Zeit.

Und dein Quelltext ist nicht sinnvoll strukturiert, vor allem fehlt die 
Einrückung. Die ist SEHR wichtig!

Strukturierte Programmierung auf Mikrocontrollern

>Meine Idee wäre ein Logikgatter, welches die Reihenfolge beachtet.

Das "Logikgatter" heißt hier Mikrocontroller.

Der Ablauf der Befehle beim Multiplexing ist nicht gut, da entstehen 
Geisterbilder. Ich hab das mal korrigiert.
Die Dekodierung mit Dutzenden #defines ist auch nicht sonderlich toll, 
das macht man besser mit einer Tabelle. Ist kompakter, übersichtlicher, 
flexibler.
Weiterhin solltest du dich mal mit dem Konzept der lokalen Variablen 
befassen ;-)
Dein Anzeigemuster durchschaue ich im Moment nicht so recht 8-0, aber 
ich tippe mal, daß du die einzelnen Ziffern als senkrechte Punktketten 
anzeigen willst. Bei dem hier verwendeten Spaltenmultiplexing ist das 
mit einer Tabelle ideal!

Siehe Anhang.

von Pepper (Gast)


Lesenswert?

Vielen lieben Dank, falk :-)

Ich hatte deinen Text + Code bereits vorhin angesehen, kam aber erst 
jetzt
zum antworten.
Heute kriege ich nichts mehr rein in meinen Kopf, aber morgen probiere 
ich da noch einmal dran rum.

Ich würde gern noch evt. Rückfragen morgen stellen, bevor der Thread 
geschlossen wird.

Schönen Abend euch noch :-)

PS: Mir war nicht bewusst, dass der Code als Anhang mit *.c wie im 
ATMEL-Studio erscheint. Das passiert mir nicht noch einmal !

von Pepper (Gast)


Lesenswert?

Guten Morgen zusammen!

Ich habe den Code verstanden und finde deine Lösung weitaus eleganter 
wie meine :-) Vorallem finde ich die Idee it der Tabelle genial. Nur 
kann ich nicht nachvollziehen, wie das mit digitalen Anzeige da 
funktionieren soll.
Z.B. bei der Darstellung der Zahl 4. Deine Methode ist so schön linear 
und übersichtlich.


Für die Personen, die das Programm von falk nutzen wollen, müssen noch 
etwas kleines korrigieren:
1
const uint16_t hex2led[10] {
2
    0b0000000000,...};
Nach dem Array fehlt ein "=" :-)

von Falk B. (falk)


Lesenswert?

@ Pepper (Gast)

>Ich habe den Code verstanden und finde deine Lösung weitaus eleganter
>wie meine :-)

Nicht wahr?

>Vorallem finde ich die Idee it der Tabelle genial.

Das ist eine Standardlösung.

>Nur kann ich nicht nachvollziehen, wie das mit digitalen Anzeige da
>funktionieren soll.

Hast du das Programm mal laufen lassen?

von Pepper (Gast)


Lesenswert?

Ja, hab ich :)
Bei deiner Lösung lässt sich jeder Zeitpunkt mit einen der 10 
Array-Elementen abbilden.
Die zweite Zeile nutzt du für die Zehnerstellen, welche mit % und / sehr 
gut ermittelt werden können.

Doch wenn wir nun zum digitalen springen kann es sein, dass z.B. die 
Zahl 2 in 3 FOrmen vorkommen kann:
2X:   XX:    und    2X:
XX    2X            2X

Für eine Ziffer ( ich lasse die Nullen bei der 2 für die Lesbarkeit mal 
weg:
00000111 1
000001 1 1
000001 111
Somit brauche ich nach meinem neuen Verständnis, wenn die Zahl 2 
insgeamt 3 Spalten einnimmt, ein Array für 9 Elemente  nur für die Zahl 
2.
Glücklicherweise gibt es keine 3er Zehnerstellen bei Stunden :-)

von Falk B. (falk)


Lesenswert?

@Pepper (Gast)

>Bei deiner Lösung lässt sich jeder Zeitpunkt mit einen der 10
>Array-Elementen abbilden.

Das ist der Sinn der Sache.

>Die zweite Zeile

Nö, Spalte. Die Anzeige erfolg in Spalten, ebenso wie das Multiplexing.

> nutzt du für die Zehnerstellen, welche mit % und / sehr
>gut ermittelt werden können.

Das hast du in deiner Version auch gemacht.

>Doch wenn wir nun zum digitalen springen kann es sein, dass z.B. die
>Zahl 2 in 3 FOrmen vorkommen kann:

???

>2X:   XX:    und    2X:
>XX    2X            2X

Was soll das darstellen?

>Für eine Ziffer ( ich lasse die Nullen bei der 2 für die Lesbarkeit mal
>weg:
>00000111 1
>000001 1 1
>000001 111
>Somit brauche ich nach meinem neuen Verständnis, wenn die Zahl 2
>insgeamt 3 Spalten einnimmt, ein Array für 9 Elemente  nur für die Zahl
>2.

Jetzt verstehe ich. Du willst die Zahlen normal als LED-Muster 
darstellen, nicht nur als LED-Kette. Das kann man machen, das 
Grundprinzip ist gleich.
Du brauchst dann halt ein 2D-Array, welches deine Codes für die Zahlen 
enthält. Und dann brauchst du noch eine deutlich intelligentere 
Funktion, welche deine Zahlen in die LED-Matrix kopiert. Das ist ein 
wenig aufwendigere Bitmanipulation.

Dazu muss man ber erstmal festlegen, wie groß deine Zahlen werden 
sollen. 3x3 oder eher 5x5? Bei 10x12 Pixel könnte man die Zahlen als 5x5 
darstellen und hat noch Platz zwischen den 1er und 10er Stellen.

von Pepper (Gast)


Lesenswert?

Vielen Dank, Falk :-)

Ich würde gern selbst noch ein wenig Ausprobieren, bevor ich die Lösung 
präsentiert bekomme.

Alle meine Fragen sind nun beantwortet und der Rest wird eine Fleißsache 
:-D
Danke Euch Allen fürs Lesen, das ist echt ein tolles Forum !

Ich wünsche noch ein sonniges Wochenende !

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Ich hab mal mein PONG aus der Ramschkiste gekramt und bisschen damit 
rumgespielt. Siehe Anhang. Die drei Beispiele sind alle für 8MHz 
RC-Oszillatortakt gemacht. Beim Scroller kann man an beiden Reglern 
drehen und die Laufschrift beeinflußen, kleine Überraschung ;-)

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.