Forum: Compiler & IDEs Wie einen Ausgangspin mit if abfragen


von Thomas W. (ram99)


Lesenswert?

Hallo
Ich würde gern in meinem Programm einen einzelnen Ausgangspin mit if 
abfragen ob der Ausgang gesetzt ist oder nicht.
Ich habe es mit:

DDRB |= 0xff;
PORTB = buffer;    //In buffer ist Wert 0 - 255

if ( PINB & (1<<PINB1) )   //Hier würde ich gern Wissen was geht
{
.....
}

versucht aber das ging nicht. Der komplette Port B ist als Ausgang 
definiert und wird über ein Byte angesteuert.

Gruß
   Ram99

von Graf van Hirntot (Gast)


Lesenswert?

1
DDRB |= 0xff;
2
PORTB = buffer;
3
4
DDRB &= ~(1 << 1);  //als Eingang
5
6
if ( PINB & (1 << 1) )
7
{
8
.....
9
}
10
11
DDRB |= (1 << 1);  //als Ausgang
Es reicht aber auch wenn dein Port eh als Ausgang definiert ist, das 
Register zu lesen. Etwa so:
1
if ( PORTB & (1 << 1) )
2
{
3
.....
4
}

GvH

von Oliver (Gast)


Lesenswert?

Datenblatt lesen.

Beim Meag32 steht z.B.

"Independent of the setting of Data Direction bit DDxn, the port pin can 
be read through the PINxn Register bit."

Also ist dein
1
if ( PINB & (1<<PINB1) )   //Hier würde ich gern Wissen was geht
2
{
3
.....
4
}
eigentlich richtig. Woher weisst du denn, daß das nicht funktioniert?

Oliver

von Stefan (Gast)


Lesenswert?

> Ich würde gern in meinem Programm einen einzelnen Ausgangspin mit if
> abfragen ob der Ausgang gesetzt ist oder nicht.

An Hand des DDR Registers weisst du, ob ein Port als Eingang (Bit=0) 
oder als Ausgang (Bit=1) konfiguriert ist.

Wenn du herausgefunden hast, dass der Port als Ausgang konfiguriert ist, 
kannst du bei PORT herausfinden, ob der Ausgang LOW (Bit=0) oder HIGH 
(Bit=1) gesetzt ist.
1
void beispiel_konfiguration(unsigned char buffer)
2
{
3
  DDRB |= 0xff;
4
  PORTB = buffer;    //In buffer ist Wert 0 - 255
5
}
6
7
void abfrage(unsigned char pin)
8
{
9
  if (DDRB & (1<<pin))
10
  {
11
     // Ausgang
12
     if (PORTB & (1<<pin))
13
     {
14
        // HIGH gesetzt
15
     }
16
     else
17
     { 
18
        // LOW gesetzt
19
     }
20
  }
21
  else
22
  {
23
     // Eingang
24
     if (PINB & (1<<pin))
25
     {
26
        // HIGH liegt an
27
     }
28
     else
29
     { 
30
        // LOW liegt an
31
     }
32
  }
33
}

  

von Graf van Hirntot (Gast)


Angehängte Dateien:

Lesenswert?

>> Datenblatt lesen.
>>
>> Beim Meag32 steht z.B.
>>
>> "Independent of the setting of Data Direction bit DDxn, the port pin can
>> be read through the PINxn Register bit."

Macht bloß herzlich wenig Sinn. Aber klar dass das funktioniert.

GvH

von Oliver (Gast)


Lesenswert?

Über den "Sinn" zu diskutieren, ist müssig. So hat es ATMEL eingebaut, 
so steht es im Datenblatt, und so funktioniert es auch.

Daher auch nochmal meine Frage an Thomas Webster: Woram merkst du dann, 
daß das anscheinend nicht funktioniert?

Oliver

von Thomas W. (ram99)


Lesenswert?

Oliver wrote:
> Über den "Sinn" zu diskutieren, ist müssig. So hat es ATMEL eingebaut,
> so steht es im Datenblatt, und so funktioniert es auch.
>
> Daher auch nochmal meine Frage an Thomas Webster: Woram merkst du dann,
> daß das anscheinend nicht funktioniert?
>
> Oliver


Danke erstmal für die vielen Antworten :)

Ich habe es ja mit dieser Variante: if(PINB & (1<<PINB1)) versucht aber 
das Programm springt immer in die else {} Bedingung.

Wenn ich es wie " Graf van Hirntot" mache mit: if (PORTB & (1 << 1)) 
funktioniert es sofort ohne Probleme. Weiß auch nicht warum die obere 
Variante nicht funktioniert. Hatte es ja erst versucht weil ich es so 
eigentlich kannte.

Gruß
   Ram99

von Graf van Hirntot (Gast)


Lesenswert?

Mach doch mal bitte probehalber drei oder vier von diesen hier vor die 
if-schleife:
1
asm volatile ("nop");

Vielleicht ist ja mein Verdacht begründet - es würde mich aber 
überraschen.

GvH

von Walter (Gast)


Lesenswert?

mit PORTB liest Du das Ausgangsregister,
mit PINB den Pin,
vermutlich ist der Ausgang auf low gezogen bzw. geht nicht schnell genug 
auf high

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.