Forum: Mikrocontroller und Digitale Elektronik Benötige Hilfe bei Programm: Taster betätigt LED ein, Taster loslassen LED nach 2s aus


von Vasir (Gast)


Lesenswert?

Hallo,

ich verwende den PIC16F88 und programmiere mit dem CCS - Compiler in C.

Ich würde gerne mit einem Taster eine LED ansteuern.

Wenn der Taster betätigt wird, soll die LED angehen.
Sobald der Taster losgelassen wird, soll die LED 2s
zeitverzögert ausgehen.

Dazu habe ich folgendes Programm geschrieben.

while(true)
{
if(input(PIN_A6))
   {
   output_high(PIN_A1);
   delay_ms(2000);
   output_low(PIN_A1);
   }
else
   {
   output_low(PIN_A1);
   }
}

Das ist ein Teilausschnitt meines Programms. Dieser Teilausschnitt 
befindet sich in der while Schleife ganz unten. Wenn der Taster betätigt 
wird, also PIN_A6 auf high geht, dann leuchtet die LED auf. Wird jedoch
der Taster losgelassen, dann geht die LED nicht nach 2s aus, sondern 
erst nach ca. 6s. Mir scheint als wenn das Programm erst verzögert 
merkt, dass der Taster losgelassen wurde. Kann mir jemand sagen was man 
dagegen tun kann?. Wenn ich die Anweisung von ganz unten im programm 
nach oben setze,
dann geht die LED nachdem der Taster losgelassen wurde ca. 4 mal an und 
aus und bleibt erst dann aus. Hat jemand eine Idee?

Vielen Dank!

von ... .. (docean) Benutzerseite


Lesenswert?

Vasir schrieb:
> Wird jedoch
> der Taster losgelassen, dann geht die LED nicht nach 2s aus

das hast du da oben aber nicht programmiert...

du hast:
Taster high?
LED an!
2s warten
LED aus!
nicht Taster high
LED aus

dabei ist das warten völlig unabhänggig vom taster, wenn einmal taster 
high wird 2 s gewaret egal was der taster macht!

wenn natürlich nach den 2s der taster immer noch high ist, wird die led 
natürlich gleich wieder eingeschaltet

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1
while(true)
2
{
3
   if( input(PIN_A6) )
4
   {
5
     output_high(PIN_A1);
6
     while( input(PIN_A6) ); // auf Loslassen warten
7
     delay_ms(2000);         // Trödele hier 2s lang
8
     output_low(PIN_A1);
9
   }
10
}

Oder:
1
while( true )
2
{
3
   static int16_t zaehler = 0;
4
5
   if( input(PIN_A6) )
6
   {
7
     zaehler = 2000;
8
     output_high(PIN_A1);
9
   }
10
11
   if ( zaehler != 0 )
12
   {
13
     zaehler -= 1;
14
     delay_ms(1); // Trödele nur 1ms
15
   }
16
   else
17
     output_low(PIN_A1);
18
19
   // Mach ab hier noch was 
20
   // aber nichts so langes 
21
   // im Vergleich zu 1ms!
22
}

Oder befasse dich mit dem Thema Timer

von Vasir (Gast)


Lesenswert?

Vielen Dank für die schnellen Antworten!

@Stefan:

Ich habe das erste Programmbeispiel ausprobiert.
Die LED geht trotzem nach dem loslassen des Taster nicht
nach 2s sondern erst nach ca. 5 bis 6 sek. aus.
Ich verwende den internen Oszillator des PIC 16F88. Eingestellt hab ich 
ihn auf 4 MHz. #use delay(clock=4000000) habe ich auch aufgerufen.
Noch eine Idee woran es liegen könnte?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du kannst mindestens zwei Fehlerquellen haben.

Stimmt die Einstellung auf 4 MHz?

D.h. Testprogramm ohne Einfluss der Taster schreiben: Kannst du eine LED 
im 1s Takt zum Blinken bringen?

Stimmt die Hardware, d.h. die Tasterschaltung?

Dein Programm setzt anscheinend eine active high (gedrückter Taster: 
input(Eingabepin) != 0) Schaltung voraus. Irgendwo muss also ein 
Pulldown Widerstand verbaut sein, um den Ruhezustand LOW zu garantieren.

