problem mit startswitch() ..while (!switched)...
hallo zusammen,
mein problem ist folgendes.
In dem Programm soll der Asuro vorwärts fahren bis ein Hindernis kommt.
dann darauf reagieren und danach das ursüngliche Progamm weiter machen.
...
#include "asuro.h"
int main(void)
{
while (1) { // das mein programm
while (!switched) { //solange kein taster mache irgendwas}
//taster war gedrückt als
mache nun was anderes und gehe zurück in das ursprungsprogramm
bzw. setze die schleife weiter fort.
switched=0; <--damit müsste ich doch in der while (!switched) { //solange kein taster mache irgendwas} wieder sein.
return 0;
}
doch leider geht das nicht, der interrupt schein noch gesetzt zu sein.
was muss ich machen damit ich wieder in die while (!switched) gelange?
gibt es da soetwas wie eine ResetSwitch() - funktion?
vielen dank für eure hilfe.
Problem in der Asuro-Lib?
Hallo! Ich krame diesen Thread wieder aus, weil das Problem nicht gelöst wurde, sondern lediglich eine Lösung mit PollSwitch angeboten wurde.
Ich habe das gleiche Problem mit der Interruptgesteuerten Tasterabfrage. Ich habe lange rumgetestet und herausgefunden, dass scheinbar, wenn der Interrupt einmal aufgerufen wurde, er die ganze Zeit aufgerufen wird und switched immer wieder auf 1 gesetzt wird, aber auch nur, wenn nach der Interruptabfrage ein Pollswitch folgt.
Mein ASURO soll alle Sensoren nutzen und per Interrupt merken, wenn er gegen etwas gefahren ist und dann erst einmal PollSwitch ausführen um zu wissen wo er angestoßen ist. Das Problem ist, die Odometrie soll auch im Interruptbetrieb im Hintergrund laufen und der AD-Wandler eben nur dann für den Taster arbeiten, wenn er wo angestoßen ist.
Ich glaube langsam, dass das nen Fehler in der ASURO-Bibliothek ist, denn die einzige Lösung die ich gefunden habe ist mehr ein Workaround denke ich. Nach dem PollSwitch muss Init() nochmal ausgeführt werden und ein Sleep-Befehl eingefügt werden, dann geht der externe Interrupt der Taster wieder, aber auch z.B. die Odometriemessung ist dann im Eimer und muss neu initialisiert und gestartet werden.
Meinen Testcode könnt ihr unter http://rafb.net/p/A2lxFl56.html ansehen (nopaste).
Mit freundlichen Grüßen,
Pascal Klein
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo m.a.r.v.i.n
ich habe Deine Anregungen ausprobiert, leider ohne Erfolg.
An dem Bild weiter unten siehst Du noch einmal genau, was da nicht klappt.
1. Der Asuro wartet auf einen Tastendruck und sendet jede Sekunde den String "Taste?" (Zeile 16-19).
2. Beim Drücken einer Taste wird die globale Variable switched auf Null gesetzt (Zeile 20).
3. Der Bitwert des entsprechenden Tasters (in diesem Beispiel 16) wird zusammen mit dem Wert switched ( jetzt wieder 0) ausgegeben. Im Terminalfenster erscheint die Zahlenkombination 16 und 0.
4. Jetzt sollte das Programm eigentlich wieder auf einen neuen Tastendruck warten und die Schritte 1-3 wiederholen. Das passiert aber nicht, sondern der Interrupt wird sofort und ohne Tastendruck erneut ausgelöst. Dies erkennt man daran, dass nun im Terminalfenster die Zahlenkombination 0 und 0 erscheint. Die globale Variable switched muss dazu zuvor erneut auf 1 gesetzt worden sein - und zwar durch Aufrufen der ISR SIGNAL (SIG_INTERRUPT1). Da dies nicht durch einen Tastendruck passiert ist, geschieht dies intern im Prozessor.
Mein Fazit: Das permanente Aufrufen der ISR SIGNAL (SIG_INTERRUPT1) muss irgendwie intern im Prozessor durch ein Register-Bit gestoppt werden. Das Abändern der globalen Variablen switched ist ohne Probleme möglich, führt aber nicht zum Erfolg.
Ulli