Forum: Mikrocontroller und Digitale Elektronik MSP430 dma07 Variable wird zurückgesetzt


von Stefan M. (stefan_m)


Lesenswert?

Hi,

die Datei von TI msp430xG46x_dma_07_CCE.c gibt einen Sinus und Cosinus 
von einer LookUpTable aus.

Allerdings ist das ganze statisch und ich wollte es mittels einer 
Variable flexibler machen, dass wenn der Taster S2 gedrückt wird, der 
Ausgabetakt halbiert wird und damit die Periode sich vergrößert.

Leider wird meine Variable immer wieder zurückgesetzt, wenn der 
Controller in den LPM0 zurückkehrt.
Wie kann ich das verhindern?

void main(void)
{
 WDTCTL = WDTPW + WDTHOLD;  // Stop watchdog timer
 FLL_CTL0 |= XCAP14PF;      // Configure load caps
 initPortPins();
 ADC12CTL0 = REF2_5V + REFON;  // Internal 2.5V ref
 TACCR0 = 13600;               // Delay to allow Ref to settle
 TACCTL0 |= CCIE;              // Compare-mode interrupt.
 TACTL = TACLR + MC_1 + TASSEL_2;    // SMCLK
 __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
 TACCTL0 &= ~CCIE;               // Disable timer compare-mode interrupt
 __disable_interrupt();          // Disable Interrupts

 DMACTL0 = DMA0TSEL_5 + DMA1TSEL_5;   // DAC12IFG triggers
 DMA0SA = (void (*)())Sin_tab;        // Source block address
 DMA0DA = (void (*)())&DAC12_0DAT;    // Destination single address
 DMA0SZ = 0x20;                       // Block size for SinTab

 DMA0CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // Rpt, inc src, word-word

 DMA1SA = (void (*)())Cos_tab;        // Source block address
 DMA1DA = (void (*)())&DAC12_1DAT;    // Destination single address
 DMA1SZ = 0x20;                       // Block size for CosTab
 DMA1CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // Rpt, inc src, word-word

 DAC12_0CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_5 + DAC12IFG + DAC12ENC + 
DAC12GRP;
 DAC12_1CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_5 + DAC12IFG + DAC12ENC;

>//-TimerA for OUTPUT Periode-
>//---------------------------

  TACCTL1 = OUTMOD_3;         // TACCR1 set/reset
  TACCR1 = 01;                // TACCR1 PWM Duty Cycle
  TACCTL0 = CCIFG;

>  //Variable die bei Tasterberührung verdoppelt wird
  TACCR0 = a;             //1638

  TACTL = TASSEL_2 + MC_1;    // SMCLK, upmode

  while (1)
  {
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0
  }
> // kehrt er in den LPM0 zurück, wird a = Anfangswert (1638) gesetzt
}

#pragma vector = TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
   TACTL =;                            // Clear Timer_A control 
registers
 __bic_SR_register_on_exit(LPM0_bits); // Exit LPMx, interrupts enabled
}

//interrupt ServiceRoutine for Port1
//----------------------------------
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
 DebounceDelay();
 if (P1IFG & BIT1)// if Switch sends an interrupt, Reset IFlag1 and set 
b=6
 {
  beep48();
  P1IFG &= ~BIT1; // InterruptFlag1 Schalte Speicherplatz 1 auf Null
>  a*=2;          // Verdopplung der Var
 }
}

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.