Forum: Mikrocontroller und Digitale Elektronik Zwei Programme auf einem uC ablaufen lassen


von Maxim (Gast)


Angehängte Dateien:

Lesenswert?

Es geht um ein Schulprojekt, genauer um eine Schrittmotorsteuerung.

Da an dem Projekt zwei Leute arbeiten, habe ich es aufgeteilt in die 
Benutzerschnittstelle (Display, Drehimpulsgeber, Menüs, ...) und die 
Steuerprogramme, welche einen anderen IC ansteuern (der wiederum den 
Motor steuert).

Nun haben wir also praktisch zwei getrennte Programme und können 
parallel daran arbeiten. Erst am Ende werden beide Programme zu einem 
zusammengefügt. Damit das auch funktioniert, wurden einige Register 
festgelegt, welche wichtige Werte enthalten. Also z.B. die 
Motorgeschwindigkeit, Richtung, An/Aus u.s.w. ...

Das alles wird in den sogenannten "Status Registern" gespeichert und 
bildet die gemeinsame Schnittstelle zwischen beiden Programmen.

Mein Programm (die eigentliche Steuerung) greift auf die "Status 
Register" nur lesend zu und handelt entsprechend den darin enthaltenen 
Werten.

Das andere Programm (Benutzerschnittstelle) fragt dagegen immer die 
Taster und den Drehimpulsgeber ab und verarbeitet diese Daten, sodass 
die vom Benutzer gewünschten Einstellungen in die "Status Register" 
geschrieben werden.

Eine Grafik im Anhang soll das etwas verständlicher gestalten.

Der uC ist ein 89S8252 @ 12Mhz

Ist das möglich?

von Karl-j. B. (_matrixman_)


Lesenswert?

Zwei Programme gleichzeitig sind auf einer CPU (außer Dualcore) nie 
möglich! Du musst deine Programme immer nacheinander aufrufen.

Du könntest beide Programme in eine Hauptschleife einbinden welches die 
einzelnen Programme immer nacheinander aufruft.

mfg Karl

von Maxim (Gast)


Angehängte Dateien:

Lesenswert?

Ja, ich meine quasi-gleichzeitig. Natürlich sollen die Programme 
nacheinander verarbeitet werden ...

Habe die Grafik überarbeitet, die erste war Mist.

von Power (Gast)


Lesenswert?

Na, wenn beide Programme (Bedienung und Visualisierung ist ein Teil und 
Steuerung der Komponenten der Zweite wenn ich richtig verstanden habe) 
zu einem vereint werden hast du ja wieder ein Programm.
Ich mache das ähnlich, ich teste auch einzelne Programmteile und füge 
sie nachher zusammen, wieso sollte das nicht funktionieren?
Man muss nur gemeinsame Schnittstellen festlegen (wie du's ja gemacht 
hast), bei Hardwarezugriff auf Überschneidungen achten (immer nur eine 
Komponente bedient einen Hardwareteil) und unterschiedliche Variablen 
benutzen, dann kann nicht viel schiefgehen.

von JojoS (Gast)


Lesenswert?

oder ein schlankes µC Betriebssystem verwenden, sowas wie FreeRTOS. Was 
es da für die i51 Architektur gibt weiss ich allerdings nicht.
Ein RTOS hat den Nachteil das erstmal mehr Einarbeitungsaufwand nötig 
ist und das OS zusätzliche Resourcen für sich braucht. Vorteil ist dann 
aber eine leichtere Erweiterbarkeit wenn weitere Tasks dazukommen.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Maxim wrote:

> Habe die Grafik überarbeitet, die erste war Mist.

Die zweite ist nicht viel besser. (Programm kommt NIE aus der 
Steuerschleife raus)
Aber vielleicht bringt Dir eine richtige Zeichnung auch die Lösung des 
Problems näher ?

Entweder Du nimmst EIN Hauptprogramm (hier: die Benutzerschnittstelle) 
und läßt das Steuerprogramm interruptgesteuert immer wieder aufrufen 
(keine Zeitschleifen möglich!),
oder Du läßt beide Teile immer wieder hintereinander ablaufen,

oder Du denkst über ein Timesharing-System nach und startest je nach 
Bedarf die beiden Programme oder besser noch - einzelne Tasks.
Dann darf es wieder keine Pausen oder Zeitschleifen geben, sondern es 
gibt dann Tabellen mit Zeitpunkten, wann welche Routinen aufgerufen 
werden sollen....

von Matthias S. (da_user)


Lesenswert?

Also in einer anderen Welt (SPS) haben wir mal 5 "Einzel-Programme" auf 
einer SPS laufen lassen. Lief ungefähr genauso ab, wie in deinem. 
Mehrere Teams (5 Stück á 2 Personen) haben zusammen an ner Anlage mit 5 
Stationen verbunden mit einem Band gebastelt. Jedes Team hatte eine 
Station.

Mit der entsprechenden Kommunikation über die Schnittstellen, wer welche 
Speicherplätze/Timer/... benutzen darf alles kein Problem.

Wir haben dann ein Hauptprogramm geschrieben, welches die Steuerung des 
Bandes und der einzelnen Stationen übernahm.

Wie gesagt: Kommunikation und Planung ist alles!

von Maxim (Gast)


Lesenswert?

Cool, danke euch!

von Gast (Gast)


Lesenswert?

Hallo,

wie bereits erwähnt, sollte das eine klassische Aufgabe für eine 
Aufteilung in Hauptprogramm (Main-Schleife o.ä.) und eine 
Interruptroutine sein (Timer-Interrupt, da bestimmt eine genaue Zeit 
einzuhalten ist).

Globale Variablen regeln dann den Zugriff (volatile bei C nicht 
vergessen, und dafür sorgen, dass immer nur einer auf die Daten 
zugreift).

der Gast.

von Peter D. (peda)


Lesenswert?

Wenn man die Programme so schreibt, daß sie bei Nichtstun sofort zur 
Mainloop zurückkehren, dann ist das kein Problem.
Dann kann man sie einfach beide in die Mainloop packen.

Nichtstun ist auch auf Zeitablauf warten.
Dazu muß ein Timerinterrupt einen Zeittakt bereitstellen, mit dem dann 
das Delay pro Aufruf vom Main runtergezählt wird.


Peter

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.