PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fast External Interrupts XC164 Infineon



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

Manta22
30.03.2013, 14:33
Hej!

Ich bin leider noch nicht dazugekommen die Lösung zu posten, aber jetzt ist es so weit!
Also das ganze funktioniert so:


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;

//
...
//

}

1. Das Moderegister ist hier komplett unnötig!
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:


FINT0CSP = SEG(extISR) | 0x8C00;
FINT0ADDR = SOF(extISR);

Dazu braucht man entweder folgende Macros:


//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))

oder man schaut einfach im Debugger nach und holt von dort die entsprechende Adresse.

Zu beachten: LVL und GVL des Controllregisters (hier: CC1_CC8IC) und des Regestrationsregisters (hier: FINT0CSP) müssen gleich sein. Sonst gehts nicht!

lg Manta22