Hallo,
ich versuche jetzt seit ca ner stunde eine led mit einem taster zu
schalten. der taster soll als schalter fungieren!
ich möchte den taster software mäßig entprellen!
hier mein code:
1
/*
2
* test.c
3
*
4
*/
5
6
#define F_CPU 125000
7
#include<avr\io.h> //AVR Register und Konstantendefinitionen
8
#include<util/delay.h>
9
10
11
#define TASTERPORT PINC
12
#define TASTERBIT PINC1
13
14
voidinitial(void)
15
{
16
17
// **** Einrichten von Ein- und Ausgängen ***************
18
DDRC=0x01;// PortC 0 Ausgänge PORTC1-6 Eingänge
19
PORTC|=0x02;// Pull Up an PortC0 und 1 aktivieren
20
21
}
22
23
24
chartaster(void)
25
{
26
staticunsignedcharzustand;
27
charrw=0;
28
29
if(zustand==0&&!(TASTERPORT&(1<<TASTERBIT)))//Taster wird gedrueckt (steigende Flanke)
30
{
31
zustand=1;
32
rw=1;
33
}
34
elseif(((zustand==1)||(zustand==2))&&!(TASTERPORT&(1<<TASTERBIT)))//Taster wird gehalten
35
{
36
zustand=2;
37
rw=0;
38
}
39
elseif(zustand==2&&(TASTERPORT&(1<<TASTERBIT)))//Taster wird losgelassen (fallende Flanke)
Also ich habe den code für die tasterfunktion aus dem entrpell wiki von
mikrocontroller.net.
Ich verstehe nicht ganz die variable zustand....wie kann diese in der if
abgefragt werden, wenn diese nie initialisiert wird?
ich weiß das man für alle zustände des tasters diese variable will, aber
ich muss doch am anfang sagen, dass der zustand z.b. 0 ist also taster
nicht gedrückt.
die led wird mit einem taster auf masse geschaltet. habe den internen
pullup aktiviert für die led.
jedenfalls ist jetzt bei mir reiner zufalls wann die led ausgeschaltet
wird. je nachdem wann in die erste oder 2te if bedingung gesprungen
wird.
irgendwie denke ich das ich recht nah dran bin, aber ich brauche jetzt
mal hilfe :(.
gruß m0ron
m0ron schrieb:> ich möchte den taster software mäßig entprellen!
Saugute Idee.
Bloß warum willst Du unbedingt die 1 Millionste und eins Version
erfinden, bzw. warum sollte jemand die schier unendliche Geduld haben,
zum 1 Millionsten und eins mal die Fehler zu erklären (Fusseln vom Mund
wisch)?
Peter Dannegger schrieb:> warum sollte jemand die schier unendliche Geduld haben,> zum 1 Millionsten und eins mal die Fehler zu erklären
Falsch. Nur zum 1 Millionsten Mal. Die 1 Million und erste war deine
und die löste das Problem, wurde schon erklärt und funktioniert auch ...
:-)
m0ron schrieb:> die led wird mit einem taster auf masse geschaltet. habe den internen> pullup aktiviert für die led.
... hast Du dazu mal ein Schaltbild!? :-/
Irgendwie (im Idealfall durch einen Timerinterupt) musst Du eine Zeit
warten.
Jedes Mal liest Du den Taster ein und vergleichst seinen Zustand mit dem
vom vorherigen Durchlauf. Sind beide Identisch, kannst Du den Wert
übernehmen, sonst nicht.
Also:
{ x = Taste
wenn x = xold, dann out = x
xold = x
}
In Deiner SW arbeitest Du dann nur noch mit 'out'
Gruß
Jobst
Jobst M. schrieb:> { x = Taste> wenn x = xold, dann out = x> xold = x> }
Je nach Implementierung kann das funktionieren, muss aber nicht. Dann
wundert sich der Anwender warum's meistens geht, nur manchmal eben
nicht.
m0ron schrieb:> Ich verstehe nicht ganz die variable zustand....wie kann diese in der if> abgefragt werden, wenn diese nie initialisiert wird?
Variablen die nicht explizit mit was anderem initialisiert werden werden
am Anfang (im startup code) auf 0 gesetzt
m0ron schrieb:> while(1) {> //if((PINC&(1<<PINC1))==0 && zustand_taster==0)> if(taster())> {> PORTC|=(1<<PC0);>> }>>> if(taster())> {> PORTC&=~(1<<PC0);>> }> }
Ist doch grosser Unsinn. Denk mal nach:
Die Schleife läuft immer um, wahrscheinlich 10000 mal pro Sekunde.
Wenn zufällig während der Zeitdauer der ersten Hälfte der Schleife der
Taster gedrpckt wurde, schaltest du die LED ein (wenn sie nach Masse
geschaltet ist). Wenn zufällig der Taster aber erst während der zweiten
1/20000 Sekunde des Schleifendurchlaufs gedrückt wird, führt der
Tastendruck zum ausschalten.
Das kann nicht funktionieren. Es ist zufällig, was passiert, weil du
nicht auf 1/20000 Sekunde genau den Knopf runterdrücken kannst.
Die Funktion
> char taster(void)> {> static unsigned char zustand;> char rw = 0;>> if(zustand == 0 && !(TASTERPORT & (1<<TASTERBIT))) //Taster wird> gedrueckt (steigende Flanke)> {> zustand = 1;> rw = 1;> }> else if (((zustand == 1) || (zustand == 2)) && !(TASTERPORT &> (1<<TASTERBIT))) //Taster wird gehalten> {> zustand = 2;> rw = 0;> }> else if (zustand == 2 && (TASTERPORT & (1<<TASTERBIT))) //Taster> wird losgelassen (fallende Flanke)> {> zustand = 3;> rw = 0;> }> else if (zustand == 3 && (TASTERPORT & (1<<TASTERBIT))) //Taster> losgelassen> {> zustand = 0;> rw = 0;> }>
ist auch dubios.
Du fragst 4 mal !(TASTERPORT & (1<<TASTERBIT)) ab, glaubst du, da kommt
immer dasselbe bei raus ? Es ist schliesslich der TAster, der gedrückt
wird und prellt.
Ausserdem folgest du zwar dem Tastenzustand, in dem du "gedrückt"
"gehalten" "losgelassen" zeitgenau erkennst, aber entprellen tust du
nicht, du könntest gleich
return zustand==0&&(!(TASTERPORT & (1<<TASTERBIT)))==1; schreiben.
Zum Entprellen benötigst du eine Zeitverzögerung.
So einfach kann Entprellen eines (bis 8) Tastern sein (ohne
Initialisierung):
uint8_t tasten,gedrueckt;
while(1)// die Programm-Hauptschleife
{
tasten=TASTERPORT&TASTERBIT;
gedrueckt=tasten&~gedrueckt;
if(gedrueckt&TASTERBIT)
{
// Taster 1 wurde gerade runtergedrückt, mach was
}
// mach was sonst in der Programm-Hauptschleife passieren muß
gedrueckt=tasten;
_delay_ms(10); // damit sie bestimmt länger dauert als eventuelles
Prellen
}
Jobst M. schrieb:> Micha H. schrieb:>> Je nach Implementierung kann das funktionieren, muss aber nicht.>> Was kann denn dabei noch schief gehen?
Da werden nur zwei Samples verglichen, das Ergebnis kann noch immer
Zufallselemente haben.
Für stabile Entprellung müssen mehrere Samples verglichen werden. Peda's
Code nimmt 3 oder 4 wenn ich mich nicht irre, der von mir meist benutzte
nimmt 5 Samples, ist dafür nicht so universell einsetzbar.
Micha H. schrieb:> Für stabile Entprellung müssen mehrere Samples verglichen werden.
Nö, müssen nicht. Dann wartet man einfach länger.
Wenn Du z.B. 5 Samples jede ms machst komme ich mit 2 Samples in 5ms zum
selben Ergebnis.
Gruß
Jobst
Jobst M. schrieb:> Nö, müssen nicht.
Müssen muss garnichts.
> Dann wartet man einfach länger.
Ja, sowas merkt man gerne an chinesischem Billigkram. Obwohl, sowas
"können" auch deutsche "Experten".
Qualität ist anders.
Micha H. schrieb:> Qualität ist anders.
Mehr als vernünftig zu funktionieren braucht es nicht. Und das tut die
Lösung. Zuverlässig!
Welches Szenario sollte denn Deiner Meinung damit nicht klappen?
Jobst M. schrieb:> Und das tut die> Lösung. Zuverlässig!
Dann würde er ja nicht fragen.
MaWin hat recht, man darf eine Funktion nicht in 2 Kontexten aufrufen.
Die Funktion kann ja nicht hellsehen, wer sie aufruft.
Daher bewirkt sie rein zufällig mal hü und mal hott.
Micha H. schrieb:> Qualität ist anders.
Nö, Sachverstand geht anders.
Man muss zum Entprellen nicht mehrfach abfragen.
PeDa Entsprellroutine enthält das gegen einstreuende Störungen, z.B.
eines Handys.
Bei kurzen Leitungen ist das überflüssig.
m0ron schrieb:> ich möchte den taster software mäßig entprellen!
Leute! Ihr redet alle am Kern der Sache vorbei! Der Taster soll nur
mäßig entprellt werden! Dafür ist der Code von Peter Danegger zum
Beispiel komplett ungeeignet, denn der entprellt ja total! Auch mehrere
Samples auszuwerten dürfte einer mäßigen Entprellung nur bedingt
zuträglich sein :-))
scnr
Timm
Helmut Lenzen schrieb:> Ist wie ein bisschen Schwanger...
Das war mir schon klar aber mancher glaubt an Wunder und da wollt ich
halt auch mal teilhaben :)
Peter Dannegger schrieb:> Saugute Idee.> Bloß warum willst Du unbedingt die 1 Millionste und eins Version> erfinden
Weil es Sin macht das man als Anfänger lernt Probleme selber zu lösen.
Nur so kann man sich weiter entwickeln. Es gibt unzählige Wege zu
entprellen. Und es ist überhaupt kein Problem wenn eine selbstgestrickte
Lösung noch Optimierungspotenzial hat. Alles macht mehr Sin als eine
hier vorgekaute Lösung zu benutzen. Das ist hier schließlich keine
Codeschipsel-Bibliothek, sondern ein Forum dessen Sinn durchaus in der
Beantwortung von Fragen zu selbst programmierten Problemen zu sehen ist.
Wer keine Lust hat zum 1000 und 1ten mal Fragen zu einem Thema zu
beantworten der lässt es halt einfach. Was mich ein wenig wundert ist
das Herr Dannegger durchaus gerne 1000 und 1 mal die selben Fragen
beantwortet, wenn es um seinem eigenen Entprellen-Code geht.
m0ron schrieb:> Hallo,>> ich versuche jetzt seit ca ner stunde eine led mit einem taster zu> schalten. der taster soll als schalter fungieren!>> ich möchte den taster software mäßig entprellen!>> hier mein code:
Ich hatte mal
Stunde durch stunde und
Led mit led und
Taster mit taster und
Schalter mit schalter
Code mit code
etc...
ersetzt.
Der Compiler ging dann nicht mehr richtig.
Das betrifft auch Beiträge.
Thomas Holmes schrieb:> Weil es Sin macht das man als Anfänger lernt Probleme selber zu lösen.
Das ist schon richtig, aber das Entprellen eines Tasters ist nunmal
keine triviale Aufgabe - nicht nur für Anfänger. Wer dazu Hilfe anbieten
mag, der sollte sich überlegen, wie er den Fragesteller an den Artikel
Entprellung heranführt.
Peter Dannegger schrieb:> Jobst M. schrieb:>> Und das tut die>> Lösung. Zuverlässig!>> Dann würde er ja nicht fragen.
Ne, Peter, hier verwechseltst Du gerade meinen Vorschlag und die
Kommentare dazu und die Frage des TOs - zumindest habe ich den Eindruck.
Gruß
Jobst
Konrad S. schrieb:> das Entprellen eines Tasters ist nunmal> keine triviale Aufgabe - nicht nur für Anfänger.
Ähh... WAS???
Jeder der selbstständig zu denken gelernt hat und weiß was Prellen eines
Tasters zu bedeuten hat, kommt da in Sekundenbruchteilen auf die Lösung.
Das umsetzen in SW scheitert dann höchsten an fehlenden
Programmierkenntnissen.
Basteler schrieb:> manchmal lernt man auch was dazu, indem man fremden Code studiert.> Und> wenn es dann was erwiesenermaßen ordentliches ist, um so besser.
Extrem optimierterer Code ist für einen Anfänger nicht gut zu verstehen
und oft schwer zu analysieren.
Hi
>Jeder der selbstständig zu denken gelernt hat und weiß was Prellen eines>Tasters zu bedeuten hat, kommt da in Sekundenbruchteilen auf die Lösung.>Das umsetzen in SW scheitert dann höchsten an fehlenden>Programmierkenntnissen.
Nein. Das scheitert am Prinzip. Das ist genial. Auch wenn DeDa zugibt,
das es auf einer Hardwareimplemtietrung beruht. Darauf kommt kein
Anfänger.
MfG Spess
spess53 schrieb:> Nein. Das scheitert am Prinzip. Das ist genial. Auch wenn DeDa zugibt,> das es auf einer Hardwareimplemtietrung beruht. Darauf kommt kein> Anfänger.
Was faselt der Herr da?
Wenn du mit "DeDa", peda's Eierlegendewollmilchsau meinst, die hab ich
weder erwähnt noch Bezug darauf genommen, noch das diese
Eierlegendewollmilchsau Trivial oder für Anfänger leicht zu verstehen
ist. Das Liegt aber nicht an der, nicht gegebenen, Komplexität der SW
Entprellung, sondern daran das es eben eine Eierlegendewollmilchsau ist.
Teo Derix schrieb:> Jeder der selbstständig zu denken gelernt hat und weiß was Prellen eines> Tasters zu bedeuten hat, kommt da in Sekundenbruchteilen auf die Lösung.
Der Anfänger versteht eben nicht worin das Problem besteht.
Nicht vernünftig funktionierende Tastenbedienungen kommerzieller Geräte
belegen immer wieder mal, dass Nicht-Anfänger zuweilen auch ihre
Probleme damit haben.
Teo Derix schrieb:> oder für Anfänger leicht zu verstehen
Der Anfänger hat das grundlegende Problem, dass er die Schwierigkeiten
der µC-gerechten Erfassung physikalischer Eigenschaften, Zustände oder
Größen völlig unterschätzt. Das Abfragen eines Tasters ist nur
scheinbar eine triviale Aufgabe, aber es erfordert die
Auseinandersetzung mit den nicht idealen Eigenschaften eines
pysikalischen Systems.