Forum: Mikrocontroller und Digitale Elektronik Problem Diplomarbeit


von Anna M. (Firma: HTL) (falron)


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
}

: Bearbeitet durch User
von Mach F. (machfax)


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

von Marius S. (lupin) Benutzerseite


Lesenswert?

Frag doch im Interrupt ab, ob der Taster gedrückt ist oder nicht.

Anna Maier schrieb:
> ich wollte ein Programm schreiben, um festzustellen ob ein Taster
> gedrückt ist oder nicht.

Ist das nicht ein bisschen zu viel für eine Diplomarbeit? ;-)

von falron (Gast)


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? ;)

von Thomas E. (thomase)


Lesenswert?

Daß man das Flag eines externen Interrupts nach dessen Initialisierung 
vor der globalen Freigabe löschen muß, ist normal.

>Immer nlch zu wenig? ;)
Das hast du mit dem Threadtitel aber auch herausgefordert. "Problem mit 
Interrupt" wäre treffender gewesen.

mfg.

: Bearbeitet durch User
von Matthias L. (lindner8712)


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

von BeastyK der seine Anmeldedaten verschluderte (Gast)


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

von Dietrich L. (dietrichl)


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

von oldmax (Gast)


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

von Timm R. (Firma: privatfrickler.de) (treinisch)


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.

von oldmax (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.