Forum: PC-Programmierung TimerA programmieren


von Eigen (Gast)


Lesenswert?

Hallo,

ich will Daten über die UART meines MSP430135 schicken. Dann muss
innerhalb von 3ms eine Antwort kommen. Um diese "Wartezeit" zu
realisieren, wollte ich einen Timer nehmen. Aber irgendwie funktioniert
der nicht ganz. Und mit dem User's Guide komm ich nicht so klar. Kann
mir da wer weiterhelfen?

Hier mein Code in C:
  /* Ab hier die Konfiguration für den Timer A eingefuegt */

  TACTL = TASSEL_2 | TAIE;
  TACCTL0 = 0x0020;
  TACCTL1 = 0x0000;
  TACCTL2 = 0x0000;
  TACCR0 = 10;
  TACCR1 = 9;
  TACCR2 = 0;
  TACCTL0 |= CCIE;

  //Timer aktivieren, falls erreicht Zeichen nochmal senden
  TACTL |= MC1;
  if((TACCTL0 & 0x0004) == 0x0004)
  {
    TACTL |=MC0;
    TXBUF0 = 'h';
  }

Falls aber eine Antwort über den RX-Interrupt kommt, soll dort auch der
Timer deaktiviert und auf null gesetzt werden. Die Abfrage, ob der Timer
abgelaufen ist funktioniert so aber nicht, muss ich da ein
Interrupt-Flag zur Abfrage benutzen, oder gar eine Interrupt-Routine
schreiben?

von Karl H. (kbuchegg)


Lesenswert?

Du willst ja auf den Timer warten.
D.h. dass Programm muss solange in einer Schleife
laufen, solange der von dir gewünschte Timerstand
noch nicht erreicht wurde.

Innerhalb der Schleife checkst du dann ab, ob über
den Rx Interrupt ein Zeichen eingetroffen ist
und brichst die Schleife vorzeitig ab.

Und noch was: Ich würde den Timer auf jeden Fall
so abfragen, ob sein Zählerstand schon größer als
der von dir vorausberechnete ist. Wenn Deine Schleife
nämlich ein bischen trödelt, könnte es schon sein,
dass du den exakten Timerstand nie zu Gesicht kriegst.
Stell Dir einfach vor Du müsstest eine bistimmte Zeit
warten, sagen wir 30 Sekunden. Dazu hast du eine Stoppuhr
auf die du immer wieder drauf schaust, während du Fussball
WM schaust. Es ist herzlich unwahrscheinlich, dass du die
Stoppuhr bei exakt 30.00 Sekunden betrachtest und feststellst
dass die Zeit um ist. Bei einer Zeit von 31 Sekunden oder 33
Sekunden, weisst du auch dass die Zeit um ist und du deine
Freundin abholen musst.

von Eigen (Gast)


Lesenswert?

Danke ich kann mit Fussball herzlich wenig anfangen.

Das ich eine Schleife programmieren muss ist mir auch schon klar
geworden. Aber wie frage ich den Timer des MSP ab. Das ist ja mein
eigenliches Problem.

von Karl heinz B. (kbucheg)


Lesenswert?

Das weis ich nicht, weil ich den MSP nicht kenne.
Steht aber sicher im Datenblatt.

Ich hab mich halt einfach mal an deinem Code orientiert.
Da steht:

  //Timer aktivieren, falls erreicht Zeichen nochmal senden
  TACTL |= MC1;
  if((TACCTL0 & 0x0004) == 0x0004)

also geh ich mal davon aus, dass TACCTL0 den momentanen
Inhalt des Timers repräsentiert.

Nur wird das halt mit einem einfach 'if' nichts werden,
weil 'if' ja nicht darauf wartet, bis die Bedinung eintrifft,
sondern nur entscheidet ob die Bedingung jetzt, zu dem Zeitpunkt
an dem 'if' sie auswertet gültig ist oder nicht.

wie wäre es mal mit:

  //Timer aktivieren
  TACTL |= MC1;

  // warten bis der Timer den Wert erreicht hat
  while( TACCTL0 < 4 )
    ;

Wie gesagt: ich kenn den Chip nicht. Ich arbeite nur mit dem
was du mir gibst. Ob TACCTL0 das richtige Register ist oder
ob das anders heist, steht im Datenblatt deines µC

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.