Problem Diplomarbeit

OP (Firma: HTL) #3591673
Lesenswert?

Hi,

ich wollte ein Programm schreiben, um festzustellen ob ein Taster 
gedrückt ist oder nicht.
Hierfür habe ich diesen mit Hilfe einer Schaltung an ein Interrupt 
angeschlossen.
Mein Problem ist, dass das Interrupt bei Beginn des Programms ausgeführt 
wird und dadurch meine Variable auf true gesetzt wird. Das darf aber 
nicht geschehen.
Im weiteren Verlauf funktioniert alles tadellos, jedoch darf die 
Variable nicht bereits am Beginn des Programms auf true gesetzt werden. 
Wie kann ich das vermeiden?
1
#define input 2
2

3
int val = 0;
4
boolean reference = false;
5

6
void setup() {
7
  Serial.begin(9600);
8
  delay(3000);
9
  attachInterrupt(input, doReference, LOW);
10
  delay(1000);
11
}
12

13
void loop() {
14
  // wenn Taster offen -> liefert HIGH am Eingang
15
  if(reference==false){
16
    Serial.println("Fahre hoch");
17
    reference=false;
18
  }else{
19
    Serial.println("Messen");
20
  }
21
  delay(100);  
22
}
23

24
void doReference(){
25
  if(!reference){
26
    reference = true;
27
  }
28
  Serial.println("Fahre runter");
29
}
#3591688
Lesenswert?

Hallo
Ich würde mal schauen warum der Interrupt beim Starten ausgelöst wird, 
was nicht sein darf.
Wenn nicht, als Bastel-Lösung eine zusätzliche Variable auf 0 
initialisieren und wenn diese beim Interrupt Handler 0 ist, nichts 
machen und diese dann auf 1 setzen. Beim nächsten IRQ ist diese dann 1 
und bleibt es auch und der IRQ wird korrekt ausgeführt...
Gruss
Gast #3591708
Lesenswert?

Wenn er nicht "gedrückt" liefert dann sollt das interrupt ja nicht 
auslösen, deshalb verstehe ich das nicht.

Danke füf die antworten.

Es wird ein roboter und die taster benötige ich für die endabschalter 
falls der roboter zu weit fahren sollt. Immer nlch zu wenig? ;)
#3591725
Lesenswert?

Sicher das du auf LOW triggern willst?

attachInterrupt(input, doReference, LOW);
Der Interrupt wird so lange abgearbeitet wie das eingangssignal low ist.

Ich gehe davon aus das du mittels des PORT Registers den "Pull Up" 
eingeschalten hast.
Falls nicht:
DEINPORT|=(1<<DEINPIN);
und schon ist der Pull Up "ein"

Versuche dann mal das:

attachInterrupt(input, doReference, FALLING);
Dadurch wird der Interrupt nur bei fallender Flanke ausgelöst.

Grüße
Gast #3591736
Lesenswert?

Huhu Anna,

warum liefert der offene Taster denn HIGH am Eingang?
Dachte immer man hat so einen Schalter (Bumper unten am Robi zb.)und 
wenn der Schalter geschlossen ist kann der Strom "fließen" und dann hat 
man gegebenenfalls 3,3 oder 5 V auf einen Eingang des Mikroprozessors 
(welchen benutzt du nochmal gleich? Schaut nach Atmel aus, so ne Arduino 
Geschichte?).

Vielleicht könntest du das etwas erläutern und sagen welcher Chip und 
so... vielleicht wirds ja so ein Schwarmroboter, wo ne handvoll 
versuchen eine Aufgabe zu erledigen ;o)

Gruß
dat
Beast
#3591760
Lesenswert?

BeastyK der seine Anmeldedaten verschluderte schrieb im Beitrag 
#3591736:
> warum liefert der offene Taster denn HIGH am Eingang?
> Dachte immer man hat so einen Schalter (Bumper unten am Robi zb.)und
> wenn der Schalter geschlossen ist kann der Strom "fließen" und dann hat
> man gegebenenfalls 3,3 oder 5 V auf einen Eingang des Mikroprozessors

