mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Danneggers Tastenentprellung


Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ??

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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....

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder meintest Du "Tastenmatrix entprellen" ???
Dann müssen die Tasten auch als Matrix angeordnet sein !!!
Ist das bei Dir auch so ??

Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Nicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.


Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Nicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

...

Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.....

Autor: Nicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes Lux

--> Wenn die Diskussion was bringen soll, dann muss man schon präziser
werden.

MEIN REDEN!!!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch endlich mal Deinen (compilefähigen) Code als Dateianhang, 
anstatt weiter so rumzustammeln, was niemand kapiert.


Peter

Autor: Janek (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Janek (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ohh moment war der flasche, das ist ja der original


hier ist der richtige

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

...

Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar wenn du den fehler findest ;)

Bist auch einer der "Großmeister" die hier sind :)

Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Janek (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 ???

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du schreibst 2-mal auf das selbe Register ohne Veroderung.


Peter

Autor: Janek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja aber ist das nicht egal, weil ich die ein per bit-shit darein schiebe 
???

Autor: Power (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.