Forum: Mikrocontroller und Digitale Elektronik Ich verstehe beim 16F886 nicht wie ich auf 8k komme


von FloZie (Gast)


Lesenswert?

Morgen,

Ka ob ich hier richtig bin, wenn es verkehrt ist sry.

Ich habe folgendes Problem:

Ich habe ein Programm welches 2,7k worte lang ist,
Habe ein 16F886 der ja eigentlich 8k worte fassen kann.
Nun soll man irgendwie ja die Speicher wechseln können.
Ich habe nun schon stunden im internet verbracht, aber keine 
befriedigende antwort bekommen.

Ich muss irgendwie 2,7k worte unterbringen und weis nur nicht wie ich 
die speicher wechsel um da den rest reinzupacken.
kenne die befehle dafür nicht. und weis nicht so richtig wie das 
funktioniert...


Ich habe es bisher einfach nie gebraucht und niemals mehr als 2k worte 
gehabt...

Bitte nur ordentliche antworten, flames könnt ihr euch sparen mich 
ärgert das schon genug

von Anja (Gast)


Lesenswert?

FloZie schrieb:
> kenne die befehle dafür nicht.

In Assembler gibt es dafür das PAGESEL-Makro

[code]
     PAGESEL Zieladresse
     GOTO    Zieladresse
[\code]

Ich mache den Initialisierungscode meistens in Page 1 damit im 
Hauptprogram möglichst wenig PAGESEL Macros nötig sind.

Außerdem kann es sich lohnen die Interrupts als Makro zu schreiben und 
an den Anfang aller Pages zu setzen.

Gruß Anja

von Chris B. (dekatz)


Lesenswert?

Das Programm in einzelne, mit ORG xxxx definierte Abschnitte (and 
denSeitengrenzen) aufteilen, z.b:

ORG 0x0000
goto main
ORG 0x0004
<interruptroutine>
main:
......Initialisierungen, Ablaufsteuerung etc
Unterprogramme werden mit
PAGESEL upr1
CALL upr1
.....
PAGESEL upr2
CALL upr2

etc. aufgerufen

Die Unterprogramme liegen auf Page1:
ORG 0x0800
upr1
....
upr2
....

(uuups sollte mal mehr als 2 Finger nehmen ;-) )

von FloZie (Gast)


Lesenswert?

Danke für die Antwort.

Ich habe im mom durch den Assembler ja alles in den 2k bereich quasi 
stehen. beginnt ja mit 0x000  und interruptroutine ist bei x004

Das programm beinhaltet zum größten teil calls mit unterschiedlichen 
aufgaben.

quasi das haubtprogramm mit abfragen etc ist ca 600 zeichen groß und der 
rest nur unterprogramme die gecallt werden.


Das packt der ja fleißig hintereinander.

die calls könnten alle in einem 2. 2k bereich verschwinden.

packt man da einfach nun ein pagesel hin? und er füllt denn den 2. 
speicher damit voll?


wie erkläre ich dem pic bzw assembler denn das der den rest nicht in die 
1. 2k packen soll sondern die ganzen calls (unterprogramme) in den 2. 
speicher.... ohh man

von Chris B. (dekatz)


Lesenswert?

FloZie schrieb:
> wie erkläre ich dem pic bzw assembler denn das der den rest nicht in die
>
> 1. 2k packen soll sondern die ganzen calls (unterprogramme) in den 2.
>
> speicher.... ohh man

Ganz einfach: den 2. Teil legst du auf die nächste Speicherseite wie 
oben schon geschrieben: ORG 0x0800 = Page 1, ORG 0x1000 = Page 2.

von FloZie (Gast)


Lesenswert?

Die antworten kamen schneller als ich probieren und antworten konnte :)

vielen dank.

Der Assembler meckert nun nicht mehr rum das alles zu lang ist.

muss nun noch das wieder zuordnen und denn sollte es hinhauen.



Vielen lieben dank euch allen!!!!

DANKE DANKE DANKE

von Anja (Gast)


Lesenswert?

Chris B. schrieb:
> Ganz einfach:

Er hat sich sooo nett bedankt.
Sollen wir im jetzt auch noch verraten daß er vor jedem GOTO oder CALL 
wenn er die page wechseln will oder aus einem CALL zurückkomt ein 
PAGESEL Makro braucht? ;-)

Gruß Anja

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.