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....
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.....
> 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?
...
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 ???
>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.