Forum: Mikrocontroller und Digitale Elektronik Interrups in PWM auf MSP430


von Daniel D. (misterschpock)


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 ?

von Daniel D. (misterschpock)


Lesenswert?

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"

von Daniel D. (misterschpock)


Lesenswert?

durch import der passenden header-datei ist das Problem jetzt behoben, 
allerdings sagt er immer "unrecognized #pragma"  - was bedeutet das?

von Bronco (Gast)


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.

von Daniel D. (misterschpock)


Lesenswert?

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"

von Jackson (Gast)


Lesenswert?

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

von Daniel D. (misterschpock)


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 ;-)

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.