Forum: Mikrocontroller und Digitale Elektronik Schalterlänge auswerten


von Sebastian (Gast)


Lesenswert?

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

von spontan (Gast)


Lesenswert?

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.

von Tom M. (Gast)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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

von John (Gast)


Lesenswert?

Sebastian schrieb:
> Sorry ich finde meinen Beitrag Von gestern nicht mehr deshalb muss ich
>
> leider einen neuen Tread machen.

Beitrag "Hilfe Eieruhr"

von Sebastian (Gast)


Lesenswert?

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

von Erich (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.