Forum: Mikrocontroller und Digitale Elektronik Eingangspins auslesen


von µC-noob (Gast)


Lesenswert?

Hallo,
sorry mir war kein Oberbegriff für meine Frage eingefallen.

--> Atmega 128, gcc compiler <--

Problem:
Ich würde gerne eine Funktion schreiben, die es ermöglicht mehrere 
Eingangspins zu erkennen.

Etwa so
1
static char inValue = 0x16; //PINE4
2
3
unsigned char get_datapins_hardware(void)
4
{
5
6
if (inValue > 2 )
7
return !( (PINE & inValue) ) ;
8
9
}
10
11
....
12
13
if (get_datapins_hardware) //tu was

Nun möchte ich es aber so gestalten dass man nicht immer nur einen Pin 
auslesen kann sondern mehrere gleichzeitig:

Etwa so
1
static char inValue = 0x80; //PINE4 + PINE6
2
3
unsigned char get_datapins_hardware(void)
4
{
5
6
if (inValue > 2 )
7
return !( (PINE & inValue) ) ;
8
9
}
10
11
....
12
13
if (get_datapins_hardware) //tu was


Das geht so aber leider nicht.

Gibt es eine möglichkeit Pins so auszulesen, ohne eine for - schleife??

Gruß
Jo

von Patrick (Gast)


Lesenswert?

PINE hat doch immer einen bestimmten Wert, je nach dem, welcher Schalter 
betätigt ist.
z.B. bei Pin 0 und 6 auf high und die anderen auf low:
PINE = 0b01000001

Da könntest Du PINE selbst als variable verwenden, die sich je nach 
Port-Zustand verändert.

Andere Frage: Was willst Du damit eigentlich machen? Vielleicht gibt es 
einen anderen Lösungsansatz für Dein Problem.

von Heinrich (Gast)


Lesenswert?

Ganzen Port einlesen und dann Bitmanipulation

von Patrick (Gast)


Lesenswert?

^^^^ genau das wollte ich damit sagen ;-)

von Compy (Gast)


Lesenswert?

Da is noch was:
1
if (get_datapins_hardware) //tu was

Das is mitunter net ganz ungefährlich. Machnal wird für 
get_datapins_hardware dann nämlich nicht die Routine aufgerufen, und 
dann deren Rückgabewert ausgewertet, sondern einfach die Adresse der 
Routine betrachtet (so als ob get_datapins_hardware eine Variable/ein 
Zeiger wäre).

So ists sicherer:
1
if (get_datapins_hardware()) //tu was mit Klammern!

von µC-noob (Gast)


Lesenswert?

Ich habe ein menü,

in einem Menüpunkt kann der Anwender wählen, welche Pins geprüft werden 
sollen.

In einem anderen menü, wird dann Ausgegeben, ob an den Gewählten Pins 
ein High oder Low - Signal anliegt.

Ich hatte es folgendermaßen geplant:

Globale Variable:
1
unsigned char inValue;

//Pins übers menü setzen
1
unsigned char set_getDatapins_input(unsigned char cPinnumber)
2
{
3
  // Processorpins PINE7 PINE6 PINE5 PINE4 PIND0 PIND1
4
  // Boxpins       PIN6  PIN5  PIN4  PIN2  PIN7  PIN8
5
  // brief:  PIN1 and PIN3 not handled in this function --> only Output
6
7
  if (cPinnumber > 1 )//&& cPinnumber != 3)
8
  {
9
    if (cPinnumber < 7)
10
    {
11
      if (cPinnumber == 2)
12
        inValue |= ( 1 << (cPinnumber + 2) );
13
      else
14
        inValue |= ( 1 << (cPinnumber + 1) );
15
        
16
      return inValue;  
17
    }
18
    else 
19
    {
20
      inValue |= ( 1 << (cPinnumber - 7) );
21
22
      return inValue;
23
    }
24
  }
25
  else
26
  {
27
    return inValue;    //Previous value to read
28
  }
29
}
//Pins übers menü rücksetzen
1
void reset_getDatapins_input(unsigned char cPinnumber)
2
{
3
  // Processorpins PINE7 PINE6 PINE5 PINE4 PIND0 PIND1
4
  // Boxpins       PIN6  PIN5  PIN4  PIN2  PIN7  PIN8
5
  // brief:  PIN1 and PIN3 not handled in this function --> only Output
6
7
  if (cPinnumber > 1 )//&& cPinnumber != 3)
8
  {
9
    if (cPinnumber < 7)
10
    {
11
      if (cPinnumber == 2)
12
        inValue &= ~( 1 << (cPinnumber + 2) );
13
      else
14
        inValue &= ~( 1 << (cPinnumber + 1) );
15
    }
16
    else 
17
    {
18
      inValue &= ~( 1 << (cPinnumber - 7) );
19
    }
20
  }
21
}

//Pins abfragen
1
unsigned char get_datapins_hardware(void)
2
{
3
         if (inValue > 2 )
4
    return !( (PINE & (inValue) );
5
6
  else  
7
    return !( PIND & inValue );
8
}

so ist mein Aufruf:
//menü Setze zu Prüfende Pins
  set_getDatapins_input(2);
  set_getDatapins_input(5);

Wenn ich NUR set_getDatapins_input(2); oder NUR 
set_getDatapins_input(5);
schreibe gehts einwandfrei.

//menü Prüfe Pinstatus --> Wird alle 10ms erneut aufgerufen.
  get_datapins_hardware();


Gruß

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich das richtig sehe, liegt dein Problem hier
if (inValue > 2 )

inValue ist, sobald du irgendeiner der E-Pins freigeschaltet
ist, immer größer als 2.

Wenn du mehrere Pins, über mehrere Ports verteilt abfragen
willst, dann musst du auf jeden Fall beide PIN Register
auslesen und die Ergebnisse miteinenader verknüpfen.

von µC-noob (Gast)


Lesenswert?

Habs geschafft,
danke für die Hinweise

So habs ich Gelöst (ich weiß, nicht die opti-lösung)
1
unsigned char get_datapins_hardware(void)
2
{
3
  static unsigned char pinHigh = 0;
4
//  Processorpins PINE7 PINE6 PINE5 PINE4 PIND0 PIND1
5
//  Boxpins       PIN6  PIN5  PIN4  PIN2  PIN7  PIN8
6
//  Boxpins PIN1 and PIN3 not handled in this function --> only Output
7
8
9
    if( !(PINE & 16) && (inValue & 16) )
10
      pinHigh |= 16;
11
    else
12
      pinHigh &= ~16;
13
14
15
    if( !(PINE & 32) && (inValue & 32))
16
      pinHigh |= 32;
17
    else
18
      pinHigh &= ~32;
19
    
20
21
    if( !(PINE & 64) && (inValue & 64) )
22
      pinHigh |= 64;
23
    else
24
      pinHigh &= ~64;
25
    
26
27
    if( !(PINE & 128) && (inValue & 128))
28
      pinHigh |= 128;
29
    else
30
      pinHigh &= ~128;
31
32
    if( !(PIND & 0x01) && (inValue & 1 ) )
33
      pinHigh |= 1;
34
    else
35
      pinHigh &= ~1;
36
37
    if( !(PIND & 0x02) && (inValue & 2 ) )
38
      pinHigh |= 2;
39
    else
40
      pinHigh &= ~2;
41
  //}
42
43
  return pinHigh;
44
45
}

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Bist du an einer 'einfacheren' Lösung interessiert?
1
unsigned char get_datapins_hardware(void)
2
{
3
//  Processorpins PINE7 PINE6 PINE5 PINE4 PIND0 PIND1
4
//  Boxpins       PIN6  PIN5  PIN4  PIN2  PIN7  PIN8
5
//  Boxpins PIN1 and PIN3 not handled in this function --> only Output
6
7
  unsigned char pinHigh = 0;
8
9
  pinHigh = ( PINE & 0xF0 ) | ( PIND & 0x03 );
10
  return pinHigh & inValue;
11
}

Ist nicht ganz gleichwertig. Bei dir werden die einzelnen
Pins nacheinander abgefragt, bei mir (zumindest an einem Port)
gleichzeitig. Ich denke mal dass das für den geplanten Anwendungs-
fall aber keine Rolle spielt.

Noch ein kleiner Tipp:
Wenn du mit Bitwerten um dich schmeisst, dann benutze
Hex-Zahlen oder Binärzahlen aber keine Dezimalzahlen.
IN Hex bzw. Binärzahlen kann man direkt das gesetzte
Bit erkennen, bei Dezimalzahlen muss man erst gross
rumrechnen.

von µC-noob (Gast)


Lesenswert?

merci!!

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.