Forum: Mikrocontroller und Digitale Elektronik MPASM dynamische symbolische Adressen?


von Info (Gast)


Lesenswert?

Kann der (PIC-)Assembler die Startadresse z.B. einer Sprungtabelle 
dynamisch vergeben und vorher im Code als low- und high-byte des program 
counters "einsetzen"? Etwa
1
    PCLATH = highbyte(SPRUNGTABELLE)
2
    PC     = lowbyte( SPRUNGTABELLE) + index
3
4
....
5
6
SPRUNGTABELLE
7
    GOTO XYZ ; +0
8
    GOTO ABC ; +1

Wenn ja, wie? Es müsste wohl auch sichergestellt werden, dass index 
nicht zum Überlauf führt, d.h. die Tabelle kann nicht an beliebigen 
Adressen im Code platziert werden.

von ./. (Gast)


Lesenswert?

Sag dem Linker halt wo er es hinlegen soll:

-L-Pseg=080h

Weiter dann mit:

void __section ("seg") seg(unsigned char index){
; in W steht index
#asm
  call  entry
#endasm

...
  return;

#asm
entry:
  bcf  PCLATH,1
  bcf  PCLATH,0
  addwf  PCL,f
  retlw
  retlw
  retlw
  retlw
  retlw

#endasm
  return;
}


Viel Spass!

von ./. (Gast)


Lesenswert?

P.S.:

In Assembler fast genauso wie in C.
Einfach den fraglichen Assemblercode in das Segment "seg" packen.
Die passende Direktive musst Du Dir mal selber suchen.
Obiges war fuer den XC8.

von Jannyboy (Gast)


Lesenswert?

Kann man fast so machen.
Man muss erst prüfen ob das lowbyte (Tabelle+Index) überrollt und 
entsprechend das highbyte setzen.

Die Makros lauten high und low ohne -byte am Ende.

von Jannyboy (Gast)


Lesenswert?

1
movlw low TABELLE
2
addwf INDEX,w
3
movwf Temp
4
5
movlw high TABELLE
6
btfsc STATUS,C
7
addlw 0x01
8
movwf PCLATH
9
10
movf Temp,w
11
movwf PC
12
13
TABELLE
14
goto Marke1
15
...
16
goto MarkeX

So musste es funktionieren.
Temp und Index müssen in Comman-Ram liegen oder jeweils ein banksel ist 
notwendig.

von Thomas E. (picalic)


Lesenswert?

Warum denn nicht einfach mit "BRW"?

z.B.:
1
  movf index,W
2
  goto TABELLE
3
4
...
5
6
TABELLE
7
  brw
8
  goto Marke1
9
  ...
10
  goto MarkeX

von Jannyboy (Gast)


Lesenswert?

Kleiner Fehler, die Adresse in PCLATH muss schon bei FF erhöht werden. 
So sollte es richtig sein... ist frei geschrieben nicht getestet.
1
movlw low TABELLE ;Temp=TABELLE(low)+index
2
addwf INDEX,w
3
movwf Temp
4
5
movlw high TABELLE ;Lade TABELLE(high) in Wreg
6
btfsc STATUS,C ;Prüfe ob die Addition(oben) einen Überlauf hatte
7
addlw 0x01;Wenn Ja dann erhöhe Wreg um 1
8
movwf PCLATH ;Schreibe Wreg in PCLATH
9
10
incf Temp,w ; Teste Temp auf 0xFF
11
btfsc STATUS,Z ; Wenn Temp ==0xFF
12
incf PCLATH ;Dann erhöhe PCLATH um 1
13
14
15
16
movf Temp,w ;Schreibe Temp in PC
17
movwf PC
18
19
TABELLE
20
goto Marke1
21
...
22
goto MarkeX

von Jannyboy (Gast)


Lesenswert?

Thomas E. schrieb:
> Warum denn nicht einfach mit "BRW"?

Die alten PICs haben kein BRW Befehl.

von Thomas E. (picalic)


Lesenswert?

Jannyboy schrieb:
> Kleiner Fehler, die Adresse in PCLATH muss schon bei FF erhöht werden.

Warum das? Scheint mir nicht richtig zu sein!

Zu diesem Thema würde ich das Lesen der entsprechenden Application Note 
von Microchip empfehlen:
ww1.microchip.com/downloads/en/AppNotes/00556e.pdf

von Thomas E. (picalic)


Lesenswert?

Jannyboy schrieb:
> Die alten PICs haben kein BRW Befehl.

Der TO hat ja nicht geschrieben, daß er sich noch mit einem alten PIC 
quält. Ich würde auf jeden Fall neue nehmen - sind besser, billiger und 
Pin-kompatibel.

von Jannyboy (Gast)


Lesenswert?

Thomas E. schrieb:
> Warum das? Scheint mir nicht richtig zu sein!

Hier ist das gut erklärt.
http://sprut.de/electronic/pic/fallen/fallen.html#tabellenhtml#tabellen

