Forum: Mikrocontroller und Digitale Elektronik Tastenanschläge zählen?


von Max M. (bytekiller)


Lesenswert?

Hallo,
habe nur eine ganz kurze Frage, auf die Google mir irgendwie keine 
Antwort liefern konnte (wahrscheinlich falsche Suchbegriffe?). Ich habe 
es jetzt geschafft, meinen Motor per PWM zu steuern. nun möchte ich 
einen Taster einbauen und wenn dieser einmal gedrückt wird, dann soll 
der Motor x schnell laufen, wird der Taster zwei Mal gedrückt, soll der 
Motor y schnell laufen, wird der Taster drei Mal gedrückt, soll er z 
schnell laufen und beim vierten Drücken soll er wieder x schnell laufen.

Könntet ihr mir dabei vielleicht helfen oder mir ein Stichwort für 
Google geben? Ich benutze übrigens Bascom.


Edit: Das Stichwort, das ich suche scheint Entprellen zu sein. Kann das 
sein?

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Max Muster schrieb:

> Könntet ihr mir dabei vielleicht helfen oder mir ein Stichwort für
> Google geben? Ich benutze übrigens Bascom.

Weniger auf Google und Copy&Paste setzen und mehr selber nachdenken und 
ausprobieren.

Woher kommt bei machen Leuten dieser Reflex, beim Programmieren erst mal 
für alles ein Codebeispiel zu benötigen?

von hinz (Gast)


Lesenswert?

Max Muster schrieb:
> Edit: Das Stichwort, das ich suche scheint Entprellen zu sein. Kann das
> sein?

Ja, und Bascom hat dafür eine spezielle Funktion.

von Max M. (bytekiller)


Lesenswert?

hinz schrieb:
> Max Muster schrieb:
>> Edit: Das Stichwort, das ich suche scheint Entprellen zu sein. Kann das
>> sein?
>
> Ja, und Bascom hat dafür eine spezielle Funktion.

Debounce. ^^

von Timmo H. (masterfx)


Lesenswert?

Einfach eine variable inkrementieren und gucken was Sache ist.
1
while(1){
2
  if(get_key_short(1<<KEY1))
3
     state = (state+1) % 3;
4
5
  switch(state){
6
   case 0:
7
     speed = x;
8
     break;
9
   case 1:
10
     speed = y;
11
     break;
12
   case 2:
13
     speed = z;
14
     break;
15
  }
16
 
17
  OCR1A= speed;
18
}

von Max M. (bytekiller)


Lesenswert?

Timmo H. schrieb:
> Einfach eine variable inkrementieren und gucken was Sache ist.
> [c]


Ich arbeite aber mit Bascom zur Zeit. Das sieht aber eher nach C aus, 
oder?

von Georg (Gast)


Lesenswert?

Hallo,

du brauchst in jedem Fall einen Timer:

1. um festzustellen, dass der Key nicht nur 2 x gedrückt wurde, sondern 
dass das innerhalb x ms geschehen ist.

2. um bei einer Pause länger x ms den Befehl auszuführen und den Zähler 
zurückzustellen.

Wenn du nur einfach zählst, bekommst du ein ganz anderes verhalten als 
gewünscht, z.B. kannst du nicht 2x nacheinender Motor 1 ansprechen.

Georg

von Max M. (bytekiller)


Lesenswert?

Georg schrieb:
> Hallo,
>
> du brauchst in jedem Fall einen Timer:
>
> 1. um festzustellen, dass der Key nicht nur 2 x gedrückt wurde, sondern
> dass das innerhalb x ms geschehen ist.
>
> 2. um bei einer Pause länger x ms den Befehl auszuführen und den Zähler
> zurückzustellen.
>
> Wenn du nur einfach zählst, bekommst du ein ganz anderes verhalten als
> gewünscht, z.B. kannst du nicht 2x nacheinender Motor 1 ansprechen.
>
> Georg

Gibt es irgendwie bestimmte Pins am Attiny 2313 mit denen das nur geht? 
Oder geht das mit allen?

MFG

von Georg (Gast)


Lesenswert?

Max Muster schrieb:
> Gibt es irgendwie bestimmte Pins am Attiny 2313 mit denen das nur geht?

Der Timer hat mit dem Pin garnichts zu tun. Praktisch richtest du einen 
Timer ein mit z.B. 1 ms und in der Timer-ISR fragst du die Taste ab. 
Dann lässt sich Entprellen und die beschriebene Abfrage zusammen 
erledigen.

Georg

von Max M. (bytekiller)


Lesenswert?

Mein Code sieht bisher so aus:
1
$regfile = "attiny2313.dat"
2
$crystal = 1000000
3
4
5
Config Portb. 3 = Output 'B3 Output
6
Config Pind. 2 = Input   'D2 Input
7
8
Motor Alias Portb. 3
9
Taster Alias Pind. 2
10
Pinb. 0 = 1              'Pull Up Widerstand
11
12
Do
13
14
Debounce Pind. 2 , 0 , Gedruekt , Sub
15
16
Loop
17
18
End
19
20
Gedruekt:
21
    Motor = 1          'Motor läuft, wenn Taste gedrückt wurde
22
      Return



Funktioniert so aber absolut nicht, aber dieses Tutorial z.B.
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/taster_entprellen/
hilft auch nicht sehr viel.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Ein fertiges Programm für Tastenentprellung und PWM-Ausgabe für einen 
DC-Motor, deren Werte in einer Tabelle stehen.
Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

von Max M. (bytekiller)


Lesenswert?

m.n. schrieb:
> Ein fertiges Programm für Tastenentprellung und PWM-Ausgabe für einen
> DC-Motor, deren Werte in einer Tabelle stehen.
> Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

Hey, der Link hilft mir auf jeden Fall schon mal, aber leider wurde das 
in C geschrieben und ich arbeite ja mit Bascom..

von ich (Gast)


Lesenswert?

Du meinst wohl du Copy und Pastest mit Bascom. Mach dir halt mal 
Gedanken! EIn gutes Beispiel hast du ja jetzt schon bekommen

von (prx) A. K. (prx)


Lesenswert?

Cyblord ---- schrieb:
> Woher kommt bei machen Leuten dieser Reflex, beim Programmieren erst mal
> für alles ein Codebeispiel zu benötigen?

Weil es oft funktioniert. Ohne Internet fällt denken leichter. ;-)

von m.n. (Gast)


Lesenswert?

Max Muster schrieb:
>> Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."
>
> Hey, der Link hilft mir auf jeden Fall schon mal, aber leider wurde das
> in C geschrieben und ich arbeite ja mit Bascom..

Sieh das doch positiv. Der Link zeigt Dir ein Programm, das wohl das 
macht, was Du Dir vorstellst oder nur leicht verändert werden müßte. Es 
ist auch recht einfach auf Deinen ATtiny2313 zu übertragen.
Das Programm ist recht kurz und übersichtlich, und in jeder Zeile ist 
ein Kommentar, der beschreibt, was passieren soll.

Vielleicht ist der schnellere, erfolgreichere Weg, einfach einmal C zu 
probieren?
Das Atmel AVR-Studio 4.18 ist kostenlos herunterzuladen und einfach zu 
installieren. Ein Projekt erstellen, den Quellcode kopieren und das 
Übersetzen sollte fehlerfrei klappen. Wenn es dann noch in Deiner 
Schaltung funktioniert, ist es vielleicht überlegenswert, es auszubauen 
und bei C zu bleiben ;-)

von Simpel (Gast)


Lesenswert?

Hi Max, was möchtest du genau?

a) Soll derMotor nach x kurzen Tastendrücken innerhalb eines 
Zeitfensters, mit Speed x laufen? mit x=1...3

