Forum: Mikrocontroller und Digitale Elektronik MSP430 Launchpad TimerA zeigt komisches Verhalten


von mistes (Gast)


Lesenswert?

Hi Leute,
folgenden Code habe ich auf meine Launchpad. Halte ich meinen Finger 
auf/ über den Controller blinkt P1.6 fröhlich im Sekundentakt. Entferne 
ich meine Hand, toggelt  die LED rasend schnell. Ich dachte zuerst an 
ein floaten irgendwelcher Eingänge, doch meine LED wird unabhängig der 
Eingänge vom timerA getoggelt.
Versteht das jemand?
1
#include  <msp430g2231.h>
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
6
  P1SEL |= 0x40;              // P1.6 Pin-Option: TA0.1
7
  P1OUT &= ~0x01;              // LED on P1.0 off
8
  P1DIR |= 0x41;                // P1.0, P1.6 output
9
10
  P1OUT |= 0x8;                //PULL UP
11
  P1REN |= 0x8;                //P1.3 PullUp enabled
12
13
  
14
 // TACCTL1 =  CCIE;                       // CCR1 interrupt enabled    
15
 // TACCTL0 =  CCIE;              // CCR0 interrupt enabled 
16
  CCTL1 = OUTMOD_3;              // Set at TACCR1, reset at TACCR0
17
  TACCR1 = 50;
18
  TACCR0 = 100;                       
19
  TACTL = TASSEL_1 + MC_1 + TAIE;           // ACLK, upmode, interrupt
20
21
  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
22
}

von mistes (Gast)


Lesenswert?

Kennt sich denn da keiner aus? Ich bin wirklich am Ende...

von mistes (Gast)


Lesenswert?

Das AVR-Symbol steht wahrscheinlich nicht umsonst neben der 
Interneteadresse!?
Weis denn jemand ein Forum in dem man um die Uhrzeit Leute erwischt, die 
sich mit MSP430 Controllern auskennen?

Gruß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Natürlich sind hier auch Leute unterwegs, die sich mit MSP430 auskennen. 
Nur kannst Du nicht damit rechnen, daß die den ganzen Tag das Forum 
durchstöbern, um Deine Frage innerhalb eines Zeitfensters von gerade mal 
zwei Stunden zu beantworten.

Das geschilderte Phänomen klingt so, als würde die Takterzeugung des 
'F2231 durch Dein Handauflegen beeinflusst. Dadurch wird natürlich auch 
die Taktquelle für Timer_A verändert, und die Blinkfrequenz Deiner LED 
folglich auch.

Die Taktquelle ist, wenn nichts anderes initialisiert wird, der interne 
RC-Oszillator (DCO).

Ich habe jetzt gerade keine Lust dazu, mir den zugehörigen Family User's 
Guide herunterzuladen und anzusehen, was exakt die verschiedenen 
Initialisierungen bedeuten, die Du da vornimmst; Du solltest Dir 
heraussuchen, wie exakt der Systemtakt (MCLK) erzeugt wird, wie hoch er 
ist, und wie der Takt, den Du als Quelle für Timer_A verwendest, erzeugt 
wird, das müsste ACLK sein.

Desweiteren könntest Du heraussuchen, was genau Deine Initialisierung 
des Timer_A und dessen Capture&Compare-Einheit bedeutet, bzw. auf 
welchem Wege Du zu den Werten gekommen bist.

Such das raus, dokumentiere es, und wenn Dir dabei keine Unstimmigkeiten 
aufgefallen sind, dann kann man über weitere Details nachdenken.

von Stefan (Gast)


Lesenswert?

Hast du den 32 KHz Quartz installiert?

von Pulldown (Gast)


Lesenswert?

mistes schrieb:
> Hi Leute,
> folgenden Code habe ich auf meine Launchpad. Halte ich meinen Finger
> auf/ über den Controller blinkt P1.6 fröhlich im Sekundentakt. Entferne
> ich meine Hand, toggelt  die LED rasend schnell. Ich dachte zuerst an
> ein floaten irgendwelcher Eingänge, doch meine LED wird unabhängig der
> Eingänge vom timerA getoggelt.
> Versteht das jemand?

mistes schrieb:
> P1OUT |= 0x8;                //PULL UP
>   P1REN |= 0x8;                //P1.3 PullUp enabled

So ist es mir jetzt auch gegangen. :-(((

Durch Änderung der Befehlsfolge auf
1
P1REN |= 0x8;                //P1.3 PullUp enabled
2
P1OUT |= 0x8;                //PULL UP
klappts auf einmal :-)))

