Forum: Mikrocontroller und Digitale Elektronik MSP430 nanosekunden Tackt Timer


von Mano (Gast)


Lesenswert?

Hallo Leute
ich bitte euch um Hilfe.
Ich versuche mit dem MSP430 den TimerA mit 250ns Signal generieren  ohne 
eine Extern Quarz außer die 32768 kHz Uhr Quart ich kriege es einfach 
nicht hin.
Mit DCO laut Datenblatt kann ich die msp430 bis 16Mhz laufe lassen. Ich 
kriege hier eine Port Signal mit =~ 61µs Periode
hier mein Programm

#include  <msp430F248.h>
void main(void)
{
     BCSCTL1 = CALBC1_8MHZ_;
     DCOCTL  = CALDCO_8MHZ_;
     WDTCTL = WDTPW + WDTHOLD;       // Watchdog-Timer abschalten
     P4SEL &= ~BIT4;
     P2SEL &= ~BIT7;
     P4DIR |= BIT4;
     P2DIR |= BIT7;
     CCTL2 = CCIE;                   // Interrupt aktivieren für Kanal 2
     CCR2 = 2;
     TACTL = TASSEL_1 + MC_2 +ID_0;        // ACLK und Continuos-Modus
     _BIS_SR(LPM0_bits + GIE);       // LPM0, Interrupts global 
aktivieren
     while(1)
     {
     }
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TIMERA (void) {
      TACTL &= ~TAIFG;

     switch( TAIV )
     {
          case  4:
          {
               P2OUT ^= BIT7;        // Toggle P2.7
               CCR2 += 2;            // Zeitmarke für nächsten Aufruf
          } break;

     }
}

von Little B. (lil-b)


Lesenswert?

ein kurzer ausflug in die mathematik:

Ein Signal mit 250ns, das macht ...kopfrechnen...grob geschätzt... 4MHz

Dein MSP läuft bei maximaler Geschwindigkeit mit 16MHz.

D.h. alle 4 CPU Takte entsteht ein Timer Interrupt.
Ich bin mit der MSP-Technologie nicht sehr vertraut, aber im besten Fall 
bedeutet das wiederum, das nur bis zu 4 ASM-Befehle ausgeführt werden 
können.
Das reicht nicht einmal aus, das Interrupt Flag zurück zu setzen. Der 
MSP ist zu langsam, um über Interrupts einen Pin mit dieser 
Geschwindigkeit toggeln zu lassen.

von Jim M. (turboj)


Lesenswert?

Mein MSP430 Zeiten sind schon länger vorbei, aber konnte nicht auch da 
wenigstens ein Timer ein PWM Signal in Hardware erzeugen? CLK/4 wird man 
in Software nicht hinbekommen.

von Clemens L. (c_l)


Lesenswert?

Mano schrieb:
> Ich kriege hier eine Port Signal mit =~ 61µs Periode

Weil der Interrupt zu langsam ist, und der Timer schon weiter als CCR2+2 
gezählt hat. Der nächste Interrupt kommt dann erst nach dem nächsten 
Timer-Überlauf.

Jim Meba schrieb:
> Mein MSP430 Zeiten sind schon länger vorbei, aber konnte nicht auch da
> wenigstens ein Timer ein PWM Signal in Hardware erzeugen?

Das können alle Ausgangssignale aller Timer.

Mano, vergiss den Interrupt, und schau dir Abschnitt 12.2.5.2 des User's 
Guide an.

: Bearbeitet durch User
von Go MSP (Gast)


Lesenswert?

1. Der DCO läuft bei dir mit 8 MHz.
2. Als Quelle für den Timer bietet sich SMCLK an.
3. TAIFG wird durch die HW gelöscht.
4. Kann das Signal ohne CPU und ISR per Output vom Timer erzeugt werden.
5. Hilft das Kapitel zum Timer A im Family User Guide.
6. Brauchts die nachfolgenden Zeilen beim MSP430 nicht. :-P
Little Basdart schrieb:
> ein kurzer ausflug in die mathematik:
>
> Ein Signal mit 250ns, das macht ...kopfrechnen...grob geschätzt... 4MHz
>
> Dein MSP läuft bei maximaler Geschwindigkeit mit 16MHz.
>
> D.h. alle 4 CPU Takte entsteht ein Timer Interrupt.
> Ich bin mit der MSP-Technologie nicht sehr vertraut, aber im besten Fall ...

von Mano (Gast)


Lesenswert?

Hallo,
ich danke euch für die Antworte.
eigentlich  wollte ich dadurch eine Delay von 2 mal 250 ns erzeugen 
deshalb brauchte ich die CPU um eine Port-Pin für bestimmte zeit auf 
Null dann wieder auf High zu toggeln.
Gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mano schrieb:
> eigentlich  wollte ich dadurch eine Delay von 2 mal 250 ns erzeugen
Gut, das kann eine Aufgabe sein...

> deshalb brauchte ich die CPU um eine Port-Pin für bestimmte zeit auf
> Null dann wieder auf High zu toggeln.
Allerdings ist mir dieser Lösungsansatz nicht ganz klar. Wenn schon die 
CPU für die benötigten Zeiten zu langsam ist, wie soll das dann gehen?

Oder mal Andersrum: WAS ist das eigentliche Problem? WOHER kommt das 
Signal? Und WOZU soll es verzögert WOHIN weitergeleitet werden?

von NOP NOP NOP NOP (Gast)


Lesenswert?

Mano schrieb:
> eigentlich  wollte ich dadurch eine Delay von 2 mal 250 ns erzeugen

Dazu fügt man ein paar _nop() ein. Ich tippe so auf 4 NOPs bei 16MHz.

von Mano (Gast)


Lesenswert?

Hallo,
es ist einfach eine signal die ich generieren sol er sollte von High auf 
Low und 2*250 ns Low bleiben dann wieder auf High mehr nicht.

Gruß

von Falk B. (falk)


Lesenswert?

@ Mano (Gast)

>es ist einfach eine signal die ich generieren sol er sollte von High auf
>Low und 2*250 ns Low bleiben dann wieder auf High mehr nicht.

Dann informier dich über die Timer und die Output Compare Funktion, 
damit klappt das. Mittels CPU, Timer und Interrupt ist es unmöglich bei 
dieser hohen Frequenz, selbst nur mit CPU und nop() geht es nicht, weil 
der MSP430 nicht soooo effizient die IO-Pins schreiben kann wie ein AVR.

von nix Versteher (Gast)


Lesenswert?

Falk Brunner schrieb:
> weil
> der MSP430 nicht soooo effizient die IO-Pins schreiben kann wie ein AVR

Häääähhhhhh?

von Falk B. (falk)


Lesenswert?

@nix Versteher (Gast)

>> weil
>> der MSP430 nicht soooo effizient die IO-Pins schreiben kann wie ein AVR

>Häääähhhhhh?

Na dann schau dir mal an, wieviel Maschinentakte der MSP430 braucht, um 
seine IO-Pin zu setzen bzw. zu ändern. Der AVR schafft es mit 1-2.

von nix Versteher (Gast)


Lesenswert?

Falk Brunner schrieb:
> Na dann schau dir mal an, wieviel Maschinentakte der MSP430 braucht, um
> seine IO-Pin zu setzen bzw. zu ändern. Der AVR schafft es mit 1-2.

Dann zeig mal die Befehlsfolge der beiden CPU.

von void (Gast)


Lesenswert?

nix Versteher schrieb:
> Dann zeig mal die Befehlsfolge der beiden CPU.
1
bic.b   #00000001b,&P1OUT       ; clear P1.0

-> slau049f.pdf (MSP430x1xx) Seite 107
bic.b ist eine Format-I (Double Operand) Instruction.
Src Operand ist in Format #N.
Dst Operand ist in Format &EDE.

-> Benötigt 5 cycles (und hat eine Instruction-Länge von 3).
= 5 * 1/16MHz = 312,5us

Das mag besser werden, wenn man eine andere MSP430 Generation oder 
schönere Adressierungsmodes wählt, keine Frage. Was ich eigentlich sagen 
wollte; Lies doch einfach mal die Doku welche die Hersteller 
bereitstellen. Der Befehls-Satz der CPU (Instruction Set) steht doch 
normalerweise gut beschrieben darin...

von Lothar (Gast)


Lesenswert?

Falk Brunner schrieb:
> Der AVR schafft es mit 1-2

Und der 8051 immer mit nur 1 soooo effizient ist der - musste jetzt sein 
:-)

