Forum: Mikrocontroller und Digitale Elektronik array, servosteuerung


von Step H. (step_h)


Angehängte Dateien:

Lesenswert?

Hallo µc Profis,

ihr habt mir schon des Öfteren weiterhelfen können, hoffentlich jetzt 
auch.

Das C-Programm im Anhang steuert einen Servo, der einen Zylinder zum 
Pumpen bedient. Das funktioniert auch Prima....

if (count <= 10000)
    {
    if (pwmimpuls <=35)

Als Beispiel habe ich mal diese Zeilen aus dem Hauptprogramm 
herausgenommen.
Die Werte 10000, 35 und analog die weiteren Werte steuern Frequenz und 
Pulsweite des PWM-Signals. Da ich verschiedene Werte benötige und nicht 
mehrere Unterprogramme schreiben will, habe ich mir überlegt, ob es 
möglich ist die Werte im Programm durch Platzhalter zu ersetzten und sie 
je nach Auswahl über ein Array zu befüllen.

Wie man ein Array anlegt weis ich.
Ich weis jedoch nicht ob dies Überhaupt möglich ist und wenn ja wie muss 
da die Syntax dazu aussehen.

Ich verwende einen AT89C5131 µc, RIDE7....

Ein Tipp von euch wäre wirklich prima....

Die gestellte Aufgabe ist zwar mit diesem Programm schon gelöst aber ich 
habe noch Zeit bis zur Abgabe des Projekts und würde das gerne eleganter 
gestallten....

Ich sage schon mal DANKE....

Grüße aus Heidelberg

von Karl H. (kbuchegg)


Lesenswert?

Step Han schrieb:


> if (count <= 10000)
>     {
>     if (pwmimpuls <=35)
>
> Als Beispiel habe ich mal diese Zeilen aus dem Hauptprogramm
> herausgenommen.

Und ich specke das noch weiter ab und konzentriere mich erst mal nur auf 
die 10000

> Die Werte 10000, 35 und analog die weiteren Werte steuern Frequenz und
> Pulsweite des PWM-Signals. Da ich verschiedene Werte benötige und nicht
> mehrere Unterprogramme schreiben will, habe ich mir überlegt, ob es
> möglich ist die Werte im Programm durch Platzhalter zu ersetzten

Du weißt aber schon, dass man an Funktionen Argumente übergeben kann?

D.h. nichts und niemand hindert dich daran, zu schreiben
1
void Test1 ( int Schaltgrenze )
2
3
{
4
TH0 = 0xB8;
5
//TH0=0xFF; //Timer auf 65335 setzen (noch 200 Intervalle bis überlauf=dauer: 0,1ms)
6
//TL0=0x37;
7
8
count ++;
9
pwmimpuls ++;
10
11
if (count <= Schaltgrenze )
12
    {
13
....

und so die Angabe der 10000 an den Aufrufer der Funktion zu delegieren.
1
int main()
2
{
3
4
  ....
5
6
7
    Test1( 10000 );

Und dieser Aufrufer kann sich dann wieder Methoden bedienen, wie er zu 
diesem Werten kommt. Ob er die Werte ausrechnet, ob er die Werte anhand 
von Pegeln an Eingängen bestimmt und ja: ob er die Werte aus einem Array 
ausliest .... das kann er machen wie er will und interessiert die 
Funktion Test1 wiederrum nicht. Die arbeitet dann nur noch mit diesem 
Wert, den sie vom Aufrufer bekommt.

von Karl H. (kbuchegg)


Lesenswert?

Und PS.
Sowas
1
  if (count <= 10000)
2
  {
3
    ...
4
  }
5
  if (count > 10000)
6
    ...

ist unklug!

Die komplette Syntax eines if lautet

    if( Ausdruck )
      Anweisung1
    else
      Anweisung2

mit der Bedeutung:
Wenn Ausdruck1 einen logischen Wahrheitswert von TRUE hat, dann wird 
Anweisung1 ausgeführt, ansonsten Anweisung2.

Genau den Fall hast du hier aber! Wenn count1 nicht kleiner/gleich 10000 
ist, dann MUSS count1 automatisch größer als 10000 sein. Eine andere 
Möglichkeit gibt es nicht mehr.

D.h. du kannst das so schreiben
1
  if (count <= 10000)
2
  {
3
    ...
4
  }
5
  else
6
  {
7
    ...

und sparst dir damit einen Vergleich und was viel wichtiger ist: Du 
sparst dir die 2.te Angabe der Vergleichsgröße! Denn du hast dir hier 
eine potentielle Fehlerquelle eingebaut, indem du bei einer Änderung
1
  if (count <= 10005)
2
  {
3
    ...
4
  }
5
  if (count > 10000)
6
    ...

zwar den ersten Vergleich verändert hast, aber auf den 2-ten vergessen 
hast!

Mit einem 'else' kann dir das nicht passieren, denn die Zahl mit der 
verglichen wird, steht nur einmal dort. Änderst du sie, dann ändert sich 
damit auch automatisch die Bedingung, wann der µC ins else kommen wird.

von Step H. (step_h)


Lesenswert?

UFF.....!!!!!

Das war ein wenig viel auf einmal, da ich sehr lange für das PRGM 
gebraucht habe und mir damit sehr schwer tue ABER das mit der 
IF-Anweisung hab ich verstnaden und erspare mir damit eine Menge BLA BLA 
vom IT-Lehrer und Prüfer... dafür schonmal ein großes DANKE!!!

Und der Rest.... wenn ich das Richtig verstehe ersetzte ich den Wert 
z.B. 10000 durch eine Variable....

dann önnte ich z.B. in einer Switch-case Stuktur angeben:

case Taster1 = 1
            Test(10000)
case Taster2 = 1
            Test(20000)
usw...

das gleiche für die die restlichen nweisungen, nur was ich nicht 
verstehe ist der Wert in der Klammer... hast das ich müsste für mehrere 
Werte folgendes schreiben:

int Test () (int count; int pwmimpuls)

und dann in der case Struktur

case Taster1 = 1
            Test(10000; 65)

....???

wenn ja, wie bekomme ich dann zwei verschiedene Werte in der im Moment 
etwas unglücklichen if-Anweisung unter einen Hut... mit zwei 
verschiedenen Variablen???

Schon mal ein dickes DANKE

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.