Ich habe im Manual keinen Hinweis auf die Reihenfolge gefunden. 
Vielleicht hilft Euch der Hinweis.

von Stefan (Gast)


Lesenswert?

Pulldown schrieb:
> Durch Änderung der Befehlsfolge auf
> P1REN |= 0x8;                //P1.3 PullUp enabled
> P1OUT |= 0x8;                //PULL UP
> klappts auf einmal :-)))

Die beiden Zeilen werden in dem ursprünglich geposteten Programm gar 
nicht benötigt.
Der Interrupt sollte auch nicht erlaubt werden wenn keine 
Interruptroutine vorhanden ist.
Da ACLK vom LFXT1 kommt, wenn nicht auf den VLO umgestellt wird, muss 
der Uhrenquarz angeschlossen sein.
Bei 32KHz und den TACCRx Werten aus dem ursprünglich geposteten Programm 
blinkt die LED dann natürlich mit über 300 Hz.

Bei angeschlossenm Uhrenquarz funktioniert diese vereinfachte Version, 
die LED blinkt mit etwa 3 Hz:
1
#include  <msp430g2231.h>
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;     // Stop WDT
6
  P1SEL |= 0x40;                // P1.6 Pin-Option: TA0.1
7
  P1DIR |= 0x40;                // P1.6 Output
8
9
  CCTL1 = OUTMOD_3;             // Set at TACCR1, reset at TACCR0
10
  TACCR1 = 5000;
11
  TACCR0 = 10000;                       
12
  TACTL = TASSEL_1 + MC_1;      // ACLK, upmode
13
14
  _BIS_SR(LPM3_bits);           // Enter LPM3
15
}

von Pulldown (Gast)


Lesenswert?

Mein lieber Stefan, es ging mir um die internen Pullup Widerstände. Bei 
der ersten Aufrufsequenz schienen sie unwirksam.

Meine Anwendung läuft bereits. Das Ganze war als Hinweis für andere 
Verzweifelte gedacht. Vielleicht weist du mehr und kennst die richtige 
Seite im Family Guide.

von Stefan (Gast)


Lesenswert?

Bei meinen Launchpads (Rev.1.3 und Rev.1.4) ist es nicht notwendig an 
P1.3 (S2) den internen Pullup einzuschalten weil ein externer Pullup 
verbaut ist. Bei der neusten Revisionen des Boards soll TI diesen 
Widerstand und auch den Kondansator am gleichen Anschluss weggelassen 
haben.

Bei Tests an P1.4 konnte ich keinen Unterschied feststellen zwischen
1
P1REN |= 0x10;                //P1.4 PullUp enabled
2
P1OUT |= 0x10;                //PULL UP
und
1
P1OUT |= 0x10;                //PULL UP
2
P1REN |= 0x10;                //P1.4 PullUp enabled
Es funktioniert beides.

von Pulldown (Gast)


Lesenswert?

Stefan schrieb:
> Bei meinen Launchpads (Rev.1.3 und Rev.1.4) ist es nicht notwendig an
> P1.3 (S2) den internen Pullup einzuschalten weil ein externer Pullup
> verbaut ist.

N i  c h t   e x t e r n! Intern!



Stefan schrieb:
> Bei Tests an P1.4 konnte ich keinen Unterschied feststellen zwischenP1REN |= 
0x10;                //P1.4 PullUp enabled
> P1OUT |= 0x10;                //PULL UPundP1OUT |= 0x10;                //PULL 
UP
> P1REN |= 0x10;                //P1.4 PullUp enabled
> Es funktioniert beides.

Das ist interessant. Ich werde es bei Gelegenheit auch noch mal 
probieren.

von Stefan (Gast)


Lesenswert?

Pulldown schrieb:
> N i  c h t   e x t e r n! Intern!

Das hatte ich schon richtig verstanden. Aber bei allen Launchpads bis 
mindestens Rev.1.4 ist ab Werk ein externer Pullup verbaut. Damit ist es 
natürlich etwas schwieriger zu erkennen ob der interne Pullup zusätzlich 
richtig eingeschaltet wird.
Ein Board ohne Pullup an P1.3 habe ich nicht, deshalb der Test an P1.4.

von Pulldown (Gast)


Lesenswert?

Stefan schrieb:
> Ein Board ohne Pullup an P1.3 habe ich nicht, deshalb der Test an P1.4.

Das dürfte egal sein. Wie oben geschrieben, teste ich das bei 
Gelegenheit noch einmal. Ich messe dann den Strom durch den Portpin oder 
hat einer bessere Idee?

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.