www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problme mit Clock für PWM (MSP430-F2013)


Autor: Nicco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Nach erfolgreiches Test von alle einzelne Funktionen (auf meinen eZ430 
Development Tool), bin ich jetzt auf meinen PWM blockiert.

für einen Motor, muss ich einen PWM mit Periode 200us, und einen duty 
cycle von bis zu 170us (spricht 85%).
da ich in für den ADC sowieso ein SMCLK von 1MHz habe, dachte ich dies 
für mein PWM zu verwenden.

Ich habe so TACCR0 bei 200 gesetzt (=200 clock pulses von je 1/1MHz=1us)
und TACCR1 als Anfang bei 100 (später soll es variabel sein).

jetzt. Solange ich den Clock source (TASSEL) auf ACLK behalte, ist alles 
gut... ich sehe den Puls mit augen (led) und Oszilloskop.
jetzt setze ich der TASSEL auf 2 = SMCLK... geht nichts mehr! heisst, 
ich komme in meine ISR nicht mehr.

Kann jemand mir helfen? was habe ich übersehen? oder gibt es eine 
fürchterliches Fehler? In Bücher und Family user guide habe ich nichts 
gelesen dass SMCLK ein Problem sein soll.
Arbeite seit einen Monat mit diesen uC, bin also ein 'Anfänger'

Hier ist mein Code:
// working on a MSP430 F2013 (eZ430 Development Tool)
//----------------------------------------------------------------------
#include <io430x20x3.h>      // Specific device
#include <intrinsics.h>      // Intrinsic functions
#include <stdint.h>          // Integers of defined sizes
//----------------------------------------------------------------------
void main (void)
{
  WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
// Select clocks
  BCSCTL1 = CALBC1_8MHZ;       // Set range for calibrated DCO at 8MHz
  DCOCTL = CALDCO_8MHZ;        // Set DCO tap and modulation
        BCSCTL3 = LFXT1S_2;    // ACLK from VLO (12KHz)
        BCSCTL2 = DIVS_3;      // SMCLK = DCO/8 = 1Mhz
// Set up Timer_A for PWM on active high LED, channel 1
  TACCR0 = 200;                // should be 200us
  TACCR1 = 100;                // Duty cycle D = 0.5 initially (will be variable in the future)
  TACCTL0 = CCIE;              // Interrupts on compare to update PWM
  TACCTL1 = OUTMOD_7 | CCIE;   // Reset/set (positive PWM), interrupts
// Configure ports 1 and 2 with pull resistors on unused pins
  P1OUT = 0;                   // Preclear output buffer
  P1DIR = BIT0;                // Set P1.0 to output, others input
  P1REN = 0xFF & ~BIT0;        // Pull resistors on P1[7:1]
  P2SEL = 0;                   // Digital i/o rather than crystal
  P2REN = BIT6 | BIT7;         // Pull resistors on pins that exist
// Start timer from ACLK, no division, Up mode, clear, with interrupts
  TACTL = TASSEL_2 | ID_0 | MC_1 | TACLR | TAIE;
  for (;;) {                   // Loop forever
    __low_power_mode_3();      // Enter LPM3 between interrupts
  }
}
//----------------------------------------------------------------------
// Interrupt service routine for CCIFG1 and TAIFG; share vector
//----------------------------------------------------------------------
#pragma vector = TIMERA1_VECTOR
__interrupt void TIMERA1_ISR (void)  // ISR for CCIFG1 and TAIFG
{
  switch (__even_in_range(TAIV, 10)) {
  case 0:                      // No interrupt pending
    break;                     // No action
  case 2:                      // Vector 2: CCIFG1
    P1OUT_bit.P1OUT_0 = 0;     // End of duty cycle: Turn off LED
    break;
  case 10:                     // Vector A: TAIFG, last value possible
    P1OUT_bit.P1OUT_0 = 1;     // Start of PWM cycle: Turn on LED
    break;
  default:                     // Should not be possible
    for (;;) {                 // Loop here for ever
    }
  }
}

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin jetzt nicht alles durchgegangen. Mir fehlt allerdings ein
__enable_interrupt();
bevor du in den LPM gehtst.

mfg Alex

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LPM3 -> SMCLK deaktiviert !!!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Wundert mich, dass es mit ACLK funktioniert...
CCR0 IRQ ist aktiviert aber es fehlt die entsprechende ISR dazu.
Sollte eigentlich 'n crash geben (nach Murphy)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Kompiler erzeugt wahrscheinlich für alle fehlenden ISRs ein RETI.

Das Hauptproblem ist wie schon beschrieben, dass du das Taktsystem vom 
MSP430 nicht verstanden hast. Beim LPM3 ist nur noch der ACLK aktiv, 
alle anderen Takte sind aus.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Kompiler erzeugt wahrscheinlich für alle fehlenden ISRs ein RETI.
Das wäre mir neu, dass der IAR das macht...

Autor: Nicco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke viel mal, das hatte ich übersehen... werde es morgen neu testen!

allerdings, die zweite ISR gibt's schon... habe die nicht rein kopiert, 
weil die nicht Problematisch ist.

Alex, die intrinsic Funktion _low_power_mode_3(); beinhaltet schon die 
Aktivierung von GIE.

Greetz

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>allerdings, die zweite ISR gibt's schon...
OK, sie macht aber hier gar keinen Sinn!

Du hast einmal den CCR0-IRQ, der aufgerufen wird wenn der Timer den Wert 
CCR0 = 200 erreicht und zum anderen den Timer-IRQ, der aufgerufen wird 
wenn der Timer von 200 auf 0 zurückspringt... also zwei IRQs die nur 
einen Clock auseinander liegen! Die kannst Du auch zusammenfassen, 
entweder CCR0-IRQ oder Timer-IRQ

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.