Interrups in PWM auf MSP430

OP #3012060
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 ?
OP #3012239
den #pragma vector=TIMERA0_VECTOR hatte ich noch vergessen, aber der 
wirft mir immer einen Compiler-Fehler vor die Füße.
in der msp430g3553.h wird er Timer_a0_vector genannt, aber auch wenn ich 
ihn so nenne, sagt er immer "identifier xxx is undefined"
Gast #3012378
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 #3012404
Hallo und danke für die Antwort.
Das hatte ich schon versucht und brachte irgendwie keinen Erfolg :(
Es kann auch so lange noch nicht funktionieren, bis ich dieses Problem 
mit dem TimerA0_vector behoben habe, da weiß ich aber leider keinen Rat 
- er bleibt bei seinem "syntaxfehler"
OP #3012471
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.