MSP430 nanosekunden Tackt Timer

Gast #4154538
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;

     }
}
#4154598
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.
#4154690
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.
Gast #4154957
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 ...
Gast #4157126
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ß
Moderator (Firma: Titel) Persönliche Seite #4157136
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?
#4157186
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.
Gast #4157223
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...
#4157388
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.
#4157452
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.
Gast #4157616
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ß
Angehängte Dateien:
Persönliche Seite #4157660
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 ...
Persönliche Seite #4157692
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.
Angehängte Dateien:
Gast #4157879
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
Gast #4158020
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ß
#4158031
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.
Gast #4158039
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.
#4158043
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.
Persönliche Seite #4158119
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.

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