Datum: 19.02.2003 12:22
Es wurden ja schon öfters Entprellroutinen vorgestellt, aber diese hat den Vorteil, besonders kurz und schnell zu sein. Außerdem werden alle 8 Tasten gleichzeitig bearbeitet, es können also alle exakt zur selben Zeit gedrückt werden. Andere Routinen können z.B. nur eine Taste verarbeiten, d.h. die zuerst oder zuletzt gedrückte gewinnt oder es kommt Unsinn heraus. Die eigentliche Einlese- und Entprellroutine ist nur 8 Instruktionen kurz. Der entprellte Tastenzustand ist im Register "key_state". Mit nur 2 weiteren Instruktionen wird dann der Wechsel von Taste offen zu Taste gedrückt erkannt und im Register "key_press" abgelegt. Im Beispielcode werden dann damit 8 LEDs ein- und ausgeschaltet. Jede Taste entspricht einem Bit in den Registern, d.h. die Verarbeitung erfolgt bitweise mit logischen Operationen. Zum Verständnig empfiehlt es sich daher, die Logikgleichungen mit Gattern für ein Bit = eine Taste aufzumahlen. Die Register kan man sich als Flip-Flops denken, die mit der Entprellzeit als Takt arbeiten. D.h. man kann das auch so z.B. in einem GAL22V10 realisieren. Als Kommentar sind neben den einzelnen Instruktionen alle 8 möglichen Kombinationen der 3 Signale dargestellt. Peter
Datum: 19.02.2003 14:48
Hallo Peter, Dein Programm ist zwar besser als - wie anderswo erwähnt - Monoflops einzusetzen; es funktioniert aber nur auf dem Papier, da es ideale Taster voraussetzt. Reale Taster prellen aus Erfahrung mehr, als das ideale Datenblatt angibt: insbesondere im Laufe der Zeit und bei Feuchtigkeit. Ein typisch schlechter Taster ist z.B. einer, wie man ihn bei der Hausinstallationstechnik findet. Die Kontakte sind für hohe Ströme ausgelegt und nicht für geringes Prellen. Für eine sauberes Entprellen kommt man nicht umhin, den Tastenzustand wiederholt auf Gleichheit zu überprüfen und danach auszuwerten.
Datum: 19.02.2003 15:53
Hallo Michael, ich habs aber nicht nur auf dem Papier (Bildschirm) getestet. Ich habe das Program auf dem AVR Testboard ausprobiert und dabei keine einzige Fehlfunktion feststellen können. Wenn man das Entprellen testweise rausnimmt, sieht man auch wunderschön, wie diese kleinen Taster prellen können. Allein durch das Abtasten in einem festen Zeitrahmen ergibt sich schon eine gewisse Entprellwirkung. Der anschließende Vergleich gibt dem Preller dann entgültig den Rest. Ich habe bei allen meinen Projekten bisher immer nur 1-mal auf Gleichheit mit dem vorherigen Zustand geprüft und dananch keine Preller mehr entdeckt. Es würde mich aber freuen, wenn Du es mal testen könntest. Vielleicht hast Du ja einen Taster, der so miserabel ist, daß wirklich mal 1 Preller auf 1000 Betätigungen durchkommt. Dann kann der Kode kann nach dem gleichen Prinzip leicht auf den Vergleich von 3 Registern erweitert werden. Spätestens dann sollte die Prellsicherheit über 1/1000000 liegen. Also, wenn Du da mal praktische Statistiken hättest, statt nur zu behaupten, es ginge nicht, das würde mich wirklich freuen. Dann würde ich auch gerne den Vergleich auf 3-fach erweitern. Damit sollte man dann sogar die Kontakte in einem Airbus zuverlässig entprellen können. Peter
Datum: 19.02.2003 16:51
Hallo Peter, ich sagte doch, Deine Routine ist immerhin besser als Monoflops, zumindest für Bastelanwendungen. Baue ein Gerät, teste es durch, und es wird immer funktionieren. Verkaufe dieses schöne Gerät nach z.B. Mexico, und da funktioniert es dann nicht mehr. So ist das Leben ! Vielleicht ist es doch besser, ein paar mehr Byte zu programmieren ?
Datum: 19.02.2003 17:18
Schade, Du bleibst also auf dem "Immer-Schlechtmachen-Trip" :-( Beweisen oder Testen hätte mir besser gefallen. Warum sollen denn die AVRs in Mexico nicht mehr funktionieren ??? Ich baue Geräte, die intern viele Hochspannungen erzeugen müssen (bis 15kV), d.h. die machen sich ihre Störungen selber. Wenn da die Tasten spinnen würden, könnte das lebensgefährlich sein. Nach Mexico haben wir, glaube ich, noch nichts verkauft, nur USA, Japan, Indien usw. Peter
Datum: 19.02.2003 18:08
Nun gut, ich wollte Dir gerne wie immer das letzte Wort lassen; nun habe ich doch mein AVR-Starterkit (4-5 Jahre alt) ausgepackt. Je nach Taste habe ich Preller alle 5-6 Mal. Entweder geht die LED ganz aus oder flackert aus-ein (je nach Taste). Habe ich doch gleich gesagt!
Datum: 20.02.2003 08:48
@Michael, ich hab mir gestern die Finger wund gedrückt (>1000) und keinen einzigen Preller gesehen. Ich habe noch das alte STK von 1997 und die Taster machen auch keinen labrigen Eindruck (deutlicher Druckpunkt). Den 1200 betreibe ich mit 11.0592MHz. Wie gesagt, in nun schon über 12 Jahren Praxis verwende ich diese Prinzip auf 8051-ern und bisher ist weder mir noch den Kunden ein derart massives Prellen bei nur 5-6 Betätigungen aufgefallen. Ich habe also absolut keine Erklärung dafür, warum es bei Dir nicht funktioniert. Peter
Datum: 20.02.2003 12:16
Sorry, jetzt habe ich's begriffen: Dein AVR-Programm ist eine Falle ! Du bist ja der Fan von dem ollen 8051, dem Prozessor mit dem 8-Bit Stackpointer, der bei rekursiver Programmierung meist das Handtuch wirft. Wenn dann das obige Programm auf einem AVR scheinbar anfängt zu spinnen, ist es wieder ein trefflicher Grund, über die hervorragenden AVR-Prozessoren zu schimpfen. Ganz schön clever ! Scherz beiseite: warum zierst Du Dich so, auch 'mal die Erfahrungen anderer Leute anzunehmen ? Deine 'quick and dirty'-Programmierung ist mir schon öfter aufgefallen. Im Laufe der Zeit relativiert sich das 'quick'; übrig bleibt dann nur 'dirty'.
Datum: 20.02.2003 13:16
Hallo Peter, ich finde Deinen Code super! Habe mich bloß gewundert, warum der achte Taster nicht funktioniert. Fälschlicherweise hatte ich das STK verdächtigt. Es ist aber unschuldig. Der At1200 hat nur die Pins PD0 -> PD6. Grüße Oliver
Datum: 20.02.2003 14:10
@Michael, wenn einer Grund hat, auf den AVR zu schimpfen, dann bist das doch alleine Du. Bei mir läuft es doch einwandfrei und bei Oliver auch. Nur Du meldest laufend Probleme an. Und dann wieder diese Beschimpfungen. Der Code ist doch klar, knapp und logisch: - Das SREG wird gesichert. - Die Arbeitsregister (IWR0, IWR1) sind exclusiv den Interrupts zugeordnet, so daß sie nicht gepusht werden müssen. - Das Rückgaberegister auslesen und löschen ist schön mit CLI/SEI geklammert. Sämtliche AVR-Fallgruben sind also gesichert. Der Code ist somit ohne jegliche Problem in größere Projekte einzubinden. Es mag ja sein, daß ich, der mit TTL groß geworden ist, logische Operationen (EOR, AND, COM, OR) etwas leichter verstehe als andere. Ich weiß wirklich nicht was Dir für eine Laus über die Leber gelaufen ist, andere immer so zu beschimpfen. Dein Entprellcode, der nur eine Taste gleichzeitig kann, ist dagegen wirklich 'quick and dirty'. Peter
Datum: 10.06.2003 14:18
Nach dem Lesen der Diskussion habe ich noch eine andere Frage: Muß man Tasten eigentlich entprellen? Wenn man davon ausgeht, das Tasten nicht länger als 100ms prellen (eher viel kürzer) reicht es aus die Taste(n) alle 110 ms abzufragen. Was sagt Ihr dazu ?
Datum: 15.06.2003 01:21
@Dirk, nein es reicht nicht,.. da du ja wenn du zb. keinen IRQ verwendest nicht weist ob die taste wirklich gedrückt wurde oder nicht,.. das, was da an dem eingang als zustand anliegt kann ja das resultat des tastenprellens sein. am besten die taste mehrere male abfragen und wenn du immer das gleiche ergebniss hast is es schon richtig, wenn nicht wiederhole die abfrage bis du mal was richtiges einliest. das is schnell einfach zu implementieren, verbraucht keine irqs und es funktioniert,.. jedenfalls bei allen tasten die ich bis jetzt verwendet habe. MfG Sebastian
Datum: 15.06.2003 07:10
@Dirk Versuchs damit: Für jede Taste richtest Du einen Zähler ein. Alle 10ms Taste abfragen. Wenn Taste gedrückt dann Zähler um 1 erhöhen, wenn nicht Zähler löschen. Wenn Zähler = 5 dann gewünschte Aktion durchführen. Dann kannst Du ja bei Bedarf auch noch abfragen ob der Zähler z.B. > 50 ist und damit eine verzögerte Repeat-Funktion realisieren. Hab ich schon vielfach und ohne Probleme so gemacht, Codebeispiel gibts auf Wunsch. Fino
Datum: 17.06.2003 13:53
Bei Anwendungen mit einer Tastatur zur Zifferneingabe ist es dem Anwender (in den meisten Fällen) eigentlich egal ob 20 oder 200ms vergehen, bis auf den Tastendruck reagiert wird. Also reicht eine Abfrage alle 100ms aus. Dann kann es max. passieren, das die Taste bei der ersten Abfrage noch prellt und nicht erkannt wird. Bei der nächsten Abfrage wird der Tastendruck aber auf jeden Fall erkannt. Das funktioniert allerings nicht, wenn eine schnelle Reaktion auf die Betätigung einer Taste benötigt wird. Dann zählt aber schon der erste Impuls um eine Reaktion auszulösen (evtl. zweite Abfrage zur Absicherung gegen kurze Störimpulse)und alle nachfolgenden müssen dann durch die Software abgeblockt werden bis die Prellzeit vorbei ist bzw. ein sauberer (nicht mehr wechselnder) Pegel anliegt. Es kommt immer auf die konkrete Anwendung an ob und wie entprellt werden muss. MfG Steffen
Datum: 20.06.2003 10:26
Hallo Steffen, genau das meinte ich mit meiner Frage. Danke für die Bestätigung. MfG Dirk
Datum: 15.07.2003 13:12
Aber sonst geht es euch gut sfg Was bedeutet eigentlich das Prellen bei Tasten ? Ich kenne ja Zeche prellen, aber bei Tasten ?
Datum: 25.07.2003 15:57
Könnte man das Prellen nicht auch durch nen Kondensator abfangen????
Datum: 28.07.2003 19:10
@Florian, z.B. bei einer Matrixtastatur geht das nicht. Wenn die Tasten jede einen einzelnen Portpin und der MC Schmitt-Trigger-Eingänge hat, dann ginge das. Bloß Du brauchst dann für jede Taste und für jedes Board die Kondensatoren. Die paar Zeilen Code mußt du dagegen nur einmal erstellen oder kopieren und kannst sie dann ganz ohne Löten in beliebig vielen Projekten für beliebig viele Tasten verwenden. Kostet Dich dann keinen Pfennig mehr. Peter
Datum: 01.08.2003 22:13
Hallo, ich enprelle die Tasten folgendermaßen: 1. Überprüfung ist Tastenpin auf high (Tastendruck, Preller ausgelöst durch Tastendruck) und temoräre Variable auf low. 2. Wenn ja Aktion auführen und temp-var=high setzen. 3. in einer Timer-ISR wird die temp-var alle 100ms zurückgesetzt wenn der Tasenpin low und die temp_var high ist. Bis jetzt hat das immer sehr gut funkioniert und die Schaltung reagiert im selben Moment in dem die Taste gedrückt wird. MfG Rainer
Datum: 02.08.2003 11:48
@Rainer, niemand hat behauptet, daß es nur eine Möglichkeit gibt. Ich habe nur gesagt, daß dieser Algorithmus besonders wenig Rechenzeit und Speicherplatz benötigt. Außerdem kann er bis zu 8 Tasten und merkt sich die Betätigung, auch wenn das Hauptprogramm gerade mal nicht sofort die Taste abfragen kann. Außerdem belegt er keinen Interrupt, d.h. der Timer kann immer noch weitere Sachen machen, da er frei durchläuft. Das ich auch beim Drücken verzögere, hat den Sinn, daß ich nicht jedesmal, wenn sich einer mit elektrostastisch geladenen Pullover den Tasten nähert, diese dann sofort verrückt spielen. Der Mensch reagiert eh nicht schneller als etwa 300ms, da ist eine Verzögerung um weitere 20ms völlig bedeutungslos. D.h. für einen Menschen betrachtet, reagiert meine Routine auch im selben Moment. Peter
Datum: 02.08.2003 12:12
Hallo Peter, ich wollte nur mal posten wie ich meine Tasten entprelle.... Meine Routine belegt auch keinen Interrupt. der Timer ist auf immer für andere Zwecke zu benuzten ich schreib nur am Schluß dieser Timer ISR eine Schleife rein die obengenanntes überprüft... Na ja was heißt wenn das Hauptprogramm mal keine Zeit hat? Wenn ich davon ausgehe das der Taster mindestens 100ms gedrückt ist laufen bei einem mit 4MHz getakteten AVR 400'000 Befehle drüber....ich hab noch kein Programm verbrochen das soviel Rechenoperationen benötigt. Bei Warteschleifen im Quellcode - sorry - da ist die Programmierung nicht gerade die beste...... Und was die Rechenzeit angeht, die betrachte ich erst gar nicht wenn ich eh von vorherein schon sage das 20ms nicht ins Gewicht fallen, Das entspricht wieder 80'000 Instructions @4MHz :-). Aber wir programmieren hier ja schließlich keine Airbag-Steuerung :-) ..... IHMO sind 99% der Themen die hier im Forum behandelt werden (meine Projekte eingeschlossen) für die MCUs sowieso Schlaftabletten. :-) MfG Rainer
Datum: 02.08.2003 15:08
"Bei Warteschleifen im Quellcode - sorry - da ist die Programmierung nicht gerade die beste......" Du sprichst mir voll aus dem Herzen. Leider sieht man immer wieder Programme, wo eine ganze Sekunde oder noch länger nutzlos verpulvert wird und dann die Klagen kommen, die CPU ist zu lahm. Das schärfste, was ich gesehen habe, war eine DCF77-Routine, die geschlagene 2 Minuten dauerte, also absolut völlig praxisfern. Ich benutze immer die Main-Loop Methode und wenn ein Prozeß mal warten muß, dann aber schleunigst zurück zu Main und den nächsten Prozeß an die Reihe gelassen. Bisher habe ich immer Durchlaufzeiten von nicht über 500ms erreicht, d.h. meine Geräte reagieren auf jeden Tastendruck quasi sofort. Leider ist das bei industriellen Heimgeräten (Videorekorder, TV, HiFi, Waschmaschine) nie der Fall, sowas programmieren wohl ausschließlich Stümper :-( Schlimmer noch, die puffern nicht mal ! Wenn ich also für das Erhöhen der Helligkeit beim TV 5 Tastendrücke brauche, muß ich immer ewig warten, bis das Menü jede einzelne Taste auch angezeigt hat. Und moderne HiFi Anlagen haben längere Bootzeiten, als früher die Röhrengeräte zum Aufheizen brauchten, völlig indiskutabel. Muß mir meine nächste HiFi-Anlage wohl doch wieder selber bauen :-( So, nun genug Frust abgelassen, muß ja auch mal sein. Peter
Datum: 02.08.2003 20:05
Hallo, für "Warteschleifen" hab ich in jedem größeren AVR mind. 2 Timer ... aber das ist anscheinend schwer sich vorzustellen das man ein Programm zu großen Teilen (die kleinen bei mir ganz) in die ISRs reinschreiben kann. Das finde ich das ist eigenlich am "schwierigsten" am MC Programmieren... ne Struktur zu finden in der keine Warteschleifen benötigt werden. Wenn ich mir die (meisten) LCD Librarys z.B. anschau .... schüttel graus ... da läufts mir kalt den Rücken runter. Da werden doch mal eben >10k Taktzyklen vernichtet - das ist eigentlich wertvolle Zeit um Strom zu sparen oder etwas anderes zu machen und nicht nur verschachtelte char variablen zu erhöhen.... g Ein wenig größer betrachtet: Deßhalb brauch ich nun schon einen >2GHz (besser 3GHz) PC um schnell Surfen zu können g. Mit einem <=1 GHz Teil wird ja mein Modem/ISDN sooooo stark runtergebremst.... MfG Rainer
Datum: 09.01.2004 14:51
Zwar Off-Topic: @Peter: Meinst Du mit DCF77 zufällig die ELV Lösung von vor ca. 10 Jahren ? Da war aber nicht nur die Synch Zeit von 2 Minuten störend :) Gruß, Andreas
Datum: 10.01.2004 13:58
@Andreas, nein, ich meinte das hier: http://www.c51.de/c51.de/Dateien/Liste.php3?showHe... DCF77.ZIP Peter
Datum: 10.01.2004 21:12
Hallo Peter! Beistrich sagt man bei uns in Österreich! Ich weiß nicht ob ihr auch Semicolon sagt, wir nennen's jedenfalls Strichpunkt :) MfG, Thomas K PS.: Vielleicht sollte man gewissen Leuten hier die Unfähigkeit einen Knopf zu drücken unterstellen :P
Datum: 22.01.2004 06:39
hallo peter dannegger bin neu im internet forum chat deshalb mich bitte korrigieren wenn ich unsinn mache. spreche Sie an,weil mir Ihre wortbeiträge und stil gut gefallen haben; auch ich habe in chats "experten" erleben dürfen (wurde verarscht,da neu) seit 4 jahren mit 8515 auf assembler (stk200 alt). einstieg als autodidakt mit stk200 Buch:S.Volpe: AVR yC und atmel-datenblättern. wesentliche subsysteme des 8515 durchprobiert (timer/irq/aco) projekte: LED-Laufschrift (512LEDS), 4x7segment LED decoder in assembler (leds direkt an ports/muxen der 4 segmente).etc etc suche hilfe von profi bei detailproblemen (habe eins mit ACO und int, das auch atmel nicht lösen kann). andere frage:kann man an den 8515 2 16bit parallel-audio-wandler (A-D D-A) an die ports anschließen,um ein digitales audio subwoofer filter (parameter: 6 12 18 24dB/okt // grenzfrequenz 20 - 200 Hz Bessel Butterworth) zu realisieren ? hat der 8515 genug rechenleistung ? (für stereo werden 2 Stück mit identischem programm eingesetzt --> mono signal pro 8515) welche algorithmen kommen zum einsatz (FIR oder IIR - Filtermodell und wie funktionieren sie?)(es geht um multiply-befehle). Idee:alle datenwörter durch 2 geteilt (rechtsschieben 1bit)/ror und schon ist es halb so laut (wenn doch alles so einfach wäre...). las schon einige bücher zum thema aber die mathe ist grausam. deshalb einstieg schwierig. antwort wäre nett. ich kann auch verstehen,das Sie vielleicht keine lust haben, "die welt schlauer zu machen". nett,wenn sie mir auch dies kurz mailen an: bukongahelas0815@netscape.net oder tel 02741/935248 danke
Datum: 22.01.2004 08:41
@Ulrich, Als Neuling in Foren das hier beachten: http://www.lugbz.org/documents/smart-questions_de.html Dann wird man auch nicht mehr freundlich darauf hingewiesen, daß man in mehrere große Fettnäpfchen getreten ist (was Du als "verarscht" empfunden haben magst). Deine gröbsten Fehler sind: - falsche Rubrik (Überschrift der Rubrik nicht gelesen) - neue Frage nicht als neuen Beitrag gestellt - für persönliche Beiträge gibts E-Mail Peter
Datum: 22.01.2004 17:48
Ich weiss gar nicht was diese ständigen Diskussionen über Tasten entprellen sollen. Und die ganzen entprellkods aus dem Forum finde ich doof. Ich progge es folgender maassen: wenn einer der Tasten betätigt wird läuft eine Zeit ab (frei ein zu stellen,je nach Anwendung) erst dann wird das Hauptprogramm abgearbeitet. Und wenn mitten im Programm in einer Schleife meinentwegen,wieder Eingänge abgefragt werden müssen,dann wird davor wieder eine verzögerung programmiert. Also total easy und garantiert kein prellen!!! Gruss. Vitali.
Datum: 22.01.2004 18:12
Hi! @Vitali Schade! Du hast leider den Sinn nicht verstanden weshalb dein Posting auch sinnlos ist. MFG Uwe
Datum: 22.01.2004 18:26
Uwe,wenn du möchtetst kann ich dir genauer erklären was prellen ist. Jeder der probleme mit Tasten prellen hat, wird für sich schon eine Lösung finden.Ich habe meine eigene Lösung dafür, die sich bei meinen Projekten bewärt hat. MfG. Vitali.
Datum: 23.01.2004 07:02
danke peter für antwort aber ich weis leider nicht welche rubrik wo gemeint ist.der begriff ist klar, aber in diesem zusammenhang ? werde die empfohlene hilfeseite besuchen und hausaufgaben machen. oder problem:wie stelle ich einen neuen beitrag ? diese fragen sind rhetorisch und harren keiner beantwortung. erst mal selber lesen.und nur noch zum konkreten thema schreiben. klar.danke.uli
Datum: 10.02.2004 22:03
Hi Peter, wenn Dir was an meiner DCF77-Routine nicht passt, dann kanst Du sie ja mal verbessern. Unter der Vorraussetzung, dass diese in einem recht gestörtem Umfeld läuft und der DCF77 keine sauberen Bit-Werte liefert. Ich habe bis jetzt nur diese eine Lösung. Die eigentliche Applikation mißt Daten. Die Abspeicherung der Zeiten muß über DCF77 ohne Ausfälle abgeglichen werden. Es darf maximal ein DCF77-Ausfall (1 min) erlaubt werden. Ansonsten muß eine Störmeldung per SMS gesendet werden. Am Anfang war das der reinste SMS-Generator !! Viel Spaß beim tüfteln !!
Datum: 11.02.2004 15:45
Meine Güte selten soviel nütziches über das Entprellen von Tasten gefunden. Da kann ich mich mit meinem sinnvollen Kommentar nur anschließen :)
Datum: 14.02.2004 12:21
@Michael "wenn Dir was an meiner DCF77-Routine nicht passt" ich meinte konkret diesen Code: // Modulname: $Source: C:/c51_buecher/Teil2/software/Peripherie/DCF77/rcs/DCF77_lib.c $ // User: $Author: MEBA $ // Version: $Name: $ $Revision: 1.1 $ // Datum: $Date: 2001/02/03 11:03:35Z $ Er ist doch sehr aufwendig und dadurch schwer zu verstehen. Wenn ich das richtig sehe, wartet es 512/3 Pegelwechsel, d.h. die CPU ist quasi 85 Sekunden tot. Wenn man noch Pech hat, liegt die Minutenpause gerade in der Mitte, d.h. man hat 42 alte Bits und 42 neue, die gesamte Zeit- und Datumsinformation ist dann fürn Arsch. Auch so völlig ohne jede Notwendig 1024kB SRAM zu verschwenden, um wahnsinnsschnelle 1Bit/Sekunde zu puffern ist auch nicht gerade die feine Englische. Meinen Code findest Du z.B. hier: http://www.specs.de/users/danni/appl/soft/c51/thcl... Die Impulszeitmessung erfolgt im Timer-Interrupt und die Auswertung ganz nebenbei im Main. Im Beispiel erfolgen noch mehrere Temperaturmessungen, ohne daß sich beides ins Gehege kommt. Ausgelastet ist der 2051 damit aber noch lange nicht, viele weitere Funktion könnten also noch mit eingebaut werden. Es ist auch ein exzellentes Beispiel, wie man Tabellengesteuert mehrere ähnliche Aktionen (einen bestimmten Wert zu einer bestimmten Adresse addieren) extrem Code sparend ausführen kann anstelle einer riesigen Statemaschine (switch). Durch die Überprüfung der Pulsanzahl, der Pulsdauer, der Pulspausen und schließlich der Parität ergibt sich auch eine exzellente Fehlererkennung, da ja Störungen asynchron und nicht Pegelgleich sind. "Es darf maximal ein DCF77-Ausfall (1 min) erlaubt werden." Warum ? Was machst Du dann bei Gewitter oder Wartungsarbeiten am Sender ? Es reicht doch, wenn einmal am Tag eine fehlerfreie Information empfangen wurde und die dann den internen Takt synchronisiert. Ich mache es jedenfalls so und habe die Uhr in der Nähe des PCs stehen. D.h. sobald der Monitor an ist und stört, läuft sie einfach intern weiter. Peter
Datum: 14.02.2004 12:42
Hi Peter, wenn der DCF77-Empfang gestört ist, kann es zwei Möglichkeiten geben: 1. Es ist bekannt, dass durch eine Wetterlage oder durch Wartungsarbeiten das DCF77 zur Zeit nicht arbeitet. Dann kann dies der eigentlichen Meßstation mitgeteilt werden. 2. Oder es gibt Probleme an der Stelle, wo die Meßeinrichtung steht. In diesem Fall muß sofort weitergemeldet werden, dass unter anderm das DCF77 Signal nicht mehr empfangen werden kann. Es hat sich herausgestellt, dass eine "statische Luftaufladung im großen Stil", den Empfang stört. Da die Meßstation nichts weiter macht als eine Luftsäuremessung, und eine Temperturmessung pro Minute, wollte ich keine Interrupts einführen. Der Sensor für die Luftsäuremessung ist zudem sehr träge, sodas eine häufigere Abfrage sich nicht lohnt. Das DCF77-Signal ist zu einem weiteren Indikator geworden für die Messstation, nicht mehr und nicht weniger :-)
Datum: 14.02.2004 13:18
"Da die Meßstation nichts weiter macht als eine Luftsäuremessung, und eine Temperturmessung pro Minute, wollte ich keine Interrupts einführen." Ich habe absolut keine Idee, warum diese Sachen gegen den Einsatz eines Interrupts sprechen sollen ? Ich benutze Interrupts sehr gerne. Und wenn dadurch der Code einfacher wird, dann ist daß auf alle Fälle ein gutes Argument für den Interrupt. Interrupts sind ja quasi eine 2.CPU, die parallel zu den anderen Routinen arbeitet. D.h. um eine Aufgabe, die der Interrupt erledigt, brauch ich mich dann nicht mehr im Main kümmern. Und ich brauche auch kein Nebenwirkungen mehr zu befürchten, die Länge des Durchlaufs des Main behindert ja nicht den Interrupt. Peter P.S.: Habe ich nun irgendwas übersehen, oder stimmt das oben wirklich, also CPU 85s tot und 1024Byte RAM-Verschwendung. Ich komme ja fast immer mit den 128Byte des 2051 aus.
Datum: 16.02.2004 00:21
Hi @Peter, ich habe mir erlaubt deine Routine als erstes Projekt für mein neues AVR Hobby zu benutzen, bin also Einsteiger. Allerdings programmiere ich professionell schon über 15 Jahre. Deine Methode ist super gut und macht genau das was Software meiner Meinung nach machen soll, Hardwarekosten senken. Man denke nur mal an ein 8x8 Matrixkeyboard. Beim Testen konnten keine Preller festgestellt werden obwohl bei meinem STK500 der SW3 ab&zu klemmt. D.h. gerade solche Taster fangen öfters an zu prellen. Ich habe den Code für das STK500 Board angepasst. Die jetzige Routine demonstriert das Entprellen von Tasten, Tastenwiederholungen mit Zeitverzögerung und das Ansteuern einer LED per Pulsweiten Modulation. Die Taktfrequenz/Inversion/Pulsweite der PWM kann über die entprellten Taster eingestellt werden. Den Code poste ich hier weil ich selber als Anfänger nicht viele gute und einfach zu verstehende Beispiele gefunden habe. Achso, wichtig am Source war es für mich den Sleep Mode der MCU zu nutzen ! Da es mein erstes AVR Projekt ist würde ich mich über Feedback von euch freuen, eg. Was habe ich falsch gemacht bzw. was geht zu verbessern. Allerdings soweit ich das verstanden habe ist PWM auf den meisten AVR's ziemlich ineffizient wenn man die Basisfrequenz der PWM fleißend einstellen will, richtig ? Gruß Hagen
Datum: 07.04.2005 09:48
...hallo Hagen, ich bin beim MC Programmieren absoluter Neuling. Wo finde ich PE2 ? Hab jetzt mal alle LED's auf Bort B angeklemmt. Sieht ja lustig aus, wie das flackert. Was mache ich denn, wenn ich einzelne Ports anderweitig benötige ? Ich würde gerne Port D für ein LCD und eine UART-Verbindung nutzen. Ich versuche das mal zu verstehen, was Du in Deinem Proggi tust aber da Du immer mit dem Ganzen Port arbeitest, ist es wahrscheinlich recht aufwändig, das auf einzelne Ports umzubauen. Da wäre es doch bestimmt einfacher die Pins einzeln abzufragen, oder ?
Datum: 07.04.2005 09:53
@Hagen Hast Du mal die Taster abgeklemmt, Ziemlich wildes Verhalten. Da man bei Überwachungsaufgaben meistens nur einen Öffner oder einen Schließer hat, ist das nicht wirklich sicher. Bei undefiniertem Zustand spinnt mein STK 500 zumindest völlig.
Datum: 07.04.2005 10:09
@Peter: Sag mal, was bedeutet eigentlich diese Zeile ? ldi wr0, 1<<CS02^1<<CS00 ldi ist klar. wr0 auch aber das mit den '<' Zeichen habe ich schon mehrfach gesehen aber keine wirkliche Erklärung dazu.
Datum: 07.04.2005 10:14
Das ist der schiebe links operator: 1<<0 = 1 1<<1 = 2 1<<3 = 4 ... 1<<7 = 128 Peter
Datum: 07.04.2005 10:22
heisst das Du schiebst hier eine 1 nach bit 0...7 ? Dann schiebst Du aber nicht sondern setzt das entsprechende Bit auf eins. Würde 0<<1 bedeuten bit 1 ist 0 ?
Datum: 07.04.2005 10:43
Was beduten diese Zeilen dann genau ? init: ldi wr0, 0xFF out ddrb, wr0 ldi wr0, 1<<CS02 ;divide by 256 * 256 out TCCR0, wr0 ldi wr0, 1<<TOIE0 ;enable timer interrupt out TIMSK, wr0 wird hier wr0 auf 00000100 gesetzt ? (CS02 ist Bit2 von TCCR0, wenn ich nicht irre). wird wr0 vorher komplett gelöscht ? wr0 = 4 oder 0b00000100 wäre doch viel einfacher nachvollziehbar.
Datum: 07.04.2005 12:32
@Carsten
Ich würde z.B. "1<<6" mit "eine 1 um 6 Bitpositionen nach links
verschoben" übersetzen. Das Ergebnis ist genau wie Du sagts, dass das
entsprechnede Bit gesetzt ist. Der Vorteil des Schiebeoperators
gegenüber z.B. einer direkten binären Darstelleung ("0b01000000")ist,
dass ich den Schiebeoprator z.B. auch mit definierten Pinnummern
verwenden kann und damit beim Quelltextschreiben nicht so viel denken
muss. Das ganze funktioniert auch mit einer 0 (z.B."0<<7" = "eine 0
um 7 Bitpositionen nach links verschoben"), was aber zumindest im
Zusammenhang mit einem ldi nicht allzuviel Sinn macht. Ich verwende es
trotzdem im Zusammenhang mit der Portinitialisierung. Dann kann ich
ohne die Pinnummer oder deren Namen zu schreiben oder zu löschen
entscheiden, ob der Ausgang 1 oder 0 sein soll usw.
z.B.
ldi RG0,1<<pSpiEn|1<<pSCK|0<<pMOSI|1<<pMISO|1<<pLed1|1<<pLed2
Ist zwar einmal etwas Schreibarbeit, aber aus meiner Sicht recht
flexibel und gleich einigermaßen dokumentiert.
Jörg
Datum: 25.04.2005 18:47
Datum: 31.01.2006 10:56
Also ich habe mir mal die debounce_keys.c angeschaut von Peter Fleury, wobei im Header steht: "based on algorithm of Peter Dannegger", daher hier die Frage.. Was ich nicht verstehe ist, wie ich diese Port(8PIN) Entprellung in meinem Programm nutzen kann... Ich möchte nicht, dass die Tastenabfrage in dieser for(;;) Endosschleife läuft, da kann cih ja nebenbei mein Programm nicht mehr abarbeiten.... Wenn ich diese for Schleife aber weglasse, dann funzt das Programm ja net richtig(wegen den Timern..?!)...? Danke
Datum: 31.01.2006 11:29
Du weißt, wovon Du sprichst, aber die anderen nicht. Also immer einen Link angeben, worauf man sich bezieht ! Oder die Source als Anhang. Peter
Datum: 28.04.2008 19:20
Hallo zusammen,
ich habe alle ihre Beitrage über Tasten entprellen gelesen und probiert
aber immer noch nicht geschaft.
#include <p18F4550.h>
#include <stdio.h>
diese Beispiele habe ich probiere,
char key_state;
char key_press;
#define KEY_PIN PORTDbits.RD0
void debounce(void)
{
static char ct1;
static char ct0;
static char i;
i = key_state^~KEY_PIN; //key changed
ct0 = ~(ct0 & i); // reset or count ct0
ct1 = ~(ct1 & i); // reset or count ct1
i &= ct0 & ct1 ; // count until roll over
key_state ^=i ; // then toggle debounce state
key_press |= key_state &i; // 0->1 :key_press detect
return key_press;
}
was ich gespaltet habe
unsigned char Read_buttons(static unsigned char task_old)
{
unsigned char task_old=PORTDbits.RD0
return task_old;
}
unsigned char REread_buttons (unsigned char PORTDbits.RD0, unsigned char
task_old)
{
unsigned char b;
unsigned char ret;
SPS_Timer0_FKT(); //wartezeit von 6ms
b = PORTDbits.RD0; // Taster auslesen
ret = (b&task_old); // einmalig 1, wenn zum ersten Mal gedrückt
(kein Repeat)
if(task_old==0)
{
task_old=1;
ret=(task_old&b);
} // wird erst wieder 1, wenn mindestens einmal eine 0 gelesen
wurde
return ret ;
}
unsigned float test=0;
void ENTPRELLUNG(unsigned char *PORTD, unsigned char PORTDbits.RD0)
{
if(!(*PORTD &(1<<PORTDbits.RD0)))
{
if(!(*PORTD &(1<<PORTDbits.RD0)))
{
test++;
if(test==4000)
{
test=0;
return 1;
}
}
}
return 0;
}
ich habe immer noch nicht geschafft konntent sie mir helfen.
Gruß
Datum: 28.04.2008 21:05
Wie kann man über so ne Trivialaufgabe eigentlich so lange öffentlich labern...?
Datum: 28.04.2008 21:57
Verprellter wrote: > Wie kann man über so ne Trivialaufgabe eigentlich so lange öffentlich > labern...? Es gibt reichlich Geräte, die zeigen, daß das Thema nicht trivial ist bzw. nicht verstanden wird. Ständig muß man sich über prellende Tasten oder verlorene Tastendrücke ärgern. Oft denken die Leute, daß der Kunde bei einfachen Geräten keine funktionierende Entprellung haben will. Die internen Ablaufzeiten werden schon irgendwie mehr schlecht als recht ne rein zufällige Entprellung ergeben. Dabei paßt eine funktionierende Entprellung selbst in nen kleinen 6-Pinner PIC. Aber auch bei Fahrstuhlsteuerungen habe ich schon prellende Tasten erlebt. Peter
Datum: 28.04.2008 22:43
rapeur wrote: > Hallo zusammen, > ich habe alle ihre Beitrage über Tasten entprellen gelesen und probiert > aber immer noch nicht geschaft. Was soll der Code machen? Wo ist das Main? Längeren Code als Dateianhang. Was ist "unsigned float"? Wird Dein Code ohne Fehler und Warnungen übersetzt? Entscheide Dich für einen Entprellcode, 2 verschiedene zusammen zu pappen ist unsinnig und kann nicht funktionieren. Alle Compiler kennen Bytevariablen und logische Operationen mit Bitmasken. Manche Compiler unterstützen aber auch Bitvariablen. Finde heraus, was Dein Compiler kann und entscheide Dich für eines davon. Beides zu mischen ist verboten (zumindest für Anfänger). Peter
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel