Forum: Mikrocontroller und Digitale Elektronik Erklärung Warteschleife


von Bea (Gast)


Lesenswert?

Hallo,

also ich habe einen Beitrag gelesen und würde gerne wissen, ob die 
Erklärung so stimmt. Weiß jemand eventuell wie man auf die Reste 
(238,166 und 0) kommt?

Hier der Beitrag:

Also, gesetzt den Fall, ein djnz-Befehl bräuchte nur 1 Taktzyklus. 
Nehmen wir mal an, die CPU würde mit 4,772727 MHz betrieben (ich weiß 
gar nicht, wie ich jetzt auf so'n komischen Wert komme...) Dann bedeutet 
das, sie hat 4772727 Takte pro Sekunde und um 2 Sekunden zu überbrücken, 
muß man 2 x 4772727 = 9545454 Takte durchlaufen lassen - oder anders 
ausgedrückt: So oft muß die innere Schleife durchlaufen werden, wenn der 
Befehl nur 1 Takt verbraucht. Verbraucht er mehr Takte, muß man den Wert 
durch die Anzahl Takte teilen, wenn er z.B. 3 Takte verbraucht, wäre der 
"Ticker-Wert" = 3191919 (eben 9545454 / 3).

Von diesem Wert wird ja rückwärts nach 0 gezählt. Register sind ja immer 
binär, daher also z.B. 8 oder 16 oder 32 bit breit (ja, es gibt auch 4- 
oder 12-bit Register...), das heißt, der Wert ist im Falle von 
8-Bit-Registern immer nach genau 8 bit zu teilen.
Wäre er also 9545454, wäre das binär (als 24-bit-Wert) :
100100011010011011101110, der ist also immer nach 8bit zu teilen:

10010001 10100110 11101110, oder 145, 166 und 238 - und genau das sind 
die Werte, die nach R2, R1 und R0 müssen (nach R0, weil das die innerste 
Schleife ist, muß der unterste Wert, also hier 238, nach R1 müßte 166 
und nach R2 dann 145).

Einfachere Möglichkeit ist, einfach immer durch 256 zu teilen:
9545454 / 256 = 37286, Rest 238
32786 / 256 = 145, Rest 166
(145 / 256 = 0, Rest 145 - aber das braucht man ja nicht mehr zu 
"berechnen"...)
Diese Teilungsreste sind dann (sozusagen im Zahlensystem der 256) die 
einzutragenden Werte.
(Ja, oder man wandelt die Zahl einfach ins Hexadezimalsystem und nimmt 
immer 2 Ziffern... Leider gibts heutzutage Assembler-Programmierer, die 
noch nie was vom Hexadezimalsystem gehört haben, deswegen weiß ich da 
manchmal nicht, ob ich das wie früher einfach voraussetzen kann...)





Viele Grüße

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Bea schrieb:
> Wäre er also 9545454, wäre das binär (als 24-bit-Wert) :
> 100100011010011011101110, der ist also immer nach 8bit zu teilen:
>
> 10010001 10100110 11101110, oder 145, 166 und 238 - und genau das sind
> die Werte, die nach R2, R1 und R0 müssen (nach R0, weil das die innerste
> Schleife ist, muß der unterste Wert, also hier 238, nach R1 müßte 166
> und nach R2 dann 145).

 LOL.
 Du scheinst ja überhaupt keine Ahnung zu haben von dem, was du da
 geschrieben hast.
 R2 müsste 145 mal bis 65536 zählen, danach müsste R1 166 mal bis 256
 zählen und zum Schluss R0 bis 238 zählen...
 Welcher normaler Mensch würde an so etwas überhaupt denken, geschweige
 den versuchen so etwas zu programmieren ?

> Also, gesetzt den Fall, ein djnz-Befehl bräuchte nur 1 Taktzyklus.
> Nehmen wir mal an, die CPU würde mit 4,772727 MHz betrieben (ich weiß
> gar nicht, wie ich jetzt auf so'n komischen Wert komme...)

 Weil die Aufgabe (oder was es auch immer ist) wahrscheinlich für
 einen 8088 geschrieben wurde ?
 Und 4.772727 ist genau 4/3 der NTSC colorburst Frequenz, damit liefen
 die ersten PCs...

> (Ja, oder man wandelt die Zahl einfach ins Hexadezimalsystem und nimmt
> immer 2 Ziffern... Leider gibts heutzutage Assembler-Programmierer, die
> noch nie was vom Hexadezimalsystem gehört haben, deswegen weiß ich da
> manchmal nicht, ob ich das wie früher einfach voraussetzen kann...)

 Wann früher ?
 Mit solchen Unsinn wie den von dir geschriebenen bezweifle ich doch
 sehr stark, dass du früher etwas von uC gehört hast, geschweige den
 damit gearbeitet hast oder (Gott behüte) sogar programmiert...

von Wolfgang (Gast)


Lesenswert?

Bea schrieb:
> Hier der Beitrag:
> ...

Warum gibst du dazu nicht die Quelle an?
http://www.coding-board.de/threads/werte-fuer-zeitschleife-berechnen.23416/#post-137949

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bea schrieb:
> also ich habe einen Beitrag gelesen
Wo?
Das Konzept der Verlinkung im Internet ist dir bekannt? Du kannst auch 
hier ganz einfach Links einfügen: einfach die Adresszeile ab http... 
hier in den Text kopieren.

> Ja, oder man wandelt die Zahl einfach ins Hexadezimalsystem und nimmt
> immer 2 Ziffern...
Das ist doch schnurzegal, wie eine Zahl dargestellt wird. Jede 
Zahlendarstellung ist gleichwertig und leicht übertragbar. Und wie man 
eine Zahl am einfachsten durch 256 teilt, das ist eben auch abhängig vom 
aktuell verwendeten Zahlensystem.

> Also, gesetzt den Fall, ein djnz-Befehl bräuchte nur 1 Taktzyklus.
Korrekterweise muss man hier beachten, ob der Sprung angenommen oder 
abgelehnt wird, und ob beim verwendeten uC das dann beide Male gleich 
viel Zeit kostet...

> Leider gibts heutzutage Assembler-Programmierer, die noch nie was vom
> Hexadezimalsystem gehört haben, deswegen weiß ich da manchmal nicht, ob
> ich das wie früher einfach voraussetzen kann...
Jaja, die gute alte Zeit. Früher(tm), wo man noch Mammuts gejagt und in 
Höhlen gehockt hat, da waren Männer noch richtige Männer...

: Bearbeitet durch Moderator
von Bea (Gast)


Lesenswert?

@Wolfgang:Das nächste mal sollte ich besser die Quelle angeben...

Mir geht es nur drum, dass ich auch eine Warteschleife (3 Loops) 
erstellen will. Hier für habe ich diesen einzigen Beitrag, welcher 
ausführlich erklärt ist, gefunden... die ersten beiden Abschnitte sind 
gut und verständlich erklärt. Im dritten Abschnitt, wo es darum geht die 
Durchläufe zu bestimmen, werde ich wahnsinnig. Da ich nicht weiss, wie 
diese Reste ermittelt wurden...

von Bestromer (Gast)


Lesenswert?

Assembler Programmierer die noch nie was vom Hexadezimalsystem gehört 
haben?
Hmmm....wo hast Du diese Weisheit her?
Du scheinst sehr einsam gewesen zu sein....keine Angst, Du bist nicht 
alleine und brauchst auch nicht die Welt zu retten, wer Assembler 
programmieren kann, weis auch genauso wie "damals" was ein Hex-System 
ist...
Vielmehr solltest Du Dir Gedanken über sinnvolle Programmiertechniken 
machen :)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Bea schrieb:
> Mir geht es nur drum, dass ich auch eine Warteschleife (3 Loops)
> erstellen will. Hier für habe ich diesen einzigen Beitrag, welcher
> ausführlich erklärt ist, gefunden... die ersten beiden Abschnitte sind
> gut und verständlich erklärt. Im dritten Abschnitt, wo es darum geht die
> Durchläufe zu bestimmen, werde ich wahnsinnig. Da ich nicht weiss, wie
> diese Reste ermittelt wurden...
 Warum nicht gleich den Link dazugeschrieben ?
 So, wie es in diesem Beitrag steht, funktioniert es doch nicht.

Lothar M. schrieb:
>> Also, gesetzt den Fall, ein djnz-Befehl bräuchte nur 1 Taktzyklus.
> Korrekterweise muss man hier beachten, ob der Sprung angenommen oder
> abgelehnt wird, und ob beim verwendeten uC das dann beide Male gleich
> viel Zeit kostet...
 Genau.

 Also, nicht wahnsinnig werden, sondern:
 Du schreibst dir zuerst eine Routine die genau 1us dauert bzw.
 (1us - CALL - RET).
 Danach eine zweite, die genau 1ms dauert, bzw. (1ms - CALL - RET).
 Die beiden Routinen brauchen keine Parameter, da die Zeit fest
 vorgegeben ist.
 Es ist fraglich ob du bei jeder Frequenz 1us kriegst, aber 1ms kann
 man schon ziemlich genau hinbiegen.

 Zum Schluss zwei Routinen die einen 16 bit Parameter brauchen (Zeit
 in us/ms), genauer:
 (Zeit in us/ms - Parameterbereitstellung - evtl. Parameterubernahme).

 Dann kannst du die beiden Routinen so viele Male aufrufen, wie
 du es brauchst und hast (mit einem Aufruf) Zeiten bis 65.5sec.
 auf us genau.

 Oder du schreibst dir eine Routine welche ihre Parameter aus einer
 Tabelle mit z.B. 8 Bytes liest und somit hast du die Moglichkeit,
 255 Jahre, 255 Monate, 255 Tage, 255 Stunden, 255Min., 255Sec.,
 255ms, 255us zu warten, naturlich auf us genau.

 Und dann schreibst du... ;)

 EDIT :
 Eigentlich sind es 256, da die Null 256 Mal durchgelaufen wird.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Bea schrieb:
> Leider gibts heutzutage Assembler-Programmierer, die
> noch nie was vom Hexadezimalsystem gehört haben

Ja, die sind alle doof, die nehmen Hex nur für Bitmasken.
Große Zahlen schreiben sie aber besser lesbar in Dezimal.
Der Assembler soll gefälligst selber Konstanten in Bytes zerlegen, denn 
das kann er gut und vor allem fehlerfrei.

Ältere Assembler können leider oft nur 16Bit, hielt man früher für 
ausreichend. Bei heutigen Assembler sind 64Bit üblich.
Zum Zerlegen in Bytes gibt es low(), high(), byte2() usw. bzw. kann man 
sich als Macro auch selber schreiben.

Dann definiert man noch F_CPU und schon kann man die Delayzeit in 
Klartext (µs, ms oder s) hinschreiben und den Assembler alles ausrechnen 
lassen und den Registern zuweisen.
Die Rechnungen dürfen nur keine Kommazahlen beinhalten und immer schön 
erst alle "*" rechnen lassen und die "/" danach. Was einmal 
abgeschnitten wurde, bleibt weg.

von Bea (Gast)


Lesenswert?

@Bestromer Danke du hast mir mit deiner Aussage sehr geholfen..


Bestromer schrieb:
> Assembler Programmierer die noch nie was vom Hexadezimalsystem
> gehört
> haben?

Mit Hexadezimalzahlen kenne ich mich sehr wohl aus, jedoch irgendwie 
habe ich den Zusammenhang nicht verstanden. Aber danke jetzt habe ich es 
gerafft  ......

Mfg

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.