Sorry ich finde meinen Beitrag Von gestern nicht mehr deshalb muss ich leider einen neuen Tread machen. Ich habe gestern mal was herumprobiert und ich bin auch schon etwas weiter gekommen.Ich habe aber noch ein paar Probleme und komme nicht auf die Lösung.Und zwar bin ich immer erst im WERT 1-50 also wird als erstes immer ein kurzer Tastendruck wargenommen.Das will ich aber nicht.Dann weiß ich überhaupt nicht wo ich den wert von w auf 0 setzen soll.Jedesmal wenn ich es irgendwo vornehme geht das programm nicht mehr.In case 2 ist es ja auch doo... weil wenn ich in case 1-50 bin wird ja nichts zurück gesetzt.Für eine kleine Hilfestellung wär ich Euch wirklich dankbar!!! $regfile = "m8def.dat" $crystal = 8000000 Config Timer0 = Timer , Prescale = 1024 Enable Timer0 On Timer0 Isr_timer0 Enable Interrupts Config Portc.1 = Output Config Portc.2 = Output Config Pinb.0 = Input Portb.0 = 1 Dim W As Byte Do Select Case W Case 1 To 50 : Portc.1 = 1 Wait 1 Case 50 To 255 : Portc.2 = 1 Wait 1 W = 0 Case Else Portc.1 = 0 Portc.2 = 0 End Select Loop End Isr_timer0: If Pinb.0 = 0 Then Incr W End If Return
Wirre Gedanken und wirre Sprache. Aus Deinen Ausführungen kann ich keine Aufgabenstellung erkenen. Durchdenk doch die Probleme erst einmal. Das hat noch niemandem geschadet.
Sebastian schrieb: > Und zwar bin ich immer erst im WERT 1-50 also wird als erstes > immer ein kurzer Tastendruck wargenommen.Das will ich aber nicht. Die Variable W (um die geht's hier?) wird vermutlich beim Programmstart mit 0 initialisiert und dann beginnst du in der ISR mit dem Hochzählen.
Also ich möchte gerne die Tastendrucklänge messen um entweder Funktion 1 auszuführen oder Funktion 2. Ich würde jetzt aber immer funktion 1 ausführen und wenn der wert hoch genug ist von w Funktion nummer 2.Ich will aber entweder 1 oder 2 und ich muss ja dia Variable irgendwo wieder auf null setzten damit ich wieder 1 oder 2 auswählen kann
Sebastian schrieb: > Sorry ich finde meinen Beitrag Von gestern nicht mehr deshalb muss ich > > leider einen neuen Tread machen. Beitrag "Hilfe Eieruhr"
so bin etwas wieder weiter gekommen aber ich habe noch immer das problem das funktion 1 immer mit ausgewählt wird
1 | Do |
2 | |
3 | Select Case W |
4 | Case 1 To 20 : |
5 | Portc.1 = 1 |
6 | Wait 1 |
7 | If W > 20 Then |
8 | W = W |
9 | Else |
10 | W = 0 |
11 | End If |
12 | |
13 | Case 20 To 50 : |
14 | Portc.2 = 1 |
15 | Wait 1 |
16 | W = 0 |
17 | |
18 | Case Else |
19 | Portc.1 = 0 |
20 | Portc.2 = 0 |
21 | End Select |
22 | |
23 | Loop |
24 | End |
25 | |
26 | Isr_timer0: |
27 | If Pinb.0 = 0 Then |
28 | Incr W |
29 | End If |
30 | Return |
Die "Schalterlänge" oder "Tastendrucklänge", da sind keine bekannten Begriffe. Man denkt zunächst, was will er denn? Die Länge des Hebels seines Schalter bestimmen, ob der Hebel aus Plastik ist und 3 cm lang oder aus Holz und andere Länge? Eine Länge wird gemessen in m (Meter) oder Teilen davon. Was du wahrscheinlich messen willst, ist eine Zeit. Ein Zeit wird gemessen in Sekunden oder ms etc. Also schreibe das doch bitte: Messen der BetätigungsZEIT (eines Schalters, besser:) eines Eingangssignals. Dann reden wir fachlich korrekt und mehr Leute werden es verstehen. Wenn du jetzt noch ranschreibst, was die Grenzwerte der Zeit(en) für die "Funktion 1" bzw. "Funktion 2" sein sollen, dann werden die Antworten besser. Gruss
1. Solange der Knopf gedrückt ist, darfst Du nur prüfen, ob es ein langer Druck war (anhand einer Zählvariable). Die Zählvariable darf aber nicht überlaufen: Wenn langer Druck erkannt, dann nicht weiter hochzählen. 2. Wenn der Knopf losgelassen wird, musst Du prüfen, ob es ein kurzer Druck war. Dann die Zählvariable zurücksetzen.
Ich mach nicht in Basic, aber das System könnte wie folgt aussehen:
1 | for n= 1 to 50 |
2 | If (Taste() != Gedrückt) goto Befehl 1 |
3 | Warte 10mS |
4 | next n |
5 | // Taste war immer noch gedrückt nach 500 mS
|
6 | Befehl 2: |
7 | // Warte das der User endlich loslässt
|
8 | If (Taste() = Gedrückt) gehe zu Befehl 2 |
9 | // Führe Befehl 2 aus
|
10 | Ende Befehl 2 |
11 | |
12 | Befehl 1: |
13 | // Mach was in Befehl 1
|
14 | Ende Befehl 1 |
Oh Daniel da muss ich erstmal wieder ein bißchen nachdenken wie ich das programmiert bekomme ich bin wirklich noch totaler Anfänger Also ich würde das jetzt ungefähr so versuchen if pinb.0=0 then incr w if w > 20 then langer tastendrück if w<20 then kurzer Tastendruck w=0 nur wie ich jetzt sage das w nicht > als der überlauf werden darf weiß ich nicht
So ich habe jetzt mal ein while wend schleife in die ISR gepackt sodas das Programm erst weiter kann sobald der Taster losgelassen wird das ist aber bestimmt sehr schlechtes programmieren
Schau Ein3es deiner Probleme ist, dass du hier ....
1 | Do |
2 | |
3 | Select Case W |
4 | Case 1 To 20 : |
5 | Portc.1 = 1 |
6 | Wait 1 |
7 | If W > 20 Then |
8 | ... |
das W schon auswertest, während die Taste noch gedrückt ist. Dein W ist kurz nachdem du die Taste gedrückt hast, schon 1 (weil W in der ISR hochgezählt wurde). Und daher wird dann dieser Zweig genommen. Aber: Das ist doch nicht richtig. Dein W ist erst dann ein Mass für die Länge eines Tastendrucks, wenn die Taste wieder losgelassen wurde! Die kannst erst nach dem Loslassen feststellen, wie lang eine Taste eigentlich gedrückt war. Vorher geht das prinzipiell nicht (Ausser mit dem Sonderfall, dass man während des Drückes sagen kann, dass man jetzt schon länger als X gedrückt hat, aber das erlaubt keine Aussage wie lange die Taste noch gedrückt sein wird). Und genau das fehlt mir in deinem Programm! Du stellst zwar fest, wann eine Taste gedrückt ist und zählst dabei einen Zähler hoch. Aber deer Zähler hat erst dann eine Aussagekraft, wenn die Taste wieder losgelassen wurde. Und nochwas: Ich hab mir die Freiheit genommen, deinen Code einzurücken, damit man die logische Struktur sieht. Wenn du alles einfach nur an den linken Rand quetscht, sieht man nicht, wie die Dinge zusammengehören bzw. voneinander abhängen. Mit einer Einrückung sieht man das viel besser und tut sich viel leichter zu analysieren, was ein Programm eigentlich macht.
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.