Forum: Compiler & IDEs PeDa Entprellung


von Andreas S. (blautech)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Und kontrollier die 16Mhz!

von Andreas S. (blautech)


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

von Electronics'nStuff (Gast)


Lesenswert?

Jochen S. schrieb:
> Der ATMEGA lief nur mit 1MHZ internem Takt.

Das ist keine Einstellung im AVR Studio sondern im Controller selber..

Jochen S. schrieb:
> warum sagt einem das denn keiner :-)

Das steht in jedem Tutorial, in jeder "Es funktioniert nicht - was tun?" 
Liste, in jedem Buch und in gefühlten 10'000 Beiträgen hier im Forum :)

Gruss

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
Noch kein Account? Hier anmelden.