Forum: Mikrocontroller und Digitale Elektronik C++ oh JE Funktion und rückgabe


von Lothar S. (magic33)


Lesenswert?

servus

ich hätte gerne eine Funnktion die mir den PIND statur zurückgibt

uint8_t taste()
{
 uint8_t keys = 0;
 ....
 keys=PIND
 return keys;

}



int main ()
{
 uint8_t taste =0

 taste=taste()


}

so geht es nicht funktion nicht callabel
HILFE
DANKE

von Sven P. (Gast)


Lesenswert?

Würd ich mal ganz scharf über die Namensgebung nachdenken.

von Hmm... (Gast)


Lesenswert?

Zunächst müssen Taster irgendwie entprellt werden. Das geht z.B. per 
Hardware (R/C-Glied) oder besser noch per Software.

Dazu wurde hier im Forum schon sooo viel geschrieben, guck dir mal die 
Suchfunktion an, die hilft ;)

http://www.mikrocontroller.net/articles/Entprellung

Es gibt dazu auch schon prima Code-Beispiele z.B. von Peter Dannegger:

Beitrag "Tasten entprellen - Bulletproof"

von Jean P. (fubu1000)


Lesenswert?

Das ist ja absoluter Käse. Wofür brauch man ne Funktion die das 
PIN-Register zurückgibt ?
Schreib doch gleich taste = PIND und gut.

von Lothar S. (magic33)


Lesenswert?

ich versuch eine 4x3 Tastenmatrix einzulesen

bei meinen hochgelobten und viel gescholtenen BASCOM heist das getKBD()

und in dem Hochgeprisenen aber meistGehastem C++
gibt es dafür keie .h .c oder irgendwas

verflucht sei C bringt aber nix!
das muss klappen

3 col an PD0-2
4 Row an PD4-7

DDRD = 0x0F;

ich lese schon seit 2 tagen posts
das kann doch nicht sein das ich da ein risen programm für brauche um 
einen port zustand zu ermitteln !
in euern Beispiel werden 5 Dateien voll mit C benötigt umm eine taste 
abzufragen(idiotensicher)!

ich habe 12Tasten (BASCOM config KBD PordD --- taste=getKBD() fertig 
!!!!!)
brauch ich dann 12x 5 dateien für eine 4x3 matrix

woher soll ich all diesen speicher nehmen

von Hmm... (Gast)


Lesenswert?

Nö, brauchst du auch nicht. Du hast halt 3 Pins die du als Ausgang 
ansteuerst und 4 Eingänge. Oder andersherum, da musst du dich schon 
entscheiden. Nehmen wir mal an PB0..PB2 wären die Ausgänge:

DDRB = 0x07;  // PB0..PB2 als Ausgang, der Rest Eingang

Nun setzt man jeweils einen Ausgang auf 1 und liest die Eingänge:

char x;
PORTB = 0x01;      // 1. Zeile lesen
x     = (PINB>>3); // Bitmaske in x lesen, x.0 = 1. Taste,...

so kann man der Reihe nach alle 3 Zeilen lesen. Entprellen sollte man 
das trotzdem noch, siehe die Links oben.

BASCOM macht da sicher auch nix anderes. Nur hast du relativ wenig 
Kontrolle darüber, wie entprellt wird. Sobald dein System 
ressourcenmässig mal etwas voller wird, wirst du die zusätzliche 
Kontrolle zu schätzen lernen ;)

Wie du bereits erkannt hast ist der Nachteil davon allerdings, das du 
wissen musst, was passiert. Aber Grundlagenwissen dürfte auch in BASCOM 
nicht schaden...

von Sven P. (Gast)


Lesenswert?

tja...typischer BASCOM-Effekt würd ich das nennen.

Mach dir klar, wie ne Matrixtastatur funktioniert, dann ergibt sich dein 
Programm von selbst.

von tata (Gast)


Lesenswert?

Oh man, das hier ist ein gutes Beispiel für 
Wie-sollte-man-niemals-eine-Frage-stellen.
Als erstes der Topic:
-Du arbeitest anscheinend auf einem Mikrocontroller, also wird das da
 oben C sein. Die Quelltext-Ausschnitte sagen das gleiche.
-"C++ oh JE Funktion und rückgabe" bei dem Titel wolltest du nichts
 erreichen, oder? Wer soll bei einem solchen Titel, den ich vermutlich
 irgendwie doch verstehe, nur Lust bekommen zu antworten?
-Deine Code-Ausschnitte sind zu alledem (ebenfalls lustlos) aus dem
 Gedächtnis hier getippt worden. Bei so vielen Syntax vergeht mir alles
 und du baust dir nur selbst eine Fehlerquelle mehr ein. Sowas kopiert
 man mit <STRG+C> und <STRG+V>, da sonst beim von Hand eintippen nur
 noch mehr Fehler eingebaut werden.

Dein Problem ist im übrigen auch, dass die Variable 'taste' gleichzeitig
der Funktionszeiger (-> ich verweise auf ein gutes C-Buch) auf die
Funktion 'taste' ist.

von Lothar S. (magic33)


Lesenswert?

ok klar soweit

kann ich
wenn ich die spalte 0 PORTB=0x01 setze

char x;
gleich alle 4 reihen einlesen

x=  (PIND>>4) 5 6 7

wie sieht das aus
dann cheken ob was war
das ganze noch 2 mal und dann hat er es

von Unbekannter (Gast)


Lesenswert?

Was passiert, wenn zwei Menschen den gleichen Namen haben und diese 
Menschen nebeneinander stehen und Du sie mit ihrem Namen ansprichst?

Antworten beide? Oder anwortet einer? Wenn ja welcher? Gibt es ein 
Durcheinander? Wenn ja, warum? Wie könnte man das Problem lösen?

von Lothar S. (magic33)


Angehängte Dateien:

Lesenswert?

DANKE DANKE
na bitte wenn der ansatz stimmpt
es geht GANZ EINFACH

uint8_t taste_lesen()
{
  uint8_t keys = 0;
  char wert ='-';
  PORTD=0x03;
  _delay_us( 10 );
  keys = PIND;
  if (keys == 115)
   wert ='3';
  if (keys == 179)
   wert ='6';
  if (keys == 211)
   wert ='9';
  if (keys == 227)
   wert ='#';
  PORTD=0x05;
  _delay_us( 10 );
  keys = PIND;
  if (keys == 117)
   wert ='2';
  if (keys == 181)
   wert ='5';
  if (keys == 213)
   wert ='8';
  if (keys == 229)
   wert ='0';
  PORTD=0x06;
  _delay_us( 10 );
  keys = PIND;
  if (keys == 118)
   wert ='1';
  if (keys == 182)
   wert ='4';
  if (keys == 214)
   wert ='7';
  if (keys == 230)
   wert ='*';
  keys =wert;
  _delay_us( 10 );
  return keys;
}

je zwei reihen ausschalten-- Blockieren (port ein)
dann den PINSTATUS abfragen
und auswerten

bei meiner schaltung tastaturmatrix 4x3 einfach an den port
col = PD0-PD2
row = PD4-PD7

ergibt die obige Funktion den tastendruck zurück

von Peter D. (peda)


Lesenswert?

Lothar Sammel wrote:
> ich versuch eine 4x3 Tastenmatrix einzulesen

Und warum dann dieser saublöde Titel?

Willst Du etwa absichtlich nur genervte und unpassende Antworten 
erhalten?


Bei ner Matrix muß man zweimal einlesen, einmal die Spalten und dann die 
Zeilen.
Hier ein Beispiel für ne 4*4 Matrix.
1
#include <io.h>
2
3
4
typedef unsigned char  u8;
5
typedef unsigned short u16;
6
#define NOP();  asm volatile("nop"::);
7
8
9
#define KEY_PIN         PINB
10
#define KEY_PORT        PORTB
11
#define KEY_DDR         DDRB
12
13
14
u8 keyscan( void )
15
{
16
  u8 col = 0, row = 0;
17
18
  KEY_PORT = 0xFF;
19
  KEY_DDR = 0xF0;
20
  KEY_PORT = 0x0F;
21
  NOP();                        // wait until input changed
22
  if( ~KEY_PIN & 1<<0 )
23
    col = 4;
24
  if( ~KEY_PIN & 1<<1 )
25
    col = 3;
26
  if( ~KEY_PIN & 1<<2 )
27
    col = 2;
28
  if( ~KEY_PIN & 1<<3 )
29
    col = 1;
30
  if( col ){
31
    KEY_PORT = 0xFF;
32
    KEY_DDR = 0x0F;
33
    KEY_PORT = 0xF0;
34
    NOP();
35
    if( ~KEY_PIN & 1<<4 )
36
      row = 5;
37
    if( ~KEY_PIN & 1<<5 )
38
      row = 9;
39
    if( ~KEY_PIN & 1<<6 )
40
      row = 13;
41
    if( ~KEY_PIN & 1<<7 )
42
      row = 17;
43
    if( row == 0 )
44
      row = col;                // 0 = no key
45
  }
46
  return row - col;             // 1..16 = key
47
}


Peter

von Lothar S. (magic33)


Lesenswert?

Danke ist nicht einfach zu verstehen mit dem ganzen geschiebe <<
1<<0 - 7 heist schiebe eine 1 an bit
~ was ist das (Nicht) oder invert

kann ich bei 4x3 enfach die col=0 rausnehmen  bei mir ist der pin3 nicht 
beschaltet oder wird dann das ganze innstabil

müsste sicher dann die col  neu nummerieren im programm

von Peter D. (peda)


Lesenswert?

Lothar Sammel wrote:
> Danke ist nicht einfach zu verstehen mit dem ganzen geschiebe <<
> 1<<0 - 7 heist schiebe eine 1 an bit

Ja, das ist zur besseren Lesbarkeit.

> ~ was ist das (Nicht) oder invert

Ja, da die Pullups verwendet werden, ist ne gedrückte Taste low aktiv.

> kann ich bei 4x3 enfach die col=0 rausnehmen  bei mir ist der pin3 nicht
> beschaltet

Ja.

> oder wird dann das ganze innstabil

Warum sollte es?
Pins, die man nicht testet haben keinen Einfluß mehr und können 
anderweitig verwendet werden.

> müsste sicher dann die col  neu nummerieren im programm

Ja, sonst hast Du Lücken.


Versuch mal, das Programm zu verstehen.


Peter

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.