Forum: Mikrocontroller und Digitale Elektronik 2-Stellige 7-Segment Anzeige im Multiplexbetrieb


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich muss einen Lottozahlengenerator anfertigen,der eine 2 stellige 
Dezimalzahl auf einer 2-Stelligen 7-Segment Anzeige anzeigen lässt.
Das ganze soll im Multiplexbetrieb ablaufen.(Ohne Timer)

Ich bin soweit fast fertig mit dem Programm,nur hänge ich noch bei 
diesem Multiplexbetrieb fest. Ich weiß eben nur das es bedeutet,dass die 
2 anzeigen immer hin- und herschalten und sozusagen immer ein und 
ausgeschalten werden,aber das so schnell geht,dass es für das 
menschliche auge nicht sichtbar ist. Wie bewerkstellige ich so etwas im 
Programm?

Ach ja,das ganze wird mit Assembler programmiert,mein Mikrocontroller 
ist von Atmel (wenn jemand diese Information benötigt)

Wäre echt lieb,wenn mir da jemand helfen könnte!

MFG

von H.Joachim S. (crazyhorse)


Bewertung
0 lesenswert
nicht lesenswert
Warum ohne Timer? Dafür sind die da.
Und falls du schon alle benutzt hast, hängst du dich eben in eine schon 
bestehende Timerroutine mit rein.

