Wie einen Ausgangspin mit if abfragen

OP #515315
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
Gast #515334
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
Gast #515771
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
Gast #515813
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
}

  
Gast #515884
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
Angehängte Dateien:
Gast #515910
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
OP #515985
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
Gast #516023
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.