Manta22
15.03.2013, 20:07
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:
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;
//
...
//
}
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:
//************************************************** **************************
// @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
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 :S
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
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:
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;
//
...
//
}
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:
//************************************************** **************************
// @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
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 :S
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