Guten Tag, bitte um Lösungsvorschläge für folgende Aufgabe: Es soll eine Synchronisation auf ein Digitales Signal entworfen werden. Das Signal, auf das synchronisiert werden soll hat folgende Sequenz a-b-c-a... -(a) Frequenz 100Hz, Rechteck mit 25% PWM (Dauer 100ms) -(b) Frequenz 100Hz, Rechteck mit 50% PWM (Dauer 100ms) -(c) Frequenz 100Hz, Rechteck mit 75% PWM (Dauer 100ms) Schnellstmöglich nach einen Wechsel a-b oder b-c bzw. c-a soll auf dem Port 1 eines MSP430 ein Synchronisiersignal ausgegeben werden. Bei a-b: 0x10, b-c: 0x20, c-a: 0x40. Das Programm soll die Wechsel der obigen Sequenzen a,b,c möglichst schnell erkennen und das oben zugeordnete Signal ausgeben. Der Wechsel der Sequenzen erfolgt kontinuierlich jeweils nach 100ms. Hierzu soll ein Programm in C erstellt werden...
- Welche Möglichkeiten gibt es, dass das Eingangssignal verfälscht wird? (z.B. abweichende Frequenz (wie stark?), abweichender duty cycle (wie stark?), glitches, auslassen einzelner Pulse, falsche Reihenfolge der Sequenz etc.) - Was heißt "möglichst schnell?" - Wie problematisch sind falsch ausgegebene Synchronisationssignale?
Das hat bei dieser Klausuraufgabe keine Relevanz. Schnellstmöglich heisst, dass keinen unnötigen Befehle oder Schleifen eingebaut werden sollen...
Christian schrieb: > Guten Tag, > > bitte um Lösungsvorschläge für folgende Aufgabe: > > Es soll eine Synchronisation auf ein Digitales Signal entworfen werden. > Das Signal, auf das synchronisiert werden soll hat folgende Sequenz > a-b-c-a... > -(a) Frequenz 100Hz, Rechteck mit 25% PWM (Dauer 100ms) > -(b) Frequenz 100Hz, Rechteck mit 50% PWM (Dauer 100ms) > -(c) Frequenz 100Hz, Rechteck mit 75% PWM (Dauer 100ms) > > Schnellstmöglich nach einen Wechsel a-b oder b-c bzw. c-a soll auf dem > Port 1 eines MSP430 ein Synchronisiersignal ausgegeben werden. Bei a-b: > 0x10, b-c: 0x20, c-a: 0x40. Das Programm soll die Wechsel der obigen > Sequenzen a,b,c möglichst schnell erkennen und das oben zugeordnete > Signal ausgeben. Der Wechsel der Sequenzen erfolgt kontinuierlich > jeweils nach 100ms. > > Hierzu soll ein Programm in C erstellt werden... wie sieht Dein Lösungsansatz aus, was hast Du dir bisher dazu überlegt? Und wo liegt das Problem, daß Du deinen Ansatz nicht funktionierend umsetzen kannst? Grüße MiWi
Dieser Code ist mein erster Versuch... #include "msp430g2553.h" // Headerdatei für MSP430 G2553 einbinden #include "addon_board.h" // Headerdatei für Erweiterungsplatine int Flankenzustand= 0, Zeitmerker= 0; void main (void) { //Port konfigurieren P1DIR |= 0x10; //Ausgang für b-Signal P1DIR |= 0x20; //Ausgang für c-Signal P1DIR |= 0x40; //Ausgang für a-Signal P1DIR &=~BIT8; //S2 als Eingang (oder schreibweise: 0x08) P1REN |= BIT8; //Eingang als Pull_Up aktivieren (default Wert = "1") P1IE |= BIT8; //Interrupt aktivieren bei bestätigen des S2 //Timer konfigurieren: TACTL = TASSEL_2; // Taktquelle des Timers auswählen, hier SMCLK mit f=1MHZ => T= 1microSec TACTL = MC_1; // Einstellen des Modus, hier Up Mode => Timer zählt bis zum Wert TACCR0 TACCR0 = 10000; // TACCR0-Wert beschreibt den maximalen Zählwert 10.000microSec = 100ms _BIS_SR(GIE); // Global Interrupt Enable while(1) { if ((Flankenzustand==1)&&((P1OUT & 0x08)==0)) //neg.Flanke am Eingang { Zeitmerker = TAR; Flankenzustand = 0; } if (Zeitmerker > 7400) //da Grenzen: 7400-7600 { P1OUT |= 0x20; } if (Zeitmerker > 4900) { //da Grenzen: 4900-5100 P1OUT |= 0x10; } else { //da Grenzen: 2400-2600 P1OUT |= 0x40; } } //Ende der while() Schleife } //Ende der main // Interrupt-Routine bei Port1 #pragma vector=PORT1_VECTOR __interrupt void port1_int(void) { if (Flankenzustand==0) { TAR = 0; //Rücksetzen des Zählers Flankenzustand =1; } P1IFG = 0; //Zurücksetzen des Interrupt-Flag-Bits }
Achso, es handelt sich um gar kein wirkliches Problem, sondern nur irgendeine Klausuraufgabe. Ohne die Anforderungen zu kennen (und dafür müssen meine Fragen beantwortet werden!), kann man da aber nicht sinnvoll helfen. Dein Ansatz ist also nicht besonders durchdacht, weil er sofort problematisch wird, wenn das Signal nicht wirklich exakt so kommt, aber im Sinne der Klausuraufgabe sicher nicht "falsch." Einige Anmerkungen habe ich noch: 1) Deine Variablenbenennung sollte überdacht werden. Variablen werden heutzutage ausschließlich englisch benannt. Ja, auch von deutschsprachigen Programmierern in deutschen Programmen. 2) Vielleicht kann es sich lohnen, die Variablen mit einem Kleinbuchstaben anzufangen. Großbuchstaben sind eher für andere Zwecke gebräuchlich. Das ändert am Programm nichts, macht es jedoch für geübte Programmierer leichter verständlich. 3) Dein Flankenzustand wird in einer interrupt-routine verwendet, sollte also volatile sein. 4) Vorsicht, schlimmer Vorschlag: Den Zeitmerker brauchst du nicht, wenn davon auszugehen ist, dass sich der Zustand des Timers zwischen den Fallunterscheidungen nicht ändert. Mit einem langsameren Timer und angepassten Werten kannst du dann direkt TAR abfragen. Wichtig: DAS MACHT MAN NICHT! Es führt allerdings zweifelsohne zu kürzerem, kleinerem Code, der schneller ausgeführt werden kann. 5) Vorsicht, weiterer Vorschlag: Weil deine Eingangssignale unfehlbar sind, kannst du auch den Timer wegschmeißen und lediglich Flanken zählen. Dafür musst du nur einmal auf einen Übergang synchronisieren und kannst dann einfach im Flanken-Interrupt deine Ports setzen. Macht man auch nicht, da fehleranfällig (Glitches etc.), ist aber extrem schnell, weil das Programm, wenn es einmal läuft, einfach Daten raushaut.
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.