Forum: Mikrocontroller und Digitale Elektronik Problem mit Tasten gegen +UB


von Zerberus (Gast)


Lesenswert?

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ß

von Falk B. (falk)


Lesenswert?

@ 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

von Zerberus (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Zerberus (Gast)


Angehängte Dateien:

Lesenswert?

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....

von The D. (devil_86)


Lesenswert?

[OT]
@ Zerberus:
Du Schleimer: Von 'Hallo Simon' auf 'Hallo Falk'.
[/OT]

von Peter D. (peda)


Lesenswert?

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

von Zerberus (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

Zerberus wrote:

> gemacht, aber welche ~ meinst Du?? Wo soll die sein?

Das hier:
1
i = key_state ^ ~KEY_PIN;


Peter

von Zerberus (Gast)


Lesenswert?

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