PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasten an einem ADC, Versuch zu entprellen



newbie1982
29.07.2008, 23:28
hi Leute,
ich versuche grade ein Board durch Tasten zu steuern.
Ich habe Drei Tasten am Board die mit einem ADW eines Tiny45 verbunden ist.
Taste 1 gibt 1,3 aus
Taste 2 gibt 2,6 aus
Taste 3 gibt 4,7 aus
eine ADW funktion wurde so definiert so dass ich werte zwischen 0-5 bekomme.
Ich habe folgendes Code erstellt damit ich die Tastenenprelle.

nun Weiss ich nicht ob alles richtig ist:-)
bitte um Hilfe und Verbesserungvorschläge.

sternst
30.07.2008, 07:28
Sorry, aber das funktioniert doch hinten und vorne nicht.

1)
((adwert > 0.5) && (adwert < 1.5))

adwert ist ein "unsigned short". Vergleiche mit "Komma-Zahlen" sind da ziemlich sinnfrei. Wie das am besten zu korrigieren ist, hängt davon ab, was aus ADkanallesen tatsächlich rauskommt.

2)
((adwert < 0.5) && (adwert > 5))

Ist immer False. Du meintest wohl eher "||".

3)
Taste = KeinKontakt | Taste = Taste1 | Taste = Taste2 | Taste = Taste3;
...
((Taste = Taste1) && (Taste = Taste1));

Das macht garantiert nicht das, was du haben wolltest. Da ich aber nicht mal einen blassen Schimmer habe, was du eigentlich damit bezwecken wolltest, kann ich dir keinen Korrekturvorschlag machen.

newbie1982
30.07.2008, 10:56
HI , DANKE FÜR DEINE ANTWORT:
ADKANALLESEN HABE ICH SO GESCHRIEBEN DASS ICH DANN DIREKT WERTE ZWISCHEN 0 UND 5 BEKOMME. DIE DIGITALISIERTE WERTE WERDEN DIREKT IN DER FUNKTION DURCH 1024 DIVIDIERT
ICH WOLLTE ES SO MACHEN.
ZUERST VIER ZUSTÄNDE DEFINIEREN.

ZUSTAND 1:(KEINKONTAKT) WO DER ANALOGWERT KLEINER ALS 0,5 "ODER" GRÖSSER ALS 5 (((adwert < 0.5) || (adwert > 5)) )
ZUSTAND2:(TASTE1) 0,5<ADWERT<1,5
ZUSTAND3:(TASTE2) 2<ADWERT<3
ZUSTAND4:(TASTE3) 4<ADWERT<5

DANACH WOLLTE ICH DIE TASTEN SO EINFACH WIE MÖGLICH ENTPRELLEN DURCH EINE SWITCH CASE FUNKTION:
WENN NUR WERTE RAUSKOMMEN WEIL TASTE PRELLEN
ZUM BEISPIEL WERTE ZWISCHEN 0 BIS 5 SOLLTE ES NICHT ALS EINEN TASTENDRUCK GESEHEN WERDEN:
DESWEGEN
Taste = KeinKontakt | Taste = Taste1 | Taste = Taste2 | Taste = Taste3;

WENN ZWEIMAL WERTE: 0,5<ADWERT<1,5 ERKANNT WURDEN
SOLLTE ES ALS TASTEEINS DEFINIEREN UND 10 MS WARTEN
>>case TasteEins: ((Taste = Taste1) && (Taste = Taste1));
_delay_ms(10);
break;
UND DAS GLEICHE FÜR TASTEZWEI UND TASTE DREI.

WOLLTE SO EINE ART BESTÄTIGUNG DES TASTENDRUCKS SCHREIBEN
ERST NACH ZWEIMAL ERKENNEN DANN WIRD ALS TASTE ERKANNT:
???

sternst
30.07.2008, 11:30
ADKANALLESEN HABE ICH SO GESCHRIEBEN DASS ICH DANN DIREKT WERTE ZWISCHEN 0 UND 5 BEKOMME.
Aber als was kommen die Werte da raus, Integer oder Float?


WENN NUR WERTE RAUSKOMMEN WEIL TASTE PRELLEN
ZUM BEISPIEL WERTE ZWISCHEN 0 BIS 5 SOLLTE ES NICHT ALS EINEN TASTENDRUCK GESEHEN WERDEN:
DESWEGEN
Taste = KeinKontakt | Taste = Taste1 | Taste = Taste2 | Taste = Taste3;
Die eigentliche Absicht hinter der Zeile verstehe ich immer noch nicht.


WENN ZWEIMAL WERTE: 0,5<ADWERT<1,5 ERKANNT WURDEN
SOLLTE ES ALS TASTEEINS DEFINIEREN UND 10 MS WARTEN
>>case TasteEins: ((Taste = Taste1) && (Taste = Taste1));
_delay_ms(10);
break;

WOLLTE SO EINE ART BESTÄTIGUNG DES TASTENDRUCKS SCHREIBEN
ERST NACH ZWEIMAL ERKENNEN DANN WIRD ALS TASTE ERKANNT:

Ok, hier verstehe ich, was du bezwecken wolltest. Zweck und Sourcecode sind allerdings so dermaßen weit voneinander entfernt, dass ich gar nicht weiß, wo ich mit einer Erklärung anfangen sollte.

Sorry, das mag für dich ziemlich hart klingen, aber der einzige Rat, den ich für dich habe, ist:
Lege dieses Projekt beiseite, nimm dir ein C-Buch und einen PC mit C-Compiler zur Hand, und fange nochmal ganz von vorne mit dem C-Lernen an.

newbie1982
30.07.2008, 11:41
danke dass du dir das angeschaut hast.
und falls du es übersehen hast, da an meinem nich steht newbie.
also hätte ich Verbesserungsvorläge erwartet, nicht so ein Rat als einziger Rat

kater
30.07.2008, 11:45
Rat: Schliesse niemals einen Taster an einen ADC an, das ist Sinnfrei. Ein Taster liefert schon 0 und 1. Ein mC arbeitet mit 0 und 1. Warum erst den Taster als analoges Signal einlesen und umständlich wieder in ein digitales umrechnen. Das kostet Zeit, Speicherplatz und ist fehleranfällig. Siehe Asuro.

Entprelle den Taster per RC Glid oder per Software mit einer kurzen Wartezeit :)

newbie1982
30.07.2008, 12:01
:-) die Tasten habe ich jetzt leider schon an einem ADC, und ich nutze einem 8beinigen controller so dass ich auch nich viele möglichkeiten eine Taste in einem Pin anzuhängen.
und gestern konnte ich dich leider nicht im Chat erwischen, finde ich eine sehr gute Sache von dir.
Ich schaue mir dass nochmal an, habe auch paar Fehler entdeckt, und bessten Dank für die Hilfe

sternst
30.07.2008, 12:25
Rat: Schliesse niemals einen Taster an einen ADC an, das ist Sinnfrei.

Für einen Taster mag das gelten, hier geht es aber um mehrere. Und da ist das sehr sinnvoll, denn mit dem ADC und ein paar Widerständen kann man gleich mehrere Taster über einen Pin einlesen.

sternst
30.07.2008, 12:26
also hätte ich Verbesserungsvorläge erwartet, nicht so ein Rat als einziger Rat

Ich mache gerne Verbesserungsvorschläge, nur in diesem Fall ist es mit ein paar Verbesserungsvorschlägen nicht getan. Ein ausführlicher Kommentar zu deinem Sourcecode wäre gleich ein halber Programmier-Kurs.

Mir ist völlig klar, dass dir eine solche Antwort nicht gefällt. Es geht hier aber ja auch nicht darum, dir zu gefallen, sondern darum, dir zu helfen. Und mein Rat war durchaus ernst gemeint, und wenn du ihn befolgst, würde dir das in meinen Augen bezüglich C am meisten weiterhelfen.

kater
30.07.2008, 12:39
Rat: Schliesse niemals einen Taster an einen ADC an, das ist Sinnfrei.

Für einen Taster mag das gelten, hier geht es aber um mehrere. Und da ist das sehr sinnvoll, denn mit dem ADC und ein paar Widerständen kann man gleich mehrere Taster über einen Pin einlesen.

Also sind wir hier wieder im klassischen Software vs. Hardware. Mit etwas mehr Hardware könnte man auch mehere Taster an weniger Pins anschliessen. Aber per Software kann man alles machen

sternst
30.07.2008, 12:54
Also sind wir hier wieder im klassischen Software vs. Hardware.
Nein, sehe ich nicht so.


Aber per Software kann man alles machen
Aber nicht, wenn einem die Hardware fehlt. ;-)
Wenn man an dem µC nur noch X freie Pins hat, man aber mehr als (X/2)² Tasten anschließen will, hilft dir keine Software der Welt weiter. Ob du nun mit ein paar Widerständen und dem ADC "trickst", oder einen größeren µC nimmst, du brauchst auf jeden Fall zusätzliche Hardware.

fhs
30.07.2008, 14:55
Hallo,

...also hätte ich Verbesserungsvorläge erwartet, nicht so ein Rat als einziger Rat
heute früh habe ich meine Antwort an Dich gelöscht, in der ich Dich zunächst auf einige der hier bereits diskutierten Fehler aufmerksam machen wollte, dann aber nicht wusste, wie ich Dir am geschicktesten den Rat gebe, noch einmal (mit einem Tutorial/Buch zu C) ganz am Anfang zu beginnen. Stefan hat Dich schon ehrlich und richtig beraten .

Viel Erfolg und Spaß bei Deinen Programmierprojekten!

Fred

Hubert.G
30.07.2008, 17:08
@ newbie1982
Grundsätzlich haben Fred und Stefan recht.
Was soll der Unfug den ADC-Wert zu dividieren wenn du ohnehin nur eine <> Auswertung machst. Den ADC 10mal abfragen wenn der Wert gleichbleibt dann ist die Taste gedrückt.
delay sind schlecht, wenn dein Programm etwas aufwendiger wird, bringen sie dich in Teufels-Küche. Überlege mal wie lange so ein main-Schleifendurchlauf dauert wenn mal etliche 10ms delay drinnen hast.