Forum: Mikrocontroller und Digitale Elektronik UP in gleichen Abständen aufrufen


von Marc (Gast)


Lesenswert?

Hallo,

ich programmiere noch nicht lange den MSP430 in C.

Nun will ich das Programmm PWM() in gleichen Abständen aufrufen.
Das Prog funktioniert nur hab ich es noch nicht geschafft dass es immer 
gleich kommt.

Ich hab folgendes "main" Prog:
1
 
2
void main (void)
3
  { 
4
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
5
    Init_Clocking();
6
    SETWDT1S;
7
    Init_Address();
8
    Init_UART();
9
    Init_IO();
10
    Init_ADC();
11
    Init_Timer();
12
    Init_LEDS();
13
    //P6OUT |= 0x40;  
14
    DataInLow = 0x00;
15
    DataInHigh = 0x00;
16
    DataOut = 0x00;
17
//    Set_Fresh_Data ();
18
//    P3DIR |= 0x10;              // P3.4 output direction TXD
19
    _BIS_SR(GIE);         //normaler Betrieb ohne Stromsparmodus
20
//    P1DIR |= 0x01;              // Set P5.1 to output direction
21
    
22
    while (1)
23
    {
24
      CLRWDT;//
25
      SETGIE;
26
      STATUS_Byte();
27
//      P1OUT ^= 0x01;      //nicht initialisiert 600ms ein 600ms aus
28
        ShowAdress();
29
            
30
      UARTCmdHndlr();
31
32
    }
33
  }

Das Prog PWM() soll im while (1) teil immer in gleichen Abständen 
aufgerufen werden. Wie kann ich das machen. Das Problem ist, dass die 
anderen Programme unterschiedlich lange brauchen.

Marc

von Martin K. (mkohler)


Lesenswert?

Timer Interrupt verwenden, PWM in der Interrupt Routine abarbeiten.

von der mechatroniker (Gast)


Lesenswert?

Sollen die anderen Codeteile in der while(1) genau einmal pro Aufruf von 
PWM() aufgerufen werden (also in bestimmter Reihenfolge), oder so oft 
wie es der Controller in der Zwischenzeit schafft.

Im ersteren Fall: Im Timerinterrupt ein Flag setzen (global oder 
modulglobal ["static"] als volatile definiert!), in der Hauptschleife 
vor dem Aufruf ein
1
while (!bTimer)
2
    ;

Im letzteren Fall PWM() aus der Interruptroutine aufrufen. Ist nur 
sinnvoll möglich, wenn der Aufruf von PWM() nicht zu lange dauert.

Übrigens: PWM() ist kein "Prog", sondern eine "Funktion".

von Marc E. (marc8)


Lesenswert?

Ich habs schon versucht aus dem Interrupt heraus aufzurufen. allerdings 
kann ich im Interrupt nicht PWM(); schreben, sondern muss es einzeln 
dort reinschreiben. Dann ist es zu lang.

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.