von Chris (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> mein Mikrocontroller
> ist von Atmel (wenn jemand diese Information benötigt)
Welche Information?
Da Atmel mehr als einen µC herstellt, wäre mein µC ist AT.....
hilfreich.

mfg.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@crazyhorse

weil wir im Unterricht noch keine Timer behandelt haben,und ich nicht 
100%ig die Englische Einführung zu den Timern verstehe...


@Thomas

ich hatte die genaue Bezeichnung des uC's hier,nun find ich sie nicht 
mehr,ich bin jedoch dabei sie herauszufinden!

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@ Chris

ich hätte dazuschreiben sollen,dass es auf 8051-Ebene programmiert wird.
(Glaube,dass das so geschrieben wird,kenne mich mit diesem AVR nicht 
aus!)

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also habs wieder gefunden! Wir benutzen den Atmel AT89S8252 !

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Das ganze soll im Multiplexbetrieb ablaufen.(Ohne Timer)

Ohne Timer, was soll der Quatsch?
Warum wollen die Lehrer immer, daß man unbrauchbare Lösung benutzt.
Macht es ihnen Spaß, wenn man damit später in der Praxis auf die 
Schnauze fällt?


Peter

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> LoTTo schrieb:
>> Das ganze soll im Multiplexbetrieb ablaufen.(Ohne Timer)
>
> Ohne Timer, was soll der Quatsch?
> Warum wollen die Lehrer immer, daß man unbrauchbare Lösung benutzt.
> Macht es ihnen Spaß, wenn man damit später in der Praxis auf die
> Schnauze fällt?

Vielleicht ist es auch nur eine Vorstufe, damit man späte den 
Unterschied zu einer Timer-Lösung sieht und darüber sprechen bzw. 
demonstrieren kann, warum  die Timer-Lösung haushoch überlegen ist.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Wie bewerkstellige ich so etwas im Programm?
Ganz einfach. Du willst "49" ausgeben:
start:
- Bitmuster für "4" am Port anlegen
- linkes Display einschalten
- ein bisschen warten
- linkes Display ausschalten
- Bitmuster für "9" am selben Port anlegen
- rechtes Display einschalten
- ein bisschen warten
- rechtes Display ausschalten
- zurück zu "start"

"ein bisschen warten" ist das blödeste, was ein Controller machen kann.
Aber Timer hattet ihr ja noch nicht.

Karl Heinz Buchegger schrieb:
> Vielleicht ist es auch nur eine Vorstufe,

Ist es wohl auch.

mfg.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Ein Haus baut man aber auch nicht mit dem Dach zuerst.
Man macht zuerst das Fundament, dann die Wände und das Dach zum Schluß.

Multiplexen ohne den Timer zu kennen, ist quasi wie Fenster einsetzen 
ohne daß die Wände stehen. Sieht nicht nur blöd aus, sondern isses auch.

Es lernt sich einfacher, wenn die Reihenfolge richtig rum ist.


Peter

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> und ich nicht
> 100%ig die Englische Einführung zu den Timern verstehe...

Zum 8051 gibt es sehr viel auf deutsch, z.B.:

http://www.ipd.uka.de/~buchmann/microcontroller/index.htm

http://www.ieap.uni-kiel.de/surface/ag-berndt/lehre/fpmc/index.html


Peter

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Zum 8051 gibt es sehr viel auf deutsch, z.B.:
Aber das nützt ja alles nichts, wenn der Lehrer das anders haben will.

Die Frage ist doch, wie der Lehrer drauf ist. Ist die Aufgabe mit Timer 
nicht richtig gelöst und somit mangelhaft oder honoriert er das 
Vorgreifen auf sein Thema der nächsten Unterrichtsstunden?

mfg.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ne er meinte,ich kann das schon mit Timer machen,aber muss halt alles 
super dann erklären auch!

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas dankeschön!

Das bisschen warten ist kein Problem,ist ja mit einer Zeitschleife 
erledigt.
bin grad am Überlegen,welche Verzögerung passend ist...

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Thomas dankeschön!
>
> Das bisschen warten ist kein Problem,ist ja mit einer Zeitschleife
> erledigt.
> bin grad am Überlegen,welche Verzögerung passend ist...

Das ist eigentlich die falsche Überlegung.
Du willst eigentlich:
 so schnell wie möglich
 so dass du es dir gerade 'noch leisten' kannst.


Ein 'zu schnell' gibt es da nicht. Aber ein 'zu langsam'.


Und, was hindert dich jetzt daran, einen Timer zu benutzen? Weil du den 
erklären musst?
Timer sind doch ganz einfache!
FAQ: Timer
Ist zwar für einen AVR, aber das Prinzip ist bei deinem µC auch nicht 
anders.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1. Ist da nur eine Erklärung WAS ein Timer ist
2. Steht dann da nur ein Quellcode von einem C-Prgr. (C-Programmierung 
gibts erst in 2 Wochen..)

Ich brauch schon genauere Erklärungen auch für die Timer-Register,wie 
man die Timer initialisiert usw..
trz. danke

von mr. mo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Ich brauch schon genauere Erklärungen auch für die Timer-Register,wie
> man die Timer initialisiert usw..
> trz. danke

Naja. So viel lesen muss man da eigentlich nicht Oo

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
...so ein Quark. Was will man bei so einem Bello mit einem Timer. Damit 
das Umschalten der Segmente exact mit 100 Herz passiert und nicht mit 
101?

Mit 2 -3  verschachtelten Schleifen ist man schon am Ziel.

Timer? nicht nötig.
Interrupt? nicht nötig

Das ist allerdings der Hammer:

>>Ich bin soweit fast fertig mit dem Programm

Was genau macht es denn bis jetzt?

JK:

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
> Das ist eigentlich die falsche Überlegung.
> Du willst eigentlich:
>  so schnell wie möglich
>  so dass du es dir gerade 'noch leisten' kannst.
Vollkommen klar. Und daß das Bullshit ist und wie es richtig geht, 
wissen wir alle.
Aber in diesem Fall ist eine Verzögerung gar nicht so unsinnig.

Der Controller muß ja noch was anderes machen, nämlich eine Taste 
abfragen und eine Zufallszahl erzeugen. Jeder Tastendruck, jede 
Berechnung bringt das Display heftig zum Flackern bzw, die Hälfte, die 
gerade leuchtet, bleibt zu lange an. Leuchtet doppelt oder dreimal so 
lang.

Mit einer Verzögerung kann ich aber jede Displayhälfte sagen wir mal 5ms 
leuchten lassen und das Längerleuchten bedingt durch Tastendruck, fällt 
nicht so ins Gewicht.
Natürlich ist das immer noch Bullshit. Aber sieht wenigstens ein 
bisschen hübscher aus. Und zieht dem Lehrer den Zahn: So jetzt machen 
wir mal das Flackern weg...

mfg.

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:

> Natürlich ist das immer noch Bullshit. Aber sieht wenigstens ein
> bisschen hübscher aus. Und zieht dem Lehrer den Zahn: So jetzt machen
> wir mal das Flackern weg...

Ich wette das artet dann aus in:
da muss man dann halt die Verzögerungsschleife an die jeweilige 
Eingabesituation anpassen.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
> da muss man dann halt die Verzögerungsschleife an die jeweilige
> Eingabesituation anpassen.
Das wäre natürlich der Hit.
Aber das Konzept des Paukers ist es ja, die Jungs erst so einen Scheiß 
machen zu lassen um ihnen danach zu zeigen, wie man es besser macht.
Und er hat es auch ohne Timer ansehnlich hingekriegt. Und der Lehrer 
kann bis zum nächsten µC-Kurs im nächsten Schuljahr darüber grübeln wie.

Wenn das ein AVR wäre, würde ich ihm ein totales Scheiß-Delay-Dingen 
zusammenpfriemeln und das richtige Programm im Bootsektor verstecken. Da 
kommt der nie drauf.

mfg.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Pseudocode für ohne Interrupt:
if( Tastendruck erkannt ){
  Taste behandeln;
}
else
{
  Zyklen der Behandlung ausrechnen;
  entsprechende Anzahl NOPs ausfuehren;
}
// dito für jede weitere Verzweigung.

Lernen tut man dabei rein garnichts.
Daher schade um die Lebenszeit, die man damit vergeudet :-(


Peter

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:

> Aber das Konzept des Paukers ist es ja, die Jungs erst so einen Scheiß
> machen zu lassen um ihnen danach zu zeigen, wie man es besser macht.

Jaein.
Da sehen sie dann wenigsten direkt, warum das ein Problem ist. Sonst 
glaubt einem die Jugend ja sowieso nichts mehr :-)


Aber ich denke mittlerweile, wir liegen da mit der These, dass es sich 
dabei um ein vorbereitende Lernmethode handelt, sowieso falsch.
Und zwar wegen dem hier
> Beitrag "Re: 2-Stellige 7-Segment Anzeige im Multiplexbetrieb"
Das klingt für mich eher wieder mal nach einer Projektarbeit, die in 
Bereiche führt, die sie noch gar nicht gelernt haben, nur hat der 
SChüler das noch gar nicht gewusst, als er sich das Projekt ausgedacht 
hat.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
>> Beitrag "Re: 2-Stellige 7-Segment Anzeige im Multiplexbetrieb"
Ja. Das habe ich wohl übersehen.
Nichtsdestotrotz. Wenn man die Zufallszahl und die Taste zwischen die 
Ausgaben packt, sich die Taste merkt und danach nur noch bei Tastendruck 
die laufend neu berechnete Zufallszahl in die Ausgabe packt, läuft das 
flackerfrei. Daß die Zufallszahl ständig neu berechnet wird stört ja 
keinen grossen Geist. Und Entprellung-light ist auch mit drin.
Hauptsache die Laufzeit ist immer gleich.

Display links
Zufallszahl
Taste
Display rechts
Zufallszahl
Taste
if (Taste) Zufallszahl in Ausgaberegister
Nächste Runde

Peter Dannegger schrieb:
> Lernen tut man dabei rein garnichts.
> Daher schade um die Lebenszeit, die man damit vergeudet :-(
Ja klar.

mfg.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
da ja jemand fragte wie mein programm bis jetzt aussieht:

Es ist keine richtige zufallszahl,ich sollte ein Register bis 49 
hochzählen lassen,solange ein Knopfgedrückt ist und wenn es bei 1 
angelangt ist fängts wieder von vorne an. Die zahl die ich dann nach dem 
loslassen des Tasters habe,wird in den XRAM gespeichert (muss laut 
aufgabenstellung) und dannach durch 10 geteilt,damit ich einer und 
zehner habe. die werden dann jeweils auf den anzeigen angezeigt. Ich 
muss jetzt nur noch die zahlen die ich habe an die DIP-schalter 
transportieren und das keine doppelten Zahlen vorkommen.
Ich hab da noch ein Problem mit den DIP-schaltern. da ja eine Zahl an 
einem Dipschalter angelegt wird (zb. P1.1 für eine Zahl,P1.2 usw...) 
muss ich ja dann beim aufruf der dipschalter wieder ''einen 
Multiplexbetrieb'' starten,wäre doch dann sinnvoll,das multiplexen in 
ein Unterprg zu packen oder??

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>> Ich muss jetzt nur noch die zahlen die ich habe an die DIP-schalter
transportieren..

Also wenn ich Zahlen habe nehme ich meistens eine Schaufel und eine 
Schubkarre um sie an die Dip Schalter zu transportieren...
Zudem ist es völlig logisch das Dipschalter an einem 
Lottozahlengenerator hast an die du Zahlen transportieren musst, das 
leuchtet garantiert jedem der das ließt sofort ein :-)

>>da ja eine Zahl an einem Dipschalter angelegt wird...

Wie wird das laufen, auf ein Stück Papier drucken und an den Dipschalter 
kleben?

>>muss ich ja dann beim aufruf der dipschalter wieder ''einen
Multiplexbetrieb'' starten..

Als Dipschalter würde ich an der Fleichtheke erstmal eine Zahl ziehen 
damit ich aufgerufen werde, sonst komme ich ja nie dran...

>>das multiplexen in ein Unterprg zu packen oder??

Auf jeden fall, so würde ich es auch machen, das ist die entscheidende 
Frage, definitiv.

JK

von Paul B. (paul_baumann)


Bewertung
0 lesenswert
nicht lesenswert
@Jürgen K.

Versuch's mal bei der Komikerparade....

Paul

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Paul Baumann schrieb:
> Versuch's mal bei der Komikerparade....
Und wer soll sich das anhören?

Aber das mit den Dipschaltern hab' ich auch nicht verstanden.

mfg.

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:

> Aber das mit den Dipschaltern hab' ich auch nicht verstanden.

Da bist du nicht alleine.
Selbst wenn ich versuche, den Begriff 'Dipschalter' erst mal durch 'X' 
zu ersetzen und dann irgendeine sinnvolle Belegung für 'X' zu finden, 
komme ich auf keinen grünen Zweig.

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Was ich mir vielleicht vorstellen könnte:
Da es sich ja um Lotto handelt, muss er 6 Zahlen (plus Zusatzzahl) 
generieren. Das würde schon mal den Passus mit der Vermeidung von 
Duplikaten erklären.
Und dann stellt sich die Frage: Wie erfährt eigentlich mein Benutzer von 
den gezogenen Zahlen?
Da muss es also irgendeinen Selektionsmechanismus geben, mit dem der 
Benutzer dem Programm mitteilen kann: Zeig mir bitte Zahl 1, jetzt Zahl 
2, etc. Und der Selektionsmechanismus könnte in seiner physischen 
Ausführung eben durch jene ominösen DIP-Schalter realisiert sein.

Das ist allerdings Spekulation. Und selbst wenn ich mit dieser Raterei 
recht habe, sollte sich der TO mal der Frage stellen, ob er tatsächlich 
verstanden hat, wie ein Computer eigentlich arbeitet und welche Rolle 
Ein- bzw. Ausgabeelemente eigentlich spielen. Denn selbst in meinen 
kühnsten und wildesten Träumen würde und wäre mir nie eingefallen, den 
Akt des Einlesens von Schalterstellungen, zum Zwecke des Feststellens 
eines Benutzerwunsches, als 'an die DIP-Schalter senden' zu bezeichnen. 
Da stimmt ganz einfach die durch die Formulierung implizierte 
Datenflussrichtung schon mal überhaupt nicht, um mal auf die erste und 
meiner Ansicht nach wichtigste Verwirrung hinzuweisen.
Das sollte im übrigen auch nicht auf die leichte Schulter genommen 
werden, die in Wohl keiner anderen Disziplin wie der Programmierung, ist 
es so wichtig, seine Gedankengänge in einer nachvollziehbaren und 
verständlichen Form zu präsentieren. Und wenn es für jemanden unmöglich 
ist, wenigstens die auszuführende Tätigkeit einingermassen verständlich 
zu beschreiben, dann ... gute Nacht

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
-.-

die Zahl,die auf der 7segment erscheint,soll dannach durch die 
DIP-Schalter wieder aufgerufen werden,hab ich mich so undeutlich 
ausgedrückt=?

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>>Versuch's mal bei der Komikerparade....

ja ist schlecht ich weiß.

Mir brannte gerade der Hut.

Es ist wirklich schwer zu beschreiben wie die Aufgabenstellung aussieht, 
das ist mir schon klar. Aber das man so garnkein Gefühl dafür mitbringt 
was andere wissen könnten und was nicht, werde ich wohl nie verstehen.

@LoTTo
Du redest von Dingen die keiner versteht. Hier hat keiner deine 
Aufgabenstellung.

Wir haben alle keine Glaskugel a la hokus pokus. Es ergibt keinen Sinn 
wenn du es nicht erklärst.

A)Wofür sind die Dipschalter
B)wieviele sind vorhanden
C)Was wird dort zu welchem Zweck angegeben
D)In welcher Form (Zahlensystem?)

>>und das keine doppelten Zahlen vorkommen

Das musst du genauer erklären. Legst du alle bereits vorgekommenen 
Zahlen in binärform an Dipschalter an um festzuhalten welche bereits 
getippt wurden?

E)Wie sind die Schalter am Controller angebunden? Register?

Es wäre ggf. sinvoller sich die bereits getippten Zahlen in einem EE 
Prom zu merken, oder im Speicher....

Es muss hier wesentlich mehr kommen und es muss auch zu deiner 
Programmierkenntnis noch was kommen,es wirkt alles sehr unkoordiniert...

JK

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> hab ich mich so undeutlich ausgedrückt=?
Undeutlich wäre ja noch gegangen.

Wieviele Dipschalter hast du denn? Du bist nämlich gerade auf dem Weg zu 
deinem nächsten Problem.

mfg.

von Hubert G. (hubertg)


Bewertung
0 lesenswert
nicht lesenswert
Es werden sieben Dip-Schalter sein.
Er drückt sieben mal die Taste und generiert damit sieben Zahlen 
zwischen 1 und 49.
Mit den Dip-Schalter kann er dann jede einzelne Stelle anzeigen. Einen 
Schalter braucht er dann noch zum zurück setzen.

von Rio (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie kompliziert kann man es denn bitte machen?
Der Lehrer ist fachlich klar unter qualifiziert.

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>>Mit den Dip-Schalter kann er dann jede einzelne Stelle anzeigen

Mensch Leute, mit einem Dip-Schalter kann man nichts anzeigen, das geht 
nur mit einem Display oder einer Anzeige.

>>Einen Schalter braucht er dann noch zum zurück setzen.

Ist klar....Wen soll er denn wohin wann "zurück setzen" oder meintest du 
"zum Zurücksetzen"?

Mensch Mensch Mensch.

>>jede einzelne Stelle anzeigen

Schritt 1. Unterscheiden zwischen Ziffer und Zahl. Eine einzelne Stelle 
ist meist eine Ziffer. Eine Zahl kann aus mehreren Ziffern bestehen.

Was sollen nun die uminösen Dip-Schalter?
Ist jeder Schalter einer Lottozahl zugeordnet? Man drückt also 7x und 
kann sich dann jede erzeugte Zahl nochmal wiederholen? Wäre dann eine 
Taste zum Durchgehen der erzeugten Zahlen nicht einfacher und 
Sinnvoller? Was ist wenn 2 Dip-Schalter aktiv gemacht werden etc...?

JK

von oldmax (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi
Nun, das Problem ist vieeel größer...
Bei einer Lottoziehung von 7 Zahlen ist natürlich sicherzustellen, das 
jede gezogene Zahl nur einmal vorkommt. Klar.  Und das mit dem Wissen 
ohne Grundlagen zum Multiplexen. Das schaut übel aus. Es wird hier nix 
nützen, zu erklären, das es relativ einfach geht. Zuerst einen 
Speicherblock mit Zahlen von 1-49 füllen, diesen dann beim Ziehen der 
Zahlen zu adressieren und die gezogene Zahl aus diesem Block zu 
entfernen und in die Ziehung einzufügen. Das Ganze in Assembler. Nun, 
für einen "Durchblicker" kein Problem. Aber der hat auch keine Probleme 
mit einer zweistelligen Siebensegmentanzeige. Ich will hier gar nicht 
darauf hinweisen, das Timer und Interrupt schon "Gänsehaut" 
verursachen.....
Doch, eine Tip hab ich noch an "LoTTo".
Mach dir erst eimal klar, was dein Programm alles können muß. Einfach 
nur von 1 bis 49 zu zählen kann es ja nicht sein. Dann schreibst du dir 
auf, welche Blöcke du brauchst, um zu deinem Ziel zu gelangen.

Auch wenn es vielleicht keine Programmierhiolfe ist, hier mal so grob 
die Vorgehensweise:
Ziehungszähler auf 0
Taster gedrückt, zählen von 0 bis max (am Anfangr 48)
Taster losgelassen, Array adressieren und Inhalt unter Zuhilfenahme von 
Ziehungszähler in Ablage kopieren. Alle Werte oberhalb von Max um eins 
nach unten schieben. Max decrementieren
Ziehungszähler incrementieren und damit die Ablage neu adressieren
Während der Ziehung die Ausgabe auf die Ziehung schalten
Nach erfolgter Ziehung über Dipschalter die Ablage adressieren und die 
Werte ausgeben
Zur Ausgabe Werte durch 10 teilen, um Zehner und Einer zu trennen und in 
den Ausgabepuffer einzutragen.
Ausgabe erfolgt aus dem Ausgabepuffer
Ich glaub, das dürfte so ziemlich komplett sein. Verfeinern musst du es 
selber. Dann nimm dir einzelne Blöcke vor und programmier sie.
Gruß oldmax

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen ich muss mich ja an die Aufgabenstellung halten! Ich kann mir 
nicht aussuchen was ich will... In der Aufgabenstellung steht,dass man 
mit den DIP-Schaltern alte Lottozahlen wieder aufrufen kann und diese 
sollen dann an der 2-stelligen 7Segment angezeigt werden!
Meine Frage: Die DIP-Schalter (sind 8 an der Zahl) sind ja zusammen ein 
PORT (dürfte bei meinem P1 sein,spielt ja keine Rolle)

Nun: ein DIP-Schalter wäre ja doch dann P1.1 als beispiel. Das ist doch 
nur ein einzelnes Bit,wie kann ich dann dort eine ganze Zahl anlegen? 
Das ist mir nun ein Rätsel..

von LoTTo (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also Die Aufgabenstellung lautet:

Ich muss einen Lottozahlengenerator entwerfen (in Assembler):

Dieser muss eine ''zufällige Zahl'' (in meinem fall ist das einfach ein 
Register Welches nun von 1 bis 49 zählt und dann wieder von vorne 
Anfängt die Zufallszahl) an eine 2-Stellige 7-Segmentanzeige anzeigen 
lassen,welche im Multiplexbetrieb laufen soll. Die bereits ausgegebenen 
Zahlen sollen durch die DIP-Schalter wieder aufgerufen werden können 
(sind 8 Stück an EINEM Port)

Ich hab mal mein Programm(was ich aber von grund auf verändern werde) 
mal im Anhang mitgegeben

von LoTTo (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal die Originale Aufgabenstellung

von xfr (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Außerdem soll verhindert werden, dass keine Zahl doppelt gespeichert wird.

Mindestens eine Zahl soll also doppelt gespeichert werden? ;-)

von LoTTo (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
falsch ausgedrückt sorry!

Ich meine das nicht 2 mal die Zahl ''33'' z.b. gespeichert werden 
soll,sondern wenn die ''33'' ein Zweites Mal kommt,soll er ja dann 
nochmal eine neue Zahl auswählen.

Ich hab mal im Anhang mein programm wie es bis jetzt ist. Kann mir 
jemand verraten ob mein 'Multiplexbetrieb' richtig ist?

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:

> Nun: ein DIP-Schalter wäre ja doch dann P1.1 als beispiel. Das ist doch
> nur ein einzelnes Bit,wie kann ich dann dort eine ganze Zahl anlegen?
> Das ist mir nun ein Rätsel..


Junge .....   GAR NICHT!

Das sind Schalter! An die kannst du nix 'anlegen'. Schalter sind 
Eingangselemente. Mit Schaltern teilt ein Benutzer einem Programm mit, 
was er gerne möchte! Schalter geschlossen - Schalter offen.

Ein Schalter wird abgefragt, wie sein Zustand ist.
Deine Zahlen gibst du auf der Anzeige aus!

Und mit den Schaltern wird ausgewählt WELCHE Zahl jetzt gerade, in 
diesem Moment angezeigt werden soll! Ist ein andere Schalter betätigt, 
dann wird eine andere Zahl angezeigt. (Nämlich eine von den 7, die du 
dir vorher bestimmt hast)


Das ganze Gestammel von wegen "Ich lege eine Zahl an dem DIP-Schalter 
an" ist völlig ohne jeden Sinn! Es ist von der Qualität von "Das U-Boot 
überholte den Zug auf der Autobahn". Die Wörter sind richtig, die 
Zusammenstellung zu einem Satz ebenfalls - und trotzdem ist der ganze 
Satz ohne jeden Sinn. Da werden Begriffe miteinander verwendet, die 
nichts miteinander zu tun haben.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mein Lehrer hat mir eben eine E-Mail geschickt,ich hab nen Völlig 
falschen Denkansatz gehabt, was die DIP-Schalter anging. Mit den 
8DIP-Schaltern kann ich die BINÄRE adresse des jeweiligen Speicherortes 
der Lottozahl einstellen,die dann an der 7-Segment angezeigt werden 
soll. . .

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Mein Lehrer hat mir eben eine E-Mail geschickt,

Da Sie offenbar mitlesen:

Hallo, Herr Lehrer.
Ich finde es ehrlich gesagt nicht in Ordnung, wenn immer mehr Lehrer auf 
www.mikrocontroller.net verweisen, damit ihre Schüler eine Anlaufstelle 
haben, wenn es Probleme gibt. In erster Linie ist es ihr Job, ihre 
Schüler soweit zu bringen, dass sie in der Lage sind, ihre Hausaufgaben 
zu lösen. Dazu gehört auch, dass man komplizierter Aufgaben mit den 
Schülern durchspricht, ihnen die grundlegenden Ansätze zeigt und 
sicherstelle, dass zumindest jeder die Aufgabenstellung und den Einsatz 
der vorhandenen Resourcen verstanden hat.

mfg
einer der Moderatoren von www.mikrocontroller.net

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ne der hat mich nicht darauf verwiesen O.o?
der liest das auch nicht mit,bin selber hierher gekommen.
Und ich will bestimmt keine Lösungen von euch , nur Hilfe wie etwas 
realisiert werden kann mehr nicht.... Mein Gott...

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> ne der hat mich nicht darauf verwiesen O.o?

Hatten wir alles schon. Und es kommt gar nicht so selten vor, dass 
überforderte Lehrer ihre Schützlinge hier 'aussetzen'.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ihr dürft ja gerne glauben was ihr wollt.. :)

Ich bedanke mich trz für die ''SINNVOLLEN'' Beiträge mancher von euch ! 
:)

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Ich finde diese Aufgabe für die Schule zu schwer.
Ich kann mir nicht vorstellen, daß die ein Schüler zufriedenstellend 
lösen kann.
Es fehlen einfach die Grundlagen, um so ein komplexes Problem in seine 
Teilaufgaben zu zerlegen und diese dann strukturiert zu implementieren.
Als erstes müßte man sich überlegen, welche Variablen man braucht und 
diese anlegen.


Peter

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Ich hab mal im Anhang mein programm wie es bis jetzt ist.

Naja, noch nicht sehr viel.
So 5 .. 10% der Arbeit schätze ich.

LoTTo schrieb:
> Kann mir
> jemand verraten ob mein 'Multiplexbetrieb' richtig ist?

Etwas verschwurbelt, könnte aber gehen.


Peter

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> Die zahl die ich dann nach dem
> loslassen des Tasters habe,wird in den XRAM gespeichert (muss laut
> aufgabenstellung)

Diese Teilaufgabe könnte z.B. so aussehen:
; Defines 
;--------------------------------------------------------------------
Minval          equ     1
Maxval          equ     49
Maxnumbers      equ     6       ; 6 aus 49
xdata_base      equ     0000h

; Variables
;--------------------------------------------------------------------
        dseg    at      30h

display_ones:   ds      1       ; 7-segment pattern for ones-digit
display_tens:   ds      1       ; 7-segment pattern for tens-digit
display_digit:  ds      1       ; 0 or 1

index:          ds      1       ; 0 ... maxnumbers - 1
number:         ds      1       ; actual random number

; Code
;--------------------------------------------------------------------
        cseg

;-------------- Store lottery number, count up Index ----------------
; function:
; if index < maxnumbers:
;       store numer,
;       increment index
;--------------------------------------------------------------------
store_number:
        mov     a, index
        cjne    a, #maxnumbers, _stn1
_stn1:
        jc      _stn2                   ; C = 1, if a < maxnumbers
        ret                             ; error, max index reached
_stn2:
        mov     dptr, #xdata_base       ; calculate address:
        add     a, dpl                  ; xdata base + index
        mov     dpl, a
        jnc     _stn3
        inc     dph
_stn3:
        mov     a, number
        movx    @dptr, a                ; store new number
        inc     index
        ret
;--------------------------------------------------------------------
end

Und mit diesem Array mußt Du dann jede neue Zahl vergleichen, ob sie 
schon drin ist, damit sie nicht doppelt ist.
Diese Prüfung ist dann eine weitere kleine Teilaufgabe.
Usw.

Diese Methode nennt sich Bottom-up. Zusammengebastelt wird zum Schluß.


Peter

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>>Meine Frage: Die DIP-Schalter (sind 8 an der Zahl) sind ja zusammen ein
>>PORT

Die DIP-Schalter sind zusammen ein 8Poliger DIP- Schalter und kein Port. 
Solange du nicht verstehst das es falsch ist was du schreibst und gerade 
auf diese Details nicht im Unterricht und bei der Aufgabenstellung 
achtest, wird das nichts mit der Ausarbeitung.

>> (dürfte bei meinem P1 sein,spielt ja keine Rolle)

Was ist denn bei deinem P1? Was ist überhaupt dein P1? Versteht kein 
Mensch!!! Garantiert nicht.

Ich versuche es jetzt noch einmal mit geziehlten Fragen, bei den letzten 
hast du ja nur vereinzelt indirekt oder garnicht geantwortet.

A)Wieviel Erfahrungen hast du mit deiner Hardware?

A1)Kannst du bei deiner Hardware Pins auf High oder Low schalten?
A2)Kannst du bei deiner Hardware Eingansgspins abfragen und darauf 
reagieren?

