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.
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 ?
Hallo Mach die Abfrage doch in die Warte-sub rein. Die hat doch sowieso nichts besseres zu tun. Gruß Joachim
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 ...
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.
Hallo Tom, Hallo Mark Wenn ihr nichts konstruktives beibringen wollt (könnt), dann lasst es doch einfach. Das spart Platz im Forum.
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.
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
Überleg doch mal wie du eine FlipFlop in Software lösen könntest ...
Also du brauchst eine Tastenabfrage incl entprellung die Toggelt eine Variable dann Brauchst du noch eine Schieberegister jede LED ein Bit ... so genug hilfestellung ...
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.
> Hier einmal die Komplette aufgabensdtellung.
Oh Scheisse,
der Idiot lässt hier wirklich seine Hausaufgaben machen,
versehentliches Helfen kommt nicht wieder vor.
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.
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 !!!!!
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
1. Eine Funktion Ein/Aus 2. Eine Funktion Schieberegister 3. Eine Endlosschleife die beide Funktionen beinhaltet ...
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.