N'abend zusammen, wie der Betreff schon vermuten läßt, ist die Tastenentprellung a la Peter Dannegger hier das Thema.... http://www.mikrocontroller.net/articles/Entprellung und zwar würde ich gerne diese Tastenentprellung für mein Projekt verwenden, in dem der Coursor auf dem Display im Menü auf/ab links/rechts bewegt werden kann. Zusätzlich soll eine Eingabe Taste verfügbar sein. Also habe ich ein Tastenfeld aufgebaut und alle Taster untereinander einseitig verbunden und auf GND gelegt. Dieses Tastenfeld liegt an PINB0-4, Pull-Ups sind aktiviert. Habe erstmal direkt den source vom Peter kopiert und versucht diese 3Taster ans laufen zu bringen. Also Rauf/Runter/Links an PINB0,1,2 Dann habe ich die Frequenz bei #define F_CPU auf 16000000 geändert. Ja mir ist bewußt, das die Zeitangaben (200ms, 500ms...) die man im source findet, jetzt natürlich nicht mehr stimmen, aber das sei erstmal egal. Denn das Problem ist folgendes: Für die ersten beiden Taster (rauf/runter an PINB0 und PINB1) funktioniert alles einwandfrei, jedoch nicht mit dem links an PINB2. Der will einfach nicht und ich habe wirklich schon tausendmal drüber hergeschaut und auch sogar den Taster durchgemessen/getauscht... Gibt es vielleicht bei den FUSEBITS noch etwas, was ich setzen/rücksetzen sollte ? Ich meine da gibt es ein FUSE die sich auf PORTC auswirkt.... gibts da vielleicht auch ein Fusebit, welches sich auf PORTA oder PORTB auswirkt ??
Welcher Prozessor? Und wie genau sieht dein verwendeter Code aus? Du musst die Interruptfrequenz des Timers auch noch anpassen, wenn du die Taktfrequenz änderst. Hast du das bedacht? Achja, und inwiefern "will PINB2 nicht"? Hast du mal testweise ein paar "Debugausgaben" in den Code eingebaut? Sprich: Wenn der Prozessor an einer bestimmten Stelle vorbeikommt, eine LED leuchten lassen etc.. PS: Probier doch mal nen anderen Taster aus an dem PINB2.
Hallo, ja habe bedacht, das die Interruptfrequenz angepasst werden muss, aber die anderen beiden Taster funktionieren ja auch einwandfrei.... lediglich das timing stimmt nicht mehr, dennoch sollte auch der 3. Taster funktionieren, also da vermute ich nicht das Problem.... Mein source-code ist der original von Peter, nur das ich #define F_CPU 16000000 // processor clock frequency anstelle von #define F_CPU 1000000 // processor clock frequency da stehen habe....
oder meintest Du "Tastenmatrix entprellen" ??? Dann müssen die Tasten auch als Matrix angeordnet sein !!! Ist das bei Dir auch so ??
Morgen, ja Tasten sind in einer Matrix zusammengeschaltet, also mit GND sind alle untereinander verbunden. Der Ausgang der Taster ist jeweils mit einem eigenem Kabel mit einem PIN am uC verbunden.... Ich verwende ein ATMega16 Ich habe bis auf die F_CPU konstante nichts an Peter Programm geändert... Da die ersten beiden Taster an PINB (also B0 und B1) einwandfrei funktionieren, gehe ich davon aus, das zwar das timing nicht mehr stimmt, weil ich ja die ISR und den Timer/Counter mit prescaling usw. nicht angepasst habe, es aber für die Funktion der Tasten keine Rolle spielt... Ich vermute also den Fehler woanders.... Würde ich PORTC benutzen, wäre es das JTAGEN Flag..... Aber da ich lediglich PORTA und PORTB nutze ist das irgendwie seltsam...
@Janek, a Tasten sind in einer Matrix zusammengeschaltet, also mit GND sind alle untereinander verbunden. Der Ausgang der Taster ist jeweils mit einem eigenem Kabel mit einem PIN am uC verbunden.... Eina Matrix ist was anderes !!!! Ein Matrix besteht aus Zeilen und Spalten. Du gehst mit jeder Taste auf einen Pin. Ich kenne Peters Routine nicht, schätze aber das da das Problem liegt.
Hallo Janek, zeigt doch mal die schaltung und den code - dann hat das raten ein ende. du schreibst die taster sind als matrix verstrippt, aber schreibst auch, dass alle an GND hängen - das widerspricht sich meines erachtens schon mal. es kann sein, dass du die taster in einer matrix angeordet hast, aber wenn alle mit GND verbunden sind, ist es elektrisch keine matrix.
Wenn du mal auf Seite 55 im Datasheet guckst dann siehst du die 'Alternate Functions of Port B'. Das sollte dir bei der Fuse-Frage weiterhelfen. Wenn du deine Schalter in einer Matrix angeordnet hast, dann kann es aber durchaus sein, dass du einen Logikfehler in der Ansteuerung hast. Das solltest du einmal im Simulator nachvollziehen. Mich wundert nämlich, dass du die Pull-Ups aus hast, aber die andere Seite der Schalter auf Masse hast. Vllt habe ich aber auch etwas falsch verstanden. Eine entsprechende Skizze des Aufbaus würde hier weiterhelfen. pumpkin
achso, nochwas. der code von peter dannegger ist glaub ich auch nicht für ne matrixtastatur gebaut. ich selber verwende ihn, denn kompakteren code habe ich noch net basteln können. oder er hat nen neuen für matrixtastatur - kann ja alles sein.
Nicky wrote: > achso, nochwas. > > der code von peter dannegger ist glaub ich auch nicht für ne > matrixtastatur gebaut. Peter Dannegger hat aber nicht nur einen Code für Tastenabfrage geschrieben, sondern mehrere, darunter auch für Tastenmatrix. > ich selber verwende ihn, Ich auch, aber in Assembler und gelegentlich in modifizierter Form. > denn kompakteren code > habe ich noch net basteln können. Das ist wohl wahr... > > oder er hat nen neuen für matrixtastatur - kann ja alles sein. Ja, er hat für jeden Zweck den Richtigen, denn er bedient sich nicht aus irgendwelchen Baukästen sondern macht selbst. Wenn die Diskussion was bringen soll, dann muss man schon präziser werden. @Janek: Du schreibst von Tiny26 und JTAG-Fuse... Das ist etwas zu hoch für mich... Das Datenblatt des Tiny26 könnte Dein Freund sein... ...
Eine andere Möglichkeit wäre ja, immer abwechselnd irgednwelche prots auf masse zu ziehen und dann zu schauen ob irgendein eingang (bei aktiviertem pullup) auf gnd gezogen wird.... aber das geschieht nicht bei peters programm, denn da sind nur 3 ausgänge (leds an PORTA) und die 3 Eingänge bei B richitg meine taster sind nicht als matrix verschaltet, da sie alle permanent auf gnd gelegt sind und dieses signal bei drücken eines tasters an den entsprechenden eingang weiterleiten.....
@Hannes Lux --> Wenn die Diskussion was bringen soll, dann muss man schon präziser werden. MEIN REDEN!!!
Zeig doch endlich mal Deinen (compilefähigen) Code als Dateianhang, anstatt weiter so rumzustammeln, was niemand kapiert. Peter
Da ist der Chef persönlich :) Also code ist im Anhang... habe aber glaube ich niemals von einem Tiny irgendwas erzählt, sondern vom ATMega16
ohh moment war der flasche, das ist ja der original hier ist der richtige
> habe aber glaube ich niemals von einem Tiny irgendwas erzählt, sondern > vom ATMega16 Sorry, mein Fehler, in der Eile falsch gelesen, oder noch einen anderen Thread, bei dem es um Tiny26 ging, im Hinterkopf gehabt. Kannst Du mir nochmal verzeihen? ...
klar wenn du den fehler findest ;) Bist auch einer der "Großmeister" die hier sind :)
Also habe mal grade meinen uC auf 1MHz runtergeclocked und den Wert bei #define F_CPU wieder auf original angepasst, aber das hat es auch nicht gebracht..... Nach wie vor funktionieren die ersten beiden Taster, aber die 3 stresst, bzw, tut garnicht
Janek wrote: > klar wenn du den fehler findest ;) Diese Bedingung kann ich leider nicht erfüllen, denn ich habe keine Ahnung von C. Ich beschränke mich auf Assembler. > > Bist auch einer der "Großmeister" die hier sind :) Dem widerspreche ich energisch. Es gibt zwar einige ganz wenige Bereiche, bei denen ich ganz gut bescheid weiß, aber verdammt viele Themen, wo ich gegenwärtig nur an der Oberfläche kratzen könnte. ...
Sehen doch beide gleich aus und auch zu meinem Beispielcode sehe ich keinen Unterschied, also muß es laufen. Der Fehler liegt zu 99.99% in der Hardware. Hast Du auch 8 (mindestens 4) LEDs angeschlossen ? Der CPU-Takt hat nur Einfluß auf die Repeat-Geschwindigkeit, die grundsätzliche Funktion wird davon nicht beeinflußt. Peter
der Fehler lag, keine ahnung wo, jedenfalls nicht an der HW. Habe den source wie im anhang zu sehen angepasst und da lief es wunderbar :) so nun wollte ich aber das tastenentprell-programm mit meinem zusammwerfen und da ging es wieder nicht... habe auch den bereich des Fehlers eingrenzen können... und zwar verwende ich in meinem programm den T/C1 und im entprell wird der T/C0 verwendet, irgendwas dabei beißt sich leider noch... hier die source-code auszüge, die sich nicht vertragen: /* Register Settings T/C1 */ TCCR1B = 1<<WGM12^1<<CS10; // Prescaler = 1, clear on compare OCR1A = XTAL / DEBOUNCE - 1; TCNT1 = 0; TIMSK = 1<<OCIE1A; SREG |= 0x80; // Set Bit I for enabling global Interrupts prescaler = (uchar)DEBOUNCE; und dieser Teil der Tastenentprellung: TCCR0 = (1<<CS02)|(1<<CS00); // divide by 1024 TIMSK = 1<<TOIE0; // enable timer interrupt Ich hoffe ihr könnt mir sagen wo der Fehler liegt, denn ich habe da jetzt schon lange drüber gegrübelt, es ist bestimmt nur eine ganz dumme kleinigkeit, die ich da übersehe, oder ???
ja aber ist das nicht egal, weil ich die ein per bit-shit darein schiebe ???
>TCCR1B = 1<<WGM12^1<<CS10;
Ist das ^ nicht Exklusiv-Oder?
Ich würde das so schreiben:
TCCR1B |= (1<<WGM12)|(1<<CS10);
Die Schreibweise der Bitmanipulationen scheinen nicht besonders
konsequent zu sein.
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.