B)Wie sieht es mit deiner Erfahrung im programmieren aus?

B1)Variablen anlegen und zuweisen
B2)Kontrollstruturen bedienen
B3)...

Du schriebst oben mal "Bin fast fertig" dabei hattest du die 
Aufgabenstellung scheinbar noch nicht mal ganz verinnerlicht. Wie steht 
es nun um diese Aussage?

>> Außerdem soll verhindert werden, dass keine Zahl doppelt gespeichert wird.

Der Aufagbenverfasser gehört übrigens auch geschlagen. Das steht dort 
wirklich so drin. Wie kann das nur sein? Und LoTTo entschuldigt sich 
auch noch dafür. Muss man Ihn ja mal in Schutz nehmen. Bei der 
Aufgabenstellung und dem Hintergrundwissen würde ich genauso da sitzen. 
Man man...
Zumal wirklich der Rahmen für den Ablauf fehlt. Wie man z.B. wieder eine 
neue Runde anfängt, oder ob die Zahlen dann immer einen "Platz" 
aufrücken etc...Halbfertige Aufgabenstellung mit fehlerhafter 
Beschreibung. Normalerweise müsste man das mal so programmieren wie es 
dort verlagt wird, das Gesicht möchte ich dann mal sehen, wenn nachher 3 
x die 37 in einem Druchlauf abgespeichert wird und der LoTTo sagt: 
"wieso, steht doch so in der Aufgabenstellung"...


