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
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.
@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!
@ 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!)
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
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.
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.
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
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.
Thomas dankeschön!
Das bisschen warten ist kein Problem,ist ja mit einer Zeitschleife
erledigt.
bin grad am Überlegen,welche Verzögerung passend ist...
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.
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
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
...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:
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.
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.
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.
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.
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.
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??
>> 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
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.
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.
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
>>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
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.
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.
>>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
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
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..
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
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?
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.
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. . .
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
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...
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'.
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
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
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:
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
>>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
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.
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!)?
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.
...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
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..
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.
1
; Timer 2 starten
2
init_timer2: MOV T2CON, #0x04 ; Starten
3
4
MOV CRCL, #0x00 ; SET RCAP2 = 0xF000 (-4096)
5
MOV CRCH, #0xF0
6
7
SETB ET2 ; ET2 = 1 : Erlaube Interupt f. T2
8
SETB EAL ; EAL = 1 : Erlaube Interupts
9
10
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.
1
; Timer 2 ISR
2
irq_timer2: PUSH ACC ; Akku sichern - denn den brauchen und verändern wir
3
PUSH PSW ; Statusreg sichern - das brauchen wir auch
4
CLR T2PS ; IRQ zuruecksetzen - wir kümmern uns nun ja darum.
5
6
MOV A, switch
7
ADD A, #128 ; bei jedem 2. Mal Carry erzeugen
8
MOV switch, A
9
10
JC zehner ; und deshalb bei jedem 2. Mal abbiegen
11
12
CLR P3.2 ; Zehner Segment abschalten
13
MOV P1, zahl_einer ; Einerdaten an Port anlegen
14
SETB P3.3 ; Einer Segment einschalten
15
16
JMP irq_fertig ; Bis zum nächsten IRQ werden die Einer angezeigt
17
18
zehner: CLR P3.3 ; Einer Segment abschalten
19
MOV P1, zahl_zehner ; Zehnerdaten an Port anlegen
20
SETB P3.2 ; Zehner Segment einschalten
21
22
irq_fertig: POP PSW ; Statusreg wieder herstellen
23
POP ACC ; Akku wieder herstellen
24
RETI ; alles wieder wie vorher und zurück
Die Ports musst Du noch anpassen. Logisch.
Vielleicht hilft es ja ...
Gruß
Jobst
>>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
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
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.
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.
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.
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.
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?
1
loop:
2
hier kommt der andere Krempel hin, den Du erledigen musst.
3
Dazu gehört NICHT warten!
4
Entweder Du veränderst zahl_einer und zahl_zehner oder Du lässt es bleiben
5
6
7
; das hier kennst Du schon ...
8
9
MOV A, switch
10
ADD A, #128 ; bei jedem 2. Mal Carry erzeugen
11
MOV switch, A
12
13
JC zehner ; und deshalb bei jedem 2. Mal abbiegen
14
15
CLR P3.2 ; Zehner Segment abschalten
16
MOV P1, zahl_einer ; Einerdaten an Port anlegen
17
SETB P3.3 ; Einer Segment einschalten
18
19
JMP irq_fertig ; Bis zum nächsten mal werden die Einer angezeigt
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
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
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.
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
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!
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
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.
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
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