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!
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
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?
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.
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!!!
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.
> 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.
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.
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.
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).