Forum: Mikrocontroller und Digitale Elektronik Schalter zu Taster


von Jan S. (Gast)


Angehängte Dateien:

Lesenswert?

Moin! Ich suche nach einer Möglichkeit, aus einem Schalter einen 
Tastimpuls zu machen. Wenn man also den Schalter drückt, wird ein kurzer 
Impuls ausgegeben, wenn man den Schalter wieder in die Aus-Stellung 
bewegt hat, soll jedoch kein Impuls gegeben werden. Dies soll 4x im 
µController unabhängig voneinander möglich sein. Im Anhang habe ich eine 
Grafik erstellt, die das verdeutlichen soll. Als µController nehme ich 
den ATtiny2313.
Ich habe bereits ein "Grundgerüst" in Bascom geschrieben, komme aber 
nicht weiter:
1
$regfile = "2313def.dat"
2
$crystal = 1000000
3
4
Config Portb.0 = Output
5
Config Portb.1 = Output
6
Config Portb.2 = Output
7
Config Portb.3 = Output
8
Config Pind.0 = Input
9
Config Pind.1 = Input
10
Config Pind.2 = Input
11
Config Pind.3 = Input
12
13
14
Do
15
   If Pind.0 = 1 Then
16
      Gosub P0
17
   Elseif Pind.1 = 1 Then
18
      Gosub P1
19
   Elseif Pind.2 = 1 Then
20
      Gosub P2
21
   Elseif Pind.3 = 1 Then
22
      Gosub P3
23
   Else
24
      Gosub nothing
25
   End If
26
Loop
27
28
29
P0:
30
Portb.0 = 1
31
Waitms 80
32
Portb.0 = 0
33
Return
34
35
P1:
36
Portb.1 = 1
37
Waitms 80
38
Portb.1 = 0
39
Return
40
41
P2:
42
Portb.2 = 1
43
Waitms 80
44
Portb.2 = 0
45
Return
46
47
P3:
48
Portb.3 = 1
49
Waitms 80
50
Portb.3 = 0
51
Return
52
53
nothing:
54
return

Ich hoffe, ihr könnt mir helfen. Gruß,
Jan

von Hubert G. (hubertg)


Lesenswert?

Wenn der Kontroller sonst nichts tun muss und es egal ist wenn Impulse 
verzögert kommen wenn zwei oder mehr Schalter gleichzeitig betätigt 
werden, könnte es funktionieren.
Allerdings musst du noch festlegen das ein Eingang wenn er mal 1 ist, 
erst wieder abgefragt wird wenn er auf 0 gegangen ist.
Eventuell muss auch das Tastenprellen berücksichtigt werden.

von Jan S. (Gast)


Lesenswert?

Hallo!

Hubert G. schrieb:
> Wenn der Kontroller sonst nichts tun muss und es egal ist wenn Impulse
> verzögert kommen wenn zwei oder mehr Schalter gleichzeitig betätigt
> werden, könnte es funktionieren.
Das sollte kein Problem sein, da immer nur 1 Schalter gedrückt ist.

> Allerdings musst du noch festlegen das ein Eingang wenn er mal 1 ist,
> erst wieder abgefragt wird wenn er auf 0 gegangen ist.
Das ist meine Schwierigkeit ;-) Hättet ihr da vielleicht einen 
Codeschnipsel für mich?

> Eventuell muss auch das Tastenprellen berücksichtigt werden.
Das geht doch soweit ich weiss mit Debounce, muss ich mir nochmal in der 
Bascom-Referenz ansehn und einbauen.

Gruß, Jan

von astroscout (Gast)


Lesenswert?

Hallo,
ich kenne mich mit Bascom jetzt nich so wirklich aus, aber mal eine 
prizipielle Anregung:
Du Fragst die Schalter bisher immer direkt am. Schreib dir dazu eine 
Funktion, die eine nur 1 zurück gibt, wenn du eine steigende Flanke am 
Eingang hast. Dazu musst du den letzten Wert des Scahlters mit dem 
aktuellen Wert vergleichen.
Das mit dem Wait sollte so funktionieren, allerdings kannst du für die 
Dauer des Impulses keine weiteren Taster abfragen. Eleganter und genauer 
wäre es, wenn du den timer verwendest.

von Richi (Gast)


Lesenswert?

Kann zwar leider kein BASCOM
aber hier mal ein beispiel in C hoffe es hilft dir weiter
die 50ms delay sind für die Tastenentprellung

mfg
Richi
1
if(PORTB.1 == 1 && MerkerB.1 == 0)
2
{
3
   _delay_ms(50);
4
   if(PORTB.1 == 1)
5
   {
6
      MerkerB.1 = 1;
7
      P1();
8
   }
9
}
10
else
11
{
12
   MerkerB.1 = 0;
13
}

von Helfer (Gast)


Lesenswert?

1
$regfile = "2313def.dat"
2
$crystal = 1000000
3
4
'        Vcc
5
'         |
6
'         # int. Pull Up
7
'         |
8
' Pin PD0 o----+
9
'              |
10
'               \ Schalter
11
'              |
12
'             GND
13
'
14
Config Pind.0 = Input
15
Portd.0 = 1 ' int. Pullup ein
16
17
'
18
' Pin PB0 o--###-->|--o GND
19
'
20
Config Portb.0 = Output
21
22
'
23
' Ausgangsbedingungen
24
'
25
Dim P0_pegel As Byte
26
P0_pegel = Pind.0
27
28
Do
29
  If Pind.0 = 1 And P0_pegel = 0 Then
30
    ' Steigende Flanke 0 nach 1 erkennen und Aktion durchführen
31
    P0_pegel = 1
32
    Portb.0 = 1
33
    Waitms 80 ' Überspringt implizit Prellen
34
    Portb.0 = 0
35
  Elseif Pind.0 = 0 And P0_pegel = 1 then
36
    ' Fallende Flanke 1 nach 0 erkennen und P0_pegel zurücksetzen
37
    Waitms 30 ' Prellen abwarten
38
    P0_pegel = Pind.0
39
  End if
40
Loop

von bitte löschen (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe das für mich hardwaremäßig ohne uC gelöst, um einen Zähler 
anzusteuern.
Vielleicht hilft das weiter.

Edit:
der LM339 ist ein Komperator, kein OP.

von Richi (Gast)


Lesenswert?

sorry das erste und zweite if gehören vertauscht oder du machst bei else 
noch eine if abfrage rein die überpüft ob der pin wieder auf null ist

von Thorsten S. (whitejack)


Lesenswert?

@Philipp Klostermann

Tip:

XOR Gatter mit zwei Eingängen.

An den Eingang 1 den Taster.(Taster im Ruhezustand L, gedrückt H)
An den Eingang 2 den Ausgang. (Ausgang ist auch Nutzsignal)

http://de.wikipedia.org/wiki/XOR-Gatter

NE555 kann das auch.

http://www.elektronik-kompendium.de/sites/slt/0310121.htm


T.

von bitte löschen (Gast)


Lesenswert?

@Thorsten S:
Den kannte ich schon, aber:
Das entprellt nicht.
Und: Wenn die Bausteine, die das Signal verarbeiten (als Impuls 
erkennen) sollen, langsamer sind als die XOR-Gatter, wird das ganze 
unzuverlässig.
Ich habe da recht lange herumprobiert, auch mit NE555 experimentiert. 
Der NE555 (blos ein Timer) bzw. NE556 (gerade mal einer mehr) hat mir zu 
viele Pins pro Taste. Hühnerfutter braucht man auch da.
Du kannst ja mal in den Thread 
Beitrag "Simulation - Prellen/Entpellen von Tastern" schauen. Da habe ich ein 
AVR-Programm zum Aufzeichnen des Prellens für eine LTSpice-Simulation 
der Tiefpass-Hochpass-Kombination und die passendende Spice-Datei 
eingestellt.

von Samuel C. (dragonsam)


Lesenswert?

Mein Tipp: Frage die Eingänge nicht mit IF ab sondern nutze DEBOUNCE. 
Das entprellt und wertet die Flanke aus. Also nur ein Impuls bis zum 
nächsten High-Pegel.

von Thorsten S. (whitejack)


Lesenswert?

...es geht nicht ums Entprellen...Ihr verwechselt da was...

T.

von Karl H. (kbuchegg)


Lesenswert?

Ich würde es so machen:


FÜr jeden SChalter gibt es einen Variable die den aktuellen 
Schalterzustand hält.
Weiters gibt es für jeden Schalter eine Variable die als Zähler 
fungiert.

Du fragst ständig die Schalter reihum ab. Detektierst du (mit dem 
gemerkten Zustand von vorher), dass der Schalter sich von 0 auf 1 
geändert hat, dann schaltest du den Ausgangspin auf 1 und einen Wert in 
die Zählvariable.

In jedem Schleifendurchlauf schaust du dir die Zähler an. Ist er 
ungleich 0, dann verringerst du ihn um 1. Wird er dadurch 0, so 
schaltest du den Ausgang wieder auf 0 zurück.

Für einen Schalter ungefähr so
1
Schalter1 = Pind.0
2
Zaehler1 = 0
3
4
do
5
6
  SchalterJetzt = Pind.0
7
  if Schalter1 <> SchalterJetzt then    ' ist am Eingang etwas passiert ?
8
    Schalter1 = SchalterJetzt
9
10
    if Schalter1 = 1 then               ' der Schalter wurde eingeschaltet
11
      Zaehler1 = 100                    ' Wartezeit für den Puls
12
                                        ' ist im Zusammenhang mit dem Waitms
13
                                        ' zu sehen
14
      Portb.0 = 1                       ' und AUsgang auf 1
15
    endif
16
  endif
17
18
19
  if Zaehler1 > 0 then                  ' läuft der Zaehler für den Schalter 1?
20
    Zaehler1 = Zaehler1 - 1             ' Ja, er läuft noch
21
  else
22
    PortB.0 = 0                         ' Nein, Ausgang abschalten
23
  endif
24
25
  waitms( 10 )
26
loop


(nicht getesteter Code. Aber so in etwa müsste es hinkommen. Weitere 
Schalter kannst du nach Belieben nach dem Muster hinzufügen.

von bitte löschen (Gast)


Lesenswert?

Thorsten S. schrieb:
> Ihr verwechselt da was...

Hier verwechselt keiner etwas, nur drängt sich die Frage nach der 
Entprellung bei der Pulserzeugung aus einem Geber, der viele kleine 
Impulse erzeugt, auf.
Ich frage mich, warum hierfür ein uC verwendet werden soll, der dann 
auch noch vollzeitmäßig damit beschäftigt ist, wenn es Bauteile für ein 
paar Cent (inklusive wenigem Hühnerfutter) genauso gut tun.

von Jan S. (Gast)


Lesenswert?

Wie ich oben schon schrieb, das ganze sollte 4 mal möglich sein. Und 
deine Schaltung 4 mal aufzubauen, wäre vom Platz und Aufwand her nicht 
wirklich die beste Lösung ;-)

von bitte löschen (Gast)



Lesenswert?

Geht so. :-)
Dieses Steckboard-Modul invertiert 2 mal, um sowohl positive Impulse als 
auch negative ohne Einfluss der Ausgangsimpedanz zu haben. (Siehe 
Schaltplan) Du kannst also in Gedanken die beiden 4011 rechts durch 
einen ersetzen und Dir die Stecknadeln und die Leiterbahnen dorthin 
wegdenken.
Wenn Du die Logik um den LM339 herum umkehrst (ich brauchte halt gerade 
negative Impulse, als ich das konzipieret habe) und die Eingangsstufe, 
die Deine Impulse erhalten soll recht hochohmig ist (die 4011 sind nur 
für die universellere Verwendung auf dem Steckboard), kannst Du Dir den 
auch noch sparen.

von Elektroniker (Gast)


Lesenswert?

Wie soll sich das Teil benehmen, wenn der Eingansimpuls kürzer als der 
Ausgangsimpuls ist? Oder ist durch andere Randbedingungen 
sichergestellt, dass dieser Fall nie eintritt?

Wie lang soll der Ausgangsimpuls sein (us, ms, s, ..., d, a)?

von bitte löschen (Gast)


Angehängte Dateien:

Lesenswert?

Philipp Klostermann schrieb:
> Wenn Du die Logik um den LM339 herum umkehrst ..
Ich habe das mal mit LTSpice durchgespielt, und da macht es einen guten 
Eindruck und erzeugt positive Impuse von etwa 6,7 ms Länge, was reichen 
sollte. Ansonsten die Kondensatoren entsprechend höher dimensionieren.
Erläuterung:
Die linke Spannungsquelle wird aus einer PWL-Datei gespeist, die die 
Aufnahme von einem Tastendruck in negativer Form (also 5V für aus und 0V 
für an) repräsentiert. Sie und die Diode repräsentieren einen Taster 
gegen GND. (Die Diode ist drin, weil ein Taster gegen GND nicht nach +5V 
hochziehen kann.)
Die Schaltung dürfte einen recht weiten Bereich für die 
Spannungsversorgungen haben, da nur mit linearen Verhältnissen 
(Spannungsteiler, Komperator) gearbeitet wird.

von Peter D. (peda)


Lesenswert?

Philipp Klostermann schrieb:
> Geht so. :-)
> Dieses Steckboard-Modul invertiert 2 mal, um sowohl positive Impulse als
> auch negative ohne Einfluss der Ausgangsimpedanz zu haben.

So und nun stell Dir mal vor, dieser ganze Wust an 40 Bauteilen ist weg 
und nur ein einziger 14-Pinner MC ist drauf.
Zugegeben, die AVR-Preise sind ganz schön angezogen (ATtiny24: 1,60€), 
aber dafür sparst Du ne Menge Layout und Lötzeit ein.

Sobald ein MC mehrere ICs + nen Haufen Hühnerfutter ersetzen kann, mache 
ich das auch.


Peter

von Thorsten S. (whitejack)


Lesenswert?

zum Entprellen für Logik habe ich immer einen

4093 + kleinen Kondensator und Widerstand bevorzugt.

für längere Zeiten:

http://www.conrad.de/ce/de/product/170771/IC-SN-74121-N-DIP#download-dokumente

Monostabile Kippstufen....

T.

von bitte löschen (Gast)


Lesenswert?

Peter Dannegger schrieb:
> mehrere ICs

Und ich hatte mir so hübsch Mühe gegeben, die Variante für positive 
Impulse, die mit nur einem IC für 4 Taster auskommt, auszuarbeiten und 
zu dokumentieren.

Peter Dannegger schrieb:
> aber dafür sparst Du ne Menge Layout und Lötzeit ein.

Man wird aber vor die Alternative gestellt, entweder eine 
SPI-Schnittstelle mit ins Layout integrieren zu müssen, oder den uC 
vorher programmieren zu müssen, was mit einem SO-Gehäuse Frickelei mit 
dem Lötkolben oder die Investition in eine entsprechende Fassung 
bedeutet.

Wenn man das möglichst schnell ohne Rücksicht auf Kosten und 
Programmieraufwand realisieren möchte, kann man das gerne mit einem uC 
machen. Aber es soll ja auch Spaß machen!

Das Hühnerfutter ist recht großzügig verteilt und lässt sich bestimmt 
auch noch etwas zusammenrücken.

Thorsten S. schrieb:
> zum Entprellen für Logik habe ich immer einen
>
> 4093 + kleinen Kondensator und Widerstand bevorzugt.

Wenn es nur um das Entprellen geht, mache ich das auch, bzw. nutze einen 
40106, was keinen großen Unterschied macht.

Thorsten S. schrieb:
> für längere Zeiten:
>
> http://www.conrad.de/ce/de/product/170771/IC-SN-74...

Preis auf der genannten Website: € 2,25

Na dann doch lieber einen uC nehmen! :-D ;-)

von Tip (Gast)


Lesenswert?

Thorsten S. schrieb:
> http://www.conrad.de/ce/de/product/170771/IC-SN-74...
> Monostabile Kippstufen....

Und die ganze Bohrerei nur, um ein paar Bytes im ATtiny2313 zu sparen ..
;-)

von Karl H. (kbuchegg)


Lesenswert?

Philipp Klostermann schrieb:
> Peter Dannegger schrieb:
>> mehrere ICs
>
> Und ich hatte mir so hübsch Mühe gegeben, die Variante für positive
> Impulse, die mit nur einem IC für 4 Taster auskommt, auszuarbeiten und
> zu dokumentieren.

Gewöhn dich daran. Was man früher diskret und mit Hühnerfutter aufgebaut 
hat, macht man heute mit einem kleinen µC.

von bitte löschen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Gewöhn dich daran. Was man früher diskret und mit Hühnerfutter aufgebaut
> hat, macht man heute mit einem kleinen µC.

Daran kann ich mich gewöhnen, was ich aber etwas schade finde ist, dass 
viele die Analogtechnik auch vom Interesse her vernachlässigen. Mein 
Zip-File hat nach 7 Stunden und 5 Beiträgen 0 Downloads, und das spricht 
für sich.

