Forum: Mikrocontroller und Digitale Elektronik Interrupt mit Timer


von John L. (Firma: blubb) (j0hn)


Lesenswert?

Hi,
ich benutze einen MSP430F2013 und versuche über globale Variablen in 
einem Interrupt eine Zählfunktion einzubauen. Wenn ich eine LED in dem 
Interrupt toggeln lasse,als Test, funktioniert es auch einwandfrei, aber 
sobald ich meine Zählfunktion einsetze passiert nichts...als würde er 
gar nicht in den Interrupt kommen. Gibts da vielleicht Probleme mit der 
Übergabe von den Werten?
Ich lasse den TAR immer bis 12500 laufen und er wird nachdem er in den 
Interrupt springt, wieder am Ende des Interrupts zurück auf 0 gestellt, 
da ich mir ausgerechnet habe, dass bei 1MHz(SMCLK) und einem Vorteiler 
von 8 ich 12500Takte brauche für 100ms.
Ich hoffe das reicht fürs Verständnis. Hier nun der Quelltext:


include "msp430x20x2.h"

int a=0;
int t100mstester;
volatile int t100ms;
volatile int t1sek=0;
int null_ms=0;
int  t100msersatz;

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;


  P1DIR |= 0xFF; // Setzt alle auf OUTput
  P1REN=0x01;       //Pull up für P1.0 aktiviert
//Timer wird aktiviert mit fortsetzen der aufsteigenden Zähler
  TACCTL0 = CCIE;                          // TACCR0 interrupt enabled
  TACCR0 = 12500;                         //Bis hier hin zählt er
  TACTL = TASSEL_2 + MC_1;
  TACTL|=0x02D2;      // SMCLK, countmode  die 3 aktiviert  vorher 02C3


    _BIS_SR(GIE);                           //Interrupt aktivieren

while(1)
{
  //Hier wird die LED angeschaltet für den richtigen Zeitpunkt
  if (null_ms==t1sek%2)
  {
    P1OUT ^=0x03;       //LED an 0x03 welche toggelt
  }
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
        t100ms = t100ms+1;
        t100msersatz = t100ms;
        if(null_ms<t100msersatz%9)
          t1sek=t1sek+1;
        TAR=0;

}





Könnt ihr mir vielleicht helfen, was der Fehler ist? Bin relativ neu in 
der Mikrocontrollerprogrammierung und hatte wenn eher Erfahrungen mit 
den ATMega...

Ich danke schon mal für eine schnelle Antwort;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

John Lud schrieb:
>  t100msersatz = t100ms;
>  if(null_ms<t100msersatz%9)
Der Ersatz ist unnötig.
Es wird sowieso nicht direkt auf den Vergleichswerten herumgerechnet!

> if(null_ms<t100msersatz%9)
Was soll denn das?
Warum machst du es nicht so wie "alle Welt"?
Insbesondere ohne Division?
1
__interrupt void Timer_A (void)
2
{
3
        if(t100ms=9) {
4
          t1sek  = t1sek+1;
5
          t100ms = 0;
6
        } 
7
        else {
8
          t100ms = t100ms+1;
9
        }
10
        TAR=0;
11
}

von John L. (Firma: blubb) (j0hn)


Lesenswert?

ok, wäre auch eine Lösung^^
Aber ich denke du meintest in den if Abfragen t100ms==9 usw.
Das Problem an der Geschichte ist, wenn ich das durchlaufenlasse, sagt 
mir der Debugger die ganze Zeit, dass dort nicht gezählt wird. Sprich es 
verbleiben t1sek und t100ms stehts auf null, so wie der Rechner sagt...

von John L. (Firma: blubb) (j0hn)


Lesenswert?

Nachtrag:
Also ich habe noch etwas rumgetestet und habe herausgefunden, dass das
Programm komischerweise immer wieder resetet.
Ich weiß nicht wie man aus der whileschleife rauskommen kann, wenn sie
theoretisch unendlich lange laufen sollte...
Was ich auch merkwürdig finde, dass ich keinen Breakpoint in der
Interuptfunktion setzen kann, da gibt er eine Fehlermeldung, dass der
nicht gesetzt ist oder ausgeschaltet.
Ich hoffe die Informationen helfen für eine schnelle Lösung.
Danke

von John L. (Firma: blubb) (j0hn)


Lesenswert?

Hi,
Habs lösen können.
Falls jemand das gleiche Problem hat, dass das Programm immer resetet. 
Es könnte an der Timer Einstellung liegen, da bei mir der Interrupt sich 
an nicht gesetzte Vektoren orientierte und somit, wenn man sich den 
Assemblercode ansah zur letzten Zeile springt, anstatt zur vorherigen 
Funktion.

=> Lösung: in Zeile: TACTL|=0x02D2;   die hintere 2 entfernen, da sonst 
sich wieder der Interrupt an den vektoren orientiert. Also eine 0 am 
Ende.
=> TACTL|=0x02D0;

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.