Hallo Robert,
hm, wenn ich das mal geahnt hätte...
Ich habe - wie von Infineon mit ihrem Easy-Kit empfohlen - eine StartUp-Routine in mein Projekt integriert. Diese wird natürlich zum Code dazugebunden und vor meiner main ausgeführt. Dort habe ich auch einen Eintrag für den SP gefunden.
Weiter unten findest du zum einen den Code der StartUp, zum anderen eine Übersicht über die Adresse, wo der SP hininitialisiert wird (0x20, was direkt in meinen Interrupt-Vektoren liegt!). Wie kommt Keil drauf, den einfach mal so dahin zu legen? Die müssten doch auch wissen, dass in der Gegend die IR-Vektoren liegen, oder??
Ich weiß ja nicht, ob es wirklich daran liegt, aber kann ich den Eintrag einfach so verändern - ohne, dass mein Programm dann gar nicht mehr läuft?
Wobei ich dann immer noch nicht wirklich den Grund erkennen kann, warum es nur beim 1. Byte schiefgeht und warum er nur den einen Interrupt zweimal ausführt (schließlich liegen auf Adressen näher an 0x20 noch 2 andere IR-Vektoren)!?
Startup:
Code:
STARTUP1:
C:0x09BD 787F MOV R0,#0x7F
C:0x09BF E4 CLR A
IDATALOOP:
C:0x09C0 F6 MOV @R0,A
C:0x09C1 D8FD DJNZ R0,IDATALOOP(C:09C0)
C:0x09C3 90F000 MOV DPTR,#0xF000
C:0x09C6 7F00 MOV R7,#0x00
C:0x09C8 7E02 MOV R6,#0x02
C:0x09CA E4 CLR A
XDATALOOP:
C:0x09CB F0 MOVX @DPTR,A
C:0x09CC A3 INC DPTR
C:0x09CD DFFC DJNZ R7,XDATALOOP(C:09CB)
C:0x09CF DEFA DJNZ R6,XDATALOOP(C:09CB)
C:0x09D1 758120 MOV SP(0x81),#0x20
C:0x09D4 02086F LJMP main(C:086F)
Memory:
Code:
C:0x0020 00 NOP
C:0x0021 00 NOP
C:0x0022 00 NOP
C:0x0023 00 NOP
C:0x0024 00 NOP
C:0x0025 00 NOP
C:0x0026 00 NOP
C:0x0027 00 NOP
C:0x0028 00 NOP
C:0x0029 00 NOP
C:0x002A 00 NOP
C:0x002B 02092A LJMP T2ISR(C:092A)
C:0x002E 00 NOP
C:0x002F 00 NOP
C:0x0030 00 NOP
C:0x0031 00 NOP
C:0x0032 00 NOP
C:0x0033 00 NOP
C:0x0034 00 NOP
C:0x0035 00 NOP
C:0x0036 00 NOP
C:0x0037 00 NOP
C:0x0038 00 NOP
C:0x0039 00 NOP
C:0x003A 00 NOP
C:0x003B 00 NOP
C:0x003C 00 NOP
C:0x003D 00 NOP
C:0x003E 00 NOP
C:0x003F 00 NOP
C:0x0040 00 NOP
C:0x0041 00 NOP
C:0x0042 00 NOP
C:0x0043 0208D3 LJMP ShootISR(C:08D3)
C:0x0046 00 NOP
C:0x0047 00 NOP
C:0x0048 00 NOP
C:0x0049 00 NOP
C:0x004A 00 NOP
C:0x004B 020800 LJMP TriggerISR(C:0800)
Außerdem sind in der Startup folgende Dinge eingestellt:
- IDATA memory length 0x0080
XDATA memory start address 0xF000
XDATA memory length 0x0200
PDATA memory start address 0x0000
PDATA memory length 0x00
Und es gäbe einen Eintrag "Reentrant Stack Initialization", bei dem man für das SMALL, LARGE und COMPACT-Modell jeweils "top of stack" einstellen kann.
In den Projekteinstellungen habe ich noch folgende Zeile gefunden:
Code(C:0x0-c:0x2fff, c:0xa000-c:0xafff), XDATA(X:0xf000-X:0xf1ff)
Wenn du jetzt sagst "Mensch, warum schreibt der das denn nicht gleich, dann hätten wir das Problem in 5 Minuten gelöst gehabt!", dann muss ich mich entschuldigen, aber auf solche Zusammenhänge wäre ich wahrscheinlich in 5 Jahren nicht gekommen. Zu meiner Verteidigung sei gesagt, dass das erst der 2. Microcontroller ist, den ich bislang programmiere. Wir hatten das Fach an der Schule und davor habe ich noch nie was von C - oder gar Assembler! - gehört gehabt...
Viele Grüße
Michael
Lesezeichen