-         

+ Antworten
Ergebnis 1 bis 2 von 2

Thema: Fast External Interrupts XC164 Infineon

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.03.2013
    Beiträge
    22

    Fast External Interrupts XC164 Infineon

    Anzeige

    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:

    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:

    Code:
    //****************************************************************************
    // @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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    15.03.2013
    Beiträge
    22
    Hej!

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

    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;
    
    //
    ...
    //
    
    }
    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:

    Code:
    FINT0CSP   = SEG(extISR) | 0x8C00;
    FINT0ADDR  = SOF(extISR);
    Dazu braucht man entweder folgende Macros:
    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))
    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

+ Antworten

Ähnliche Themen

  1. Infineon XE164FN
    Von MrChip im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 6
    Letzter Beitrag: 21.01.2013, 13:11
  2. sind ALLE Interrupts wieder ON nach Enable Interrupts?
    Von sBronco im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.07.2011, 15:58
  3. external interrupts bei gleichzeitiger lcd benutzung
    Von gothmog im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 16.11.2006, 10:02
  4. Unterschied external crystal <-> external clock (fuses
    Von sg10241024 im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 04.07.2005, 22:08
  5. C167 v. Infineon
    Von freakysteve im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 09.02.2005, 09:56

Stichworte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •