Forum: Mikrocontroller und Digitale Elektronik PIC18 Woher kommt der 7. "Cycle"


von Osscon (Gast)


Lesenswert?

Hallo,
beim folgendem Code verstehe ich, warum er genau 6 Cycle für einen 
Durchlauf benötigt:
1
Loop
2
btg  LATB,0,0
3
btfsc   RegisterWasNullIst,0,1
4
goto    $+2
5
goto    Loop
Das würde in diesem Fall gleichbedeutend mit diesem Code sein:
1
Loop
2
btg  LATB,0,0
3
nop
4
nop
5
nop
6
goto    Loop
Jetzt verstehe ich aber nicht warum folgender Code 7 Cycle und nicht 6 
benötigt:
1
Loop
2
btg  LATB,0,0
3
btfss   RegisterWasNullIst,0,1
4
goto    $+2
5
goto    Loop
Das würde doch wiederum dasselbe sein wie das hier:
1
Loop
2
btg  LATB,0,0
3
nop
4
goto    $+2
5
goto    Loop

Kann mir jemand erklären woher der 7. Cycle kommt?

von Herbert (Gast)


Lesenswert?

Bedingter Sprung (BTFSS/...) 1 Cycle oder 3 je nachdem.

von Volker S. (vloki)


Lesenswert?

Osscon schrieb:
> Hallo,
> beim folgendem Code verstehe ich, warum er genau 6 Cycle für einen
> Durchlauf benötigt:
>
1
> Loop
2
> btg  LATB,0,0
3
> btfsc   RegisterWasNullIst,0,1
4
> goto    $+2
5
> goto    Loop
6
>

> Jetzt verstehe ich aber nicht warum folgender Code 7 Cycle und nicht 6
> benötigt:
>
1
> Loop
2
> btg  LATB,0,0
3
> btfss   RegisterWasNullIst,0,1
4
> goto    $+2
5
> goto    Loop
6
>

Ich seh jetzt da keinen Unterschied, kannst du nochmal...

<edit> oh SORRY ;-) Da ist ja ein sc/ss
Wie war das nochmal mit dem +1+2 bei PIC18/PIC16 und warum überhaupt 
goto und nicht bra?

: Bearbeitet durch User
von Osscon (Gast)


Lesenswert?

Da ist nur ein Beispiel. Ich bin auf dieses Problem in einem anderem 
Programm gestoßen.

Beitrag "Re: PIC18 Woher kommt der 7. "Cycle""

Wie genau meinst du das?
Ich habe das auch in der Doc gelesen wusste aber nicht so recht damit 
anzufangen.
Kannst du mir das genauer an dem Beispiel erklären?

von Volker S. (vloki)


Lesenswert?

Herbert schrieb:
> Bedingter Sprung (BTFSS/...) 1 Cycle oder 3 je nachdem.
3 weil die nächste ist 2 Cycle...

Osscon schrieb:
> Wie genau meinst du das?
Was genau meinst du?
Ah ok, es kann ja nur ein Programmwort übersprungen werden.
Dann stellt wird aber festgestellt, dass es sich bei denm dann folgenden 
Wort um den zweiten Teil eines 2Wort Befehls handelt. Also muss das auch 
übersprungen, bzw. nicht beachtet werden...

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Vielleicht hast du ja auch schon ein Problem damit, warum die Ausführung 
ein oder zwei Zyclen dauern kann.
Das kommt daher, dass wenn nicht gesprungen wird, der Programmzeiger 
einfach nur incrementiert werden muss, was sozusagen nebenher geschehen 
kann.
Bei einem Sprung muss der Programmzeiger gezielt verändert werden, was 
den zweiten Zyklus erforderlich macht. Wenn der Zeiger dann auf das 
zweite Word eines 2Word Befehls zeigt, dann wird das einfach ignoriert, 
aber der Zyklus ist futsch...

<edit> was schreib ich heut nur f+r ein...

: Bearbeitet durch User
von Osscon (Gast)


Lesenswert?

Ja, dass ist eigentlich klar, aber der folgende code MUSS 4 Cycle 
benötigen und ich dachte er bräuchte 3 warum?
1
btfss   RegisterWasNullIst,0,1
2
goto    $+2

von Volker S. (vloki)


Lesenswert?

Volker S. schrieb:
> Wie war das nochmal mit dem +1+2 bei PIC18/PIC16...

Besser immer Labels benutzen!

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Volker S. schrieb:
> Volker S. schrieb:
>> Wie war das nochmal mit dem +1+2 bei PIC18/PIC16...
>
> Besser immer Labels benutzen!

Schau mal in das Program Memory!
1
Line  Address   DisAssy
2
-------------------------------------
3
22    002A      BTG LATB, 0, ACCESS
4
23    002C      BTFSS 0xD3, 0, BANKED
5
24    002E      GOTO 0x30     <<<<<<<<<<< goto $+2 <<<<<<<<<
6
25    0030      NOP
7
26    0032      GOTO 0x2A
8
27    0034      NOP

von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


Lesenswert?

Hallo,
auch meine Meinung, relative Sprünge nur als "computed jump" für 
spezielle Tabellenauswertungen, vor dem Springen den Registerinhalt auf 
zulässige Sprungweite prüfen. Wenn der Offset nur einen Teil des 
counters verbiegt Vorsicht wenn die Tabelle über blockgrnzen abegelgt 
ist.

Gruß

Merke, jede Variable die von "igendwo" kommt kann gelogen sein.

von Anon E. (anonelec)


Lesenswert?

NB: Beim GOTO war wohl ein Optimierer am Werk. GOTO ist doch ein 
2-Word-Befehl, während BRA ein 1-Wort-Befehl ist. Nach 002E GOTO ... 
sollte der nächste Befehl bei 0032 sein.

Schon von daher sollte nach BTFSS u.ä. kein 2.Wort-Befehl stehen, 
sondern nur ein BRA o.ä.

von Volker S. (vloki)


Lesenswert?

Anon E. schrieb:
> NB: Beim GOTO war wohl ein Optimierer am Werk. GOTO ist doch ein
> 2-Word-Befehl, während BRA ein 1-Wort-Befehl ist. Nach 002E GOTO ...
> sollte der nächste Befehl bei 0032 sein.
Ist es doch laut Program Memory auch. (Nur sollte man dann eben +4 
springen)


> Schon von daher sollte nach BTFSS u.ä. kein 2.Wort-Befehl stehen,
> sondern nur ein BRA o.ä.
Warum? Wo soll da ein Problem sein?. Das zweite Word wird doch dann als 
Nop interpretiert...


(((Dass bra hier besser wäre hatten wir ja schon)))
Volker S. schrieb:
> und warum überhaupt goto und nicht bra?

: Bearbeitet durch User
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.