JK

von Dr. Frust (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen K. schrieb:
> Der Aufagbenverfasser gehört übrigens auch geschlagen. Das steht dort
> wirklich so drin.

Ja, mir scheint durch den Schüler kann man den Lehrer sehen. Und man 
sieht nichts Gutes.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
naja... Ich hab eigentlich nur noch das Problem mit dem Multiplexen im 
Moment:

So wie ich es programmiert habe,würde er mir die Zahl (also Die 
Zehnerziffer kurz und die Einerziffer kurz) kurz anzeigen .... Zu 
schnell für das menschliche Auge. Wie könnte ich es lösen,dass dauernd 
hin und hergeschaltet wird (OHNE TIMER,auch wenns schwachsinn ist!)?

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> naja... Ich hab eigentlich nur noch das Problem mit dem Multiplexen im
> Moment:
>
> So wie ich es programmiert habe,würde er mir die Zahl (also Die
> Zehnerziffer kurz und die Einerziffer kurz) kurz anzeigen .... Zu
> schnell für das menschliche Auge. Wie könnte ich es lösen,dass dauernd
> hin und hergeschaltet wird (OHNE TIMER,auch wenns schwachsinn ist!)?


Indem du dauernd, während das Programm auf den nächsten Tastendruck 
wartet bzw. die DIP-Schalter abfrägt, zwischen den Anzeigen hin und her 
schaltest?

Wenn du keinen Interrupt/Timer nehmen kannst, dann musst du eben selber 
an 'strategisch guten Positionen' in deinem Programm dafür sorgen, dass 
laufend umgeschaltet wird. An irgendeiner Stelle im Programm muss es ja 
schliesslich passieren.

Ob dein programm jetzt Däumchen dreht und beim Warten auf eine Taste 
nichts tut, oder ob es zwischendurch mal die jeweils andere 
Anzeigenstelle einschaltet, ist ja dem µC wieder egal.

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
...ohne Timer einfach 3 oder 4 Schleifen ineinander verschachteln:



START_    movlw    .2
    movwf    ZEIT4


MESS4_    movlw    .2
    movwf    ZEIT3


MESS3_    movlw    .3
    movwf    ZEIT2


MESS2_    movlw    .3
    movwf    ZEIT1

MESS1_    decfsz    ZEIT1,F
    goto     MESS1_
    decfsz    ZEIT2,F
    goto     MESS2_
    decfsz    ZEIT3,F
    goto     MESS3_
    decfsz    ZEIT4,F
    goto     MESS4_
    goto    START_

So siehts in PIC asm aus. Eine Schleife um die nächste basteln. In jeder 
Schleife hat man dann unterschiedliche Rechenleistungen. Weiter innen 
kann man dann das Muxen machen, und aussen die Dinge die nur seltener 
gemacht werden müssen....


JK

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich finds ja wahnsinnig nett,dass manche hier Lösungen posten,(auch wenn 
das gar nicht das ist worauf ich wirklich aus bin),nur ich bin eben noch 
schüler und wir arbeiten nur mit einem Mikrocontroller und zwar den von 
Atmel und wenn ihr hier mit AVR oder sonstigem anfängt,kann ich da nicht 
alles rauslesen oder gar nichts..

von Jobst M. (jobstens-de)


Bewertung
0 lesenswert
nicht lesenswert
Beispiele sind eben doch am anschaulichsten. :-/
Und ich habe es gerade am Wickel ...

Also: Du musst für Multiplex mit Timer diesen erst mal starten.
Dazu wird dem Timer gesagt, wie er sich verhalten soll.
Es muss dem Timer gesagt werden wie weit er zählen soll (das ist in 
Deinem Fall nicht sonderlich wichtig)
Und es müssen die benötigten Interupts erlaubt (eingeschaltet) werden.

Das wird hier mit 'LCALL init_timer2' erledigt.
; Timer 2 starten
init_timer2:   MOV  T2CON, #0x04  ; Starten

               MOV  CRCL, #0x00   ; SET RCAP2 = 0xF000 (-4096)
               MOV  CRCH, #0xF0

               SETB  ET2          ; ET2 = 1 : Erlaube Interupt f. T2
               SETB  EAL          ; EAL = 1 : Erlaube Interupts

    RET

Dann muß man an der Timer2-IRQ-Vector-Adresse ein 'LJMP irq_timer2' 
setzen, damit diese, wenn der Timer2 einen IRQ erzeugt, auch 
angesprungen wird.
Alles was Du nun noch im Hauptprogramm machen musst, ist die beiden 
Bytes zahl_einer und zahl_zehner mit sinnvollen Daten zu füllen. Einmal. 
Und erst dann wieder, wenn Du andere Zahlen darstellen möchtest.
; Timer 2 ISR
irq_timer2:     PUSH  ACC            ; Akku sichern - denn den brauchen und verändern wir
                PUSH  PSW            ; Statusreg sichern - das brauchen wir auch
                CLR  T2PS            ; IRQ zuruecksetzen - wir kümmern uns nun ja darum.

                MOV  A, switch
                ADD  A, #128         ; bei jedem 2. Mal Carry erzeugen
                MOV  switch, A

                JC  zehner           ; und deshalb bei jedem 2. Mal abbiegen

                CLR  P3.2            ; Zehner Segment abschalten
                MOV  P1, zahl_einer  ; Einerdaten an Port anlegen
                SETB  P3.3           ; Einer Segment einschalten

                JMP  irq_fertig      ; Bis zum nächsten IRQ werden die Einer angezeigt

zehner:         CLR  P3.3            ; Einer Segment abschalten
                MOV  P1, zahl_zehner ; Zehnerdaten an Port anlegen
                SETB  P3.2           ; Zehner Segment einschalten

irq_fertig:     POP  PSW             ; Statusreg wieder herstellen
                POP  ACC             ; Akku wieder herstellen
                RETI                 ; alles wieder wie vorher und zurück

Die Ports musst Du noch anpassen. Logisch.

Vielleicht hilft es ja ...


Gruß

Jobst

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>>Wie könnte ich es lösen,dass dauernd hin und hergeschaltet wird (OHNE TIMER,auch 
wenns schwachsinn ist!)

indem du das nicht nur 1 mal machst sondern unendlich, in einer 
Schleife...

schleife unendliche
{
   ist anzeige "zehner" an
   {
      ja: dann mach anzeige einer an (und lege die segmentfolge an)

      nein: dann mach anzeige zehner an (und lege deren segmentfolge an)
   }

   mach anderes Zeug (Tasten abfragen etc...)

   gehe nach oben und wiederhole.

}


JK

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen K. schrieb:
>>>Wie könnte ich es lösen,dass dauernd hin und hergeschaltet wird (OHNE 
TIMER,auch
> wenns schwachsinn ist!)
>
> indem du das nicht nur 1 mal machst sondern unendlich, in einer
> Schleife...
>
> schleife unendliche
> {
>    ist anzeige "zehner" an
>    {
>       ja: dann mach anzeige einer an (und lege die segmentfolge an)
>
>       nein: dann mach anzeige zehner an (und lege deren segmentfolge an)
>    }
>
>    mach anderes Zeug (Tasten abfragen etc...)
>
>    gehe nach oben und wiederhole.
>
> }
>
>
> JK

also eins kann nicht stimmen (aus meiner sicht)

Wenn Anzeige zehner an ist soll er einer auch anmachen und die 
segmentfolge anlegen. Das hat doch doch dann zu Folge,(da zehner 
immernoch an ist),dass die 2stellige 7segment 2 mal dieselbe ziffer 
anzeigen würde,z.B. '1  1'. Die zweistellige 7segment ist ja an einem 
Port angelegt

von Dussel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Natürlich soll die andere Stelle ausgeschaltet und vor dem Einschalten 
das neue Muster angelegt werden. Das ist nur Pseudocode und ein bisschen 
Transferleistung gehört dazu.
Mach erstmal was anderes, um den Kopf frei zu bekommen. Ich habe das 
Gefühl, du bist jetzt komplett verwirrt. ;-)
Und nicht verzweifeln. Sowas kann jedem passieren.

