PeDa Entprellung

OP #2917654
Lesenswert?

Hallo zusammen,

seit einiger Zeit versuche ich mit der Routine von PeDa die Tasten zu 
entprellen.

Zum Aufbau: Ich benutze einen Atmega32(A), der von einem externen 16MHz 
Quarz getaktet wird.

Auf meinem Experimentierboard befinden sich 3 Taster, die ohne einen 
Vorwiderstand nach GND ziehen. Diese hängen an Port D (PD0, PD1, PD2). 
Der Vorwiderstand wird ja nicht gebraucht, weil im Code für PortD die 
internen Pullups des Controllers aktiviert sind. Sonst hängt an Port D 
nichts.

Die LED´s hängen an PORTA (PA0, PA1... und weitere, die hier nicht 
benutzt werden).

Es gibt keine Build-Errors oder Warnings.
Die Hardware wurde bereits mit anderen Codes geprüft und sollte 
fehlerfrei sein.

Im Code wurden lediglich die Ports angepasst und in der Main die LED´s 
anfangs ausgeschaltet: LED_PORT = 0x00 statt LED_PORT = 0xFF;

Betätige ich nun eine Taste, passiert zunächst nichts. Durch mehrmaliges 
Drücken, Loslassen kann man die LED´s irgendwie unkontrolliert zum 
Leuchten bringen. Wid KEY1 lange gedrückt und losgelassen, so toggelt 
LED2. Aber auch nicht wirklich reproduzierbar.

Ich vermute, dass es mit der hohen Taktrate zusammen hängt oder ein 
Problem mit irgendwelchen Zeiten habe, komme aber nicht mehr weiter.

Vielleicht kann sich mal jemand den angefügten Code anschauen.

Danke und Gruß
Jochen
Angehängte Dateien:
#2917685
Lesenswert?

Jochen S. schrieb:

> Die LED´s hängen an PORTA (PA0, PA1... und weitere, die hier nicht
> benutzt werden).

AVcc ist beschaltet?
die 16 Mhz wurden kontrolliert?

> Ich vermute, dass es mit der hohen Taktrate zusammen hängt oder ein
> Problem mit irgendwelchen Zeiten habe, komme aber nicht mehr weiter.

Eher umgekehrt.
Du hast mit 16Mhz gerechnet und alle Zeiten haben sich an diesen 16Mhz 
orientiert, Läuft dein µC aber nicht mit 16Mhz so ist er um einen Faktor 
16 zu langsam für alles.

Mit get_key_short und get_key_long hab ich keine Erfahrung. Bis jetzt 
hab ich immer nur get_key_press bzw. die Repeat Funktion benutzt. UNd 
die funktioniert wunderbar out of the box


Vereinfache doch die Auswertung mal
1
  ...
2

3
  while(1){
4
    if( get_key_press( 1<<KEY0 ))
5
      LED_PORT ^= 1<<LED0;
6

7
    if( get_key_press( 1<<KEY1 ))
8
      LED_PORT ^= 1<<LED1;
9
    
10
    if( get_key_press( 1<<KEY2 ))
11
      LED_PORT ^= 1<<LED2;
12
  }

damit da erst mal ganz einfache Fälle ohne irgendwelchen Schnickschnack 
vorliegen.
#2917694
Lesenswert?

Den Teil
1
#ifndef F_CPU
2
#define F_CPU           16000000                   // processor clock frequency
3
#warning kein F_CPU definiert
4
#endif

bitte auch ändern.
1
#define F_CPU           16000000

einfach das #define machen, ohne Bedingung.
Denn wenn du in deinen Projekteinstellungen (bzw. im Makefile) eine 
andere Vorgabe hast, dann kommen die 16Mhz hier nicht zum tragen und es 
wird mit falschen WErten gerechnet. Das ist aber ein Fall, den du nicht 
unentdeckt lassen willst. Da will/kann und soll der COmpiler dich 
benachrichtigen.
OP #2917718
Lesenswert?

Danke. Danke. Danke.

Ich hatte also Recht mit meiner Vorahnung, dass etwas mit den Taktzeiten 
faul ist. Als Anfänger habe ich gedacht, es reicht aus im C-File die 
Taktzeit zu definieren. Doch mit Deinem Tipp und ein bisschen googlen in 
den letzten 5 Minuten hab ich nun dazugelernt, dass man auch im 
AVR-Studio die Taktzeiten einstellen muss - warum sagt einem das denn 
keiner :-)

Der ATMEGA lief nur mit 1MHZ internem Takt.

Nochmals vielen Dank. Jetzt klappts.

Gruß
Jochen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren