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