www.mikrocontroller.net

Forum: Compiler & IDEs Wie einen Ausgangspin mit if abfragen


Autor: Thomas Webster (ram99)
Datum:

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

Autor: Graf van Hirntot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRB |= 0xff;
PORTB = buffer;

DDRB &= ~(1 << 1);  //als Eingang

if ( PINB & (1 << 1) )
{
.....
}

DDRB |= (1 << 1);  //als Ausgang
Es reicht aber auch wenn dein Port eh als Ausgang definiert ist, das 
Register zu lesen. Etwa so:
if ( PORTB & (1 << 1) )
{
.....
}

GvH

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if ( PINB & (1<<PINB1) )   //Hier würde ich gern Wissen was geht
{
.....
}
eigentlich richtig. Woher weisst du denn, daß das nicht funktioniert?

Oliver

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
void beispiel_konfiguration(unsigned char buffer)
{
  DDRB |= 0xff;
  PORTB = buffer;    //In buffer ist Wert 0 - 255
}

void abfrage(unsigned char pin)
{
  if (DDRB & (1<<pin))
  {
     // Ausgang
     if (PORTB & (1<<pin))
     {
        // HIGH gesetzt
     }
     else
     { 
        // LOW gesetzt
     }
  }
  else
  {
     // Eingang
     if (PINB & (1<<pin))
     {
        // HIGH liegt an
     }
     else
     { 
        // LOW liegt an
     }
  }
}

  

Autor: Graf van Hirntot (Gast)
Datum:
Angehängte Dateien:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Thomas Webster (ram99)
Datum:

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

Autor: Graf van Hirntot (Gast)
Datum:

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

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

GvH

Autor: Walter (Gast)
Datum:

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

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.