von Rudolph (Gast)


Lesenswert?

Lothar schrieb:
> 8051 immer mit nur 1

1 CPU Takt vielleicht, also 4 Takt-Zyklen. :-)

von Falk B. (falk)


Lesenswert?

@ Lothar (Gast)

>> Der AVR schafft es mit 1-2

>Und der 8051 immer mit nur 1 soooo effizient ist der - musste jetzt sein
>:-)

Vielleicht nochmal einen Grundkurs an der VHS belegen und den 
Unterschied zwischen CPU- und Maschinentakt erklären lassen.

Der originale 8051 braucht 12 (ZWÖLF) CPU-Takte für einen Maschinentakt, 
moderne Nachfolger je nach Typ 1-6.

von Mano (Gast)


Lesenswert?

Hallo,

was ist mit 1µs Tackt oder 500ns Tackt ohne Output Compare Funktion.

Gruß

von Falk B. (falk)


Lesenswert?

@ Mano (Gast)

>was ist mit 1µs Tackt oder 500ns Tackt ohne Output Compare Funktion.

Ersten heißt es Takt (und nicht Tackt oder gar die clock!) und zweitens, 
warum willst du dir unbedingt das Leben schwer machen? Was passt dir 
denn nicht an der Output Compare Funktion?

Klar könnnte man einen 1 MHz Takt rein per CPU erzeugen, sind ja 16 
CPU-Takte pro Ausgangstakt, das schafft auch der MSP430 ;-)
Ich kann aber kein MSP430 Assembler und mit dem Ding hab ich vor 
vieeeeeelen Monden das letzte Mal gearbeitet.

