Forum: Mikrocontroller und Digitale Elektronik MC 167 Assembler Programmstruktur warten Wartezeit


von Martin (Gast)


Lesenswert?

Hallo Zusammen,

ich hab mal ne Frage.

Ich habe eine Aufgabe vor mir liegen und kann diese nicht loesen. Ist 
aber in wenigen Schritten erledigt.

                   mov  R2, #5h           ;Wartezeit festlegen
Zeitschritt:       mov  R1, #0FFFFh       ;Wartezeit festlegen
Schleife:          CMPD1 R1, #00h         ;Wartezeit dekrementieren u
                                          ;und mit Null vergleichen
                   JMP CC_NE, Schleife    ;Wiederholen, solange nicht 
Null
                   CMPD1 R2, #00h         ;2. Wartezeit dekrementieren
                                          ;und mit Null vergleichen
                   JMP CC_NE, Zeitschritt ;Wiederholen, solange nicht 
Null



Frage: Veraendern Sie das obige Programm so, dass statt der 5-fachen
Laufzeit sich moeglichst genau die 2,5-fache Zeit ergibt. Unterstreichen 
Sie hierzu im obigen AssemblerCode die Zeile die Sie aendern moechten 
und schreiben hier den neuen Code hin.


Wenn jemand eine Ahnung hat, wie das geht, waere ich um jeden Tipp 
dankbar. Also den Programmausschnitt verstehe ich schon. Ich komm nur 
nicht mit ,5 klar.

Vielen Dank schon mal vorab und viele Gruesse

von holger (Gast)


Lesenswert?

Du schaffst es nicht den Wert zu finden der am besten
geeignet ist die Wartezeit zu halbieren?

von Martin (Gast)


Lesenswert?

Hi,

noe, schaffe ich nicht. Daher bitte ich einen erfahrenen Programmierer 
um die Hilfe

von Dietrich L. (dietrichl)


Lesenswert?

Martin schrieb:
> schaffe ich nicht

Dann solltest Du Dir zuerst einmal den Programmablauf aufzeichnen und 
verstehen, was da passiert.
Dann müsstest Du auch erkennen, an welcher Stelle Du "drehen" musst.

Gruß Dietrich

von Wilhelm F. (Gast)


Lesenswert?

Martin schrieb:

> Hi,
> noe, schaffe ich nicht. Daher bitte ich einen erfahrenen Programmierer
> um die Hilfe

Befehle suchen, die die Schleife in der halben Zeit machen.

Ich kenne den 167 nicht, aber beim 8051 gibt es auch allerhand solcher 
Dinge bzw. Tricks.

Möglicherweise gibt es andere Befehle, die das selbe tun, und kürzere 
Ausführungszeit haben. Bspw. haben Registerbefehle beim 8051 die halbe 
Laufzeit von Datenspeicher als Register.

von CalM (Gast)


Lesenswert?

Martin

die diskusion mit den Hausaufagen durch andere Lösen lassen, waren in 
diesem Forum schon genug, daher lasse ich die Belehrungsversuche.

Lösung könnte sein:


mov  R2, #5h           ;Wartezeit festlegen
Zeitschritt:       mov  R1, #0FFFFh       ;Wartezeit festlegen
Schleife:          CMPD1 R1, #7FFF        ;Wartezeit dekrementieren u
                                          ;und mit 0FFFFh hable 
vergleichen
                   JMP CC_NE, Schleife    ;Wiederholen, solange nicht
Null
                   CMPD1 R2, #00h         ;2. Wartezeit dekrementieren
                                          ;und mit Null vergleichen
                   JMP CC_NE, Zeitschritt ;Wiederholen, solange nicht
Null


könnte gehen.

Mfg

CalM

von Tom M. (tomm) Benutzerseite


Lesenswert?

Martin schrieb:
> Wenn jemand eine Ahnung hat, wie das geht, waere ich um jeden Tipp
> dankbar. Also den Programmausschnitt verstehe ich schon. Ich komm nur
> nicht mit ,5 klar.

Okay, dann zeig uns mal, wie du eine beliebige ganzzahlige Vielfache 
Wartezeit erreichst (2, 5, 10, 1000 fach).

von Martin (Gast)


Lesenswert?

Vielen Dank ich probiers aus.
Sind uebrigens keine Hausaufgaben sondern uralte Aufgaben die ich zum 
lernen verwende.

Danke nochmal fuer die Bemuehungen.

von NNY (Gast)


Lesenswert?

