Forum: Mikrocontroller und Digitale Elektronik Unterbrechen eines Lauflichts durch Tastendruck


von Baracuss (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich habe ein Kleines Lauflich programmiert.
Nun möchte ich dieses Lauflich durch drücken eines Tasters an P1_0 
unterbechen und durch erneutes drücken des Taster an der gelichen 
Position wieder fortfahren.
Ich habe schon mehreres ausprobiert und drüber gegrübelt aber ich komme 
nicht drauf wie ich dieses ohne einen Interuppt schaffe.

Es wäre super wen ihr mir helfen könntet.
Im vorraus schon einmal vielen dank.

von tom (Gast)


Lesenswert?

oh, eine Aufgabe - die der Schüler/Student sicher selbst lösen soll, 
wäre ja sonst pädagogisch etwas unsinnig, Hr. zu Guttenberg jr., oder ?

von XXX (Gast)


Lesenswert?

Hallo

Mach die Abfrage doch in die Warte-sub rein.
Die hat doch sowieso nichts besseres zu tun.

Gruß
Joachim

von Mark X. (lechuck_ger)


Lesenswert?

Oh will da jemand seine Hausarbeiten durchs Forum erledigen lassen ?
Ich sehe in deinem Source nicht eine Tasterabfrage ...

Versuch es erstmal selbst und dann wenn du Fragen hast warum irgendwas 
nicht funktioniert, dann komm wieder ...

von Sascha E. (baracuss)


Lesenswert?

Wie gesagt ich habe schon mehrer varianten probiert habe jedes mal wen 
ich taster drücke unter breche ich zwar das Lauflicht aber nur so lange 
wie ich den taster drücke.
in dem angehang habe ich auch nur das reine laulicht angehanden die 
Tasterabfrage habe ich in einem anderen Programm probiert.

von Grübler (Gast)


Lesenswert?

Hallo Tom, Hallo Mark

Wenn ihr nichts konstruktives beibringen
wollt (könnt), dann lasst es doch einfach.
Das spart Platz im Forum.

von MaWin (Gast)


Lesenswert?

Tja, dein Programm ist auch sehr naiv, denn er pausiert 10000ms (10 
Sekunden ?, sind wohl eher 0.2) und in der zeit kann es nicht auf Taster 
reagieren, daher bräuchtest du einen Interrupt.

Aber mit einen vernünftigen Programmstruktur wäre es viel einfacher. 
Vergiss deine Warteschleife, damit machst du dir jedes Programm kaputt.

Irgendwo musst du deinen Taster anschliessen, sagen wir an TASTER

gedrueckt=wargedrueckt=gestoppt=i=a=0;
P1=0x01;
while(1)
{
  if(!gestoppt&&++a==200)
  {
     if(P1==0x80) P1=0x01; else P1<<=1; // nicht KnightRider
     a=0;
  }
  gedrueckt=TASTER;
  if(gedrückt&&!wargedrueckt) gestoppt=!gestoppt;
  wargedrückt=gedrückt;
  warte(1); // nur 1 ms
}

Kürzer, besser, leichter zu erweitern.

Entscheidend ist, daß du die Logik umdrehst: Nicht warten, sondern eine 
Schleife die immer rumläuft und nur dann was tut, wenn es "Zeit" ist 
oder das "Ereignis" vorliegt.

von anschwärzer (Gast)


Lesenswert?


von Ralph B. (rkhb)


Lesenswert?

Baracuss schrieb:
> ich komme
> nicht drauf wie ich dieses ohne einen Interuppt schaffe.

Mit Interrupt wäre die beste Methode, da der Interrupt die 
Programmausführung an jeder Stelle unterbricht. Ohne Interrupt musst Du 
in der Hauptschleife die beste Stelle suchen oder die Tastaturabfrage 
mehrfach unterbringen.

Da ich weder den Prozessor noch den Compiler habe, kann ich Dir das 
Ganze nur skizzieren:

if (Taste gedrückt)
{
  warte (Tastenentprellung);     // Stichwort ergoogeln!
  while (Taste nicht gedrückt);  // Schleife bis wieder gedrückt
  warte (Tastenentprellung);     // Stichwort ergoogeln!
}

Das Semikolon an der While-Schleife - so wie es dasteht - nicht 
vergessen! Es könnte sein, dass der Compiler die While-Schleife 
wegoptimiert, weil sie nichts macht. Dann muss man dem Compiler das 
Optimieren verbieten oder die Schleife was machen lassen:

while (Taste nicht gedrückt)
{
  warte (ganz kurz);
}

Mit Interrupt (sicher die nächste Aufgabe) geht das so nicht, da erstens 
ein Interrupt so kurz wie möglich abgehandelt werden soll (keine 
Warteschleifen) und zweitens der Interrupt (Taste) nicht durch einen 
weiteren Interrupt (nochmal Taste) unterbrochen werden kann/soll.

HTH

viele grüße
ralph

von Mark X. (lechuck_ger)


Lesenswert?

Überleg doch mal wie du eine FlipFlop in Software lösen könntest ...

von Mark X. (lechuck_ger)


Lesenswert?

Also du brauchst eine Tastenabfrage incl entprellung
die Toggelt eine Variable
dann Brauchst du noch eine Schieberegister jede LED ein Bit ...

so genug hilfestellung ...

von Sascha E. (baracuss)


Angehängte Dateien:

Lesenswert?

Hier einmal die Komplette aufgabensdtellung.

Es soll ein Lauflicht programmiert werden, dass jeder Zeit mit einm 
Tastendruck T0 gestartet oder gestoppt werden kann. Wenn das Lauflicht 
nach dem es gestoppt wurde neu gesartet wird, soll es an der gleichen 
Posiition fortfahren.
Hinweis: Die LED D0 ist nicht Bestandteil des Lauflichtes!

Zu den ersten paar sinloasen beiträgen einmal, dies ist keine 
Hausaufgabe sondern eine aufgabe wärend eines Lehrgangs.
Das Problem ist nur das wir hier zu 7 Leruten sitzen und keiner kommt 
weiter.
Wir würden ja auch unseren Ausbilder fragen aber der ist heute nich da, 
da er wegen Prüfungen zur IHK musste.

Ich habe es jetzt mal so geändert  wie Ralph es mir vorgeschlagen 
hattest aber leider Funktioniert es nicht so wirklich.
Ich kann das Lauflicht zwar stoppen aber erst nach dem es einmal 
komplett durchgelaufen ist und dann startet es aber auch nach einer 
unbestimmten zeit von selbst wieder.

von MaWin (Gast)


Lesenswert?

> Hier einmal die Komplette aufgabensdtellung.

Oh Scheisse,
der Idiot lässt hier wirklich seine Hausaufgaben machen,
versehentliches Helfen kommt nicht wieder vor.

von Sascha E. (baracuss)


Lesenswert?

Achja ganz vergeseen wir verwenden einen 89c51cc03 von Atmel.
Compalieren tun wir mit Keil 3µvision.
Den Controller beschreiben wir mit FLIP.
Als Evolutiuons Board verwenden wir ein TFH/PalmTec, TFH-Board 0NF-V2.
Die Leds und Taster sitzen auf dem TFH-DIO-Test board was ebenfalls von 
Palmtech ist.

von Mark X. (lechuck_ger)


Lesenswert?

Also du brauchst eine Tastenabfrage incl entprellung
die Toggelt eine Variable
dann Brauchst du noch eine Schieberegister jede LED ein Bit ...

so genug hilfestellung ...

reicht das nicht aus ?
Wenn nein, dann lern Schuhputzer !!!!!

von Peter D. (peda)


Lesenswert?

Baracuss schrieb:
> ich habe ein Kleines Lauflich programmiert.
> Nun möchte ich dieses Lauflich durch drücken eines Tasters an P1_0
> unterbechen und durch erneutes drücken des Taster an der gelichen
> Position wieder fortfahren.

Versuche erstmal einen Programmablaufplan zu erstellen, d.h. mit Worten 
zu beschreiben, was wann wo und wie passieren soll.
Direkt Code einzuhacken ist der falsche Weg

Sinnvoll ist es, einen Timer zu benutzen. Dann muß man nicht 
rumprobieren mit den Zeiten, sondern kann sie ganz exakt vom Compiler 
ausrechnen lassen.
Für das Entprellen empfiehlt sich ein 10ms Zeitraster.


Peter

von Mark X. (lechuck_ger)


Lesenswert?

1. Eine Funktion Ein/Aus
2. Eine Funktion Schieberegister
3. Eine Endlosschleife die beide Funktionen beinhaltet ...

von ulp (Gast)


Lesenswert?

du kannst das auch so machen
1
void rechts(uint8_t stepsrechts)
2
{
3
 if(stepsrechts == 1)
4
  {
5
      drehrichtung++;
6
      if (drehrichtung == 4)
7
      {
8
        drehrichtung = 0;
9
      }
10
      drehen(drehrichtung);
11
      wait10Ms(STEPPERTIME);
12
    }
13
  }
14
}
15
void drehen(uint8_t state)   //drehen des Schrittmotors
16
{
17
  switch (state)
18
  {
19
   case 0:
20
     LED1ON;
21
     LED2ON;
22
     LED3OFF;
23
     LED4OFF;
24
     break;
25
   case 1:
26
     LED1OFF;
27
     LED2ON;
28
     LED3ON;
29
     LED4OFF;
30
     break;
31
   case 2:
32
     LED1OFF;
33
     LED2OFF;
34
     LED3ON;
35
     LED4ON;
36
     break;
37
   case 3:
38
     LED1ON;
39
     LED2OFF;
40
     LED3OFF;
41
     LED4ON;
42
     break;
43
  }
44
}
45
46
47
void main (void)
48
{
49
50
bla bla
51
init der componenten....
52
53
  while (1)
54
  {
55
    if (PINA1 == 1)
56
    {
57
      rechts(1);
58
    }
59
    else
60
    {
61
      rechts(0);
62
    }
63
   }
64
}

von Mark X. (lechuck_ger)


Lesenswert?

hab es grade in C geschrieben hat keine 10 min gedauert ...

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.