Hallo zusammen,
den ganzen Tag experimentiere ich nun schon mit AVR Studio um einen
vernünftigen C-Code hinzubekommen, der mir ein Eingangssignal auswertet
und den Eingangspin entprellt.
Ich möchte:
- bei vorhandenem Eingangssignal eine Schleife laufen lassen, die eine
bestimmte Zeit verstreichen lässt, aber das nur solange, wie auch das
Eingangssignal vorhanden ist
- ist das Eingangssignal zu kurz, soll auch die Schleife wieder
abgebrochen werden und der Controller soll nichts unternehmen
Ich war schon soweit, dass es funktioniert hat aber der Ausstieg aus der
Schleife erfolgte willkürlich, das heißt, mal wurde die Schleife 1x
durchlaufen, aber manchmal auch 2x bevor der Controller ausstieg! Ich
habe keine Ahnung warum...
Konkret geht es darum, das ich ein Signal haben möchte, wenn ein
Eingangstaster länger als, sagen wir 1 Sekunde, gedrückt bleibt.
die "billige" Version mit _delay_ms hatte ich auch schon getestet, aber
wenn ich den taster kurz antippe, und 1 sekunde später nochmal kurz,
dann hab ich trotzdem ein "falsch" erkanntes eingangssingal von 1
sekunde dauer. das ist natürlich nicht beabsichtigt.
ich suche einen c-quellcode der nur auf 1 sekunde "dauerhaften"
tastendruck reagiert und dann demenstprechend return 1 oder return 0
zurückgibt.
jemand ne idee?
ich habe schon alle optimierungsstufen von o0 bis 0s durch, eingestellte
parameter stimmen auch alle...
hier wäre mein codebeispiel für die funktion, aber es geht nicht.
compilerfehlermeldungen = 0, aber eingangssignal wird nicht erkannt.
eine led die leuchten sollte, tut es nicht ;) ausser nur, wenn man sie
manuell ansteuert mit PORTD |= (1<<PD4).
das allerkomischste ist es, dass es mal exakt 1 sekunde dauert, bis auf
tastendruck reagiert wird, und dann mal exakt 2 sekunden! nur warum? :(
christian
1 | // Funktion: Taster entprellen und abfragen
|
2 | int status_standardtaster(void)
|
3 | {
|
4 |
|
5 | warten = 0;
|
6 |
|
7 | do
|
8 | {
|
9 |
|
10 | if ( (PIND & (1<<PIND5)) ) // Eingangssignal vorhanden?
|
11 | {
|
12 | warten = warten + 1;
|
13 |
|
14 | if (warten > 10000) { return 1; } // Eingangssignaldauer lange genug
|
15 | }
|
16 |
|
17 | if ( !(PIND & (1<<PIND5)) ) { return 0; } // Eingangssignal nicht da
|
18 |
|
19 | }while( (PIND & (1<<PIND5)) ); // Solange Eingangssignal vorhanden
|
20 |
|
21 | return 0;
|
22 | }
|