MSP4302553 Timer Interrupt

Gast #3795668
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.
Persönliche Seite #3795728
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;
Gast #3795747
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 :(
Gast #3795777
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
#3795788
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

Gast #3795791
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 ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren