www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3x4 tastenmatrix auslesen ..auf ein neues


Autor: rudi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So Hallo ...

nachdem ich hier einige Tips bekommen habe meine Tastenmatrix 
auszulesen..habe ich mich für folgende Variante entschieden...(siehe 
Anhang)

Das Problem ist leider nur, dass das Program, wenn ich es Compiliere 
keine Fehlermeldung gibt. Jedoch wenn ich es in meinen Atmel Atmega8 
lade nicht funktioniert...

woran kann das liegen ??

Bitte schaut euch meinen Code an...

Thx

Autor: rudi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ui..hatte noch zwei fehler entdeckt...

einmal hatte die if schleife unten keione klammern, zweitens hatte ich 
vergessen den portc zu definieren...

danke für eure hilfe

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also...trotzdem funktioniert der code nicht , wenn ich ihn in den uc 
lade...!!!????????

....Vielen Dank

Autor: Falk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@rudi (ratlos)

>Das Problem ist leider nur, dass das Program, wenn ich es Compiliere
>keine Fehlermeldung gibt. Jedoch wenn ich es in meinen Atmel Atmega8
>lade nicht funktioniert...

>woran kann das liegen ??

Dass du einfach Code kopiert hast, ohne ihn ansatzweise zu verstehen. 
Modularer Programmaufbau ist auf für kleine Programme nit von Nachteil. 
Dein Auslesen der Matrix gehört in eine Funktion. Macht das ganze 
WESENTLICH lesbarer etc.

Siehe Anhang, sollte funktionieren.

MfG
Falk




Autor: Kippschalter ohne Einrastung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Macht das ganze WESENTLICH lesbarer etc.

Hier wird für µCs programmiert und da kommt es auf Effizienz und nicht 
auf Optik an.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kippschalter ohne Einrastung

>> Macht das ganze WESENTLICH lesbarer etc.

>Hier wird für µCs programmiert und da kommt es auf Effizienz und nicht
>auf Optik an.

Und ob! Wenn schon der OP bei seinem Code nicht mehr durchsieht, dann 
wird einem anderen, welchen den Code ggf. warten oder erweitern soll, 
erst recht schwer fallen.

Was Hänschen nicht lernt, lernt Hans nimmer mehr!

Ausserdem haben auch uC heue sowiel FLASH, das man da schon richtig viel 
Programm unterbringen kann. Und da geht fix die Übersicht verloren. Das 
geht schon bei 2K FLASH los.

MFG
Falk

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Asserdem, wer sagt denn, dass ein Sourcecode mit guter Optik ineffizient 
sein soll? Im GEGENTEIL! Geniale Programme sind kurz und übersichtlich!

MFG
Falk

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo und danke für eure hilfe...

na ja kopiert habe ich ihn  ja schon..da haste recht..aber geändert habe 
ich ihn auch und an mein vorhaben angepasst....verstanden habe ich ihn 
jedoch auch..sonst hätt ich ihn ja gar nicht anpassen können...

na ja lassen wir das...

der Code funktioniert trotzdem nicht...

ich weiß nicht mehr weiter

...rudi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@rudi

>der Code funktioniert trotzdem nicht...

Welcher Code?

>ich weiß nicht mehr weiter

Debuggen? Erstmal im Simulator, dann auf dem Board.

Prüfe ob deine LED schaltbar ist. Dazu einfach code[3] mit dem richtigen 
Passwort im Quelltext initialisieren, dier 4 Zeilen welche code 
verändern auskommentieren. Dann müsste sofort nach dem Start die LED 
angehen. Dann muss das Scannen der Matrix debugged werden. Dazu könnte 
man den Rüchgabewert entweder auf einen freien Port ausgeben und per LED 
anzeigen, oder per Uart auf dem PC anzeigen.

MFG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 
   Ergebnis = PIND; //Spalten abfragen
...    
    Ergebnis += PIND;  // Zeilen und Spalten verknüpfen (addieren)

Was soll das werden ?

Wie willst Du nun unterscheiden, ob das Bit im 1. oder 2. Ausdruck 
gedrückt war ?

Die Addition ist also der völlig falsche Ansatz.

Außerdem brauchst Du für ne 3*4 Matrix auch 3 Abfragen a 4 Bit, 2 
reichen da nicht.


Edit:
------------------------------------------------------------------

Sorry, könnte sein, daß ich obig Blödsinn geschrieben habe.

Ich merke gerade, daß ich in Deinem Code nun überhaupt nicht mehr 
durchblicke.
Ob er funktionieren könnte, kann ich nicht einschätzen.
Ich bezweifle es aber sehr.

Kannst Dir ja mal meine beiden Beispiele ansehen, wie ich das mache.


Peter

Autor: Falk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger

>Außerdem brauchst Du für ne 3*4 Matrix auch 3 Abfragen a 4 Bit, 2
>reichen da nicht.

Doch, doch. Das ist ne "Kreuzpeilung", einmal über die Spalten und 
einmal über die Zeilen.
Das geht, hab ich auch schon gemacht.

Was ich aber gerade merke. Es fehlt die Flankenerkennung. Wenn ich 
nämlich eine Taste drückee wird wei jedem Durchlauf alle 150ms die 
gleiche Taste erkannt. Damit landet in code immer in fast allen 
Speicherzellen die gleiche Taste.

@rudi

Hast du auch die Codes in der SWITCH Anweisung angepasst?

Hier ein neuer Versuch.

MFG
Falk


Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo falk...

danke für die mühe...

ja die codes in der switch anweisung hatte ich angepassst...(die waren 
auch schon bei meinem allerersten post hier angepasst)

du schreibst ja jetzt in deinem neuen code

if ((taste != taste_alt) && (taste !=0))

1)dann könnte mein code 1111 ja gar nicht auftreten....???
2)was heißt taste !=0 ? wenn taste ungleich 0 ist ! heißt jetzt, wenn 
das array leer ist ?

danke

rudi



Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@rudi

>if ((taste != taste_alt) && (taste !=0))

>1)dann könnte mein code 1111 ja gar nicht auftreten....???

Du verwechselst EINIGES.

>2)was heißt taste !=0 ? wenn taste ungleich 0 ist ! heißt jetzt, wenn
>das array leer ist ?

NEIN!

taste ist der Rückgabewert von scan_matrix. Die modifizierte Version 
gibt 0 zurück, wenn keine Taste gedrückt ist. Wenn nun taste=taste_alt 
ist, dann ist ein und die selbe Taste mehrfach erkannt, und dann soll 
KEIN neuer Code eingelesen werden. Es wird immer nur dann eine Taste in 
dein code Array geschrieben, wenn ein neuer Tastendruck erkannt wurde.

MFG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk wrote:
> @Peter Dannegger
>
>>Außerdem brauchst Du für ne 3*4 Matrix auch 3 Abfragen a 4 Bit, 2
>>reichen da nicht.
>
> Doch, doch. Das ist ne "Kreuzpeilung", einmal über die Spalten und
> einmal über die Zeilen.
> Das geht, hab ich auch schon gemacht.


Statt Addition sollte man aber besser OR nehmen, dann hat man keine 
Überträge auf die Nachbartasten.


Ich hatte da noch was von Mehrtastenerkennung im Hinterkopf. Dürfte 
damit recht haarig werden.


Peter

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger

>Statt Addition sollte man aber besser OR nehmen, dann hat man keine
>Überträge auf die Nachbartasten.

Yep.

>Ich hatte da noch was von Mehrtastenerkennung im Hinterkopf. Dürfte
>damit recht haarig werden.

Das geht AFAIK nur mit Dioden in der Matrix. Wobei Tastaturen auch nur 
zwei Folien haben, welche über Gummischalter verbunden werden. Ist die 
Diode dort im Gummi?

MFG
Falk

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meiner Schaltung habe ich vier Dioden drinne, die jeweils in den 
Zeilen eingebaut sind. (PD3,PD4,PD5,PD6).

Habe einen Tastenblock gekauft..aus Edelstahl....der hat nur ne reine 
Matrix als Anschluss, deswegen habe ich Dioden vorsichtshalber 
eingebaut...

Danke....

habe das Programm nochmal ausprobiert,,....leider klappt es nicht...

Autor: Falk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@rudi

>In meiner Schaltung habe ich vier Dioden drinne, die jeweils in den
>Zeilen eingebaut sind. (PD3,PD4,PD5,PD6).

Ein Bild sag mehr als tausend Worte. Poste mal nen Schaltplan. 
Vielleicht hast du die Dioden falsch eingebaut.

>Habe einen Tastenblock gekauft..aus Edelstahl....der hat nur ne reine
>Matrix als Anschluss, deswegen habe ich Dioden vorsichtshalber
>eingebaut...

Das nützt nix! Jeder der zwöf Taster braucht ne Diode! Wahrscheinlich 
hast du mit deinen 4 Dioden Murks gemacht.

>habe das Programm nochmal ausprobiert,,....leider klappt es nicht...

Da habe ich so meine Zweifel. Ich hab nochmal drüber geschaut, in meiner 
Version fehlt ne Variablendeklaration, da muss der Compiler meckern. 
Hast du WIRKLICh meinen Code NEU compiliert und in den AVR gebrannt?

Siehe Anhang.

MFG
Falk

Autor: Sonic (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Na, das ist doch die Vorgehensweise die ich mal gepostet habe, nur 
leicht abgeändert, oder? Wenn ja, da brauchste nirgends 'ne Diode, das 
geht mit den Kontakten.

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja habe die variable ereignis auch schon eingebaut....
ja habe das programm gebrannt....

die Dioden liegen wie schon gesagt in reihe zu den portsD 3,4,5,6...mit 
der Sperrichtung zum avr hin zeigend...das verhindert bei gleichzeitigem 
drücken zweier tzasten aus der selben spalte einen kurzschluss...

dafür habe ich sie eingebaut



Autor: Fisch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Wie wär es denn eigentlich mal, wenn du dein Entprellungsdelay mal ein 
bisschen vergrößerst. Man spricht doch normal immer von 15ms, bei dir im 
Code steht aber irgendwas im µs-Bereich.

MFG Fisch

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

>Na, das ist doch die Vorgehensweise die ich mal gepostet habe, nur

Ja. Aber mann solte doch gerade Anfängern keinen Code auf Beta-Nivau in 
die Hand drücken, oder?

MFG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Code auf Beta-Nivau
Wie muss ich das jetzt verstehen? ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rudi wrote:
> In meiner Schaltung habe ich vier Dioden drinne, die jeweils in den
> Zeilen eingebaut sind. (PD3,PD4,PD5,PD6).

Ja, dann kanns ja auch nicht gehen.
Dann mußt Du eine meiner beiden Varianten nehmen.


Bei der "Kreuzpeilung" fließt nämlich Wechselstrom durch die Tasten.


Peter

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

>>Code auf Beta-Nivau
>Wie muss ich das jetzt verstehen? ;-)

Willst du das WIRKLICH hören? OK!

//#include <avr/delay.h>          // wenn schon eingebunden, hier 
löschen

//volatile unsigned char T_Byte = 0;

1. Fragmente

>char _scan_key (char Null)

2. Fuktionen mit Underscore sind AFAIK für den Compiler "reserviert"
3. Ein Parameter ohne Anwendung

>volatile unsigned char Ergebnis;
>volatile unsigned char T_Byte;

4. Das volatile ist völlig sinnlos hier

>// Datenrichtung der Ports

>  DDRA = 0b11110000;        // Port für die Tastatur muss evtl. angepasst werden
>  PORTA = 0b00001111;

5. Ist hier deplaziert und doppelt.

>T_Byte = ' ';

6. unnötig

7. Sieht man, dass das irgendwo rausgeschniten wurde, die 
Kommentarfragmente verraten es.

MfG
Falk




Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger:
>>Statt Addition sollte man aber besser OR nehmen, dann hat man keine
>Überträge auf die Nachbartasten.

Beim ersten Durchlauf (Spalten) wird 0...7 ins Register eingelesen, beim 
Zzeiten 8..255 dazuaddiert, wo soll da was übertragen werden?

>Ich hatte da noch was von Mehrtastenerkennung im Hinterkopf. Dürfte
>damit recht haarig werden.

