mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F2410: TimerB 1.6 ISR


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Bei meinem MSP430F2410 sind alle Timer B CCR aktiv.
CCR0 hat einen eigenen Interrupt-Vektor und somit eine eigene ISR.
CCR1 bis CCR6, sowie das Überlaufflag vom TimerB teilen sich den Vektor 
TBIV und eine ISR.

Nun suche ich die schnellste und effektivste Möglichkeit die 
aufgelaufenen Flags abzufragen.

Soll man das IFG der jeweiligen CCRx abfragen:
while(TBIV)
{
if(TBCCTL1 | CCIFG)
{
   ...
}
if(TBCCTL2 | CCIFG)
{
   ...
}
...
if(TBCTL | TBIFG)
{
   ...
}
}
oder den TBIV:
while(TBIV)
{
if(TBIV | 0x02)
{
   /* CCR1 */ 
   ...
}
if(TBIV | 0x04)
{
  /* CCR2 */
   ...
}
...
if(TBIV | 0x0E)
{
  /* Timer overflow */
   ...
}
}

Was ist denn eurer Meinung nach die beste Lösung?

Gruß
Markus

Autor: Dennis E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Soll man das IFG der jeweiligen CCRx abfragen:while(TBIV)
> {
> if(TBCCTL1 | CCIFG)
> {
>    ...
> }

Also so fragt man schonmal garnicht das IFG ab! Wenn dann schon mit "&" 
- aber trozdem ist es immernoch falsch.

Du hast doch extra den TBIV - dr ist doch genau für das schnelle 
auslesen des Registers gedacht:
...
ISR Timer B
{
  switch (TBIV)
  {
    case 1:
    {
      ...
      break;
    }

    case 2:
    {
      ...
      break;
    }
  }
}

Guck mal in den User's Guide. Da ist alles drin erklärt, welcher IV von 
welchem Timer kommt.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis E. schrieb:
> Also so fragt man schonmal garnicht das IFG ab! Wenn dann schon mit "&"
>
> - aber trozdem ist es immernoch falsch.

Ja, du hast recht. Das sollte natürlich ein "&" sein.

Dennis E. schrieb:
> ISR Timer B
>
> {
>
>   switch (TBIV)
>
>   {
>
>     case 1:
>
>     {
>
>       ...
>
>       break;
>
>     }
>
>
>
>     case 2:
>
>     {
>
>       ...
>
>       break;
>
>     }
>
>   }
>
> }


Ja, aber was ist, wenn CCR1 und CCR3 überglaufen sind, bis die die ISR 
aufgerufen wird? Wie bekomme ich das raus?
0x02 = 0010 = CCR1
0x04 = 0100 = CCR2
0x06 = 0110 = CCR3
0x08 = 1000 = CCR4
0x0A = 1010 = CCR5
0x0C = 1100 = CCR6
0x0E = 1110 = Timer Overflow

CCR1 (0x02) + CCR3 (0x06) wäre ja 0x08 und somit CCR4. So kann es also 
nicht gehen!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und guten Morgen!

Ist meine Frage so komplex, dass keiner mehr antwortet? ;(

Viele Grüße
Markus

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Hallo und guten Morgen!
>
> Ist meine Frage so komplex, dass keiner mehr antwortet? ;(
>
> Viele Grüße
> Markus

Nö... sie ist so einfach, weil es im User-Guide eindeutig beschrieben 
und einfach nachzulesen ist!
TBIV enthält immer nur einen Eintrag, nämlich den mit der höchsten 
Prio

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Nö... sie ist so einfach, weil es im User-Guide eindeutig beschrieben
> und einfach nachzulesen ist!
> TBIV enthält immer nur einen Eintrag, nämlich den mit der höchsten
> Prio

d.h. Wenn zwei CCR angeschlagen haben, wird zweimal nacheinander die ISR 
aufgerufen?

Autor: Dennis E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau so ist es!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja doof.
Dann verliere ich ja unnötig Zeit, dadurch das erst die ISR beendet und 
danach wieder aufgerufen wird...

Autor: Dennis E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Das ist ja doof.

Nee, isses nicht. Im Regelfall geht ja kein Interrupt verloren. Aber 
falls dir das Sorgen macht, dann setze ich noch einen drauf: Der 
Interrupt springt ja auch nicht sofort an, es dauert weitere Taktzyklen 
bis man in der ISR ist :( Problem beim Timer? Nein, das Ereignis ist ja 
jedesmal um diese Takte verzögert, also wieder völlig OK.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Das ist ja doof.
> Dann verliere ich ja unnötig Zeit, dadurch das erst die ISR beendet und
> danach wieder aufgerufen wird...

Wenn Dein Timing wegen der paar Taktzyklen derart kritisch ist, dann 
hast Du ein generelles Designproblem und musst Dir was schnelleres 
suchen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.