Forum: Mikrocontroller und Digitale Elektronik PICasm: bra/goto


von Max H. (hartl192)


Lesenswert?

Ich habe mich kurz über den Unterschied zwischen bra und goto bei 
PIC12/18 und PIC24 informiert und bin zu einem Ergebnis und einer Frage 
gekommen:

Ich kann hier goto und bra verwenden, es passiert immer das gleiche.
PIC24:
1
wait:
2
btss flags, #0
3
bra/goto wait
4
bclr flags, #0

PIC12:
1
loop:
2
btfss OSCSTAT,PLLR    ;Wait until PLL is ready
3
bra/goto loop

GOTO ist ein Absoluter Sprung und BRA ein relativer.
Der Assembler macht das daraus:

PIC12/18:
1
bra loop --> BRA 0x1fe  
2
goto loop --> GOTO 0x19
In der Beschreibung steht:
>Syntax:   [ label ] BRA label
>          [ label ] BRA $+k
>Operands: -256 <= label - PC + 1 <= 255
>          -256 <= k <= 255

PIC24:
1
bra wait --> bra 0x00025e
2
goto wait --> goto 0x00025e
In der Beschreibung steht:
>Syntax: {label:} BRA Expr
>Operands: Expr may be a label, absolute address or expression.
>Expr is resolved by the linker to a Slit16, where
>Slit16 ∈ [-32768 ... +32767].

Beim 8bit µC macht Assembler aus dem Label automatisch die relative 
Adresse und beim PIC24 macht das erst der linke.

Also ist bra und goto für mich das gleiche, wenn ich mich um weniger als 
±255 / ±32767 bewege und beim PIC12 keine ROM-Page überschreite und 
Labels verwende? Oder habe ich irgendetwas übersehen?

: Bearbeitet durch User
von Helge A. (besupreme)


Lesenswert?

So lange du auf Labels springst, steht im hexfile das gleiche. Also 
entsprechend bra oder goto, je nach Sprungweite.

Springst du old style auf absolute Adressen, mußt du selber aufpassen. 
Hab mir das grad für einen 16F1503 angeschaut.

von Max H. (hartl192)


Lesenswert?

Beim PIC24 kann ich es nicht Testen, da mein PIC24 tu wenig Flash hat um 
relativ um mehr als ±32767 zu springen. Beim PIC12 gibt mir der 
Assembler wenn ich das Schreibe einen Fehler aus:
1
  org 0x00
2
  bra test
3
  .
4
  .
5
  .
6
  .
7
  org 0x01FF
8
  test:
9
  nop
Goto geht problemlos, da die beiden Adressen in der Gleichen Page sind.
Wenn ich mit bra einen Fehler mache lässt der Assembler das nicht zu:
Also für kurze Sprünge immer bra, und wenn der Assembler schimpft ein 
goto und mit der Bank aufpassen...

: Bearbeitet durch User
von Meister E. (edson)


Lesenswert?

Max H. schrieb:
> Wenn ich mit bra einen Fehler mache lässt der Assembler das nicht zu:
> Also für kurze Sprünge immer bra, und wenn der Assembler schimpft ein
> goto und mit der Bank aufpassen...

Das ist ok so, die Page-Grenzen sollte man trotzdem immer im Auge 
behalten. Wenn du eine absolute Adresse vom Assembler berechnen lässt, 
z.B. so:
1
    bra   $+2      ; <- Sprungziel ist der aktuelle PC+4 (absolut)
2
    movf  var_1, w
3
    movwf var_2
4
    movf  var_2, w
5
    movwf var_1

Wenn PC zum Zeitpunkt der Verzweigung auf eine der letzten 4 Adressen 
der Page zeigt, wird der Sprung in eine der ersten 4 Adressen der 
aktuellen Page stattfinden.
Das gilt auch für den brw-Befehl der Enhanced Mid-Range PICs (z.B. 
16f15xx).

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.