www.mikrocontroller.net

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


Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würd ich mal ganz scharf über die Namensgebung nachdenken.

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja...typischer BASCOM-Effekt würd ich das nennen.

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

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Sammel (magic33)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <io.h>


typedef unsigned char  u8;
typedef unsigned short u16;
#define NOP();  asm volatile("nop"::);


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


u8 keyscan( void )
{
  u8 col = 0, row = 0;

  KEY_PORT = 0xFF;
  KEY_DDR = 0xF0;
  KEY_PORT = 0x0F;
  NOP();                        // wait until input changed
  if( ~KEY_PIN & 1<<0 )
    col = 4;
  if( ~KEY_PIN & 1<<1 )
    col = 3;
  if( ~KEY_PIN & 1<<2 )
    col = 2;
  if( ~KEY_PIN & 1<<3 )
    col = 1;
  if( col ){
    KEY_PORT = 0xFF;
    KEY_DDR = 0x0F;
    KEY_PORT = 0xF0;
    NOP();
    if( ~KEY_PIN & 1<<4 )
      row = 5;
    if( ~KEY_PIN & 1<<5 )
      row = 9;
    if( ~KEY_PIN & 1<<6 )
      row = 13;
    if( ~KEY_PIN & 1<<7 )
      row = 17;
    if( row == 0 )
      row = col;                // 0 = no key
  }
  return row - col;             // 1..16 = key
} 


Peter

Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

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.