von Ausbilder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was ich hier sehe, sehe ich auch bei meinen Azubis. Die sollen irgendwas 
machen, was 1. in der Realität ganz anders zu machen ist und 2. die 
Pauker ebenfalls keinen Schimmer haben, wie was zu lösen ist. Ich wette, 
der Pauker versteht den Timer auch nicht.

Im übrigen stellt man wieder fest, dass die Schöler kein English können, 
obwohl es unterrichtet wird. Armes Deutschland.

Im Rahmen eines Ausbildungsprojektes haben wir ein Thermometer mit einer 
Uhr gebaut, wenn man es den Leuten in Mundgerechte Happen schneidet und 
verständlich erklärt, gibts keine Probleme. Jedoch schaffen die meisten 
Pauker nicht, weil sie eh keine Lust haben und fachlich selber Pfeifen 
sind.

von Jobst M. (jobstens-de)


Bewertung
0 lesenswert
nicht lesenswert
Ausbilder schrieb:
> ...

Kann ich unterschreiben.


Gruß

Jobst

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
aber Diese 'Schleifen' kann ich ja doch dann nur in C programmieren,aber 
nicht mit Assembler,oder?

Und wie ich ja bereits geschrieben hatte (Trz. Danke an 
Jobstens-de),muss ich das (es wäre mir lieber) ohne Timer realisieren.

von Wegstaben V. (wegstabenverbuchsler)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> aber Diese 'Schleifen' kann ich ja doch dann nur in C programmieren,aber
> nicht mit Assembler,oder?

Schleifen, (bedingte) Abfragen, Zuweisungen: Das sind alles die 
"Grundbausteine" von Algorithmen, egal ob die in C, Assembler, oder in 
"Pseudocode" geschrieben sind.

der Unterschied besteht bei der zuvor genannten Schleifenanweisung 
lediglich darin, daß bei einer "Endlos-Schleife" keine Abbruch-Bedingung 
vorkommt (welche man überprüfen muß)

wiederhole (unendlich lange bis zum jüngsten Tag)
{
    mache irgendwas
}


bzw.

wiederhole (bis irgendwas zutrifft>)
{
    mache irgendwas
}


Du siehst? Im 2. Falle gibt es eine "Schleifenbedingung" , z.B. daß eine 
Variable einen bestimmten Wert haben muß.


In Assembler würde das "springen" auf den Schleifenanfang mit 
irgendeiner Jump-Instruktion abgebildet werden, welche dir an den 
Schleifenanfang hüpft. In C gibt es zwar auch etwas vergleichbares 
("goto"), das ist aber zum Einen verpönt, zum Anderen auch gar nicht 
notwendig, sowas macht der Compiler für dich.

von Jobst M. (jobstens-de)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> aber Diese 'Schleifen' kann ich ja doch dann nur in C programmieren,aber
> nicht mit Assembler,oder?

Hat Euch der Lehrer das auch nicht beigebracht?

loop:
                hier kommt der andere Krempel hin, den Du erledigen musst.
                Dazu gehört NICHT warten!
                Entweder Du veränderst zahl_einer und zahl_zehner oder Du lässt es bleiben


                ; das hier kennst Du schon ...

                MOV   A, switch
                ADD   A, #128         ; bei jedem 2. Mal Carry erzeugen
                MOV   switch, A

                JC    zehner          ; und deshalb bei jedem 2. Mal abbiegen

                CLR   P3.2            ; Zehner Segment abschalten
                MOV   P1, zahl_einer  ; Einerdaten an Port anlegen
                SETB  P3.3            ; Einer Segment einschalten

                JMP   irq_fertig      ; Bis zum nächsten mal werden die Einer angezeigt

zehner:         CLR   P3.3            ; Einer Segment abschalten
                MOV   P1, zahl_zehner ; Zehnerdaten an Port anlegen
                SETB  P3.2            ; Zehner Segment einschalten

                JMP   loop


Eieiei ...


Gruß

Jobst

von oldmax (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi
Ich versteh auch manchmal die Welt nicht mehr...
>aber Diese 'Schleifen' kann ich ja doch dann nur in C programmieren,aber
>nicht mit Assembler,oder?
Jedes Programm ist eine Schleife, ob du willst oder nicht. Betrachte ein 
Programm wie einen Ring, zum Beispiel eine Eisdenbahn. Ganz einfach ist 
da ein Oval mit einem Punkt zum Ein- und Aussteigen. Damit es 
interessanter wird, kommen Weichen hinzu. Der Ring aber bleibt und wenn 
du nach HAmburg in die Miniaturwelt fährst... auch das sind alles 
Schleifen, wo die Züge fahren. Genau so funktioniert ein Programm und 
damit es "deine" Schleife wird, setzt du in deinem Programm irgendwo ein 
"JMP Loop". Wenn du es nicht so programmierst, dann läuft dein 
Controller mit seinem Programmcounter oder Befehlszeiger an die Grenzen 
seines Speichers und fängt danach wieder mit Adresse "0" an. Diese 
Kleinigkeit eines Programmes sollte euch aber doch im Unterricht 
beigebogen worden sein. Ansonsten ist jede Mühe hier vergeblich.
Die Arbeiten oder Aufgaben in dieser Schleife sind "Erfassen von 
Informationen", "Verarbeiten dieser Informationen" und "Ausgeben von 
Ergebnissen". Dreimal darfst du raten, wie diese drei Aufgaben in der 
Schleife verteilt sind.
Nun zum Multiplexen. Die Kunst ist nicht, die gemeinsame Anode oder 
Kathode einer 7-Segmentanzeige ein- oder auszuschalten, sondern auch die 
jeweilige Information entsprechend auf die Segmente zu schalten. 
Angenommen, du hast zwei Speicherzellen. In einer steht eine "3" und in 
der anderen eine "7" . Das soll der Zahl "37" entsprechen.
Nun geht man wie folgt vor:
Zuerst den gemeinsamen Anschluss aller Anzeigen abschalten. Dann die 
Zahl aus der folgenden Speicherzelle in einen Akku laden und an die 
parallel geschalteten Segmente codieren. Danach die nächste 
Anzeigenstelle aktivieren und den Gemeinsamen der Ziffer einschalten. 
Nun kommt eine kleine Zeitverzögerung, damit die Anzeige auch etwas 
darstellen kann, sprich die LED's sollen auch ein wenig leuchten. Dann 
beginnt der Vorgang von vorn.
Die Codierung der Ziffern kannst du in einem Array entsprechend 0 bis 9 
hinterlegen. Zur Ausgabe lädst du in einem Register die Basisadresse 
dieses Arrays. Addierst den Wert der anzuzeigen ist und holst den 
entsprechenden Code dazu. Dieser wird dann auf die Anzeigesegmente 
geschaltet. Hört sich kompliziert an und das ist es auch, wenn mann noch 
nicht einmal die Programmschleife kapiert hat. Ich fürchte, dein 
Lottozahlengenerator wird nix, es sei denn einer erbarmt sich deiner und 
liefert den Code. Ich hab dir bereits in einem Post geschrieben, das du 
dir erst einmal Gedanken machen sollst, welche Programmblöcke in deiner 
Aufgabe enthalten sind. Letztendlich werden diese dann einfach in deine 
Programmschleife eingefügt, ähnlich der Weichen in einem Gleisoval.
Vielleicht verstehst du jetzt ein wenig, warum einige Antworten so 
negativ zu den Lehrkräften ausfallen. Auch mir erscheint es so, das sie 
euch völlig nackt zum Skifahren schicken......
Gruß oldmax

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
oldmax schrieb:
> Ich hab dir bereits in einem Post geschrieben, das du
> dir erst einmal Gedanken machen sollst, welche Programmblöcke in deiner
> Aufgabe enthalten sind.

So isses!

Es nützt garnichts, wenn man sich erstmal in das Multiplexen verbeißt. 
Denn für die nächsten Aufgaben mußt Du es immer wieder auseinander 
reißen.

Du mußt die einzelnen Teilaufgaben beschreiben (in Worten) und dann erst 
kannst Du sie auch implementieren (Code). Diese werden dann in der 
Mainlopp hintereinander aufgerufen.
Das Beschreiben in Worten hat auch den Vorteil, daß jemand leicht helfen 
kann, wenn etwas falsch ist, bevor Du umsonst Mühe aufgewendet hast, 
Code zu schreiben. In Text lassen sich Deine Fehler viel leichter sehen, 
als in Code.


Warum hier geraten wird, erstmal den Timerinterrupt zu lernen, hat einen 
einfachen Grund. Als Anfänger hast Du 0 Ahnung, wie lange einzelne 
Funktionen brauchen. Braucht Deine Mainloop zu lange, flackert die 
Anzeige. Braucht sie zu schnell, ist die Anzeige zu dunkel, bzw. Du 
kriegst Geister-Digits angezeigt.
Der Timer ist daher ideal, um definierte Zeitabläufe zu schaffen. Und 
als Interrupt entkoppelt er das Multiplexen von der Mainloop. Es ist 
dann völlig egal, wie lange die Mainloop dauert. Die Mainloop braucht 
auf das Multiplexen keinerlei Rücksicht zu nehmen.


Peter

von Jürgen K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
sag mal LoTTo, wie kann dein Programm eigentlich schon fast "ferig" sein 
wenn du keine Schleifen kennst!?

Mich dolcht du hast nichts. Wo ist denn das P

_Anfang      mach dies
             mach das
             mach noch mehr
             gehe zu _Anfang

!?
Ich verstehe es nicht - was ist denn nun das Problem? Beim Muxing von 2 
Stellen musst du doch nur gucken welche an ist und immer die andere 
einschalten nachdem du die eine ausgeschaltet hast und entsprechendes 
Muster anlegen - ist doch kein Geheimnis....?

JK.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hab das multiplexen geschafft.
multiplex:  MOV A,R6
            MOVC A,@A+DPTR
            MOV P2,A
            SETB AnzZ
            ;Call Zeit
            CLR AnzZ
            MOV A,R5
            MOVC A,@A+DPTR
            MOV P2,A
            SETB AnzE
            ;CALL Zeit
            CLR AnzE
            JNB Taster,multiplex


funzt perfekt,habs schon ausprobiert ;)

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> hab das multiplexen geschafft.