Das ist völlig kahl :D (nicht haarig), funktioniert erstklassig!

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk.
Ich wollte es nicht wirklich hören. ;) Als Ergänzung: die Datei ist eine 
Include-Datei von einem Hauptprogramm und wurde nur als Test 
geschrieben, deshalb sind einige Unnötigkeiten und unsaubere Sachen 
drin. Hast schon Recht, das sollte man Anfängern nicht vorsetzen. Werde 
mich Bessern! :(

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonic wrote:

> Das ist völlig kahl :D (nicht haarig), funktioniert erstklassig!

Na dann zeig doch mal her.

Es geht bestenfalls 2 Tasten gleichzeitig, da man ja wegen dem 
Wechselstrom keine Dioden in die Tasten legen kann.


Peter

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie soll ich dir das denn jetzt zeigen?
Am Besten baust du das Teil schnell auf, ist ja nix weiter dahinter und 
probierst es aus, dann siehste's ja. ;-)
Du kannst auch alle Tasten gleichzeitig drücken (beim 4x4), dann kommt 
als Code '0' raus.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:
Würfelförmig gedrückte Tastenkombinationen können nicht erkannt werden, 
da hast du recht!

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger

>Es geht bestenfalls 2 Tasten gleichzeitig, da man ja wegen dem
>Wechselstrom keine Dioden in die Tasten legen kann.

Welcher Wechselstrom?


@Sonic

>Am Besten baust du das Teil schnell auf, ist ja nix weiter dahinter und
>probierst es aus, dann siehste's ja. ;-)
>Du kannst auch alle Tasten gleichzeitig drücken (beim 4x4), dann kommt
>als Code '0' raus.

Dass mich nichts aufhält mehrere Tasten gleichzeitig zu drücken ist 
klar. Aber deine Routine kann mir nicht sagen, "jetzt sind die Taste 1, 
5 und * gleichzeitig gedrückt (so wie es eine PC-Tastatur kann mit Shift 
Tasten etc.). Du kannst mit deiner Soft- und Hardware immer nur eine 
gedrückte Taste eindeutig identifizieren. Sind mehrere gleichzeitig 
gedrückt wird gar keine erkannt und dein default ZZweig mit T_byte =' ' 
angesprungen.

MFG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:
Ja, stimmt. In meinem Programm wollte ich nur die Einzeltasten sehen, 
wie die Auswertung auch sagt. Wenn du code auf UART ausgibst wirst du 
sehen, dass es auch mit mehreren Tasten funktioniert.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um mal zu sagen was erkannt werden kann:
Alle Tasten in einer Reihe gleichzeitig ODER alle Tasten in einer 
Spalte. Mix aus mehreren Spaltentasten und Zeilentasten können nicht 
erkannt werden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk wrote:
> @Peter Dannegger
>
>>Es geht bestenfalls 2 Tasten gleichzeitig, da man ja wegen dem
>>Wechselstrom keine Dioden in die Tasten legen kann.
>
> Welcher Wechselstrom?

Nun, einmal sind die Spalten am Low-Ausgang (-) und die Zeilen am 
High-Eingang (+) und beim 2. Mal ist es genau umgekehrt.

Mit Dioden in Reihe kanns also nicht gehen.


Peter


Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

>Ja, stimmt. In meinem Programm wollte ich nur die Einzeltasten sehen,
>wie die Auswertung auch sagt. Wenn du code auf UART ausgibst wirst du
>sehen, dass es auch mit mehreren Tasten funktioniert.

Dann müssen aber noch irgendwelche Dinge in Hardware und Software dafür 
arbeiten. Eine einfache Tastenmatrix ohne Dioden sowie die von dir 
gepostete Routine machen das nicht. Warum?

Wenn zwei Tasten einer Spalte gedrückt sind (z.B. '0' und "-") erzeugt 
das einen Code, welcher nicht in deinem SWICH drinsteht. -> Default

MfG
Falk




Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab' ich doch geschrieben:
>wie die Auswertung auch sagt.
Ich habe nur Einzeltasten ausgewertet.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal eine Komfortroutine, die alle Drücke erkennt.

Selbst, wenn Du alle 24 Tasten gleichzeitig drückst, kriegst Du sie alle 
geliefert, pro Aufruf einen Tastencode.
Und beim Loslassen kriegst Du dann wieder 24 Release-Codes geliefert.

Es gibt also doppelt soviel Codes wie Tasten sind + einen Code (0) für 
keine Änderung seit dem letzten Aufruf.


Beitrag "Tasten-Matrix entprellen"


Peter

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

>Hab' ich doch geschrieben:

NEIN!

>>wie die Auswertung auch sagt.
>Ich habe nur Einzeltasten ausgewertet.

Du hast mehrfach behauptet, dass man damit auch Mehrfachtastendrücke 
auswerten kann.

MFG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste nicht gelesen?
Ungefähr sechs Postings weiter oben:

Um mal zu sagen was erkannt werden kann:
Alle Tasten in einer Reihe gleichzeitig ODER alle Tasten in einer
Spalte. Mix aus mehreren Spaltentasten und Zeilentasten können nicht
erkannt werden.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du hast mehrfach behauptet, dass man damit auch Mehrfachtastendrücke auswerten 
kann.

Auch wenn man's KANN dann MUSS man das nicht unbedingt! ;-)

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

>Um mal zu sagen was erkannt werden kann:
>Alle Tasten in einer Reihe gleichzeitig ODER alle Tasten in einer
>Spalte.

Auch das ist FALSCH! Deine Routine kann das nicht! Dazu müsste der 
SWITCH erweitert werden.

>>Du hast mehrfach behauptet, dass man damit auch Mehrfachtastendrücke auswerten 
kann.

>Auch wenn man's KANN dann MUSS man das nicht unbedingt! ;-)

Du KANNST es nicht einmal!

MfG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du verstehst mich nicht! :(
Meine Abfrage fragt NUR die Einzeltasten ab, vorgabe für meine 
Tastenabfrage war, das Ganze so klein und so schnell wie möglich zu 
halten. Ebenso sollten nur die Einzeltasten abgefragt werden, 
Kombinationen ignoriert. DARUM sind in der switch-Abfrage keine 
Kombinationen drin.
Es ist aber problemlos möglich die switch-Abfrage durch die 
Kombinations-Codes zu erweitern.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

>Du verstehst mich nicht! :(

Doch, doch, aber wie es scheint ist die Logik bei dir heute im Urlaub.

>Meine Abfrage fragt NUR die Einzeltasten ab, vorgabe für meine
>Tastenabfrage war, das Ganze so klein und so schnell wie möglich zu
>halten. Ebenso sollten nur die Einzeltasten abgefragt werden,
>Kombinationen ignoriert. DARUM sind in der switch-Abfrage keine
>Kombinationen drin.

Alles schön und gut, aber deine Äusserungen waren für jeden anderen 
ausser dir so zu verstehen, dass diese Funktionalität schon enthalten 
ist. Dem ist nicht so. Du hättest also sinnvollerweise schreiben müssen.

"Mit dieser Funnktion sind nur einzelne Tasten auswertbar. Wenn mehrere 
gleichzeitig gedrückte Tasten erkannt werden sollen muss der Code 
erweitert werden."

>Es ist aber problemlos möglich die switch-Abfrage durch die
>Kombinations-Codes zu erweitern.

Sicher, das muss aber dazugesagt werden.

MFG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste Recht. Bei uns ist es Voraussetzung, in ein Programm nur das zu 
implementieren was nötig ist und nicht was möglich ist. Klar kann ein µC 
un das zugehörige Programm viel viel mehr, aber am Ende kommt sowas wie 
WINDOS dabei 'raus :D => eine Million Funktionen und keiner blickt mehr 
durch!

Bin schon ein Stück weit zum 'Fachidioten' geworden, das kommt davon 
wenn man immer mit den gleiche Leuten zusammenarbeitet. ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hier noch ne Version von mir:

#include <io.h>


#define NOP()  asm volatile("nop"::)


#define KEY_PIN         PINB
#define KEY_PORT        PORTB
#define KEY_DDR         DDRB


unsigned char key_scan( void )
{
  unsigned char key = 1;

  KEY_PORT = 0x1F;
  KEY_DDR = 0x70;
  NOP();

  switch( KEY_PIN & 0x0F ){
    default: return 0;
    case 0x07: key++;
    case 0x0B: key++;
    case 0x0D: key++;
    case 0x0E: ;
  }

  KEY_PORT = 0xF0;
  KEY_DDR = 0x0F;
  NOP();

  switch( KEY_PIN & 0x70 ){
    default: return 0;
    case 0x60: key += 4;
    case 0x50: key += 4;
    case 0x30: ;
  }
  return key;
}


Es ist prinzipiell nur ne Einzeltastenerkennung möglich.

Mehrfach geht nur, wie Sonic sagte, in einer Spalte oder Zeile.

Will man 2 beliebige Tasten gleichzeitig erkennen, muß man anders 
abtasten (z.B. 3* je 4 Bit).


Peter

Autor: rudi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
aha...

was geht denn jetzt mit meiner schaltung ???...Ich möchte ja auch nur 
eine Taste "gleichzeitig " erkennen ! das reicht ja zur 
codeauswertung....

hatte das ganze auch schon mal anders versucht...aber seht selbst, das 
war viel zu umständlich und dauert viel zu lange...oder könnt ihr mir 
sagen, was ich noch optimieren kann ?

dabei sind meine eingänge die spalten (PD0-PD2) und die ausgänge die 
Zeilen PD3-PD6.

Jede Zeile wird einzeln auf 0 gelegt und dann wir an den eingängen 
abgefragt ob eine 0 eingelesen wird....

thx

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist mit deinen Dioden? Hast du nun rausgebaut und die Matrix direkt 
angeschlossen?

MFG
Falk

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum gehts du jetzt wieder zu der alten Version zurück?

MfG
Falk

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein...und die müssen auch nicht raus !!!

da ich ja die dioden nur in den zeilen habe ! und die zeilen sind meine 
ausgänge ! die ausgänge liegen alle auf "1" und die eingänge (spalten) 
auch alle auf "1" (pull ups).Die ausgänge werden einzeln nach 0 
geschaltet...
wird jetzt eine taste gedrückt, lese ich an den eingängen die "0" ein ! 
da spielt es keine rolle ob diode vorhanden oder nicht. die dioden sind 
einzig und alleine für den kurzschlussfall den ich erwähnt habe...

thx

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja weil ich dachte, dass es mit deiner nicht funktioniert ? peter 
danegger hat doch geschrieben:

 Welcher Wechselstrom?

Nun, einmal sind die Spalten am Low-Ausgang (-) und die Zeilen am
High-Eingang (+) und beim 2. Mal ist es genau umgekehrt.

Mit Dioden in Reihe kanns also nicht gehen.


Peter


??

Autor: Falk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ rudi

>nein...und die müssen auch nicht raus !!!

Du musst es ja wissen . . .

(ich ahne schreckliches)

>einzig und alleine für den kurzschlussfall den ich erwähnt habe...
>dafür habe ich sie eingebaut

Es gibt gar keine Möglichkeit für einen Kurzschluss. Schau dir mal meine 
Version _korrektur_3 an. Die Pins, die als Ausgang geschalten werden, 
liegen auf LOW. Die Pins, die als Eingang geschalten werden haben einen 
aktiven Pull-up. Da kann man nix kurzschliessen.

MFG
Falk

P.S. Ich hab ne Vermutung, wahrscheinlich ist die Abfrage zu schnell. 
Die Pull-ups können die Pins nicht so schnell umladen (10pF * 50 kOhm = 
500ns Zeitkonstante, bis VCC/2). Versuch mal Version 4.


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk wrote:

> P.S. Ich hab ne Vermutung, wahrscheinlich ist die Abfrage zu schnell.
> Die Pull-ups können die Pins nicht so schnell umladen (10pF * 50 kOhm =
> 500ns Zeitkonstante, bis VCC/2). Versuch mal Version 4.


Das habe ich mir auch überlegt.

Deshalb setze ich zuerst die alten Ausgänge auf 1 und danach wird die 
Richtung umgeschaltet, d.h. nicht der Pullup muß sie auf high ziehen, 
sondern der neue Ausgang auf low:
...
  KEY_PORT = 0x1F;
  KEY_DDR = 0x70;
...
  KEY_PORT = 0xF0;
  KEY_DDR = 0x0F;
...

Dioden sind trotzdem nicht nötig, da ja immer sämtliche Ausgänge high 
oder low sind.


Peter

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ok danke nochmals für eure hilfe...

das heißt also, dass ich die Dioden jetzt drinlassen kann und es 
trotzdem funtionieren müsste ?

danke und einen schönen abenmd noch

rudi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimmse raus.


Peter

Autor: rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen...
Ich wollte mich vielmals bei euch bedanken...habe die dioden 
ausgebaut...jetzt funktioniert die Abfrage einwandfrei..spitze...

Danke an

Peter Dannegger (peda)
Falk (Gast) und

Sonic (Gast)

....vielen dank...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rudi wrote:
> Ich wollte mich vielmals bei euch bedanken...habe die dioden
> ausgebaut...jetzt funktioniert die Abfrage einwandfrei..spitze...

Ja so ist das mit dem Wechselstrom, Dioden mag er nicht.


Peter

Autor: Tastatur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wärst du so freundlich und würdest den Code posten damit andere auch was 
davon haben?
Schaltplan?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger

>Ja so ist das mit dem Wechselstrom, Dioden mag er nicht.

Eher umgedreht.

"Ehh, du gomst hier nisch rein!"
;-)

MFG
Falk

Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
switch( KEY_PIN & 0x0F ){
    default: return 0;
    case 0x07: key++;
    case 0x0B: key++;
    case 0x0D: key++;
    case 0x0E: ;
  }

Ist es nicht übersichtlicher mit Breaks zu arbeiten und die passende 
Konstante in key zu setzen?
Erzeugt bestimmt auch weniger Programmcode?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
X. H. wrote:

> Ist es nicht übersichtlicher mit Breaks zu arbeiten und die passende
> Konstante in key zu setzen?
> Erzeugt bestimmt auch weniger Programmcode?

Nö, Programmcode steht immer hintereinander im Flash.
Jeder Abzweig (break) kostet Dich also einen zusätzlichen Jump-Befehl.
In dieser Hinsicht haben die C-Entwickler mal mitgedacht.


Peter

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Jeder Abzweig (break) kostet Dich also einen zusätzlichen Jump-Befehl.
Kommt drauf an, ob ich in Richtung Geschwindigkeit oder Platz optimieren 
will. Mit Breaks wird die Abfrage nach erfüllter Bedingung sofort 
verlassen (schnell), ohne Breaks werden ALLE Abfragen durchlaufen 
(langsam).

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sonic

>verlassen (schnell), ohne Breaks werden ALLE Abfragen durchlaufen
>(langsam).

Nicht ganz. Alle Anweisungen des/der Zweige werden durchlaufen, die 
Abfragen jedoch nicht!

MfG
Falk


Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:
dass wir nicht schon wieder aneinander vorbeireden: alle 
case-Anweisungen (Abfragen) werden ausgeführt. Bei nichterfüllung wird 
zur nächsten gesprungen.
Stimmst du da zu?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sonic

>dass wir nicht schon wieder aneinander vorbeireden: alle

;-)

>case-Anweisungen (Abfragen) werden ausgeführt. Bei nichterfüllung wird
>zur nächsten gesprungen.
>Stimmst du da zu?

Wir müssen eine Trennung zwischen Abfrage (Vergleich der Variablen mit 
den case Konstanten) und Anweisungen in diesem jeweiligen Case Zweig 
durchführen.

Und soweit mir bisher bewusst war, läuft eine Switch-Anweisung so.

i = 5;
switch( i ){
    default: return 0;
    case 4: key++;
    case 3: key++;
    case 2: key++;
    case 1: ;
  }

Obiger Code müsste so ausgeführt werden

Vergleiche i mit 4 -> nein
Vergleiche i mit 3 -> nein
Vergleiche i mit 2 -> nein
Vergleiche i mit 1 -> nein
Springe zu Default

Vier Vergleiche mit jeweils negativem Ergebnis

Dagegen läuft es hier anders

i = 4;
switch( i ){
    default: return 0;
    case 4: key++;
    case 3: key++;
    case 2: key++;
    case 1: ;
  }

Vergleiche i mit 4 - OK
key++
key++
key++

Hier wird nur einmal verglichen! Aber drei Anweisungen aus den drei 
Zweigen ausgeführt.

MfG
Falk



Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich meinte ist:
i = 4;
switch( i ){
    default: return 0;
    case 4: key++;
    case 3: key++;
    case 2: key++;
    case 1: ;
  }
Hier wird mit 4 verglichen, auf 3, 2 und 1 auch noch geprüft, mit 
negativem Ergebnis. key wird um 1 inkrementiert.

Bei
i = 4;
switch( i ){
    default: return 0;
    case 4: key++;
            break;
    case 3: key++;
            break;
    case 2: key++;
            break;
    case 1: ;
  }
wird nach positver Abfrage auf 4 die switch-Abfrage verlassen und die 
restlichen case-Abfragen übersprungen. key wird um 1 inkrementiert.

Bei zahlreichen case-Abfragen spart man so einiges an Rechenzeit.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sonic

>Was ich meinte ist:
>i = 4;
>switch( i ){
>    default: return 0;
>    case 4: key++;
>    case 3: key++;
>    case 2: key++;
>    case 1: ;
>  }
>Hier wird mit 4 verglichen, auf 3, 2 und 1 auch noch geprüft, mit
>negativem Ergebnis. key wird um 1 inkrementiert.

Ohhh, DAS glaube ich nicht. Dann wäre ja die break Anweisung sinnlos!
Es wird mit 4 verglichen, Positiv, und dann 3x key++! Die case 
Anweisungen sind praktisch nur Sprungmarken!

Bei
i = 4;
switch( i ){
    default: return 0;
    case 4: key++;
            break;
    case 3: key++;
            break;
    case 2: key++;
            break;
    case 1: ;
  }
wird nach positver Abfrage auf 4 die switch-Abfrage verlassen und die
restlichen case-Abfragen übersprungen. key wird um 1 inkrementiert.

>Bei zahlreichen case-Abfragen spart man so einiges an Rechenzeit.

Nö, das ist eine andere Baustelle. Der letzte Case-Zweig bzw. default 
ist immer der langsamse, denn vorher müssen alle anderen Werte geprüft 
werden (Wenn da nicht der Compiler SEHR schlau ist und irgendwelche 
Muster erkennt und mit einer binären Suche den Suchweg verkürzt, oder 
Sprung per Index).

MFG
Falk


Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das stimmt schon, wenn erst die letzte Abfrage erfüllt ist. Der 
Programmierer sollte drauf achten, dass selten vorkommende Zustände 
immer zuletzt abgefragt werden. So habe ich das jedenfallds gelernt.
>und dann 3x key++!
Wie kommst du auf 3x key++? In der switch-case-Abfrage kann nur EIN 
Zweig erfüllt sein, außer man fragt zweimal auf das selbe Ergebnis ab.
Ich habe auch mal gelernt:
'continue' beendet die aktuelle Schleifeniteration,
'break' beendet die ganze Schleife und
'return' beendet die ganze Funktion

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sonic

>immer zuletzt abgefragt werden. So habe ich das jedenfallds gelernt.
>>und dann 3x key++!
>Wie kommst du auf 3x key++? In der switch-case-Abfrage kann nur EIN
>Zweig erfüllt sein, außer man fragt zweimal auf das selbe Ergebnis ab.

Ohhhh, ich fürchte du bist da gewaltig auf dem Holzweg! Mach mal Urlaub. 
So verdienst du nicht mehr lange deine Brötchen mit Programmierung.

>'break' beendet die ganze Schleife und

Hier gehts aber nciht um ne Schleife sondern ein SWITCH Statement. 
Ausserdem muss man die Hierachie beachten!

MFG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das eigentlich mal am Debugger getestet? Ich stimme dir zu dass 
ich mal Urlaub brauche ;) , aber da bin ich wohl nicht der Einzige, 
oder?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sonic

>Hast du das eigentlich mal am Debugger getestet? Ich stimme dir zu dass

Nöö, aber a) das kann ich machen und b) das sthet nun WIRKLICH in jedem 
C Buch. Werde beides gleich nochmal für dich konsultieren.

>ich mal Urlaub brauche ;) , aber da bin ich wohl nicht der Einzige,
>oder?

Naja, gegen Urlaub hab ich wenig einzuwenden, aber ich fürchte du hast 
dich mal wieder mit der Logik verrannt. Lies die Postings (deine wie 
meine) nochmal. Und schau auch mal in ein C Buch. Peter, sach doch auch 
mal was.

MFG
Falk

Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk hat da schon recht. Sonst würde der switch auf key_pin auch keinen 
Sinn machen. Musste auch erstmal überlegen, warum das Sinn machte.
Kann eben gefährlich sein wegen falschen Schlussfolgerungen...

http://www.phim.unibe.ch/comp_doc/c_manual/C/SYNTA...
Here, if the Grade is 'A' then the output will be [...]

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, in dem Link isses doch prima beschrieben:

case 'A' : printf( "Excellent" );
        case 'B' : printf( "Good" );
        case 'C' : printf( "OK" );
        case 'D' : printf( "Mmmmm...." );
        case 'F' : printf( "You must do better than this" );
        default  : printf( "What is your grade anyway?" );