von Vasir (Gast)


Lesenswert?

Es funktioniert :O), wenn ich einen Pullabwiderstand verwende und
den Eingang PIN_A6 auf 0 abfrage.

While(true)
{
if((!input(PIN_A6))
{
output_high(PIN_A1);
while(input(!PIN_A6));
delay_ms(2000);
output_low(PIN_A1);
}
}

Eine Frage habe ich noch.

Ist es überhaupt möglich diese Funktion hinzubekommen, ohne einen Pull 
Down oder Pull Up Widerstand zu verwenden?

Vielen Dank für die Hilfe!!!

von Max (Gast)


Lesenswert?

Möglich ist das, aber nicht ganz so sicher.
Stichwort dazu "Taster-Entprellung"

von Karl H. (kbuchegg)


Lesenswert?

Vasir schrieb:

> Ist es überhaupt möglich diese Funktion hinzubekommen, ohne einen Pull
> Down oder Pull Up Widerstand zu verwenden?

Kommt auf den Taster an.
Der Pulldown/Pullup hat ja eine elektrische Funktion.
Er soll verhindern, dass dein Inputpin 'in der Luft hängt'. Denn dann 
kann er Gott weiß was für einen Pegel einnehmen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Pullabwiderstand

= Pull-Up Widerstand? Also Widerstand zu Vcc?
oder
= Pull-Down Widerstand? Also Widerstand zu GND?

> Ist es überhaupt möglich diese Funktion hinzubekommen, ohne einen Pull
> Down oder Pull Up Widerstand zu verwenden?

Wenn Pull-Up, das ist möglich, wenn du den Eingabepin nicht auf PORTA 
legst, sondern auf PORTB. PORTB hat lt. Datenblatt interne per Software 
zuschaltbare Pull-Up-Widerstände. Dann brauchst du keinen externen.

von Vasir (Gast)


Lesenswert?

Okay, wieder einiges dazu gelernt :O)

Vielen Dank!

von Vasir (Gast)


Lesenswert?

Nein, ich meine, ob es generell möglich ist ohne Pull Up oder Pull Down 
Widerstand dieses Funktion mit dem Taster und der LED hinzubekommen.
Auch ohne das ich die internen verwende. Also Quasi, ob ich die Funktion 
hinbekomme, wenn ich einfach nur den Taster an 5V anschließe und den 
anderen Anschluss direkt an den PIN_A6 lege.

von Karl H. (kbuchegg)


Lesenswert?

Vasir schrieb:
> Nein, ich meine, ob es generell möglich ist ohne Pull Up oder Pull Down
> Widerstand dieses Funktion mit dem Taster und der LED hinzubekommen.
> Auch ohne das ich die internen verwende. Also Quasi, ob ich die Funktion
> hinbekomme, wenn ich einfach nur den Taster an 5V anschließe und den
> anderen Anschluss direkt an den PIN_A6 lege.

Und nochmal.
Das hängt von deinem Taster ab.
Wenn der zwiswchen Vcc und GND hin und herschaltet, dann ja.
Aber meistens verschaltet man Taster nicht so, weil es technisch nicht 
so einfach ist einen Taster zu bauen, der seine Ausgangsleitung nie (zu 
keinem Zeitpunkt) in der Luft hängen lässt.

Die Leitung zum µC darf nie einfach nur so zum µC gehen und am anderen 
Ende in der Luft hängen. Dein Taster verbindet sie mit VCC, wenn du den 
taster drückst. Aber wenn du den Taster nicht drückst, dann führt die 
Leitung ins Leere. Und das darf nicht sein. Denn diese Leitung hat dann 
keinen definierten Pegel mehr.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mit einem speziellen Taster, der kontaktseitig eine Seite von Vcc auf 
GND umschalten kann, ja.
1
           ___
2
            |
3
      +---o | o------Vcc
4
      |   =====
5
      |     #
6
Pin --+---o # o------GND
7
            #
8
9
# = Feder

Ist aber eine heisse Kiste, denn wenn Pin durch einen Softwarefehler auf 
Ausgang geschaltet wird, kann zu viel Strom in den µC rein oder raus und 
der µC raucht ab (Kurzschlußfall).

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.