Ich hatte den Code eben frei geschrieben wie ich mir dachte es 
funktioneren können.
Weil keine Adresse auf FF enden darf.
Die meisten Tabellen mache ich mit den FSR.
Nur Mini-Tabellen mit addwf PC. Aus der oben genannten Problematik.

von Jannyboy (Gast)


Lesenswert?

Thomas E. schrieb:
> Ich würde auf jeden Fall neue nehmen - sind besser, billiger und
> Pin-kompatibel.

Neue Pic sind nicht immer gleich besser.
Vergleiche z.B. mal die Comparatoren von einem PIC12F629 und und 
PIC12F1571... Vielleicht findes du den unter schied.

von Thomas E. (picalic)


Lesenswert?

Jannyboy schrieb:
> Weil keine Adresse auf FF enden darf.

Sorry, das ist wohl nicht richtig. Probiere es aus: Du kannst sehr wohl 
auf eine berechnete Adresse mit PCL = 0xFF springen und es wird auch 
normal funktionieren.
Lade z.B. PCLATH mit 0x02 und dann lade PCL mit 0xFF - dann wird der 
Befehl auf 0x2FF angesprungen, nicht etwa der auf 0x1FF!

Was Sprut meint, ist das, was auch in der APPNOTE steht, daß nämlich bei 
Addition von W auf PCL kein Übertrag auf PCH berücksichtigt wird.

Jannyboy schrieb:
> Vergleiche z.B. mal die Comparatoren von einem PIC12F629 und und
> PIC12F1571... Vielleicht findes du den unter schied.

Was soll das jetzt? Sind wir hier beim lustigen Ratespiel oder was? Es 
wäre für alle Mitleser deutlich nützlicher, wenn Du dann den "unter 
schied" hier einfach kurz erläutern würdest - da hätten dann alle was 
davon.
Nein, ich weiß den Unterschied nicht, und werde jetzt auch nicht 
sämtliche Parameter der Komparatoren dieser beiden PICs vergleichen.

: Bearbeitet durch User
von Jannyboy (Gast)


Lesenswert?

Thomas E. schrieb:
> Sorry, das ist wohl nicht richtig. Probiere es aus: Du kannst sehr wohl
> auf eine berechnete Adresse mit PCL = 0xFF springen und es wird auch
> normal funktionieren.
> Lade z.B. PCLATH mit 0x02 und dann lade PCL mit 0xFF - dann wird der
> Befehl auf 0x2FF angesprungen, nicht etwa der auf 0x1FF!

Ja da hast du Recht.
ich habe jetzt mal ausprobiert. Mein erster Code ist der Richtige.
1
  list p=16f628a
2
  #include <p16f628a.inc>
3
  
4
  udata_shr
5
Index    res .1
6
Temp    res .1
7
  
8
  org 0x0000
9
10
Main
11
  movlw 0xff
12
  movwf Index
13
14
  movlw low TABELLE
15
  addwf Index,w
16
  movwf Temp
17
    
18
  movlw high TABELLE
19
  btfsc STATUS,0
20
  addlw 0x01
21
  movwf PCLATH
22
    
23
  movf Temp,w
24
  movwf PCL
25
  goto Main
26
27
  org 0x0101    
28
TABELLE
29
  goto Marke1
30
  goto Marke2
31
  goto Marke3
32
33
  org 0x0200
34
  goto MarkeFF
35
36
Marke1
37
Marke2
38
Marke3
39
MarkeFF
40
  goto Main
41
  end

> Es wäre für alle Mitleser deutlich nützlicher, wenn Du dann den "unter
> schied" hier einfach kurz erläutern würdest - da hätten dann alle was
> davon.

Unterschied Comparatoren

PIC12F629 bei 3V
Strombedarf: 6-8 µA
Offset: +/- 5-10 mV (Eher 2-5mV*)
Response Time: 150nS


PIC12LF1571 bei 3V im Highspeed Modus
Strombedarf: 21 µA (Eher 18-30µA*)
Offset: +/- 7,5-60 mV (Eher +15-20mV*)
Response Time: 400nS

* Erfahrungswerte aus Serienfertigung

Gerade bei RFID oder Batterie-Anwendungen tun die schlechteren Werte und 
der erhöhte Stromverbrauch weh.

von Info (Gast)


Lesenswert?

Dankeschön, ich werde es ausprobieren. Es handelt sich um ausgelesenen 
Code. Derzeit habe ich die Adresse selbst vergeben, um das Programm 
verändern zu können, aber wenn es der Assembler automatisch macht, ist 
das die bessere Lösung.

von Thomas E. (picalic)


Lesenswert?

Jannyboy schrieb:
> Unterschied Comparatoren

Danke - offenbar haben sie bei den Enhanced Midrange Typen tatsächlich 
die Comparatoren "verschlimmbessert".

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.