Das ist Pfui! Deshalb soll man keine Schlechten Beispiele drucken (oder 
schreiben)!

Klar macht die switch-Abfrage das so, aber das ist äußerst unschön und 
verwirrend! So sollte es sein:

case 'A' : printf( "Excellent" );
                   break;

        case 'B' : printf( "Good" );
             break;

  case 'C' : printf( "OK" );
             break;

        case 'D' : printf( "Mmmmm...." );
             break;

  case 'F' : printf( "You must do better than this" );
             break;

  default  : printf( "What is your grade anyway?" );
                   break;

Das ist sauber Strukturiert.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, schön aussehen tut's auch nicht ;-). Hätte die Vorschau bemühen 
sollen!

Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonic wrote:
> Klar macht die switch-Abfrage das so, [...]

Wenn das:
Output:
Excellent
Good
OK
Mmmmm....
You must do better than this    
What is your grade anyway?
klar ist, warum behautest du hier:
i = 4;
switch( i ){
    default: return 0;
    case 4: key++;
    case 3: key++;
    case 2: key++;
    case 1: ;
  }

Vergleiche i mit 4 - OK
key++
key++
key++


etwas anderes?
(siehe:
Autor: Falk (Gast) - Datum: 01.04.2007 19:04)

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich voraussetze dass das

