MPASM dynamische symbolische Adressen?

Gast #4765790
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.
Gast #4765908
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!
Gast #4766123
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.
Gast #4766146
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
Gast #4766196
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.
#4766262
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.
Gast #4766439
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.
Gast #4766592
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren