Hallo, ich habe ein ganz seltsames Problem, ich habe 8 Tasten an meinem AT90CAN128 angeschlossen, die gegen + schalten. Die Pins des Controllers hängen also im nichtbetätigeten Zustand über 10k Pulldown Widerstände gegen Masse. Wird eine Taste gedrückt, so bekommt der Pin High Pegl. Soweit alles tip top, funktioniert auch. Allerdings habe ich das Problem, jedesmal wenn ich mein Programm starte, bzw. das Board einschalte, springt mir das Programm in eine Routine, die hinter der ersten Taste an PA0 hinterlegt ist?? Tastenentprellung über Interrupt usw. hab ich alles eingebaut, funktioniert auch bestens, nur das erste mal darf eben nicht sein!! Woran kann sowas liegen?? Hier noch etwas Code, zum die erste Taste abfragen: if (get_key_press(1<<PA0)) //Abfrage der Flanke Taster SN0 { lesen_contr (0x00); //Funktion zum lesen von Controllregister 0 uart_puts0 (&USART_RxBuf[0]); //Reginhalt an Terminalprogramm schicken LCD_puts("Contr.Register 0 auslesen");//Ausgeführte Fkt an Display anzeigen } Wie kann ich verhindern das das Programm immer beim ersten mal in diese Routine läuft? En Tip wäre voll super. Danke Gruß
@ Zerberus (Gast) >Allerdings habe ich das Problem, jedesmal wenn ich mein Programm starte, >bzw. das Board einschalte, springt mir das Programm in eine Routine, die >hinter der ersten Taste an PA0 hinterlegt ist?? Tastenentprellung über >Interrupt usw. hab ich alles eingebaut, Wahrscheinlich ist die Routine für LOW aktive Tasten entwickelt und detektiert beim Start erstmal den Tastendruck (Pull-Down). Wahrscheinlich musst du die Variabeln, mit denen die Entprellung gemacht wird, invertiert initialisieren. MFG Falk
Hey Frank, danke für den Tip. Sowas in der Art hab ich mir auch schon gedacht. Allerdings weiß ich net wie ich eine Variable invertiert initialisiere. Kannst Du mir da bitte ein Bsp. nennen. Danke schon mal
@ Zerberus (Gast) >Hey Frank, danke für den Tip. Wenn fü jedes Mal, wenn man mich mit Frank anspricht, nur eien Euro bekommen würde . . . >Allerdings weiß ich net wie ich eine Variable invertiert initialisiere. >Kannst Du mir da bitte ein Bsp. nennen. Zeig deinen komplette Sourcecode als Anhng. MFG Falk
Oje Sorry Falk, des wollt i net :-) Falls ich das Programm mit deiner Hilfe zum laufen bekomm, geb i Dir gern nen Euro :-) Hier der Anhang....
[OT] @ Zerberus: Du Schleimer: Von 'Hallo Simon' auf 'Hallo Falk'. [/OT]
Für high aktive Tasten muß das ~ im Interrupt natürlich raus. Und:
1 | unsigned char key_state = 0xFF; |
Damit werden alle Tasten als gedrückt gesetzt, d.h. es muß erst ein Loslassen erkannt werden. Selbst Drücken beim Einschalten bewirkt dann keine Aktion. Peter
Hi Peter, danke für den Tip. Ich hab jetzt mal unsigned char key_state = 0xFF; gemacht, aber welche ~ meinst Du?? Wo soll die sein?
Zerberus wrote:
> gemacht, aber welche ~ meinst Du?? Wo soll die sein?
Das hier:
1 | i = key_state ^ ~KEY_PIN; |
Peter
Hey Peter, schicke Sache das Programm rennt!!!!!! Jipi.... Danke Gruß Simon
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.