Prima, dann fehlen Dir ja nur noch die restlichen 95% der Aufgabe.

LoTTo schrieb:
> funzt perfekt,habs schon ausprobiert ;)

Nur weil Du eine Teilaufgabe ausprobiert hast, ist noch lange nichts 
perfekt.

Einige Kritikpunkte:
1.
Du vertraust darauf, daß 4 Register ihren Wert behalten.
Besser, Du nimmst Variablen (RAM) dafür. Das erhöht die Übersicht, 
verbessert die Lesbarkeit und vermeidet push/pop-Arien.

2.
Warum jedesmal neu die Umwandlung in 7-Segement?
Machs doch gleich beim Zerlegen der Zahl.

3.
Es ist nicht verboten, Code zu kommentieren. Im Gegenteil, Du solltest 
es. Es hilft vorallem Dir selbst.


Peter

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
nein,mir fehlen nicht 95% der aufgabe... ich muss jetzt nur noch das mit 
den DIP-Schaltern machen und dann bin ich fertig.

von LoTTo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
das mit dem Kommentieren kommt natürlich noch,hier ging es doch nur 
darum,wie ich das mit dem Multiplexen und den DIP-Schaltern realisiere 
..

Lesen und dann meckern!

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
LoTTo schrieb:
> nein,mir fehlen nicht 95% der aufgabe...

Der Eindruck entsteht aber, wenn man mal die Aufgabenstellung mit dem 
vergleicht, was Du uns bisher gezeigt hast.
Möchtest Du uns das gesamte Programm zeigen?

In der Regel läßt sich viel besser helfen, wenn man ein komplettes 
Programm sieht und nicht nur kleine Schnipselchen davon.

Soll das Programm auch praktisch funktionieren oder nur im Simulator den 
Eindruck erwecken?
In der Praxis muß man nämlich die Tasten entprellen.


Peter

von Sam .. (sam1994)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> In der Praxis muß man nämlich die Tasten entprellen.

Tasten ja, Dip-Schalter eigentlich nicht.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Sam .. schrieb:
> Tasten ja, Dip-Schalter eigentlich nicht.
Eigentlich. Wenn man sie bestimmungsgemäß als Kodier- oder 
Konfigurationsschalter benutzt. Er will/soll sie aber wie richtige 
Schalter einsetzen. Dazu kommt dann das Problem, daß man mit seinen 
Wurstfingern immer die beiden daneben liegenden Schalter mitbetätigt, 
ohne daß diese auch einrasten oder vielleicht doch der eine oder andere.
Muss alles berücksichtigt werden, damit der Controller nicht ausrastet.
Peda liegt da mit seiner Einschätzung von 5% schon ganz richtig. 
Vielleicht sind es auch 10%. Aber der Drops ist noch lange nicht 
gelutscht.

mfg.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Sam .. schrieb:
> Tasten ja, Dip-Schalter eigentlich nicht.

Ich hab die Aufgabe so verstanden, daß ein Taster vorhanden ist, den man 
6* drückt, um 6 verschiedene Lottozahlen zu erzeugen.
Wenn man den nicht entprellt, können z.B. bei einem Druck 2 oder mehr 
aufeinander folgende Zahlen gespeichert werden.


Peter

von retnox (Gast)


Bewertung
0 lesenswert
nicht lesenswert
so hab nun alle Probleme ALLEINE gelöst,trz danke an diejenigen unter 
euch,die sinnvolle beiträge von sich gaben.

von Jobst M. (jobstens-de)


Bewertung
0 lesenswert
nicht lesenswert
retnox schrieb:
> so hab nun alle Probleme ALLEINE gelöst,trz danke an diejenigen unter
> euch,die sinnvolle beiträge von sich gaben.

Darum ging es ja auch! Hätten wir Dir eine fertige Lösung vor die Füße 
geschmissen, hättest Du nichts dabei gelernt.
Ich denke schon, daß Dir der ein oder andere Beitrag erheblich weiter 
geholfen hat, daher finde ich 'alleine' etwas übertrieben. Naja ...


Gruß

Jobst

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.