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; } }
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.
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.
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
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 ...
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ß
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?
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.
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ß
@ 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.
Falk Brunner schrieb: > weil > der MSP430 nicht soooo effizient die IO-Pins schreiben kann wie ein AVR Häääähhhhhh?
@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.
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.
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...
Falk Brunner schrieb: > Der AVR schafft es mit 1-2 Und der 8051 immer mit nur 1 soooo effizient ist der - musste jetzt sein :-)
@ 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.
Hallo, was ist mit 1µs Tackt oder 500ns Tackt ohne Output Compare Funktion. Gruß
@ 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.
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ß
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 ...
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
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.
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
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
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ß
@ 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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.