von Markus B. (mbp-bayern)


Lesenswert?

Philipp Klostermann schrieb:
> nach 7 Stunden und 5 Beiträgen 0 Downloads

Hallo Philip,

obwohl ich diese Simulation vor 20 Minuten heruntergeladen und 
ausprobiert habe, so stand soeben noch immer 0 Downloads.
Villeicht geht ja nur der Zähler nicht.

Für meinen Teil würde ich im Übrigen gedanklich zu einem
74xx er Schmitt Trigger Logik-Gatter tendieren,
hab mir aber keine ausführlichen Gedanken gemacht.

MFG:MBP
Markus.

von new (Gast)


Lesenswert?

dumme Frage, hat der Tiny keinen Pin-Change Interrupt, wie der Mega8? 
Bin grad zu müde das Datenblatt zu suchen.
Aber den kann man doch auf eine Positive Flanke einstellen, wenn ich 
mich nicht täusche, zum entprellen müsste man den Pin dann nur aus der 
Maske entfernen und fertig.
Sleep sollte auch noch möglich sein.

von bitte löschen (Gast)


Lesenswert?

Markus B. p. schrieb:
> Für meinen Teil würde ich im Übrigen gedanklich zu einem
> 74xx er Schmitt Trigger Logik-Gatter tendieren,
> hab mir aber keine ausführlichen Gedanken gemacht.

So richtig tiefgehende Typenrecherchen von Schmitt-Triggern habe ich 
auch noch nicht gemacht, zumal die Angaben der Schwell- und 
Schaltspannungen sehr temperaturabhängig ist, so dass ich einfach den 
40106 (0,17 SMD bei R.) nehme, wenn es nur darum geht, Tasten zu 
entprellen, weil es da nicht so auf präzise definierte Werte ankommt, er 
leicht verfügbar ist, und bis zu 15V Versorgungsspannung verträgt. Der 
Vorteil der 74er Typen gegenüber den H(F)C4000er Typen ist die 
Geschwindigkeit, und die spielt bei manuellen Eingaben jetzt nicht soo 
die tragende Rolle. ;-) Der 74HC14 (0,22 SMD bei R.) verträgt 7V Vcc und 
damit nur die Hälfte.

Im Fall des Impulsformers ist ein Schmitt-Trigger nicht geeignet, da die 
Spannung des Eingangsimpulses für den Schmitt-Trigger nach dem Hochpass 
nicht die Einschaltspannung vom 7414 (2,3V - 3,15V bei 4,5V Vcc) oder 
vom 40106 (2,2V - 3,6V bei 5V Vcc) erreicht, und man sich mit einem 
Komperator und etwas Hühnerfutter einen passenden Schmitt-Trigger selbst 
stricken muss. (Oder gibt es so etwas wie "Hex Schmitt Triggers with 
commonly adjustable Trigger Voltages and Hysteresis" :-D )

Die Anzahl der Downloads scheint verzögert angezeigt zu werden. Nun 
werden 3 Downloads angezeigt.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Philipp Klostermann schrieb:
> Die Anzahl der Downloads scheint verzögert angezeigt zu werden. Nun
> werden 3 Downloads angezeigt.

Ich war's nicht, denn ich stehe nicht auf Simulationen. Ich stehe auch 
nicht darauf, solche Dinge mit Gattergräbern und Hühnerfutter zu 
erschlagen, seitdem es bezahlbare AVRs gibt, denn ich mag keine 
Platinen, die so kompliziert sind, dass man sie mit einfachen 
Bastlermitteln nicht mehr selbst anfertigen kann. Eine Schaltung mit AVR 
braucht neben dem ATTiny2313 noch einen Stütz-Kerko an der Versorgung 
und einen PullUp-Widerstand am Reset.

Und natürlich etwas Software.

Ich hänge mal zwei Quältexte dafür an, einen in ASM (braucht sehr wenig 
Ressourcen) und einen in Bascom (sehr verschwenderisch betreffs 
Ressourcen).

Beide unterstützen 8 Kanäle zur Impulsformung, haben eine 
Sorglos-Entprellung (gemäß Peter Dannegger) und eine im 16ms-Raster 
einstellbare Impulsdauer.

...

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.