Hallo Leute,
und zwar stehe ich wirklich auf dem Schlauch. So erstmal zur
Aufgabenstellung: Wir müssen einen Lottozahlengenerator in Assembler
programmieren(8051WinXL und RIDE). Man soll eine Taste drücken und
sobald man loslässt soll eine Zahl von 1 bis 49 auf der 2-stelligen
7-Segment Anzeige ausgegeben werden. Ich habe nun meinen Programmcode
als Anhang zur Verfügung gestellt mit der Hoffnung,dass ihr mir helfen
könnt. Ich möchte nur mal nebenbei sagen, dass ich wirklich nicht sehr
gut in diesem Themengebiet bin, jedoch mein Bestes gebe. Des Weiteren
kriegen wir von unserem Lehrer gar keine Unterstützung...
Ich hoffe ihr könnt mir helfen und danke euch im Voraus! :-)
DerGast schrieb:> Ich habe nun meinen Programmcode als Anhang zur Verfügung gestellt mit> der Hoffnung,dass ihr mir helfen könnt.
Das hättest du mal besser als *.asm oder *.txt gemacht. Dann bräuchte
man kein externes Programm, um den Quelltext anzusehen. Da sehe ich
gerade: es ist noch schlimmer, viel schlimmer! Du hast einen
Screenshot(!), der augenscheinlich wiklich abfotografiert(!!) wurde, in
dieses Office-Format hineingepackt. Umständlicher gehts echt nicht
mehr...
> Ich habe nun meinen Programmcode als Anhang zur Verfügung gestellt mit> der Hoffnung,dass ihr mir helfen könnt.
Was erwartest du von diesem Programm? Was sollte es tun, und was macht
es stattdessen? Und wie stellst du das fest?
DerGast schrieb:> Des Weiteren kriegen wir von unserem Lehrer gar keine Unterstützung...
Warum nicht? Der macht das Selbe doch schon seit gut 30 Jahren...
BTW1:
das hier ist ein komplett unnötiger Kommentar (so wie die meisten)
mov R1, A; // Akku ins R1 laden
Richtig gut Kommentare beschreiben nicht die Assemblerzeile, sondern
das, was mit diesen Zeilen gerade gemacht wird.
BTW2:
deine Frage hat nichts mit FPGAs und VHDL zu tun --> verschoben
Also Fazit, ohne das Programm nun exakt nachvollzogen zu haben: KV
(kannste vergessen).
Alle Deine bedingten Sprünge CJNE haben zwar ein Ziel, wenn die
Bedingung erfüllt ist, aber keines wenn sie nicht erfüllt ist.
Beim obigen Beispiel läuft die Bedingung IMMER auf "loop1", egal was
dabei herauskommt. Beim letzten CJNE stürzt das Programm ab, denn es
läuft in den Segmentcode.
Lustigerweise war mein allererstes Kontrollerprojekt 1982 ein
Lottozahlengenarator mit dem 8048 (48!!!).
Bevor Du in Assembler losprogrammierst musst Du den Ablauf am besten als
Pseudocode aufschreiben. Zur besseren Sichtbarkeit der Struktur habe ich
immer ein paar bekannte OPcodes genommen, z.B. LCALL oder RET.
Und bitte MODULAR aufbauen und nicht als SPAGHETTICODE!
Zunächst mal teilst Du Deine Grundfunktionen für Display, Zählen usw. in
Funktionsmodule auf und schreibst diese als Subroutinen.
Dann im Hauptprogramm rufst Du nur noch die Subroutinen auf.
Also in etwa so:
1
Anzeige:
2
Einer und Zehner an Display
3
RET
4
5
Anzeige_Reset:
6
Einer auf 1
7
Zehner auf 0
8
RET
9
10
Zaehlen:
11
Einer + 1
12
wenn Einer = 10
13
dann
14
Einer = 0
15
Zehner + 1
16
wenn Zehner = 5
17
dann
18
Anzeige_Reset
19
RET
20
21
Reset:
22
LCALL Anzeige_Reset
23
Hauptprogramm:
24
wenn Taste
25
LCALL Zaehlen
26
sonst
27
LCALL Anzeige
28
LJMP Hauptprogramm
So. Das ist nun im Groben Dein Programm.
Was noch beim Assembler dazukommt, ist dass man bei 1 Seite Programm
nicht schreibfaul sein sollte und Labels und Daten AUSFÜHRLICH benennen
kann.
Angaben wie "loop", "anf", "anf2" usw. sind Müll!
Man kann die Namen ruhig so benennen, wie ich es oben getan habe und das
Programm wird - oh Wunder - gleich leserlicher.
Wenn Du die Funktionen in Module als Subroutinen (CALL) aufteilst, dann
kannst Du diese nachher einzeln testen.
Und Du kannst die im Hauptprogramm einzeln auskommentieren, um Fehlern
auf die Spur zu kommen.
z.B. kannst Du bei einem ersten Test das Hauptprogramm so machen:
1
Hauptprogramm:
2
Anzeige
3
LJMP Hauptptogramm
Dann siehst Du z.B. ob die Anzeige geht und ob die Werte EINER und
ZEHNER richtig initialisert sind, also "01".
Wenn das geht, baut man die nächste Funktion ein usw. usw.
Wenn die erste Funktion schon nicht geht, hast Du es viel leichter zu
suchen, weil die aufgerufene einzelne Funktion viel kürzer ist als Dein
ganzer "Programmschlauch"!
Hast Du überhaupt eine Hardware zum Test? Dein Programm ist so wie es
ist nicht mal ansatzweise lauffähig, also womit hast Du das getestet?
So wie das jetzt aussieht würde ICH auch auf dem Schlauch stehen :-)
1.Wie du oben lesen konntest haben wir keine Unterstützung von unserem
Lehrer.
Das einzige,dass wir bekommen haben ist eine Befehlsliste( Richtig geil)
2.Wenn man gerade mal 2 Wochen Erfahrung hat kann vielleicht für dich
nichts gutes raus kommen ABER für uns !
3.Könnte man auch ein wenig freundlicher Antworten ... klingt als
wolltest du dass ich von einer Brücke springe !
4. Habe ich das so kommentiert ,dass es für MICH verständlich ist ,wenn
du ein Problem damit hast behalte es für dich.
5.Hier sieht man ,wie manche Menschen sind ,meinen sie wären etwas
besseres und machen andere runter ! Vielen Dank für die Unterstützung
(NICHT)
Noch ein schönes Egoleben
P.s Das Programm funktioniert !
FUCK YOU schrieb:> FUCK YOU> 1.Wie du oben lesen konntest haben wir keine Unterstützung von unserem> Lehrer.
Mal ehrlich: wenn du deinem Lehrer genau so kommst, dann wundert mich
das eigentlich nicht...
> 5.Hier sieht man ,wie manche Menschen sind ,meinen sie wären etwas> besseres und machen andere runter !
Was stimmt an den obigen Aussagen nicht? Warum müsste man das mehr in
Watte verpacken?
> Vielen Dank für die Unterstützung
Lern was draus.
> P.s Das Programm funktioniert !
Schön, dass wenigstens DU dann DEIN Programm für DICH ALLEIN behältst.
Dann also auch ...
> Noch ein schönes Egoleben
FUCK YOU schrieb:> 1.Wie du oben lesen konntest haben wir keine Unterstützung von> unserem> Lehrer.> Das einzige,dass wir bekommen haben ist eine Befehlsliste( Richtig geil)> 2.Wenn man gerade mal 2 Wochen Erfahrung hat kann vielleicht für dich> nichts gutes raus kommen ABER für uns !> 3.Könnte man auch ein wenig freundlicher Antworten ... klingt als> wolltest du dass ich von einer Brücke springe !> 4. Habe ich das so kommentiert ,dass es für MICH verständlich ist ,wenn> du ein Problem damit hast behalte es für dich.> 5.Hier sieht man ,wie manche Menschen sind ,meinen sie wären etwas> besseres und machen andere runter ! Vielen Dank für die Unterstützung> (NICHT)> Noch ein schönes Egoleben>> P.s Das Programm funktioniert !
Ich glaub ich hab mich verhört!!!
Ist das Deine Antowort darauf, dass ich mir hier die Zeit genommen habe?
Okay - das war das erste und letzte mal!
Das Programm kann nicht funktionieren! Wenn bei dem letzte Befehl die
Bedingung nicht erfüllt ist, läuft es in den Segmentcode und somit ins
Nirvana. Aber gut, Dein Problem.
Da stellt sich mir natürlich die Frage, was Du hier willst, wenn Dein
Programm doch funktioniert..
Recht vielen Dank für Deine pampige Antworten. Nicht dass ich
irgendeinen Danke erwartet hätte.
@Moderator: Bitte meine obigen Hilfebeitrag löschen.
Danke.
Joachim schrieb:> @Moderator: Bitte meine obigen Hilfebeitrag löschen.
Ich tus nicht, weil er ja einem weniger egozentrisch orientierten
Menschen helfen könnte...
Cyblord -. schrieb:> Das größte Problem sehe ich eigentlich darin, die korrekten Lottozahlen> vorherzusehen. Warum wird auf diese Problematik nicht eingegangen?
ROFL. Damit gehe ich jetzt ins Wochenende
Danke Cyblord, das war der beste Beitrag des Tages :-)
Cyblord -. schrieb:> die korrekten Lottozahlen
Darauf muss man nicht eingehen, weil der Generator a) nur eine der x
notwendigen Zahlen ausgibt und b) auch nur wenn man den Finger vom Knopf
nimmt. Man muss folglich nur x-mal hintereinander zum richtigen
Zeitpunkt den Finger runternehmen. (Selbst mit Pseudozufallszahlen, ganz
ohne Einsaddierer ist das deterministisch.)
FUCK YOU schrieb:> 1.Wie du oben lesen konntest haben wir keine Unterstützung von unserem> Lehrer.
Ich sehne den Tag herbei, an dem der Lehrer die Schüler sogar noch zu
Hause abholt und die Eltern sie erst mitgehen lassen, wenn der Lehrer
die Hausaufgaben auch ordentlich gemacht hat. Selbständiger
Erkenntnisgewinn ist im Zeitalter der Suchfunktion ineffizient.
Lothar M. schrieb:> Joachim schrieb:>> @Moderator: Bitte meine obigen Hilfebeitrag löschen.> Ich tus nicht, weil er ja einem weniger egozentrisch orientierten> Menschen helfen könnte...
Eigentlich müsstest du es aber...
Cyblord -. schrieb:> Das größte Problem sehe ich eigentlich darin, die korrekten Lottozahlen> vorherzusehen.
Das Programm gibt ja noch nicht mal MÖGLICHE Lottozahlen aus - es sollte
doch bekannt sein, dass man auf einem Lottozettel keine Zahl 2 oder
mehrmals ankreuzen kann. Ein echter Lottozahlengenerator müsste also
beim zweiten Mal eine Zufallszahl aus den verbiebenen 49 - 1 Zahlen
ausgeben usw. bis man die 6 Zahlen beieinander hat.
Also der übliche Ausbildungsmist ohne jeden Realitätsbezug oder der Prof
hat in den ganzen Jahren immer noch nicht begriffen wie Lotto geht.
@DerGast: vergiss diesen Einwand, du kannst ja nichts dafür, und der
Realität bist du einfach noch nicht gewachsen - wie auch, wenn es nicht
mal deine Ausbilder sind.
Georg
Georg schrieb:> Das Programm gibt ja noch nicht mal MÖGLICHE Lottozahlen aus - es sollte> doch bekannt sein, dass man auf einem Lottozettel keine Zahl 2 oder> mehrmals ankreuzen kann. Ein echter Lottozahlengenerator müsste also> beim zweiten Mal eine Zufallszahl aus den verbiebenen 49 - 1 Zahlen> ausgeben usw. bis man die 6 Zahlen beieinander hat.
Stimmt, die Antwort darauf ist, das man dann ja nochmal drücken kann.
Aber damit wird die "echte" Zufallszahlermittlung verfälscht.
Harald W. schrieb:> Stimmt, die Antwort darauf ist, das man dann ja nochmal drücken kann.> Aber damit wird die "echte" Zufallszahlermittlung verfälscht.
Nicht wirklich!
Das ist ja das Zufalls-Paradoxon:
Auch wenn im Mittel alle Zahlen gleich oft auftreten, erhöht sich die
Wahrscheinlichkeit für eine Zahl nicht dadurch, dass sie in der
Vergangenheit seltener vorkam.
Bei jedem neuen Zug ist die Wahrscheinlichkeit für alle Zahlen gleich
groß.
Gruß Dietrich
Dietrich L. schrieb:> Bei jedem neuen Zug ist die Wahrscheinlichkeit für alle Zahlen gleich> groß.
Stimmt nicht. Für die erste Zahl ist die Wahrscheinlichkeit 1/49, für
die zweite 1/48, für die dritte 1/47, usw.
Route 6. schrieb:> Dietrich L. schrieb:>> Bei jedem neuen Zug ist die Wahrscheinlichkeit für alle Zahlen gleich>> groß.>> Stimmt nicht. Für die erste Zahl ist die Wahrscheinlichkeit 1/49, für> die zweite 1/48, für die dritte 1/47, usw.
Leider auch falsch, da in diesem Beispiel die Wahrscheinlichkeit für
jede Zahl bei 1/49 bleibt, allerdings verbunden mit der Zusatzbedingung,
dass bei ungültiger (vorher schon einmal gezogener) Zahl erneut gezogen
werden muss. Oder um es anders auszudrücken: Die Wahrscheinlichkeit
liegt in jedem Fall bei "1 zu Anzahl der gültigen Zahlen", egal ob es
1/48, 1/47 oder 1/49 mit Zusatzbedingung ist.
Florian W. schrieb:> bei ungültiger (vorher schon einmal gezogener) Zahl
Das gibt es beim Lotto nicht! Hast Du mal die Ziehung im Fernsehen
beobachtet?
Die jeweils gezogene Zahl wird nicht mehr in die "Ziehtrommel"
zurückgetan.
Route 6. schrieb:> Florian W. schrieb:>> bei ungültiger (vorher schon einmal gezogener) Zahl>> Das gibt es beim Lotto nicht! Hast Du mal die Ziehung im Fernsehen> beobachtet?> Die jeweils gezogene Zahl wird nicht mehr in die "Ziehtrommel"> zurückgetan.
Aber bei dem hier besprochenen Generator gibt es das leider.
Lies doch erst einmal worum es eigentlich geht, und Quatsch dann erst
dazwischen. Wie wärs?
Cyblord -. schrieb:> Lies doch erst einmal worum es eigentlich geht, und Quatsch dann erst> dazwischen. Wie wärs?
Lies Du erst mal, worauf ich geantwortet habe!
Wie wärs?
Route 6. schrieb:> Cyblord -. schrieb:>> Lies doch erst einmal worum es eigentlich geht, und Quatsch dann erst>> dazwischen. Wie wärs?>> Lies Du erst mal, worauf ich geantwortet habe!> Wie wärs?
Hab ich. Und da geht's nun mal um die Ziehung mittels des obigen
Generators. Und dabei können nun mal Zahlen doppelt auftreten. Um die
echte Lottoziehung geht's dabei nicht.