Assembler timer

Hallo Achim,

Nach deiner Angabe macht der Proz in der Wartezeit nichts sinnvolles. Bei delay ist mir das klar. In wie weit gilt das für dies Teil? Hatte angenommen, das die Teil durchgearbeitet wird und danach noch was anderes macht, z.B. Abfrage Taster oder Sensoren oder Absturzerkennnung. Wenn ich mir es genau anschaue, hast du recht. Es wird die Schleife do - while durchlaufen.
Man muß mit der Prozessorzeit eines kleinen Controllers immer gut haushalten. Wenn er in einer Interruptroutine (ISR) drinsteckt dann kann er in dieser Zeit nichts anderes machen als die Sachen die man in diese Routine reinprogrammiert hat. Die werden dann eins nach dem anderen abgearbeitet. Wenn man die ISR schnell wieder verläßt, dann kann er wieder auf andere Interrupts reagieren. Das heißt man verliert keine Ereignisse die irgendentwas wichtiges auslösen sollen. Wenn man für eine Wartezeit in der Hauptroutine nen Delay/Wait einsetzt dann ist es eignetlich nur eine Schleife in der der Controller nichts anderes macht als Strom verbrauchen. Er kann aber aus dieser Schleife durch einen Interrupt herausgerissen werden und auf Ereignisse reagieren. Noch besser wäre es, wenn man zB mit einem Timer einen festen Zeittakt von zB 10ms vorgibt (eine Variable bei jedem Timerinterrupt hochzählen läßt) und wenn man dann irgendwo eine Wartezeit benötigt (zB für die 750ms Meßzeit eines DS18S20 1Wire-Sensors) dann testet man in der Hauptroutine ob diese Variable soweit hochgezählt hat das 750ms (also 75 Interrupts) ausgeführt wurden. Damit kann die Hauptroutine auch weiterlaufen und man kann auch hier weitere Aufgaben ausführen. Die Wartezeit wird dann sozusagen nebenher ausgeführt. Mit dieser Methode kann man wesentlich mehr aus der zur Verfügung stehenden Prozessorzeit rausholen als mit nem normalen Delay oder Wait oder sowas.

Gruß
Dino
 
Hallo Dino
Danke für deine Hilfe. Ganau so was suche ich. Den Timer und ISR gibt es schon. Laufen sehr gut. Habe die Zeiten 10ms und 500ms zur Verfügung. Jetzt suche ich ein Teil der genau so was macht. Es geht eigentlich um Abfrage von Sicherheitssystemen. Solange ein Motor dreht und der Proz dabei in einer Schleife hängt, kann er nicht auf einen Absturz reagieren. Suche also einen Timer (delay, sleef, wait - egal wie) der weiter das Programm arbeitet und gleichzeitig auf solche Sachen reagieren kann. Mein versuchter Weg hat das gleiche Problem. Das habe ich erst festgestellt nach Dirk seinem letzten Teil. Hatte es anders versucht, aber mit gleichem Ergebnis. Es gibt Möglichkeiten. Leider fehlt mir die Einsicht dazu.
Vileelicht kennst due inen Weg oder ein anderer Leser?!
Achim
 
Hi Achimn

Danke für deine Hilfe. Ganau so was suche ich. Den Timer und ISR gibt es schon. Laufen sehr gut. Habe die Zeiten 10ms und 500ms zur Verfügung. Jetzt suche ich ein Teil der genau so was macht.
warum programmierst du dir das dann nicht ? ;)

Die einfachste Lösung dafür ...
Du nimmst eine Variable die immer einfach in der 10ms-ISR hochgezählt wird. Also alle 10ms plus Eins.
Deine Hauptroutine läuft ja dauerhaft (ohne Waits oder sowas) in einer Schleife rum. Also ohne Verzögerungen.
Wenn du nun zB eine Zeit von 300ms benötigst dann machst du folgendes :
- zu dem Zeitpunkt wenn diese 300ms starten sollen setzt du die Variable auf Null. (zB über nen Tastendruck, ...)
- an der Stelle in deiner Hauptroutine wo die Aktion bei 300ms laufen soll machst du deine Zeilen für diese Aktion in eine If/Then die diese Variable auf den Wert 30 (10ms x 30 = 300ms) abfragt und schon ist es fertig.

Du mußt nur drauf achten das der Programmablauf IMMER an der If/Then für die 300ms vorbeikommt (also der Prozessor nicht irgendwo anders aufgehalten wird oder rumtrödelt)

die restliche Gehirnarbeit mußt du nun selber machen ;) (zB Überläufe der Variable abfangen, ...) Laß das Programm mal im Kopf durchlaufen und überleg dir was innen drin abläuft.

Gruß
Dino
 
Hallo Dino
Ein Teil der Aufgabe habe ich fertig. Dr Timer mit der 10ms ISR läuft bereits. Zu dem Durchlauf des Hauptprogrammes habe ich mir auch schon gedanken gemacht und einiges Probiert. Leider will das nicht ganz so laufen wie ich will. Habe es auch mit if gemacht. Komme aber immer wieder auf eine Schleife zurück. Vielleicht ein kleiner (grosser geht auch) Hinweis. Ich bin leider nichtder Profi in C. Streite mich fast jeden Tag mit dem PC. Das Ding hat leider fast immer Recht.
Achim
 
Hi Achim,

Zu dem Durchlauf des Hauptprogrammes habe ich mir auch schon gedanken gemacht und einiges Probiert. Leider will das nicht ganz so laufen wie ich will. Habe es auch mit if gemacht. Komme aber immer wieder auf eine Schleife zurück. Vielleicht ein kleiner (grosser geht auch) Hinweis.
Also dann fange ich mal an ... (C kann ich aber nicht. Ist aber überall gleich).

1. Ganz am Anfang kommen die ganzen Initialisierungen und Deklarationen
Code:
//IO-Pins einstellen
// Variablen deklarieren und belegen
durchlaufzaehler = 0
// Timer einstellen
// usw

2. Danach brauchst du eine Hauptroutine/Endlosschleife/Hauptschleife/Mainloop (wie man es immer nennt).
Da stecken die normalen Sachen drin und werden immer wieder aufgerufen/durchlaufen.
Code:
do
  // hier irgendwas was dauernd bearbeitet werden soll
loop

3. Du brauchst deine ISR die zB alle 10ms. Die wird von der Hardware die du am Anfang initialisiert hast aufgerufen.
Der Prozessor wird also aus deiner Hauptroutine rausgerissen und führt dann die ISR aus bis sie beendet wird. Dann gehts in der Hauptroutine (oder wo er rausgerissen wurde) weiter.
In der ISR sitz für deine Variable so etwas drin...
Code:
if durchlaufzaehler < 255 then  // (Variablenueberlauf abfangen)
  durchlaufzaehler = durchlaufzaehler + 1   // (geht auch mit incr durchlaufzaehler - incr=increment)
endif

4. Du brauchst eine Variable die auch ganz am Anfang deklariert wird. Diese Variable ist sozusagen ein Durchlaufzähler für die 10ms-ISR. Also wenn die in der ISR um 1 erhöht wird, dann weißt du das weitere 10ms vergangen sind.

5. in der Hauptroutine machst du sowas rein ...
Code:
if durchlaufzaehler = 25 then
  print "jetzt sind wieder 250ms rum"
  durchlaufzaehler = 0  // (initialisieren fuer den naechsten Durchlauf, wenn nicht dauernd dann diese Zeile weglassen)
endif

6. Wenn es irgendwodurch gestartet werden soll dann brauchst du noch einen Teil in der Hauptroutine ...
Code:
if "taste 3 gedrueckt" then
  durchlaufzaehler = 0
endif
damit wird deine Zeitroutine mit 25x10ms (250ms) durch einen Tastendruck gestartet. Das ist dann nur jeweils ein Durchlauf nach dem Tastendruck. Dafür mußt du aber bei Punkt 4 die Zeile "durchlaufzaehler=0" weglassen weil er ja sonst immer wieder deine Zeitroutine starten würde.

Die Zeilen sind jetzt nicht wirklich C-Code. Es sind Bemerkungen die dir zeigen sollen was an bestimmten Stellen passieren muß damit es läuft. So ... das muß jetzt aber reichen. Mal es dir mal auf nem Blatt auf und geh es im Kopf durch. Wenn du es erstmal verstanden hast dann ist es nicht weiter kompliziert. Es muß nur erstmal der Groschen fallen. Bei Mikrocontrollern benutzt man solche Konstrukte sehr oft um keine Zeit mit Warteschleifen zu vergeuden. Der Prozessor hat nur eine endliche Ausführungsgeschwindigkeit die man optimal ausnutzen muß. Dein Windows wartet ja auch nicht mit allen anderen Sachen bis du endlich mal wieder ne Taste gedrückt hast. Da ist sowas ähnliches als Task-Scheduler drin.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)