Forum: Mikrocontroller und Digitale Elektronik MSP4302553 Timer Interrupt


von knautschi (Gast)


Lesenswert?

Hallo
Ich verzweifle gerade daran per Timer und Interrupt eine LED zu 
toggeln... eigentlich sollte das ja kein Problem darstellen aber der 
macht das einfach nicht. Der springt einmal in die Interruptrutine und 
macht die led an. aber dann bleibt die an...

•
1
 #include "msp430g2553.h"
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;     // Stop WDT
6
  DCOCTL = CALDCO_1MHZ;                           // 1MHz
7
  TACTL = TASSEL_2 + MC_1 + ID_3+ TAIE;           // SMCLK/8, upmode
8
  CCR0 =  10000;                     // 12.5 Hz
9
  P1OUT &= 0x00;               // Shut down everything
10
  P1DIR &= 0x00;
11
  P1DIR |= BIT0;             // P1.0 and P1.6 pins output the rest are input
12
P1OUT=0x00;
13
14
15
  __bis_SR_register(LPM0_bits + GIE);
16
17
}
18
19
// Timer A0 interrupt service routine
20
#pragma vector=TIMER0_A1_VECTOR
21
__interrupt void Timer_A(void)
22
{
23
   P1OUT ^= BIT0;// Toggle P1.0
24
25
26
}

Ich weiß gerade einfach nicht weiter... MC_1 ist der upmode sprich der 
sollte bis CCR0=(10000) zählen und dann kommt das Interrupt. Sprich xor 
P1.0. Dann sollte er von selber wieder von 0 an hoch zählen bis der 
nächste interrupt ausgelöst wird.

kann mir bitte einer nen Tip geben, was an meinem code falsch ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vergleiche doch einfach mit den Codebeispielen, die TI veröffentlicht 
hat.

Die zeigen eigentlich für jedes Peripherieelement, wie es anzusteuern 
sind, und dazu gehört natürlich auch der Timer.

knautschi schrieb:
> P1OUT &= 0x00;               // Shut down everything
>   P1DIR &= 0x00;
>   P1DIR |= BIT0;             // P1.0 and P1.6 pins output the rest are
> input

Hast Du Dir angesehen, welchen Wert diese Register beim POR haben?

Und, nur mal so nebenbei gefragt:

Unterscheiden sich diese beiden Zeilen?

> a &= 0x00;

und

> a = 0x00;

von Max M. (vcc)


Lesenswert?

Der interrupt wird bei dir nur ein mal ausgeführt.
Du brauchst ne endlosschleife in main.

von knautschi (Gast)


Lesenswert?

Hallo

ähm ich weiß dass ich nicht ganz sauber kommentiert habe. sind 
angepasste standardbeispiele. Das wichtige ist dass

>   P1DIR |= BIT0;
bedeutet das Bit0 auf Output gestellt ist damit die LED auch angesteuert 
werden kann.

und stimmt weiß auch nicht warum ich da ein & drin hab.

Jedenfalls hab ich die vorlage die im CC drin sind durchgesehen, find 
aber meinen fehler immernoch nicht :(

von Max M. (vcc)


Lesenswert?

Max M. schrieb:
> Der interrupt wird bei dir nur ein mal ausgeführt.
> Du brauchst ne endlosschleife in main.

sorry - so ein Blödsinn - ist schon spät.
Geht ja um interrupts hier...

von knautschi (Gast)


Lesenswert?

Max M. schrieb:
> Der interrupt wird bei dir nur ein mal ausgeführt.
> Du brauchst ne endlosschleife in main.

mh wenn ich nach
>__bis_SR_register(LPM0_bits + GIE);

ne
1
while(1){}

schleife setze geht die led immernoch an und blinkt nicht :(

von Christian L. (cyan)


Lesenswert?

Nur mal ein Schuss ins Blaue:

Versuche mal das CCIE Bit zu setzen und einen Output Mode OUTMODx 
auszuwählen. Beides muss ins TACCTL1 Register geschrieben werden.

von knautschi (Gast)


Lesenswert?

mhh wird in den dokus zwar nirgens beschriben aber muss man, auch wenn 
ich mir das nicht vorstellen kann, das interruptflag löschen damit der 
wieder reagiert wie bei einem Port Interupt??

von Max M. (vcc)


Lesenswert?

du musst vorher den interrupt für CCR0 aktivieren, also im main, vor dem 
TACTL = ...

--> TACCTL0 = CCIE;      // Enable interrupts for CCR0

: Bearbeitet durch User
von Christian L. (cyan)


Lesenswert?

Christian L. schrieb:
> Beides muss ins TACCTL1 Register geschrieben werden.

Ich sehe gerade, dank Max, dass es das TACCTL0 Register sein muss.

von knautschi (Gast)


Lesenswert?

Max M. schrieb:
> TACCTL0 = CCIE;      // Enable interrupts for CCR0

wenn ich den aktiviere gehts garnicht mehr. Das ist glaube ich ja auch 
der interrupt, welcher kommt wenn der timer bis overflow 0xffff (oda so) 
zählt. dadurch dass ccr0 schon früher kommt, kommt der nie oder?
Dafür ist ja TACTL = TAIE+... gesetzt

von Max M. (vcc)


Lesenswert?

Flag löschen im interrupt fehlt evtl. noch

von Max M. (vcc)


Lesenswert?

Probier mal TACCR0 zu benutzen statt CCR0

TACCR0 = 10000;  // 10000 Periode
TACCTL0 = CCIE;      // Enable interrupts for CCR0.
TACTL = TASSEL_2 + ID_3 + MC_1 + TAIE;


und dann statt

#pragma vector=TIMER0_A1_VECTOR

das dieses pragma für deine ISR:

#pragma vector = TIMERA0_VECTOR

es sei denn du hast schon so ein define irgendwo:

#define TIMER0_A0_VECTOR TIMERA0_VECTOR


von knautschi (Gast)


Lesenswert?

hab gelesen dass für den MSP430g2553

#pragma vector=TIMER0_A1_VECTOR
geschrieben werden muss. lass ich das A1 weg bekomm ich neben der Zeile 
ein gelbes ! im dreieck und die led geht auch nicht mehr an. aber auch 
mit den anderen änderungen geht die led nur an ...

von knautschi (Gast)


Lesenswert?

wenn ich TACCTL0 &=~CCIFG; probiere um im interrupt am ende das flag zu 
löschen bringt das auch nix...

von Mrs. MSP (Gast)


Lesenswert?

Ein Blick in den Family User Guide zeigt uns, dass man TAIV lesen muss, 
um das TAIFG zu löschen. Es handelt sich um einen shared Interrupt.

von Mrs. MSP (Gast)


Lesenswert?

Und noch ein Beispiel für beide Timer Interrupts:
Beitrag "Re: Frequenzmessung mit MSP430 im LPM3"

von knautschi (Gast)


Lesenswert?

Ah danke das hat funktioniert.

kannst du mir mal sagen auf welcher seite das steht damit ich weiß wo 
ich das nächste mal suchen kann

von Mrs. MSP (Gast)


Lesenswert?

knautschi schrieb:
> kannst du mir mal sagen auf welcher seite das steht

Im Family User Guide zum G2553 (slau144) ab 12.2.6 geht es um die TimerA 
Interrupts.

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.