b) Soll er nach dem ersten Tatsendruck mit Speed_1 alleine weiterlaufen, 
beim zweiten mit Speed_2.... und beim 4. Tastendruck wieder mit 
Speed_1...?

c) Soll der Motor nur solange mit Speed x laufen, wie die Taste gedrückt 
bleibt?

d) ...weiß der Geier... ;-)


Gewöhne dir bitte mal eine präzise Beschreibung des Ziels bzw. des 
Funktionsablaufes an, sonst redet man hier aneinander vorbei und 
verschwendet Zeit...

von Amateur (Gast)


Lesenswert?

Eine Einbahnstraße?

Also nur schneller?

Was bei Erreichen des Maximums.

Insgesamt sollte das ganze kein Problem sein, einen freien Timer 
vorausgesetzt und eine vernünftige Entprellung.

Ein kleines Problem wird der Rhythmus in sich bergen:
Was ist der Unterschied zwischen zweimal x und einmal y?

von Max M. (bytekiller)


Lesenswert?

m.n. schrieb:
>
> Vielleicht ist der schnellere, erfolgreichere Weg, einfach einmal C zu
> probieren?
> Das Atmel AVR-Studio 4.18 ist kostenlos herunterzuladen und einfach zu
> installieren. Ein Projekt erstellen, den Quellcode kopieren und das
> Übersetzen sollte fehlerfrei klappen. Wenn es dann noch in Deiner
> Schaltung funktioniert, ist es vielleicht überlegenswert, es auszubauen
> und bei C zu bleiben ;-)

vielleicht ist die Idee ja gar nicht so schlecht.

Gibt es irgendein Tutorial, das Du mir für den Anfang empfehlen kannst?

von Amateur (Gast)


Lesenswert?

Schau mal oben links auf dieser Home-Page. Da gibt's:
AVR-GCC-Tutorial

von m.n. (Gast)


Lesenswert?

Amateur schrieb:
> Schau mal oben links auf dieser Home-Page. Da gibt's:
> AVR-GCC-Tutorial

Und hier gibt http://www.mikrocontroller.net/articles/Atmel_Studio es 
viele Links zu AVR Studio, wobei die Version 4.19 gut geeignet ist. Die 
124 MB sind auch schnell geladen und enthalten die komplette 
Installation.

von Karl H. (kbuchegg)


Lesenswert?

Max Muster schrieb:

> Funktioniert so aber absolut nicht,

Das das hier
1
...
2
  Taster Alias Pind. 2
3
  Pinb. 0 = 1              'Pull Up Widerstand
4
...

nicht funktioniert, glaub ich dir sogar.

Der Pullup sollte natürlich schon auch auf dem Pin eingeschaltet werden, 
an dem der Taster hängt. Und eingeschaltet wird ein Pullup mit dem Port 
Register und nicht dem Pin Register (wobei ich mir nicht sicher bin, ob 
das bei BASCOM nicht egal ist)

von Karl H. (kbuchegg)


Lesenswert?

Max Muster schrieb:

> vielleicht ist die Idee ja gar nicht so schlecht.
>
> Gibt es irgendein Tutorial, das Du mir für den Anfang empfehlen kannst?

Wenn du da auch so planlos, unstrukturiert und schlampig rangehst wie 
bei der BASCOM-Programmierung, wird das allerdings nichts werden. Noch 
simpler als mit BASCOM kriegst du es nirgends(Arduino spielt noch in 
einer ähnlichen Liga). Und selbst das kriegst du nicht hin.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Wenn du da auch so planlos, unstrukturiert und schlampig rangehst wie
> bei der BASCOM-Programmierung, wird das allerdings nichts werden. Noch
> simpler als mit BASCOM kriegst du es nirgends (Arduino spielt noch in
> einer ähnlichen Liga). Und selbst das kriegst du nicht hin.

Gib ihm die Zeit, die er braucht. Bei Anderen bist Du ja auch nicht so 
demotivierend. Treten hilft da überhaupt nicht :-(

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.