Jetzt hab ichs, glaube ich:
Der Interrupt Vector liegt ja bei 0x0008 bzw. 0x0018
und dort ist folgender Code zu finden, nämlich der Eintritt in die Interrupt Funktion
Hier werden alle notwendigen Register gerettet, erstmal unabhängig davon ob diese benutzt werden.
Code:
0008 821B BSF btemp, 1, ACCESS
000A CFFA MOVFF PCLATH, __pcstackCOMRAM
000C F001 NOP
000E CFFB MOVFF PCLATU, 0x2
0010 F002 NOP
0012 CFE9 MOVFF FSR0, 0x3
0014 F003 NOP
0016 CFEA MOVFF FSR0H, 0x4
0018 F004 NOP
001A CFE1 MOVFF FSR1, 0x5
001C F005 NOP
001E CFE2 MOVFF FSR1H, 0x6
0020 F006 NOP
0022 CFD9 MOVFF FSR2, 0x7
0024 F007 NOP
0026 CFDA MOVFF FSR2H, 0x8
0028 F008 NOP
002A CFF3 MOVFF PROD, 0x9
002C F009 NOP
002E CFF4 MOVFF PRODH, 0xA
0030 F00A NOP
0032 CFF6 MOVFF TBLPTR, 0xB
0034 F00B NOP
0036 CFF7 MOVFF TBLPTRH, 0xC
0038 F00C NOP
003A CFF8 MOVFF TBLPTRU, 0xD
003C F00D NOP
003E CFF5 MOVFF TABLAT, 0xE
0040 F00E NOP
0042 C01B MOVFF btemp, 0xF
0044 F00F NOP
0046 C01C MOVFF 0x1C, 0x10
0048 F010 NOP
004A C01D MOVFF 0x1D, 0x11
004C F011 NOP
004E C01E MOVFF 0x1E, 0x12
0050 F012 NOP
00D8 0012 RETURN 0
54:
!! Die NOP s sind NICHT etwa reingebastelt um Code zu verschwenden, obwohl ich das auch am Anfangs dachte....
das ist Prozessorbedingt so bei einem Befehl MOVFF.
er kommt auch bei einem Interrupt in diesen Code rein, habe ich grad mal simuliert und das dauert dann 40 Cycles für diesen Codeabschnitt
Bei 16 MHz / 4 wegen der Pipeline Struktur = 4 MHz =250ns pro Cycle
Bei 40 Cycles also 40*250ns sind 10 us und das entspricht deinem Fehler.
Vermutlich kommt hier dann die "Optimierung" zur Geltung, wenn man eine Pro Version hat.Ich kann das leider nicht testen, habe nur die Freie VersionIch glaube man kann sich aber auch eine Pro Version Testweise runterladenIdee: Du könntest noch die PLL im Chip einschalten und die Zeit damit vierteln.
Also den internen Takt vervierfachen. Must deine SPI Einstellung vermutlich noch ändern.
Lesezeichen