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.







Zitieren


Lesezeichen