MSP 430 Abtastrate

Gast #2202577
Lesenswert?

Ich programmiere den MSP430 in C und versuche 50 Hz abzutasten. der 
ADC10 wird dazu von einem Timer angestossen, der ueber einen Quart 
laeuft.
Wenn ich jetzt im ADC10 Interrupt den ADCwert in eine Variable speichere 
bekomme ich einen Jitter in die Messung.
Ich vermute die Laufzeit des C-Befehls ist zu lang.
Weiss jemand wieviele Takzyklen die C Befehle benoetigen oder wie ich 
den Takt fuer die Abarbeitung auch an 16 MhZ koppeln kann?
Gast #2202620
Lesenswert?

Genau so mache ich das auch.
hmm irgendwie will er aber nicht... in der ISR Routine ist noch eine IF 
Abfrage drin, da ich den aktuellen Abtastwert in einen Array schreibe, 
er wieder genullt werden muss. aber so lange kann das doch nicht dauern 
oder?
#2202631
Lesenswert?

Elektro IN schrieb:
> in der ISR Routine ist noch eine IF
> Abfrage drin, da ich den aktuellen Abtastwert in einen Array schreibe,
> er wieder genullt werden muss. aber so lange kann das doch nicht dauern
> oder?

Das ist gar nichts. Der MSP ist nicht gerade langsam. Du kannst am 
Anfang deiner Serviceroutine einen Pin setzen und schluss wieder auf 0 
setzen.
Damit kannst du mit dem Skope messen wie lang die dauert.

Sonst alles richtig eingestellt? Watchdog,Taktgenerierung etc ..
Gast #2202635
Lesenswert?

Watchdog ist aus und der Timer bekommt den Takt vom 16 Mhz Quartz.
Das mit dem Oszi werd ich mal probieren. Gitbs ein Register, in dem ich 
den Systemtakt auch an den Quartz koppeln kann. Bin im User Guide nicht 
ganz schlau geworden.
#2202647
Lesenswert?

Elektro IN schrieb:
> Gitbs ein Register, in dem ich
> den Systemtakt auch an den Quartz koppeln kann. Bin im User Guide nicht
> ganz schlau geworden.

Also direkt ohne die FLL Schaltung?
Kann man einstellen. Welchen MSP430 Type setzt du ein ?

Beim MSP430F2418 stelle ich den so ein.

/*********************************************************************** 
***
*
*   void  ChangeSystemClock(void)
*   CPU Clock auf externe Clock am XIN Eingang umschalten (12 MHz)
*   ACLK = 12MHZ
*   MCLK = 12MHZ
*
************************************************************************ 
***
void  ChangeSystemClock(void)
{

    uint    n;

    _BIC_SR(OSCOFF);                        // Externer Oszillator 
einschalten b.z.w. freigeben
    BCSCTL1 = DIVA_0 | XTS | XT2OFF;        // ACLK = /1 , XT2 = OFF , 
XTS = High Frequency Mode
    BCSCTL3 = XT2S_3 | LFXT1S_3 | XCAP_0;   // XT2 = External Clock, XT 
= External Clock , No Capacitors

    IFG1 &= ~(OFIFG);                       // Oszillator Fault 
Interrupt Flag loeschen
    for(n=0;n < 0xff;n++);                  // Kurze Zeit warten
                                            // jetzt umschalten
    BCSCTL2 = SELM_3 | DIVM_0;              // MCLK = LFXT1CLK , MCLK 
Divider = 1
    IE1 |= OFIE;                            // Oszillator fault 
Interrupt freigeben

}
#2202669
Lesenswert?

Elektro IN schrieb:
> Weisst du zufaellig auch, wo
> ich den Eingangwiderstand fuer den ADC10 finden kann?

Im Prinzip ist der sehr hochohmig da der mit geschalteten Kapazitäten 
arbeitet. Das heisst aber nicht das man den an eine hochohmige Schaltung 
hängen kann da sich der Sample & Hold Kondensator ja umladen muss. Mehr 
als rund 10Kohm Ausgangswiderstand der Treibenden Schaltung würde ich 
nicht empfehlen. TI gibt nur die Eingangskapazität von 27pF an.
Gast #2213773
Lesenswert?

WEnn ich den Cide benutze wie du ihn mir geschickt hast und dann in der 
While(1) schleife einen Port toggele dauert es länger als im default 
modus, obwohl MCLK jetzt an den 16 Mhz Quartz gekoppelt ist und die 
Laufzeit der C Befehle doch eigentlich kürzer sein müsste. Weiss jmd 
woran das liegen kann?
Gast #2215054
Lesenswert?

Ich habe jetzt nen 16 Mhz Quartz angelötet und wollte ihn mit folgendem 
Code auf ACLK und MCLK muxen

BCSCTL1 = DIVA_0 | XTS | XT2OFF;
BCSCTL3 = XT2S_2 | LFXT1S_2 | XCAP_0;
BCSCTL2 = SELM_3 | DIVM_0 | SELS;

Aber wenn ich zum test in der main einen Port toggele ist es langsamer 
als im default ohne Quartz
#2215133
Lesenswert?

So bekommst du laut Code-Examples den HF XT zum Laufen:
1
BCSCTL1 |= XTS;                           // ACLK = LFXT1 = HF XTAL
2
  BCSCTL3 |= LFXT1S1;                       // 3 – 16MHz crystal or resonator
3

4
  do
5
  {
6
    IFG1 &= ~OFIFG;                         // Clear OSCFault flag
7
    for (i = 0xFF; i > 0; i--);             // Time for flag to set
8
  }
9
  while (IFG1 & OFIFG);                     // OSCFault flag still set?
10

11
  BCSCTL2 |= SELM_3;                        // MCLK = LFXT1 (safe)

Du musst immer erst schauen, ob der läuft. Sonst gibts den Fall-Back auf 
den DCO Clock.
Hast du denn die beiden Kondensatoren mit angeschlossen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren