z.B. indem du per Interrupt auf die Bumper reagierst.
ich würd mal sagen grundsätzlicher programmfehler wenn dieses in einer routine länger hängen bleibt.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Gleichzeitig geht bei einem ATMEGA Controller nichts, aber schnell hintereinander schon.
Du könntest die beiden Geberabfragen in einen Interrupt verpacken und Auswertung im Hauptprogramm machen lassen.
Beispiel:
Ein Bumper wurde aktiv. Der "Bumper" Interrupt wir ausgelöst und schaltet die Motoren deines Bots ab. Im Interrupt wird dann noch festgestellt welcher Bumper aktiv war und ein entsprechendes Flag ( Bitvariable ) wird gesetzt.
Dann wird der Interrupt verlassen.
Im Hauptprogramm werden ständig diese Flags ( Bitvariablen ) abgefragt und entsprechend darauf reagiert.
Die Hall Sensoren ( Drehzahlmessung ?? ) lösen dann ebenfalls einen Interrupt aus und geben die ermittelten Werte in entsprechende Pufferspeicher. Zusätzlich kann man da noch ein Flag einbauen, das es neue Werte gibt, die dann im Hauptprogramm nach Verarbeitung wieder gelöscht werden.
Im Hauptprogramm werden dann diese Pufferspeicher ausgelesen und die benötigten Werte berechnet, sowie die Flags gelöscht.
Wichtig ist, das die Interruptroutinen möglichst kurz sind.
Zeitschleifen oder umfangreiche Recheoperationen ( Multiplikationen, Divisionen ) sollte man vermeiden.
Währende eines laufenden Interrupts kann kein weiterer Interrupt ausgeführt werden ( Es geht doch, aber nur mit Tricks ).
Ein anstehender Interrupt geht aber trotzdem nicht verloren, weil das entsprechende Flag Register ja aktiviert wurde.
2 gleichzeitig anstehende Interrupts werden einfach nacheinander abgearbeitet.
SOOO Grundsätzlich ist das nicht (wirklich), 2 Dinge gleichzeitigZitat von Vitis
gibt es nicht (wirklich). Der Prozessor arbeitet sein Programm
Befehl für Befehl nacheinander ab, kann also zwangsläufig nicht
gleichzeitig "hier oder dort" Werkeln....da ämdert auch ein IRQ
nichts dran. Außer mehrere Kerne mit gemeinsamen Takt natürlich.
Gruß Richard
Wirklich gleichzeitig geht nur sehr eingeschränkt für spezielle von der HW unterstützte funktionen. Es gehen aber 2 oder mehr Dinge fast gleichzeitig, so das es bei dem Fahrzeug nicht weiter ausfällt. Oft geht das z.B. mit interrupts. Wie man da genau macht, kann man so noch nicht sagen. Da ist die Problemstellung zu ungenau beschrieben.
Hier leigt der Fehler vermutlich schon in der Planungsphase. Eine exacte Beschreibung der Anforderungen ist dabei oft schon die halbe Lösung.
Hallo,
Ok danke schon mal.
Ja Die Hall Sensoren sind für die Drehzahlmessung da.
Also ich hab das immer so gemacht (ich bin Anfänger) :
Und da komm ich ja nicht mehr raus wenn ein bumper gedrückt wurde...Code:Do '-----Zufalszahl----- If Zufalszeit > 1500 Then Zufalszeit = 500 End If Zufalszeit = Zufalszeit + 10 '---Bumper Links--- If Pina.0 = 1 Then Sound Portd.7 , 400 , 400 Call Zuruck Waitms 1000 Call Stope Waitms 1000 Call Rechts Waitms Zufalszeit End If '---Bumper Rechts--- If Pina.1 = 1 Then Sound Portd.7 , 500 , 400 Call Zuruck Waitms 1000 Call Stope Waitms 1000 Call Links Waitms Zufalszeit End If Call Forward Loop End
MFG ARB1
So etwas wie die Drehzahlmessung bzw. das mitzählen von Umdrehungen kann man recht gut in einen Interrupt verlegen. Dazu müßte der Hallsensor aber an einem Pin sein, der auch einen Interrupt auslösen kann.
Eine weniger gute Alternative wäre es einen Timerinterrupt zu nutzen. Damit könnt man z.B.alle 10 ms etwas Rechenzeit abzweigen. Man muß den Teil dann aber so schreiben, das man immer nur kleine Teile in eins macht.
Ähnlich wie mit dem Timerinterupt könnte man es auch realisieren, wenn man jeweils beim warten ein Unterprogramm aufruft, das sich dann für einen kurze Zeit um die Drehzahl kümmert.
Lesezeichen