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