Auslesen eines Pins - was ist falsch?

Gast #3284454
Lesenswert?

Hallo zusammen,

um das Auslesen eines Pins zu testen, habe ich folgenden C-Code für 
einen atmega8 geschrieben:
1
#include <avr/io.h>
2

3
int main(){
4
  
5
  DDRD = 0xff; //DDRD outputs
6
  DDRB = 0x00; //DDRB inputs
7
  PORTD = 0x08; //PORTD = 0b00001000 => D3 HIGH
8
  PORTB = 0x00;
9
  
10
  while(1){
11
  
12
    if((PORTB & 0x80) == 0x80){ //if B7 HIGH, then D3 LOW
13
      PORTD &= ~(1<<3);
14
    }
15
    if((PORTB & 0x80) == 0x00){ //if B7 LOW, then D3 HIGH
16
      PORTD |= (1<<3);
17
    }
18
  }
19
  
20
  return 0;
21
  
22
}

Die LED, die ich an D3 angeschlossen habe, leuchtet, auch wenn ich B7 an 
+5V lege. Habe ich einen Fehler im Code gemacht?


Sorry für die triviale Frage, habe heute erst mit der AVR-Programmierung 
angefangen und hadere noch etwas mit dem Syntax.

Würde mich sehr Freuen, wenn mir jemand weiterhelfen könnte.

Gruß
Gast #3284462
Lesenswert?

Pins werden nicht über das PORT Register sondern über das PIN Register 
abgefragt.
Außerdem ist es besser lesbar, wenn du nicht mit hex-Zahlen 
rumhantierst.

Also machs lieber so:

if (PINB & (1<<PB7) )
{
    mach_was();
}
else
{
    was_anderes();
}


lg
Chris
Gast #3284742
Lesenswert?

Martin Wende schrieb:
> Steht so aber auch im heiligen Grahl Namens Datenblatt.

Ein wenig hinkt der Vergleich schon - den Heiligen Gral haben viele 
gesucht, aber keiner gefunden, ganz so schlimm ist es mit den 
Datenblättern nicht. Auch wenn man das beim Lesen hier im Forum manchmal 
meinen könnte.

Gruss Reinhard

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren