Schalter zu Taster

Gast #2138197
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
Angehängte Dateien:
#2138205
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.
Gast #2138216
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
Gast #2138226
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.
Gast #2138231
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
}
Gast #2138242
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
Gast #2138597
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.
#2138721
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.
Gast #2138735
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.
Gast #2138913
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.
Gast #2139026
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)?
Gast #2139398
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.
Angehängte Dateien:
#2139447
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
Gast #2139668
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 ;-)
Gast #2139892
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.
#2139944
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.
Gast #2139956
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.
Gast #2140001
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.
#2140539
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.

...
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren