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;)
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 | }
|
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.