mov  R2, #5h           ;Wartezeit festlegen
Die ganzzahlige Vielfache lege ich fest, in dem ich die gewuenschte 
ganzzahlige Wartezeit ins Register 2 lege.

von CalM (Gast)


Lesenswert?

@Martin

bist du dir sicher das du die Wartezeit ereitern sollst und nicht 
einfach nur halbieren? So würde ich die Aufgabe verstehen. Statt 5 
Facher zeit genau die 2,5 fache mach für mich Faktor 2 um die deine 
Wartezeit keluiner werden soll. Nächster punkt ist das die Änderrung mit 
nur einer Zeile möglich sein soll. Damit hast du dann (mindestens) zwei 
mögliche Lösungen für die Aufgabe.

Mfg

CalM

von NNY (Gast)


Lesenswert?

Hi,

ja schon, ich versuche die Wartezeit zu halbieren.
Dekrementieren kann ich nur ganzzahlige Werte

Ich habs noch nicht ausprobiert, aber wahrs. werd ich nur

die Programmzeile
Zeitschritt:       mov  R1, #0FFFFh

zu dieser umformen
Zeitschritt:       mov  R1, #07FFFh

Es muss doch auch noch eine weitere Loesung geben

von holger (Gast)


Lesenswert?

>die Programmzeile
>Zeitschritt:       mov  R1, #0FFFFh
>
>zu dieser umformen
>Zeitschritt:       mov  R1, #07FFFh

Na also, geht doch;)

von Karl H. (kbuchegg)


Lesenswert?

NNY schrieb:
> Hi,
>
> ja schon, ich versuche die Wartezeit zu halbieren.
> Dekrementieren kann ich nur ganzzahlige Werte
>
> Ich habs noch nicht ausprobiert, aber wahrs. werd ich nur
>
> die Programmzeile
> Zeitschritt:       mov  R1, #0FFFFh
>
> zu dieser umformen
> Zeitschritt:       mov  R1, #07FFFh
>
> Es muss doch auch noch eine weitere Loesung geben

Gibt es auch.

Ich geh mal auf eine Analogie.
Du hast 5 Bierkisten, in der jeweils 20 Bierflaschen stecken. Das macht 
in Summe 100 Flaschen (deine Wartezeit). Wie kannst du jetzt 
einigermassen gut 50 Bierflaschen (also die Hälfte davon) abpacken, 
wobei du natürlich beliebig viele Kisten nehmen kannst.

Du kannst 1  Kiste nehmen und da 50 Flaschen reinstecken.
OK, das geht nicht, weil in der Kiste keine 50 Flaschen Platz haben.
Du kannst 2 Kisten nehmen und in jede 25 Flaschen. Fast. 25 Flaschen pro 
Kiste gehen nicht
Du kannst 3 Kisten nehmen und in jede 16 Flaschen. Sind in Summe 48 
Flaschen. Fast. Das geht noch besser
4 Kisten a 12 Flaschen. Wieder 48. Mal sehen, obs noch besser geht
5 Kisten a 10 Flaschen. Gibt genau die 50 Flaschen
6 Kisten a 8 Flaschen. Macht 48. Die 50 waren besser
7 Kisten a 7 Flaschen. Macht 49. Besser als 48, aber schlechter als 50
8 Kisten a 6 Flaschen. Hatten wir schon. 48
9 Kisten a 5. 45, unter jeder Kritik
10 Kisten a 5 Flaschen. 50. Na, also. Geht doch
....

Die Rolle der Kisten spielt in deinem Code die äussere Schleife. Die 
Flaschen sind die innere Schleife. Und du suchst jetzt nach der Anzahl 
der Wiederholungen, die du benötigst, damit der Kern x mal ausgeführt 
wird.
Das Prinzip ist genau das gleiche, wie bei Kisten und Flaschen.
Du suchst 2 Zahlen a und b, sodass a*b eine bestimmte vorgegebene Anzahl 
ergibt. Wobei es noch Nebenbedingungen gibt. Beim Bier war es die Anzahl 
der Flaschen pro Kiste, die nicht höher als 20 sein kann. Bei den 
Warteschleifen ist es die Anzahl der inneren Schleifen, die nich höher 
als FFFFh sein kann (also 65535).

Was immer dir zum Thema Bierkisten und Flaschen einfällt, um dieses 
Problem zu lösen, das kannst du im Grunde auch mit deinem Programm 
machen. Zb. kannst du 6 Kisten mit 8 Flaschen machen und 1 Kiste mit 
lediglich 2. Macht in Summe auch wieder die geforderten 50.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.