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
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
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!!!
Möglich ist das, aber nicht ganz so sicher. Stichwort dazu "Taster-Entprellung"
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.
Okay, wieder einiges dazu gelernt :O) Vielen Dank!
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.