hallo ich habe die Tasterentprell Routine von peter dannegger wie sie hier ist, http://www.mikrocontroller.net/articles/Entprellung#Warteschleifen-Verfahren ausprobiert das geht auch alles wunderbar aber wenn ich meine Uart routine mit einfüge geht nur noch die Uart aber keine tasten auswertung mehr for (;;) { c = uart_getchar(); //hole daten vom Uartpuffer ab if( get_key_short( 1<<KEY1 )) LED_PORT ^= 1<<LED1; if( get_key_long( 1<<KEY1 )) LED_PORT ^= 1<<LED2; // single press and repeat if( get_key_press( 1<<KEY2 ) || get_key_rpt( 1<<KEY2 )){ uint8_t i = LED_PORT; i = (i & 0x07) | ((i << 1) & 0xF0); if( i < 0xF0 ) i |= 0x08; LED_PORT = i; } } }
Er, am besten ist es immer ALLES zu zeigen nicht nur den Teil der Main. Dur wirst sicherlich gleich die Hinweise auf Zeile 42 im Deinem Programm sowie den Hinweis auf die defekte Glaskugel erhalten.
Falls uart_getchar() so lange den Programmfortlauf blockiert, bis ein Zeichen eingetroffen ist, würde das manches erklären.
Die Tastenfunktion ohne Repeat merkt sich den Tastendruck, bis er abgeholt wird. Die Tastenfunktion mit Repeat setzt voraus, daß die Mainloop schneller als die Repeat-Zeit ausgeführt wird. Ein unbedingtes getchar() in der Mainloop ist (fast) immer ein ganz böses Foul. Deshalb gibt es oft auch eine Funktion, die erstmal anzeigt, ob überhaupt was im Puffer ist. Peter
schade das die tasterentprellung nun bei mir nich geht die routine in asm geht ja zusammen mit meinen uart das is natürlich mist dann
ICH schrieb: > schade das die tasterentprellung nun bei mir nich geht > die routine in asm geht ja zusammen mit meinen uart > das is natürlich mist dann Sie geht mit Sicherheit. Aber deine uart_getchar() wird halt nicht mitspielen. Aber solange du den Code nicht herzeigst, ist das halt alles nur Raten im Wald. Nochmal: Deine uart_getchar() DARF nicht auf das Eintreffen eines Zeichens warten! Du musst sie eben so gestalten, dass das nicht passiert, sondern die uart_getchar() einen Code zurückliefert, an dem der Aufrufer erkennen kann: Kein Zeichen an der UART eingetroffen. Zb könnte die eine 0 liefern, weil 0 in einem Text nicht vorkommen kann. Deine main Loop sieht dann so aus:
1 | for (;;) |
2 | {
|
3 | c = uart_getchar(); //hole daten vom Uartpuffer ab |
4 | if( c != 0 ) { |
5 | // Verarbeite das Zeichen von der UART
|
6 | }
|
7 | |
8 | if( get_key_short( 1<<KEY1 )) |
9 | ...
|
und die uart_getchar muss natürlich entsprechend geändert werden. Wie das dann aussehen kann, kann man aber nicht sagen, weil du der Aufforderung deinen Code herzuzeigen nicht nachkommst. Wir fragen das ja nicht zum Spass oder weil wir dich ärgern wollen. Grundsätzlich: Dein Programm soll nirgends auf irgendetwas warten! Nur so kannst du die Illusion erzeugen, dass dein µC mehrere Dinge gleichzeitig tun kann bzw. mehrere Eingaben gleichzeitig überwachen kann.
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.