von Mano (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Eigentlich will ich  Einzele impulse mit unterschiedlichen Frequenzen 
zwischen 250ns und 1µs
wie kann ich den Timer in Compare/captur Mode sagen dass er nur eine 
impuls generieren darf und Zwar mit 1µs oder mit 0,250µs  siehe Anhang
Gruß

von Tim S. (tim_seidel) Benutzerseite


Lesenswert?

Ohne die genaue HW Implementation zu kennen:
In dem man den Resetwert so wählt, dass die beiden Schaltflanken nicht 
mehr erreicht werden.

Das kann z.B. sein in dem man den Zählerreset bei 1 durchführen lässt 
und die Schaltflanken bei 10 und 10+X. Impuls starten indem der Zähler 
auf einen Wert > 1 vorgeldaden wird. Nach dem Überlauf hängt er dann bei 
0 und 1 inner Schleife.

Kennt die HW Implementation keine Reset-Schwelle sondern nur Reset-Werte 
macht es Sinn die Schaltschwellen naiv anzulegen und den Reset so zu 
belegen, dass er immer einen Wert hinter den Schaltschwellen annimmt.

Etc, etc ...

von Torsten C. (torsten_c) Benutzerseite


Angehängte Dateien:

Lesenswert?

Mano schrieb:
> wie kann ich den Timer in Compare/captur Mode sagen dass er nur eine
> impuls generieren darf und Zwar mit 1µs oder mit 0,250µs

Arbeitest Du mit 'Code Composer Studio' von TI? Dort sind die 
Datenblätter und PWM-beispiele drin.

https://www.mikrocontroller.net/wikifiles/4/47/Ccs5b.png

Ansonsten steht es auch im Datenblatt.

Falls Du eine spezielle Frage zum Datenblatt oder zu einem Beispiel 
hast, ist es viel leichter konkret darauf zu antworten, als auf eine 
algemeine Frage, denn es gibt viele Möglichkeiten, mit den 
Timer-Registern Impulse zu erzeugen. Wir können m.E. nicht wissen, 
welche Möglichkeite in Deinem Fall am besten geeignet ist.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Lothar schrieb:
> Und der 8051 immer mit nur 1

Aber nur die mit großem Prescaler (12, 6, 4).
Der AT89LP52 braucht für "CLR Bit" oder "SETB Bit" 2 Zyklen, d.h. 100ns 
bei 20MHz Takt.

von Mano (Gast)


Lesenswert?

Hallo,
ich benutze das Interrupt für CCR0 sowie das  Interrupt für CCR1 um eine 
Einzel Impuls zu erzeugen.
Am Anfang setze ich den Port auf Low, wenn das Interrupt CCR1 auftaucht, 
setze ich ihn (der Port-Pin) auf High
sobald das  Interrupt  CCR0 ausgelöst ist, setze ich den Port-bin wieder 
auf Low  und danach deaktiviere ich die CCR0 und CCR1 Interrupts.
Leider habe ich noch ein Problem.
Ich habe es noch nicht geschafft eine Impuls unter 1 µs zu erzeugen 
warum ????
Ich habe die Register so eingestellt.

Clock:
            mov.b   #0xF8,&BCSCTL1
            mov.b   #0x9C,&DCOCTL

Timer:
   mov.w     #65535,&TACCR0;
    mov.w     #1,&TACCR2
    mov.w     #TASSEL_2 + MC_2,&TACTL ;         // SMCLK, up - mode
    mov.w     #CCIE,&CCTL2
    mov.w     #CCIE,&CCTL0

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Du kannst Interrupts nutzen (nennt sich soft-PWM). Aber wozu?

Und warum in aller Welt machst Du es nicht einfach so wie
Falk Brunner schrieb:
> informier dich über die Timer und die Output Compare Funktion,
> damit klappt das.

Beratungs-resistent?

: Bearbeitet durch User
von Mano (Gast)


Lesenswert?

Hallo,
zuerst bedanke ich euch für die Hinweise.
ich denke ihr versteht nicht mein Problem. weil ich es vielleicht nicht 
richtig erklärt habe.
Nochmal.
wenn ich den Timer als Output Signal benutze dann habe ich das Problem, 
wie kann ich ihn anhalten und zwar in die richtige Zeit. weil ich darf 
nur eine einzige pulse auslösen mehr nicht.

wenn ich eine SW PWM generiere, dann habe ich die Möglichkeit nur eine 
einzelpuls wie ich vorher gezeichnet habe auszugeben.
Gruß

von Falk B. (falk)


Lesenswert?

@ Mano (Gast)

>ich denke ihr versteht nicht mein Problem. weil ich es vielleicht nicht
>richtig erklärt habe.

Genau.

>wenn ich den Timer als Output Signal benutze dann habe ich das Problem,
>wie kann ich ihn anhalten und zwar in die richtige Zeit. weil ich darf
>nur eine einzige pulse auslösen mehr nicht.

Dann erzeuge den Einzelimpuls direkt per CPU. Die Output Compare 
Funktion hat nur dann einen Vorteil, wenn man einen dauerhaften Takt 
erzeugen will.

von Stefan F. (Gast)


Lesenswert?

Um den Timer nach einem Impuls anzuhalten, setzt man normalerweise eine 
Interruptroutine ein.

Ich kenne die Timer dieses Chips nicht im Detail. Ich würde daher das 
Datenblatt durchsuchen, ob folgendes Möglich ist:

Initial ist der Ausgang Low.
Beim Start des Timer geht der Ausgang auf High.
Wenn der Timer bis 4 Gezählt hat, soll der Ausgang auf Low gehen (Output 
Compare) und einen Interrupt auslösen.

Die Interrupt Service Routine hält den Timer an. Solange sie das 
schneller macht, als dass der Timer überlauft, erfüllt es seinen Zweck.

von Clemens L. (c_l)


Lesenswert?

Mano schrieb:
> wenn ich den Timer als Output Signal benutze dann habe ich das Problem,
> wie kann ich ihn anhalten und zwar in die richtige Zeit. weil ich darf
> nur eine einzige pulse auslösen mehr nicht.

Mit einem Timer im Continuous-Modus, und einem CCR im Reset/Set-Modus.
Das CCR setzt den Ausgang auf 1, wenn der Timer auf 0 zählt, und auf 0, 
wenn der Timer auf den Wert im CCR zählt.
Danach hat der CCR-Interrupt-Handler genügend Zeit, den Timer zu 
stoppen.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> Dann erzeuge den Einzelimpuls direkt per CPU. Die Output Compare
> Funktion hat nur dann einen Vorteil, wenn man einen dauerhaften Takt
> erzeugen will.

Die Output Compare Funktion hat auch dann einen Vorteil, wenn die 
Impulslänge ohne Asm-Programmierung und unabhängig von der 
Compiler-Optimierung immer genau gleich lang sein soll. @Falk: Aber das 
weißt Du selbst.

@Mano: '4 ASM-Befehle'^^ gehen auch. Dann muss man aber 'Setzen und 
Rücksetzen' in einer einzigen Funktion (bzw. inline) machen. Also kein 
Call oder Return dazwischen.

Du kannst z.B. 10 Funktionen für 10 verschiedene Impuls-Längen 
schreiben, wenn Du die Output Compare Funktion nicht nutzen willst.

Mano schrieb:
> dann habe ich das Problem,
> wie kann ich ihn anhalten und zwar in die richtige Zeit

Die Frage wurde ja beantwortet. Aber was meinst Du mit 'in die richtige 
Zeit'? Wann Du den anhältst ist egal, hauptsache vor dem nächsten Puls.

: Bearbeitet durch User
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.