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?
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
Ja, ich meine quasi-gleichzeitig. Natürlich sollen die Programme nacheinander verarbeitet werden ... Habe die Grafik überarbeitet, die erste war Mist.
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.
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.
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....
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.