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.
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!
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.
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.
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
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.
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.
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.
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.
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.
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.
Jannyboy schrieb:> Unterschied Comparatoren
Danke - offenbar haben sie bei den Enhanced Midrange Typen tatsächlich
die Comparatoren "verschlimmbessert".