Interrups in PWM auf MSP430

OP #3012060
Lesenswert?

Hallo,


ich hab mal eine Frage:
Ich hab eine PWM implementiert, in der bei 200Hz eine LED gedimmt wird.
Dann lass ich die Pulsweiten berechnen, die aus einer Sinuswelle 
entstehen, so dass die LED pulsierend an und aus geht.

Jetzt muss es doch irgendetwas geben wie einen interrupt, der auf Pin 1 
das Signal an und aus schaltet, wenn die Zeit abgelaufen ist und die CPU 
sich während dessen mit der Berechnung der Pulsweiten beschäftigen kann?
Bisher musste beides nacheinander ablaufen, aber das läuft dann 
logischerweise nicht mehr ganz flüssig.

HIER DIE FRAGE:

Wie funktioniert sowas mit den Interrups? Es müsste ja irgendeine art 
Interrupt-Fänger die ganze zeit warten und sobald er den Interrupt 
fängt, das und das machen und danach kann die CPU wieder mit der alten 
Arbeit fortfahren.

Zumindest stell ich es mir so vor.


Hier mein bisheriger Code bzw mein erster Versuch.
1
void main(void)
2
{
3
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
4
                 
5
  P1DIR = 1;                            // p1 auf output
6
  TACTL = TASSEL_1 + TACLR;                 // aclck und clear
7
  TACCTL0 = CCIE;                           // ccr0 interrupt einschalten
8
  TACCR0 = 32768-1;                         // 1 sekunde
9
  TACTL |= MC_1;                            
10

11
}
12

13

14

15
__interrupt void Timer_A (void)
16
{
17
    P1OUT=0x1;          // testweise LED einschalten.                 
18
}

eigentlich müsste ja ein interrupt geworden werden, wen eine Sekunde 
abgelaufen ist und dann sollte die LED angehen. Tut sie aber nicht.
Was läuft falsch ?
Gast #3012378
Lesenswert?

Stefan Datenschutz schrieb:
> Hier mein bisheriger Code bzw mein erster Versuch.

Falls dieser Code vollständig ist:
Du brauchst im main() eine unendliche Schleife, damit der µC etwas zu 
tun hat. Ansonsten geht der µC aus main() heraus und versucht dann, das, 
was er im Programmspeicher vorfindet auszuführen.
Im besten Fall macht er einen Reset.
OP #3012471
Lesenswert?

Jackson schrieb:
> Dann solltest Du mal im Compiler-Handbuch bzw. in Beispielen nachgucken,
> wie es gehen soll. Versuch mal, einen Beispielcode zu compilieren.

eigentlich hasse ich solche tips, aber es war nochmal ein ansporn, die 
codebeispiele zu lesen und dort wurde deutlich, dass es in jedem 
handbuch, das ich bisher durchgewühlt habe, falsch geschrieben war.

es heißt
1
 #pragma vector = TIMER0_A0_VECTOR
2
__interrupt void Timer_A0_ISR(void)

damit funktionierts.

die zeile
1
__enable_interrupt();

ist auch nicht zu verachten ;-)

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