Ein offener Taster liefert erstmal nichts (d.h. einen undefinierten 
Zustand am Eingangspin). Daher braucht man einen Ziehwiderstand, der den 
Ruhepegel liefert, und den kann man nach GND oder Vcc schalten und den 
Taster entsprechend umgekehrt. Abhängig davon ist der Ruhezustand Low 
oder High.

Gruß Dietrich
Gast #3592228
Lesenswert?

Hi Anna
Vielleicht kannst du dich ja mal für einen Namen entscheiden, oder wie 
ist
Anna und Falcon zu definieren? Zum Thema. Eine Endabschaltung realisiert 
man mit einem Öffner. Stell dir vor,, der Schalter ist defekt, ein 
Kabelbruch oder was auch immer, er liefert einfach kein Schaltsignal. 
Dann läuft dein Roboter, bis ihn nur massive Hindernisse aufhalten oder 
er sich seine Energien selber kappt. Bei einem Öffner ist zumindest ein 
Kabelbruch oder Ausfall der Signalversorgung erkennbar und der Roboter 
fährt gar nicht erst in die Richtung.
Sollte eigentlich als Grundlage für eine Diplomarbeit klar sein. Auch 
würde ich einen Schalter niemals in einen Interrupt packen. Warum? Damit 
er sicher erkannt wird? Das wird ein Schalter in einem vernünftigen 
Programm im Polling auch. Sollte Polling zeitlich nicht reichen, ist das 
Programm für einen Roboter sowieso nicht brauchbar. Eine lange 
Zykluszeit müsste dann nicht nur Signale im Interrupt erfassen, sondern 
auch noch die nötigen Bearbeitungsschritte bis hin zur Ausgabe 
durchführen. Dann besteht 80% deines Programmes aus ISR.
Bau dein Programm ereignisgesteuert auf. Dann hast du auch keine 
Probleme mit Zykluszeit und du kannst die Interrupts für sinnvolle 
Aufgaben freihalten. Z.B. Signale von Winkeldekodern oder 
Drehimpulsgebern.
Gruß oldmax
(Firma: privatfrickler.de) #3592257
Lesenswert?

Immer dieses religiöse anti-Tasten-auf-Interrupt-Evangelium.

Bei Benutzereingaben verstehe ich es ja noch, wegen der Entprellung,
aber in diesem Fall?

oldmax schrieb:
> Auch
> würde ich einen Schalter niemals in einen Interrupt packen. Warum?

Die Frage muss lauten: Warum nicht!

Der Endtaster soll ja hier scheinbar den ganzen Roboter ausschalten, da 
stört Prellen ja wohl nicht.

Warum denn nicht?

Das Pollen auch geht ist kein sinnvolles Argument.
Gast #3592316
Lesenswert?

Hi
Ehrlich gesagt, ist es mir völlig wurscht, ob irgend welche Schalter im 
Interrupt abgefragt werden oder nicht, das Ergebnis zählt am Ende. Dem 
Anwender ist es genauso egal, Hauptsache, es funzt. Aber ist das eine 
Basis für eine Diplomarbeit?
Deshalb, warumm kontaktbehaftete Schalter in einen Interrupt packen? Die 
Schaltzeiten liegen weit höher als jede vorstellbare Zykluszeit in einem 
Maschinenprogramm. Und wo ist da ein Unterschied zu einem manuell 
betätigten Taster und einem Endschalter?
>Der Endtaster soll ja hier scheinbar den ganzen Roboter ausschalten, da
>stört Prellen ja wohl nicht.
Nein, ein Endschalter schaltet nicht den ganzen Roboter aus. Energien 
bleiben selbstverständlich bei einem Endschalter aufgeschaltet und wenn 
man's richtig macht, werden Antriebe dann geregelt herunter gefahren. 
Nicht verwechseln mit "NOT"-Aus. Da darf ein Antrieb ruhig austrudeln... 
na ja, fast.... Auch hier gibt es verschiedene Ausführungen, was 
kinetische Energien betrifft.
Ein Not-Aus wird auch in der Regel nicht über einen Controller 
geschaltet. Warum auch, da wird das Netz gekappt und gut is. (meistens)
gruß oldmax

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren