mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430FG4618 BeispielCode dma_07_CCE.c LookUpTable Funktionsweise?


Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das Beispiel msp430xG46x_dma_07_CCE.c von TI beinhaltet 2 Lookuptables. 
Einmal für einen Sinus und einmal für einen cosinus.

Schrittweite beträgt 32.

Nun hab ich versucht, die Auflösung der Kurven zu verfeinern, in dem ich 
die LookUpTable vom Sinus um weitere 32 Werte hinzugefügt habe. Leider 
sieht es so aus, als ob der Code dennoch nur die erste 32 Werte durch 
den DAC schickt. Denn ich bekomme nur oberwellen des Sinus raus. Also 
alle Wellentäler sind nach oben geklappt.

Was muss ich noch tun, um meine Schrittweite auf 64 zu erweitern?

f+r die LookUpTable hatte ich auch in den Index auf 64 erweitert, daran 
liegts also nicht ;) Muss man vielleicht noch den Speicher anders 
zuweisen?


Und was auch nicht klar ist, wieso die Zeile:

 TACTL = TACLR + MC_1 + TASSEL_2;          // Up mode, SMCLK

einmal mit Up_Mode ausgewiesen ist und weiter unten, wird der Timer 
nochmal eingestellt mit:

TACTL = TASSEL_2 + MC_1;                  // SMCLK, contmode

und wird hier als Continiousmode ausgewiesen. ???

Oder haben die sich da verschrieben?


Hier mal der original Code:
--------------------------------------------------------------
//********************************************************************** 
********
//   MSP430xG461x Demo - DMA0/1, Rpt'd Blk to DAC12_0/1, Sin/Cos, 
TACCR1, XT2
//
//   Description: DMA0 and DMA1 are used to transfer a sine and cos 
look-up
//   table word-by-word as a repeating block to DAC12_0 and DAC12_1. The 
effect
//   is sine and cos wave outputs. Timer_A operates in upmode with 
TACCR1
//   loading DAC12_0 amd DAC12_1 on rising edge and DAC12_OIFG 
triggering next
//   DMA transfers. DAC12_0 and DAC12_1 are grouped for jitter-free 
operation.
//   ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 
1048576Hz
//   //* An external watch crystal between XIN & XOUT is required for 
ACLK *//
//
//                MSP430xG461x
//             -----------------
//         /|\|              XIN|-
//          | |                 | 32kHz
//          --|RST          XOUT|-
//            |                 |
//            |        DAC0/P6.6|--> ~ 10kHz sine wave
//            |        DAC1/P6.7|--> ~ 10kHz cos wave
//
//   A. Dannenberg/ M. Mitchell
//   Texas Instruments Inc.
//   October 2006
//   Built with CCE Version: 3.2.0
//********************************************************************** 
********
#include "msp430xG46x.h"

//---------------------------------------------------------------------- 
--------
// 12-bit Sine Lookup table with 32 steps
//---------------------------------------------------------------------- 
--------
const int Sin_tab[32] = { 2048, 2248, 2447, 2642, 2831, 3013, 3185,
                          3346, 3495, 3630, 3750, 3853, 3939, 4007,
                          4056, 4085, 4095, 4085, 4056, 4007, 3939,
                          3853, 3750, 3630, 3495, 3346, 3185, 3013,
                          2831, 2642, 2447, 2248, 2048
                        };
//---------------------------------------------------------------------- 
--------
// 12-bit Cosine Lookup table with 32 steps
//---------------------------------------------------------------------- 
--------
const int Cos_tab[32] = { 1648, 1264,  910,  600,  345,  156,   39,
                             0,   39,   56,  345,  600,  910, 1264,
                          1648, 2048, 2447, 2831, 3185, 3495, 3750,
                          3939, 4056, 4095, 4056, 3939, 3750, 3495,
                          3185, 2831, 2447, 2048
                        };

void main(void)
{
  volatile unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  FLL_CTL0 |= XCAP14PF;                     // Configure load caps
  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;          // Up mode, SMCLK
  __bis_SR_register(LPM0_bits + GIE);      // Enter LPM0, enable 
interrupts
  TACCTL0 &= ~CCIE;                         // Disable timer 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 = 0x020;                           // Block size
  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 = 0x020;                           // Block size
  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;
  TACCTL1 = OUTMOD_3;                       // TACCR1 set/reset
  TACCR1 = 01;                              // TACCR1 PWM Duty Cycle
  TACCR0 = 025-1;                           // Clock period of TACCR0
  TACTL = TASSEL_2 + MC_1;                  // SMCLK, contmode

  while(1)
  {
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0
  }
}

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

------------------------------------------------------------------------

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wieder einmal kann ich mir selber antworten :D

In der Zeile:

DMA1SZ = 0x020;                           // Block size

muss man den Wert 0x020 auf den Indexwert der Table angleichen.
Für 64 Werte entspricht das also 0x040.

Bleibt noch offen, wieso MC_1 einmal als Up_Mode und einmal als 
Cont_Mode ausgewiesen ist?!

Hat da jemand eine Idee?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.