PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega 32 2 sachen gleichzeitig bearbeiten



ARB1
21.08.2010, 22:09
Hallo,

Ich hab eine Frage... :D
Ich hab ein Roboter der soll die Bumper und Hall Sensoren abfragen.

Wenn aber ein Bumper auslöst geht er ja in die ausweich routine und kann die Hall Sensoren nicht mehr abfragen...

Wie kann ich jetzt beides gleichzeitig machen oder geht das überhaupt?

MFG ARB1

TobiKa
22.08.2010, 05:36
z.B. indem du per Interrupt auf die Bumper reagierst.

Vitis
22.08.2010, 09:30
ich würd mal sagen grundsätzlicher programmfehler wenn dieses in einer routine länger hängen bleibt.

wkrug
22.08.2010, 09:36
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.

Richard
22.08.2010, 09:43
ich würd mal sagen grundsätzlicher programmfehler


SOOO Grundsätzlich ist das nicht (wirklich), 2 Dinge gleichzeitig
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

Besserwessi
22.08.2010, 11:17
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.

ARB1
22.08.2010, 13:43
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 :D) :



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


Und da komm ich ja nicht mehr raus wenn ein bumper gedrückt wurde...

MFG ARB1

Besserwessi
22.08.2010, 14:04
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.