Hallo zusammen!
Ich habe unlängst versucht die Fast External Interrupts von meinem XC164 von Infineon zu verwenden. Allerdings funktioniert das ganze nicht so richtig.
Falls es hilfreich ist, ich verwende die Software Keil zum programmieren!
Hier mal mein anfänglicher Code:
Nach einigen Recherchen bin ich schließlich draufgekommen, dass das Register EXICON schreibgeschützt ist und das ich das ganze mit einem "unlock modul" betreiben muss...dieses sollte so aussehen:Code:void extISR(void) interrupt 0x18 { counter = counter +1; } void main(void){ //Pin Konfig DP1H_P0 = 0; DP1H_P4 = 0; //Mode Register auf Capture setzen CC2_M4 |= 0x0200; //ConRegister auf falling edge setzen EXICON |= 0x0002; //Interrupt LVL und GVL setzen CC1_CC8IC = 0x0059; // ... // PSW_IEN = 1; // ... // }
So das ganze ist ja gut und schön, nur wie verwende ich diese "unlock Routine"? Wichitg für mich ist der command 4. Nach diesem sollte ich Schreibzugriff haben. Aber ich komm beim besten Willen nicht drauf, wie ich das Ding verwende :SCode://**************************************************************************** // @Function void MAIN_vUnlockProtecReg(void) // //---------------------------------------------------------------------------- // @Description This function makes it possible to write one protected // register. After calling of this function and write on the // protected register is the security level set to low // protected mode. // //---------------------------------------------------------------------------- // @Returnvalue None // //---------------------------------------------------------------------------- // @Parameters None // //---------------------------------------------------------------------------- // @Date 27.02.2009 // //**************************************************************************** void MAIN_vUnlockProtecReg(void) { uword uwPASSWORD; if((SCUSLS & 0x1800) == 0x0800) // if low protected mode { uwPASSWORD = SCUSLS & 0x00FF; uwPASSWORD = (~uwPASSWORD) & 0x00FF; SCUSLC = 0x8E00 | uwPASSWORD; // command 4 } // end if low protected mode if((SCUSLS & 0x1800) == 0x1800) // if write protected mode { SCUSLC = 0xAAAA; // command 0 SCUSLC = 0x5554; // command 1 uwPASSWORD = SCUSLS & 0x00FF; uwPASSWORD = (~uwPASSWORD) & 0x00FF; SCUSLC = 0x9600 | uwPASSWORD; // command 2 SCUSLC = 0x0800; // command 3; new PASSWOR is 0x00 uwPASSWORD = SCUSLS & 0x00FF; uwPASSWORD = (~uwPASSWORD) & 0x00FF; SCUSLC = 0x8E00 | uwPASSWORD; // command 4 } // end if write protected mode } // End of function MAIN_vUnlockProtecReg
Aja und ich will keine Komplettlösung! Ich steh komplett auf der Leitung...Ich bräuchte nur einen Schubs in die richtige Richtung!
danke + lg
Manta22
Hej!
Ich bin leider noch nicht dazugekommen die Lösung zu posten, aber jetzt ist es so weit!
Also das ganze funktioniert so:
1. Das Moderegister ist hier komplett unnötig!Code:void extISR(void) interrupt 0x18 { counter = counter +1; } void main(void){ //Pin Konfig DP1H_P0 = 0; DP1H_P4 = 0; //1. //Mode Register auf Capture setzen CC2_M4 |= 0x0200; //2. MAIN_vUnlockProtecReg(); //ConRegister auf falling edge setzen EXICON |= 0x0002; //Interrupt LVL und GVL setzen CC1_CC8IC = 0x0059; // ... // PSW_IEN = 1; // ... // }
2. Die Unlockroutine direkt vor dem Setzen des entsprechenden Registers aufrufen
Will man außerdem nicht nur Fast External Interrupts verwenden, sondern diese auch noch aus dem Interrupt Cache aufrufen, muss man die entsprechenden ISR´s im Cache regestrieren:
Dazu braucht man entweder folgende Macros:Code:FINT0CSP = SEG(extISR) | 0x8C00; FINT0ADDR = SOF(extISR);
oder man schaut einfach im Debugger nach und holt von dort die entsprechende Adresse.Code://Defines/oder eher Macros #define SEG(func) (unsigned int)(((unsigned long)((void (far *) (void))func) >> 16)) #define SOF(func) (unsigned int)(((void (far *) (void))func))
Zu beachten: LVL und GVL des Controllregisters (hier: CC1_CC8IC) und des Regestrationsregisters (hier: FINT0CSP) müssen gleich sein. Sonst gehts nicht!
lg Manta22
Lesezeichen