i = 4;
switch( i ){
    default: return 0;
    case 4: key++;
    case 3: key++;
    case 2: key++;
    case 1: ;
  }

nicht sein darf! Das ist äußest unschön programmiert, darum bin ich 
drüber gestolpert.

Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonic wrote:
> Weil ich voraussetze dass das
>
> i = 4;
> switch( i ){
>     default: return 0;
>     case 4: key++;
>     case 3: key++;
>     case 2: key++;
>     case 1: ;
>   }
>
> nicht sein darf! Das ist äußest unschön programmiert, darum bin ich
> drüber gestolpert.

Ok.
Ich find das auch unschön.

Ist also der Konflikt zwischen Programm-Speicher sparen versus Schönheit 
und Schnelligkeit ;-)

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau so ist es!

>     default: return 0;
>     case 4: key++;

würde ich

     default: return 0;
     case 4: key+=3;
             break;

schreiben.

Wenn viele cases danach kommen hast du einiges gespart.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic

Moin,

>Weil ich voraussetze dass das

>i = 4;
>switch( i ){
>    default: return 0;
>    case 4: key++;
>    case 3: key++;
>    case 2: key++;
>    case 1: ;
>  }

>nicht sein darf! Das ist äußest unschön programmiert, darum bin ich
>drüber gestolpert.

