Forum: Mikrocontroller und Digitale Elektronik ISR - MSP430 - Switch-Case Anweisung


von MSP430 (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zu der ISR-Behandlung bei den MSP430ern.
Das folgende konstrukt findet sich beispielhaft in mehreren Büchern und 
Examplecodes.


__interrupt void TIMERB1_ISR(void)
{
/* Any access, read or write, of the TBIV register automatically resets 
//the highest "pending" interrupt flag. */

  switch( __even_in_range(TBIV,14) )
  {
    case  0: break;                          // No interrupt
    case  2: break;                          // CCR1 not used
    case  4: break;                          // CCR2 not used
    case  6: break;                          // CCR3 not used
    case  8: break;                          // CCR4 not used
    case 10: break;                          // CCR5 not used
    case 12: break;                          // CCR6 not used
    case 14: P1OUT ^= 0x01;                  // overflow
            break;
    default: break;
  }
}



Was ich mich dabei aber frage:
"Case 0" trifft doch im wesentlichen immer zu, und demnach müsste die 
ISR doch stets sofort verlassen werden, ohne jemals einen der echten 
Interrupt-Cases erreichen zu können...
oder habe ich die switch-case Anweisung nicht richig verstanden?

von bla (Gast)


Lesenswert?

MSP430 schrieb im Beitrag #2742059:
> "Case 0" trifft doch im wesentlichen immer zu
case 0 trifft genau dann zu wenn __even_in_range(TBIV,14) (dessen 
Definition du uns ja verschwiegen hast) Null ist. Ich glaube du hast 
switch-case tatsächlich falsch verstanden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MSP430 schrieb im Beitrag #2742059:
> oder habe ich die switch-case Anweisung nicht richig verstanden?

Danach sieht es aus.

von Rangi J. (rangi)


Lesenswert?

nicht richtig verstanden, ja!
das '__even_in_range' ermöglicht dem compiler hier eine ganz einfache 
sprungtabelle zu bauen. die 14 meint dann, dass der hoechste wert 14 
möglich ist.
im TBIV-reister sind nur die bits 1 bis 3 belegt, und der wert, der 
ausgelesen wird entspricht dann eben 2,4,6,8, ... je nach priorität. 0 
kommt praktisch nicht vor, da sonst keine interrupt ausgelöst werden 
würde.

oder zielt deine frage darauf ab, dass ein 'grösser als'-vergleich im 
case stattfindet? mir klingt das nach irgendeiner komischen sprache, in 
der das so war. basic oder so?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.