Forum: Ausbildung, Studium & Beruf Programmierung MSP430


von Christian (Gast)


Lesenswert?

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...

von someone (Gast)


Lesenswert?

- 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?

von Christian (Gast)


Lesenswert?

Das hat bei dieser Klausuraufgabe keine Relevanz. Schnellstmöglich 
heisst, dass keinen unnötigen Befehle oder Schleifen eingebaut werden 
sollen...

von MiWi (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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
}

von someone (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.