www.mikrocontroller.net

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


Autor: Vasir (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(true)
{
   if( input(PIN_A6) )
   {
     output_high(PIN_A1);
     while( input(PIN_A6) ); // auf Loslassen warten
     delay_ms(2000);         // Trödele hier 2s lang
     output_low(PIN_A1);
   }
}

Oder:
while( true )
{
   static int16_t zaehler = 0;

   if( input(PIN_A6) )
   {
     zaehler = 2000;
     output_high(PIN_A1);
   }

   if ( zaehler != 0 )
   {
     zaehler -= 1;
     delay_ms(1); // Trödele nur 1ms
   }
   else
     output_low(PIN_A1);

   // Mach ab hier noch was 
   // aber nichts so langes 
   // im Vergleich zu 1ms!
}

Oder befasse dich mit dem Thema Timer

Autor: Vasir (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vasir (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Max (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vasir (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, wieder einiges dazu gelernt :O)

Vielen Dank!

Autor: Vasir (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem speziellen Taster, der kontaktseitig eine Seite von Vcc auf 
GND umschalten kann, ja.
           ___
            |
      +---o | o------Vcc
      |   =====
      |     #
Pin --+---o # o------GND
            #

# = 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.