Ahhhh, du bist neuerdings das Mass der Dinge. Naja, das egozentrische 
Weltbild hatte schon immer Hochkonjunktur, Inqisition und Kepler zum 
Trotz.
Sonic, du machst dich lächerlich. Und deine Ausreden waren auch schon 
mal besser.

MFG
Falk

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S. Die Switch-Anweisung ohne breaks hat schon ihre Berechtigung. Und 
wenn mans sauber formatiert ist sie auch gut lesbar.

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ahhhh, du bist neuerdings das Mass der Dinge.

Jemand muß dir schließlich Paroli bieten.

BTW: Sonic hat seine Kompetenz hier im Forum schon bewiesen, von dir 
kamen bisher nur Zurechtweisungen.

Schöne Woche.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jupp

>Jemand muß dir schließlich Paroli bieten.

Versuchen darf das jeder. Aber er hat sich hier mal wieder verrannt.

>BTW: Sonic hat seine Kompetenz hier im Forum schon bewiesen, von dir
>kamen bisher nur Zurechtweisungen.

Erzähl noch mehr Märchen. Vieleicht wird mal ein Buch draus.

MFG
Falk

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Versuchen darf das jeder.

Du merkst scheinbar gar nicht, was für einen Charakter du hier 
rüberbringst, oder? Bist du wirklich so oder ist das nur gespielt?

Was machst du eigentlich beruflich? Bestimmt wissenschaftlicher 
Mitarbeiter, oder?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jupp

>>Versuchen darf das jeder.

>Du merkst scheinbar gar nicht, was für einen Charakter du hier
>rüberbringst, oder? Bist du wirklich so oder ist das nur gespielt?

Wie man in den Wald hineinruft, so schallt es heraus.

>Was machst du eigentlich beruflich? Bestimmt wissenschaftlicher
>Mitarbeiter, oder?

Ganz kalt. Dreimal darfst du raten.

MfG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, viel kann der Falk ja nicht schaffen, wenn er zu jeder Tage- und 
Nachtzeit hier im Forum anzutreffen ist! ;-)

Könntet ihr bitte über mich lästern wenn ich NICHT da bin? das tut mir 
doch auch weh!  :D  :D

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.